Sqr/UI/TeamDps/TeamDps.nut

235 lines
8.4 KiB
Plaintext
Raw Normal View History

2024-03-18 21:37:40 +08:00
/*
文件名: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);
}