235 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			235 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名:TeamDps.nut | ||
|  | 路径:UI/TeamDps/TeamDps.nut | ||
|  | 创建日期:2023-01-26	05:15 | ||
|  | 文件用途:团队DPS | ||
|  | */ | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | function onSetHp_appendage_dps(appendage, hp, attacker) { | ||
|  |     if (!appendage) { | ||
|  |         return hp; | ||
|  |     } | ||
|  |     local parentObj = appendage.getParent(); | ||
|  |     local sourceObj = appendage.getSource(); | ||
|  | 
 | ||
|  |     local RootTab = getroottable(); | ||
|  |     if (RootTab.rawin("TEAMDPSCONTROLOBJECT")) RootTab["TEAMDPSCONTROLOBJECT"].onSetHp(appendage, hp, attacker); | ||
|  | 
 | ||
|  |     return hp; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | class TeamDps extends BasicsDrawTool { | ||
|  |     MyDamage = 0; | ||
|  |     TeamDpsTimer = null; | ||
|  |     GetTeamDpsTimer = null; | ||
|  |     PackSize = 0; | ||
|  |     DPSSTL = {}; | ||
|  | 
 | ||
|  |     function TeamDpsPack(chunk) { | ||
|  |         local RootTab = getroottable(); | ||
|  |         if (RootTab.rawin("TEAMDPSCONTROLOBJECT") == false)return; | ||
|  |         local TObj = RootTab["TEAMDPSCONTROLOBJECT"]; | ||
|  |          | ||
|  |         local TeamDpsPack = Json_STL("TeamDpsPack"); | ||
|  |         TeamDpsPack.Parse(chunk, 0, false); | ||
|  |         TObj.PackSize = TeamDpsPack.Get("PACKSIZE"); | ||
|  |         for (local i = 0; i < TObj.PackSize; ++i) { | ||
|  |             local tab = ["Player", "0", "0%", "0.0"]; | ||
|  |             tab[0] = TeamDpsPack.Get("PACK->" + i + "->NAME"); | ||
|  |             tab[1] = TeamDpsPack.Get("PACK->" + i + "->DAMAGE"); | ||
|  |             tab[2] = TeamDpsPack.Get("PACK->" + i + "->RATE"); | ||
|  |             tab[3] = TeamDpsPack.Get("PACK->" + i + "->RATENUM"); | ||
|  |             if (tab[0] != false && tab[1] != false && tab[2] != false && tab[3] != false) | ||
|  |                 TObj.DPSSTL.rawset(i, tab); | ||
|  |         } | ||
|  | 
 | ||
|  |         TeamDpsPack.Delete(); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     constructor() { | ||
|  |         //构造同步Timer | ||
|  |         TeamDpsTimer = TimeSTL("TeamDpsTimer", 5000); | ||
|  |         TeamDpsTimer.Start(); | ||
|  |         GetTeamDpsTimer = TimeSTL("GetTeamDpsTimer", 5000); | ||
|  |         GetTeamDpsTimer.Start(); | ||
|  |         Pack_Control.rawset(614, TeamDpsPack); | ||
|  |     } | ||
|  | 
 | ||
|  |     //AP成员函数 | ||
|  |     function onSetHp(Append, Hp, Attacker) { | ||
|  |         if (!Append) return Hp; | ||
|  | 
 | ||
|  |         local MonsterObj = sq_GetCNRDObjectToActiveObject(Append.getParent()); //获取怪物 | ||
|  |         local Chr = sq_GetCNRDObjectToSQRCharacter(sq_getMyCharacter()); //获取我自己 | ||
|  |         if (!MonsterObj || !Chr) //如果怪物或者我自己不存在设置AP销毁 | ||
|  |         { | ||
|  |             Append.setValid(false); | ||
|  |             return Hp; | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |         //if(!MonsterObj.isMyControlObject()) return Hp; //如果怪物对象是我的角色直接返回 | ||
|  |         local MonsterHp = MonsterObj.getHp(); //获取怪物当前生命值 | ||
|  |         if (Attacker == null && MonsterHp > Hp) //如果攻击者为空 并且 当前生命值大于要设置的生命值 | ||
|  |         { | ||
|  |             if (!Chr.isEnemy(MonsterObj)) return Hp; //如果怪物和我不是敌对直接返回 | ||
|  |             local DamageHp = MonsterHp - Hp; //得到这次掉的血 | ||
|  |             if (DamageHp < 2147483647) { | ||
|  |                 //MyDamage += DamageHp; | ||
|  |                 return Hp; | ||
|  |             } | ||
|  |         } | ||
|  |         if (Attacker != null && sq_IsMyControlObject(Attacker) && MonsterHp > Hp) //如果攻击者是我自己 并且 当前生命值大于要设置的生命值 | ||
|  |         { | ||
|  |             if (!Chr.isEnemy(MonsterObj)) return Hp; //如果怪物和我不是敌对直接返回 | ||
|  |             local DamageHp = MonsterHp - Hp; //得到这次掉的血 | ||
|  |             if (DamageHp < 2147483647) { | ||
|  |                 MyDamage += DamageHp; | ||
|  |                 return Hp; | ||
|  |             } | ||
|  |         } | ||
|  |         return Hp; | ||
|  |     } | ||
|  | 
 | ||
|  |     //绘制函数 | ||
|  |     function DrawDpsFunc(obj) { | ||
|  |         //print(TEAMDPSCONTROL.DPSSTL[0][0]); | ||
|  |         //print(TEAMDPSCONTROL.DPSSTL[0][1]); | ||
|  |         local Psize = 4; | ||
|  | 
 | ||
|  |         local Base_X = 20; | ||
|  |         local Base_Y = 120; | ||
|  |         T_DrawDynamicAni(obj, "common/dps/maintop.ani", Base_X, Base_Y, "maintop"); //绘制Dps上边栏 | ||
|  |         for (local i = 0; i < PackSize; i++) { | ||
|  |             T_DrawDynamicAni(obj, "common/dps/main.ani", Base_X, Base_Y + 41 + (i * 22), "main"); //绘制Dps中间栏 | ||
|  |             if (DPSSTL.rawin(i)) { | ||
|  |                 T_DrawDynamicAni(obj, "common/dps/dps.ani", Base_X + 8, Base_Y + 22 + (i * 28), "mainslot" + i); //绘制Dps中间槽底 | ||
|  | 
 | ||
|  |                 local Rate = DPSSTL[i][3].tofloat(); | ||
|  |                 setClip(Base_X + 8, Base_Y + 22 + (i * 28), Base_X + 8 + (160.0 * Rate).tointeger(), Base_Y + 22 + (i * 28) + 18); //开始裁切 | ||
|  |                 T_DrawDynamicAni(obj, "common/dps/dps" + (i + 1) + ".ani", Base_X + 8, Base_Y + 22 + (i * 28), "mainslotc" + i); //绘制Dps中间槽 | ||
|  |                 releaseClip(); //裁切结束 | ||
|  | 
 | ||
|  |                 L_Code_STL(DPSSTL[i][0], Base_X + 10, Base_Y + 24 + (i * 28), 0xFFFFFFFF, 0); | ||
|  |                 L_Code_STL(DPSSTL[i][1].tostring(), Base_X + 94, Base_Y + 24 + (i * 28), 0xFFFFFFFF, 0); | ||
|  | 
 | ||
|  |                 local RateStr = DPSSTL[i][2].tostring(); | ||
|  |                 local RateStrLen = RateStr.len(); | ||
|  |                 L_Code_STL(RateStr, Base_X + 164 - (RateStrLen * 5), Base_Y + 24 + (i * 28), 0xFFFFFFFF, 0); | ||
|  |             } | ||
|  |         } | ||
|  |         T_DrawDynamicAni(obj, "common/dps/mainbotton.ani", Base_X, Base_Y + 41 + (PackSize * 22), "mainbotton"); //绘制Dps下边栏 | ||
|  | 
 | ||
|  | 
 | ||
|  |         //T_DrawDynamicAni(obj, "common/dps/maintop.ani", Base_X, Base_Y, "maintop"); | ||
|  | 
 | ||
|  |         /* | ||
|  |                 for(local i = 0; i < 4; ++i) | ||
|  |                 { | ||
|  |                     if(DPSSTL.rawin(i)) | ||
|  |                     { | ||
|  |                         L_Code_STL(DPSSTL[i][0], 28, 110 + (i * 24), 0xFFFFFFFF, 1); | ||
|  |                         L_Code_STL(DPSSTL[i][1].tostring() + "  " + DPSSTL[i][2].tostring(), 148, 110 + (i * 24), 0xFFFFFFFF, 1); | ||
|  | 
 | ||
|  |                     } | ||
|  |                 } | ||
|  |                 */ | ||
|  |     } | ||
|  | 
 | ||
|  |     //常规成员函数 | ||
|  |     function exit() { | ||
|  |         TeamDpsTimer.Reset(); | ||
|  |         TeamDpsTimer.Delete(); | ||
|  |         GetTeamDpsTimer.Reset(); | ||
|  |         GetTeamDpsTimer.Delete(); | ||
|  | 
 | ||
|  |         DPSSTL.rawdelete(0); | ||
|  |         DPSSTL.rawdelete(1); | ||
|  |         DPSSTL.rawdelete(2); | ||
|  |         DPSSTL.rawdelete(3); | ||
|  |     } | ||
|  | 
 | ||
|  |     function Run(obj) { | ||
|  |         if (TeamDpsTimer.Get() >= 1700) { | ||
|  |             local TeamDpsBuffer = Json_STL("TeamDpsBuffer"); | ||
|  |             TeamDpsBuffer.Put("op", 611); | ||
|  |             TeamDpsBuffer.Put("DAMAGE", MyDamage); | ||
|  |             local str = TeamDpsBuffer.GetString(); | ||
|  |             L_sq_SendPackType(130); | ||
|  |             L_sq_SendPackWChar(str); | ||
|  |             L_sq_SendPack(); | ||
|  |             TeamDpsBuffer.Delete(); | ||
|  |             MyDamage = 0; | ||
|  |             TeamDpsTimer.Reset(); | ||
|  |             TeamDpsTimer.Start(); | ||
|  |         } | ||
|  | 
 | ||
|  |         if (GetTeamDpsTimer.Get() >= 3000) { | ||
|  |             local TeamDpsBuffer = Json_STL("GetTeamDpsBuffer"); | ||
|  |             TeamDpsBuffer.Put("op", 613); | ||
|  |             local str = TeamDpsBuffer.GetString(); | ||
|  |             L_sq_SendPackType(130); | ||
|  |             L_sq_SendPackWChar(str); | ||
|  |             L_sq_SendPack(); | ||
|  |             TeamDpsBuffer.Delete(); | ||
|  | 
 | ||
|  |             GetTeamDpsTimer.Reset(); | ||
|  |             GetTeamDpsTimer.Start(); | ||
|  |         } | ||
|  | 
 | ||
|  |         DrawDpsFunc(obj); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | function TeamDPS(obj) { | ||
|  |     if (!obj) return false; //如果人物不存在则返回 | ||
|  |     local RootTab = getroottable(); | ||
|  | 
 | ||
|  |     //建立时间容器 | ||
|  |     if (RootTab.rawin("TeamDpsMonTimer") == false) { | ||
|  |         local Buf = TimeSTL("TeamDpsMonTimer", 500); | ||
|  |         Buf.Start(); | ||
|  |         RootTab.rawset("TeamDpsMonTimer", Buf); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (sq_GetCurrentModuleType() != 3 && sq_GetCurrentModuleType() != 10 && sq_GetCurrentModuleType() != 12 && sq_GetCurrentModuleType() != 13) { | ||
|  |         if (RootTab.rawin("TEAMDPSCONTROLOBJECT")) { | ||
|  |             RootTab["TEAMDPSCONTROLOBJECT"].exit(); | ||
|  |             RootTab.rawdelete("TEAMDPSCONTROLOBJECT"); | ||
|  | 
 | ||
|  |         } | ||
|  |         return false; //如果不是处于副本中则返回 | ||
|  |     } | ||
|  | 
 | ||
|  |     if (RootTab["TeamDpsMonTimer"].Get() >= 500) { | ||
|  |         RootTab["TeamDpsMonTimer"].Reset(); | ||
|  |         RootTab["TeamDpsMonTimer"].Start(); | ||
|  |         local objectManager = obj.getObjectManager(); | ||
|  |         if (objectManager) { | ||
|  |             local CollisionObjectNumber = objectManager.getCollisionObjectNumber(); | ||
|  |             for (local i = 0; i < CollisionObjectNumber; ++i) { | ||
|  |                 local Monobject = objectManager.getCollisionObject(i); | ||
|  |                 Monobject = sq_GetCNRDObjectToActiveObject(Monobject); | ||
|  |                 if (Monobject && Monobject.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(Monobject)) { | ||
|  |                     if (!CNSquirrelAppendage.sq_IsAppendAppendage(Monobject, "appendage/teamdps/dps.nut")) { | ||
|  |                         CNSquirrelAppendage.sq_AppendAppendage(Monobject, obj, -1, false, "appendage/teamdps/dps.nut", true); | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     if (!RootTab.rawin("TEAMDPSCONTROLOBJECT")) { | ||
|  |         local Buffer = TeamDps(); | ||
|  |         RootTab.rawset("TEAMDPSCONTROLOBJECT", Buffer); | ||
|  |     } | ||
|  |     RootTab["TEAMDPSCONTROLOBJECT"].Run(obj); | ||
|  | } |