/* 文件名:Roters.nut 路径:Plugins/Roters/Roters.nut 创建日期:2022-11-02 12:27 文件用途:罗特斯世界BOSS */ RotersControl <- null RotersRankControl <- null RotersDgnIndex <- 18081 RotersMapIndex <- 48502 RotersMonIndex <- 8865646 SpiritBarrierNum <- 9 SpiritBarrierHit_MaxNum <- 100 SpiritBarrierHit_Damage <- 0.01 class RotersHudButton extends BasicsDrawTool { obj = null; buttonName = null; x = null; y = null; yoffset = 0; BaseAnifile = null; width = null; length = null; constructor(gObj, gButtonName, gX, gY, gAnifile, gWidth, gLength) { obj = gObj; buttonName = gButtonName; x = gX; y = gY; BaseAnifile = gAnifile; width = gWidth; length = gLength; } function DrawButton() { if (isDown() && yoffset == 0) { yoffset = 1; y++; } T_DrawStayAni(obj, BaseAnifile, x, y, 0, buttonName); if (isInRect()) { T_DrawStayAni(obj, BaseAnifile, x, y, 1, buttonName); } } function isInRect() { local mouseX = IMouse.GetXPos(); local mouseY = IMouse.GetYPos(); if (sq_IsIntersectRect(mouseX, mouseY, 5, 5, x, y, width, length)) return true; return false; } function isDown() { if (isInRect() && IMouse.IsLBDown()) { obj.getVar(buttonName).setBool(0, true); return true; } return false; } function isActive() { if (isInRect() && IMouse.IsLBUp() && obj.getVar(buttonName).getBool(0)) { obj.getVar(buttonName).setBool(0, false); yoffset = 0; return true; } return false; } } class Roters_Control extends BasicsDrawTool { //类状态 STATE = 0; Monster_obj = null; Time_obj = null; ID_Object = null; //怪物的ID GR_Object = null; //怪物组 AP_Chr = null; //人物的AP Boss_StaticHp = null; Boss_LastHp = 1.0; Boss_RealHp = null; EndBoss_HP = null; SpiritBarrier = SpiritBarrierNum; Hit_Num = 0; Hit_MaxNum = SpiritBarrierHit_MaxNum; Rem_Time = null; BossHpMainAni = null; BossHpAni = null; BossHpRdcT_obj = null; BossHpEffT_obj = null; BackTown = null; GoTownTime = null; //构造函数 constructor() { //构造时间容器 Time_obj = TimeSTL("RotersDgn", 160000); } function exit() { STATE = -1; Time_obj.Reset(); Time_obj.Delete(); } function GetWorldIndex() { local stage = sq_GetGlobaludpModuleStage(); local MapIndex = sq_GetMapIndex(stage); return MapIndex; } //初始化Boss基础代码 function InitBossStatic(obj) { //类状态为0时 if (STATE == 0) { //还没有给怪物附加AP时 if (ID_Object == null) { local objectManager = obj.getObjectManager(); if (!objectManager) return; local CollisionObjectNumber = objectManager.getCollisionObjectNumber(); for (local i = 0; i < CollisionObjectNumber; ++i) { local Monobject = objectManager.getCollisionObject(i); local MonIndex = Monobject.getCollisionObjectIndex(); //罗特斯 附加以后类状态写入1 if (MonIndex == RotersMonIndex) { Monobject.setObjectHeight(6666); sq_ChangeDrawLayer(Monobject, ENUM_DRAWLAYER_BOTTOM); //Ap_Object = CNSquirrelAppendage.sq_AppendAppendage(Monobject, obj, -1, false, "appendage/roters/ap_roters.nut", true); ID_Object = sq_GetUniqueId(Monobject); GR_Object = sq_GetGroup(Monobject); Time_obj.Start(); STATE = 1; } //门 if (MonIndex == 5718) { sq_ChangeDrawLayer(Monobject, 7); } } } } } //初始化人物基础代码 function InitChrStatic(obj) { //如果类状态为1时 if (STATE == 1) { //如果人物AP不存在时 if (AP_Chr == null) { //附加人物AP 并将类状态写入2 AP_Chr = CNSquirrelAppendage.sq_AppendAppendage(obj, obj, -1, false, "appendage/roters/ap_chr.nut", true); STATE = 2; } } } //罗特斯Ap proc 执行代码 function proc_Roters_M(obj) { if (!ID_Object || !GR_Object) return; local sourceObj = sq_GetObject(obj, GR_Object, ID_Object); //得到源对象 -- 施加AP的人 sourceObj = sq_GetCNRDObjectToActiveObject(sourceObj); //如果附加Ap的人不存在了直接返回城镇 if (sourceObj.isDead()) { L_sq_GoTown(); return; } //如果Ap源对象不是我 则直接返回 只需要一个人来操作机制 if (!sourceObj.isMyControlObject()) return; //如果Boss的基准生命值为空时 赋值给Boss最大生命值 if (Boss_StaticHp == null) Boss_StaticHp = sourceObj.getHpMax(); //如果Boss对象为空时 赋值给对象 //if (Monster_obj == null) Monster_obj = sourceObj; //Boss当前真实生命值赋值 Boss_RealHp = sourceObj.getHp(); //判断时间写入Boss蓝耗机制 if (Rem_Time > 12000 && Rem_Time < 15000) { sourceObj.sendSetMpPacket(((sourceObj.getMpMax() * 0.9) - 15.0).tointeger()); if (STATE == 2) STATE = 3; } if (Rem_Time > 8000 && Rem_Time < 12000) { sourceObj.sendSetMpPacket(((sourceObj.getMpMax() * 0.7) - 15.0).tointeger()); if (STATE == 3) STATE = 4; } if (Rem_Time > 0 && Rem_Time < 8000) { sourceObj.sendSetMpPacket(((sourceObj.getMpMax() * 0.5) - 15.0).tointeger()); if (STATE == 4) STATE = 5; } } //人物AP执行代码 function onAttack_chr_M(appendage, realAttacker, damager, boundingBox, isStuck) { local ParentObj = appendage.getParent(); //得到源对象 -- 施加AP的人 if (!ID_Object || !GR_Object) return; local sourceObj = sq_GetObject(ParentObj, GR_Object, ID_Object); //得到源对象 -- 施加AP的人 sourceObj = sq_GetCNRDObjectToActiveObject(sourceObj); //如果Ap父对象不是我 则直接返回 不增加其他人的连击数 if (!ParentObj.isMyControlObject()) return; //如果攻击到的是罗特斯本体不增加连击数 if (damager.getCollisionObjectIndex() == RotersMonIndex) return; //如果连击数小于100 每次攻击+1 if (Hit_Num < 100) ++Hit_Num; //如果连击数大于等于100 并且壁障数大于0 if (Hit_Num >= 100 && SpiritBarrier > 0) { //清空连击数 壁障数设置-1 Hit_Num = 0; --SpiritBarrier; sourceObj.setHp(sourceObj.getHp() - (sourceObj.getHpMax().tofloat() * SpiritBarrierHit_Damage).tointeger(), null, true); CallBossHp(1); } } //绘制精神屏障主界面 function drawSpiritBarrier(obj) { T_DrawStayAni(obj, "common/dungeon/roters/bz/main.ani", 650, 25, 0, "精神屏障主界面"); setClip(659, 50, 659 + (97 * (Hit_Num.tofloat() / Hit_MaxNum.tofloat())).tointeger(), 54); T_DrawStayAni(obj, "common/dungeon/roters/bz/main.ani", 659, 50, 1, "精神屏障进度条"); releaseClip(); T_DrawCustomNum(obj, 736, 26, SpiritBarrier, "common/dungeon/roters/bz/", 0); } //绘制时间 function drawTime(obj) { if (!Time_obj.Get()) return; Rem_Time = (160000 - Time_obj.Get()) / 10; local Offset_Xpos = 0; if (Rem_Time < 10000) Offset_Xpos = -9; if (Rem_Time < 1000) Offset_Xpos = -18; if (IMouse.GetXPos() < 205 && IMouse.GetYPos() < 49 && IMouse.GetXPos() >= 0 && IMouse.GetYPos() >= 0) T_DrawStayAni(obj, "common/dungeon/roters/time/main.ani", 0, 2, 1, "倒计时主界面背景"); T_DrawStayAni(obj, "common/dungeon/roters/time/main.ani", 0, 2, 0, "倒计时主界面"); T_DrawStayAni(obj, "common/dungeon/roters/time/d.ani", 101 + Offset_Xpos, 9, 0, "时间点"); T_DrawStayAni(obj, "common/dungeon/roters/time/d.ani", 101 + Offset_Xpos, 18, 0, "时间点2"); T_DrawCustomTimeNum(obj, 132 + Offset_Xpos, 23, Rem_Time, "common/dungeon/roters/time/", 18, 0); } //绘制Boss血条动画 function drawBossHp(obj) { if (BossHpRdcT_obj) { local nowhun = Boss_RealHp.tofloat() / Boss_StaticHp.tofloat(); BossHpMainAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 106, 67, 0, "Boss血条主界面"); local v = sq_GetUniformVelocity((Boss_LastHp * 493.0).tointeger(), (nowhun * 493.0).tointeger(), BossHpRdcT_obj.Get(), 1000); setClip(154, 88, 154 + v, 109); BossHpAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 154, 88, 1, "Boss血条"); releaseClip(); BossHpMainAni.setRGBA(255, 255, 255, 250); BossHpAni.setRGBA(255, 255, 255, 250); if (BossHpRdcT_obj.Get() >= 2000) { BossHpRdcT_obj.Delete(); BossHpRdcT_obj = null; CallBossHp(2); } } else if (BossHpEffT_obj) { local nowhun = Boss_RealHp.tofloat() / Boss_StaticHp.tofloat(); BossHpMainAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 106, 67, 0, "Boss血条主界面"); setClip(154, 88, 154 + (nowhun * 493.0).tointeger(), 109); BossHpAni = T_DrawStayAni(obj, "common/dungeon/roters/hp/main.ani", 154, 88, 1, "Boss血条"); releaseClip(); local v = sq_GetUniformVelocity(250, 0, BossHpEffT_obj.Get(), 1000); BossHpMainAni.setRGBA(255, 255, 255, v); BossHpAni.setRGBA(255, 255, 255, v); if (BossHpEffT_obj.Get() >= 1000) { BossHpEffT_obj.Delete(); BossHpEffT_obj = null; Boss_LastHp = nowhun; } } } //绘制Boss血条动画 function CallBossHp(Type) { switch (Type) { case 1: if (BossHpRdcT_obj == null) BossHpRdcT_obj = TimeSTL("RotersBossHpRdc", 2000); BossHpRdcT_obj.Reset(); BossHpRdcT_obj.Start(); break; case 2: if (BossHpEffT_obj == null) BossHpEffT_obj = TimeSTL("RotersBossHpEff", 1000); BossHpEffT_obj.Reset(); BossHpEffT_obj.Start(); break; } } function DrawMain(obj) { if (STATE >= 6) return; //绘制精神屏障主界面 drawSpiritBarrier(obj); //绘制时间 drawTime(obj); drawBossHp(obj); } function ProcDgn(obj) { //初始化BOSS基础代码 InitBossStatic(obj); //初始化角色基础代码 InitChrStatic(obj); //罗特斯循环函数 proc_Roters_M(obj); //如果时间结束 if (Rem_Time == 0 && STATE >= 3) { if (EndBoss_HP == null) EndBoss_HP = Boss_StaticHp - Boss_RealHp; if (BackTown == null) BackTown = RotersHudButton(obj, "rotersbacktown", 371, 245, "common/dungeon/roters/damage/back.ani", 66, 19); local Offset_Xpos = ((EndBoss_HP.tostring().len() - 1) * -5); T_DrawStayAni(obj, "common/dungeon/roters/damage/main.ani", 249, 115, 0, "结算主界面"); T_DrawCustomNum(obj, 395 + Offset_Xpos, 171, EndBoss_HP, "common/dungeon/roters/damage/num/", 10); if (STATE == 5) { local WorldBossUpdateDamage = Json_STL("WorldBossUpdateDamage"); WorldBossUpdateDamage.Put("op", 13); WorldBossUpdateDamage.Put("hurt", EndBoss_HP); local str = WorldBossUpdateDamage.GetString(); L_sq_SendPackType(130); L_sq_SendPackWChar(str); L_sq_SendPack(); WorldBossUpdateDamage.Delete(); STATE = 6; } BackTown.DrawButton(); if (BackTown.isActive()) { L_sq_GoTown(); } } } } function Roters(obj) { //如果在副本中 if (sq_GetCurrentModuleType() == 3) { //如果获取当前地图ID 等于 罗特斯地图ID if (Roters_Control.GetWorldIndex() == RotersMapIndex) { //如果罗特斯对象为空 则实例化 if (RotersControl == null) { RotersControl = Roters_Control(); } //执行逻辑主函数 RotersControl.ProcDgn(obj); //执行绘制主函数 RotersControl.DrawMain(obj); } else { //如果罗特斯对象不为空 则销毁他 if (RotersControl != null) { RotersControl.exit(); RotersControl = null; } } } else { //如果罗特斯对象不为空 则销毁他 if (RotersControl != null) { RotersControl.exit(); RotersControl = null; } } } //罗特斯排行榜界面类 class Roters_RankControl extends BasicsDrawTool { State = -2; //世界BOSS当前状态 End = 0; Windows_Object = null; AnimotionState = 0; BufferTimeSTL = null; Page = 0; MainSwitchButton = null; //OP模式 ThisOp = null; //类JsonBuffer ThisJsonBuffer = null; function RotersRankCallBack(chunk) { local RootTab = getroottable(); if (RootTab.rawin("ROTERSRANKCONTROL") == false) return; local RotersRankPack = Json_STL("RotersRankPack"); RotersRankPack.Parse(chunk, 0, false); local op = RotersRankPack.Get("op"); switch (op) { //开界面 case 12: { RootTab["ROTERSRANKCONTROL"].ThisOp = 12; if (RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer) RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer.Delete(); RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer = Json_STL("ThisJsonBuffer"); RootTab["ROTERSRANKCONTROL"].ThisJsonBuffer.Parse(chunk, 0, false); } break; //开启世界BOSS case 14: RootTab["ROTERSRANKCONTROL"].ThisOp = 14; break; //打赢了 case 16: RootTab["ROTERSRANKCONTROL"].ThisOp = 16; break; //没打赢 case 18: RootTab["ROTERSRANKCONTROL"].ThisOp = 18; break; //彻底结束 case 20: RootTab["ROTERSRANKCONTROL"].ThisOp = 20; break; default: break; } RotersRankPack.Delete(); } constructor() { Pack_Control.rawset(12, RotersRankCallBack); Pack_Control.rawset(14, RotersRankCallBack); Pack_Control.rawset(16, RotersRankCallBack); Pack_Control.rawset(18, RotersRankCallBack); Pack_Control.rawset(20, RotersRankCallBack); BufferTimeSTL = TimeSTL("RotersBufferTimeSTL", 3000); } //绘制排名信息 function DrawRankInfo(obj) { //如果信息表不存在 或数据不正确 则返回 if (!ThisJsonBuffer || ThisJsonBuffer.tostring().len() < 1) return; local Y_Pos_Offset = 0; for (local i = 0; i < 11; i++) { if (i == 10) Y_Pos_Offset = 3; L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->rank"), 163, 325 + (i * 16) + Y_Pos_Offset, 0xFF99D7FF, 1); L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->cName"), 257, 325 + (i * 16) + Y_Pos_Offset, 0xFF00D7FF, 1); L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->job"), 409, 325 + (i * 16) + Y_Pos_Offset, 0xB79260FF, 1); L_Code_STL(ThisJsonBuffer.Get("result->" + i + "->hurt"), 535, 325 + (i * 16) + Y_Pos_Offset, 0xFFFF00FF, 1); } } //绘制主界面框 function DrawRankMain(obj) { //如果信息表不存在 或数据不正确 则返回 if (!ThisJsonBuffer || ThisJsonBuffer.tostring().len() < 1) return; T_DrawStayAni(obj, "common/dungeon/roters/main/main.ani", 129, 8, 0, "罗特斯Rank主界面"); //T_DrawDynamicAni(obj, "common/dungeon/roters/main/maineff.ani", 133, 52, "罗特斯Rankeff主界面"); local HpPoi = ThisJsonBuffer.Get("hppercentage").tofloat() / 100.0; setClip(130, 28, 130 + (542.0 * HpPoi).tointeger(), 68); T_DrawStayAni(obj, "common/dungeon/roters/main/mainhp.ani", 130, 28, 0, "罗特斯Rank生命值"); releaseClip(); local AttackButton = ButtonPro(obj, "AttackButton", 542, 270, "common/dungeon/roters/main/attackbutton.ani", 120, 20); AttackButton.SetRectEnble(true, "AttackButton", 542, 270, "common/dungeon/roters/main/attackbutton.ani", 1); AttackButton.SetCustomClickEnble(true, "AttackButton", 542, 270 + 1, "common/dungeon/roters/main/attackbutton.ani", 1); if (End != 1) AttackButton.Show(); if (AttackButton.isLBActive()) { L_sq_GoDungeon(RotersDgnIndex); } local RightSwitchButton = ButtonPro(obj, "RightSwitchButton", 460, 504, "common/dungeon/roters/main/rightbutton.ani", 11, 13); RightSwitchButton.SetRectEnble(true, "RightSwitchButton", 460, 504, "common/dungeon/roters/main/rightbutton.ani", 1); RightSwitchButton.SetCustomClickEnble(true, "RightSwitchButton", 460, 504 + 1, "common/dungeon/roters/main/rightbutton.ani", 1); RightSwitchButton.Show(); if (RightSwitchButton.isLBActive()) { if (Page < 4) ++Page; local Test = Json_STL("WorldBossBuffer"); Test.Put("op", 11); Test.Put("page", Page); local str = Test.GetString(); L_sq_SendPackType(130); L_sq_SendPackWChar(str); L_sq_SendPack(); Test.Delete(); } local LeftSwitchButton = ButtonPro(obj, "LeftSwitchButton", 336, 504, "common/dungeon/roters/main/leftbutton.ani", 11, 13); LeftSwitchButton.SetRectEnble(true, "LeftSwitchButton", 336, 504, "common/dungeon/roters/main/leftbutton.ani", 1); LeftSwitchButton.SetCustomClickEnble(true, "LeftSwitchButton", 336, 504 + 1, "common/dungeon/roters/main/leftbutton.ani", 1); LeftSwitchButton.Show(); if (LeftSwitchButton.isLBActive()) { if (Page > 0) --Page; local Test = Json_STL("WorldBossBuffer"); Test.Put("op", 11); Test.Put("page", Page); local str = Test.GetString(); L_sq_SendPackType(130); L_sq_SendPackWChar(str); L_sq_SendPack(); Test.Delete(); } } //绘制主界面开启按钮 function DrawMainButton(obj) { T_DrawDynamicAni(obj, "common/dungeon/roters/main/mainbuttoneff.ani", -30, 35, "罗特斯Rank按钮特效"); if (MainSwitchButton == null) { MainSwitchButton = ButtonPro(obj, "MainSwitchButton", 15, 70, "common/dungeon/roters/main/mainbutton.ani", 65, 65); } MainSwitchButton.SetRectEnble(true, "MainSwitchButtonr", 15, 70, "common/dungeon/roters/main/mainbutton.ani", 1); MainSwitchButton.SetCustomClickEnble(true, "MainSwitchButtonc", 15, 70, "common/dungeon/roters/main/mainbutton.ani", 2); MainSwitchButton.Show(); if (MainSwitchButton.isLBActive()) { if (!sq_GetPopupWindowMainCotrol(267)) L_NewWindows("Lenheart", 267, 0x65535); local Test = Json_STL("WorldBossBuffer"); Test.Put("op", 11); Test.Put("page", Page); local str = Test.GetString(); L_sq_SendPackType(130); L_sq_SendPackWChar(str); L_sq_SendPack(); Test.Delete(); } } //Run主执行函数 function Run(obj) { //初始状态 if (State == -2) { //构造 嗅探包 请求世界Boss是否开启 local WordBossSwitchReqPack = Json_STL("WordBossSwitchReqPack"); WordBossSwitchReqPack.Put("op", 15); local StrBuffer = WordBossSwitchReqPack.GetString(); L_sq_SendPackType(130); L_sq_SendPackWChar(StrBuffer); L_sq_SendPack(); WordBossSwitchReqPack.Delete(); State = -1; } //等待开启信号状态 if (State == -1) { //如果OP状态等于14 if (ThisOp == 14) { if (AnimotionState == 0) { BufferTimeSTL.Reset(); BufferTimeSTL.Start(); AnimotionState = 1; } if (AnimotionState == 1) { local MainStartAni = T_DrawStayAni(obj, "common/dungeon/roters/main/mainstart.ani", 80, 50, 0, "RotersMainStartAni"); local v = sq_GetUniformVelocity(0, 250, BufferTimeSTL.Get(), 3000); MainStartAni.setRGBA(255, 255, 255, v); if (BufferTimeSTL.Get() >= 2900) { BufferTimeSTL.Reset(); BufferTimeSTL.Start(); AnimotionState = 2; } } if (AnimotionState == 2) { local MainStartAni = T_DrawStayAni(obj, "common/dungeon/roters/main/mainstart.ani", 80, 50, 0, "RotersMainStartAni"); local v = sq_GetUniformVelocity(250, 0, BufferTimeSTL.Get(), 3000); MainStartAni.setRGBA(255, 255, 255, v); if (BufferTimeSTL.Get() >= 2900) { BufferTimeSTL.Reset(); BufferTimeSTL.Delete(); BufferTimeSTL = null; AnimotionState = 3; } } if (AnimotionState == 3) { End = 0; //是否结束写入0 State = 0; } } } //绘制世界BOSS面板按钮 if (State == 0) { DrawMainButton(obj); //如果收到 op 12号包 打开了面板 state写入1 if (ThisOp == 12) { State = 1; ThisOp = 0; } } //绘制面板 if (State == 1) { //如果窗口开启绘制面板 绘制排名 if (sq_GetPopupWindowMainCotrol(267)) { Windows_Object = sq_GetPopupWindowMainCotrol(267); DrawRankMain(obj); DrawRankInfo(obj); } //窗口关闭状态写回0 else { State = 0; } } //检测到 打赢或者打输了的 包 是否结束写入1 if (ThisOp == 16 || ThisOp == 18) { State = 0; End = 1; } //世界BOSS彻底结束 状态回归-2 if (ThisOp == 20) { State = -2; } } } function RotersRank(obj) { //只在城镇中执行 if (sq_GetCurrentModuleType() != 1) return; local RootTab = getroottable(); //如果不在西海岸主干道不执行 if (L_sq_GetTownIndex() != 3 || L_sq_GetRegionIndex() != 0) { if (RootTab.rawin("ROTERSRANKCONTROL"))RootTab.rawdelete("ROTERSRANKCONTROL"); return; } //如果对象不存在 实例化对象 if (RootTab.rawin("ROTERSRANKCONTROL") == false) { local ROTERSRANKCONTROLOBJ = Roters_RankControl(); RootTab.rawset("ROTERSRANKCONTROL", ROTERSRANKCONTROLOBJ); } else { RootTab["ROTERSRANKCONTROL"].Run(obj); } }