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);
 | |
| } |