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