Rindro-Sqr/Project/DamagePerSecond/DamagePerSecond.nut

134 lines
4.2 KiB
Plaintext

/*
文件名:DamagePerSecond.nut
路径:Project/DamagePerSecond/DamagePerSecond.nut
创建日期:2024-08-31 10:32
文件用途:秒伤统计
*/
class DamagePerSecondC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//不是窗口
NoWindow = true;
//是否可见
// Visible = false;
//伤害统计集合
DamagePerSecondList = null;
//总伤害统计
TotalDamage = longlong(0);
function Sq_PushDamageData(ObjAddress, MySelfAddress, Value) {
local Object = null;
//我自己的伤害
if (ObjAddress == 0 || ObjAddress == MySelfAddress) {
Object = MySelfAddress;
} else {
//先判断是否是角色
if (L_Sq_GetObjectIsCharacter(ObjAddress)) {
Object = ObjAddress;
}
}
if (Object) {
if (DamagePerSecondList.rawin(Object)) {
//如果存在就相加
DamagePerSecondList[Object].Damage = DamagePerSecondList[Object].Damage + longlong(Value);
} else {
//不存在就创建
DamagePerSecondList.rawset(Object, {
Damage = longlong(Value),
Name = L_Sq_GetObjectNameByAddress(Object)
});
}
TotalDamage += longlong(Value);
}
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
DamagePerSecondList = {};
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
PushDamageFontFuncTab.rawset("DamagePerSecondCFunc", Sq_PushDamageData.bindenv(this));
}
function RegisterWidget() {
// //关闭按钮
// local CloseButton = LenheartNewUI_BaseButton(278, 0, 11, 12, "interface/lenheartwindowcommon.img", 276);
// CloseButton.OnClick = function() {
// this.Visible = false;
// }.bindenv(this);
// Childrens.append(CloseButton);
}
function DrawDamageBar(Pos, DamageObj) {
local Rate = DamageObj.Damage / TotalDamage;
local DamageStr = DamageObj.Damage.GetFormat("%0.2f");
local ShowStr = DamageStr + ", " + format("%.2f", Rate.tofloat() * 100) + "%";
//绘制底
L_sq_DrawImg("hud/dps.img", 3, X + 8, Y + 20 + (Pos * 22));
setClip(X + 8, Y + 20 + (Pos * 22), X + 8 + (160.0 * Rate.tofloat()).tointeger(), Y + 20 + (Pos * 22) + 18);
L_sq_DrawImg("hud/dps.img", 4 + (Pos % 4), X + 8, Y + 20 + (Pos * 22));
releaseClip(); //裁切结束
L_sq_DrawCode(DamageObj.Name, X + 12, Y + 23 + (Pos * 22), sq_RGBA(230, 200, 155, 255), 0, 1);
L_sq_DrawCode(ShowStr, X + 168 - LenheartTextClass.GetStringLength(ShowStr), Y + 23 + (Pos * 22), sq_RGBA(230, 200, 155, 255), 0, 1);
}
//绘制主界面
function DrawMain(obj) {
if (DamagePerSecondList.len() == 0) return;
L_sq_DrawImg("hud/dps.img", 0, X, Y);
for (local i = 0; i<(DamagePerSecondList.len() - 1); i++) {
L_sq_DrawImg("hud/dps.img", 2, X, Y + 41 + (22 * i));
}
L_sq_DrawImg("hud/dps.img", 1, X, Y + 41 + (22 * (DamagePerSecondList.len() - 1)));
local i = 0;
foreach(Object, DamageObj in DamagePerSecondList) {
DrawDamageBar(i, DamageObj);
i++;
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
Height = 41 + (22 * (DamagePerSecondList.len() - 1)) + 7;
TitleH = Height;
if (sq_GetCurrentModuleType() == 1 || sq_GetCurrentModuleType() == 2) {
DamagePerSecondList = {};
TotalDamage = longlong(0);
}
}
}
getroottable().rawdelete("DamagePerSecond_Obj");
function Lenheart_DamagePerSecond_Fun(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("DamagePerSecond_Obj")) {
RootTab.rawset("DamagePerSecond_Obj", true);
LenheartNewUI_CreateWindow(DamagePerSecondC, "秒伤统计窗口", 0, 160, 178, 150, 28);
}
}
getroottable()["LenheartFuncTab"].rawset("DamagePerSecondFuncN", Lenheart_DamagePerSecond_Fun);