Rindro-Sqr/Project/CombatRank/CombatRank.nut

511 lines
17 KiB
Plaintext
Raw Normal View History

2024-09-16 17:09:36 +08:00
/*
文件名:CombatRank.nut
路径:Project/CombatRank/CombatRank.nut
创建日期:2024-08-12 20:07
文件用途:战斗力系统
*/
class CombatRankC extends LenheartNewUI_Windows {
//调试模式
// DeBugMode = true;
//默认显示状态需要是关闭 因为要通过收包打开
Visible = false;
//排行榜显示的第几页
Page = 1;
MaxPage = 1;
//当前显示页面的数据对象
PageInfo = null;
//我的数据
MyInfo = null;
//殿堂模特数组
ShowCharacter = null;
function GetRankInfo() {
local T = {
op = 20072003,
page = Page
}
SendPackEx(T);
}
function GetRankInfoCallBack(Chunk) {
PageInfo = null;
local Jso = Json.Decode(Chunk);
PageInfo = Jso.ranking;
MyInfo = PageInfo.pop();
MyInfo.rank <- Jso.on;
MaxPage = Jso.size;
//如果是在第一页 才会有123名
if (Page == 1) {
ShowCharacter = array(3);
for (local i = 0; i< 3; i++) {
local T = {
op = 20069001,
items = PageInfo[i].avaS,
job = PageInfo[i].job.tointeger(),
flag = i
}
SendPackEx(T);
}
}
}
//时装 帽子 头部 脸 上衣 下装 鞋子 胸部 腰部 皮肤 光环
AvatarInfoIdx = [0x3038, 0x3010, 0x3014, 0x3018, 0x301c, 0x3020, 0x3024, 0x3028, 0x302c, 0x3030, 0x3034];
creInfoIdx = [0x3068, 0x306C, 0x3070, 0x3074];
//更换装备事件回调
function PlayerChanageEquCallBack(Chunk) {
local obj = sq_GetMyMasterCharacter();
if (!obj) return;
local C_Object = L_sq_RA(0x1ab7cdc);
//记录时装
local avataritemsbuf = [];
foreach(offset in AvatarInfoIdx) {
local AvatarEquiAddress = L_sq_RA(C_Object + offset);
if (AvatarEquiAddress >= 0x400000) {
local Ab = [];
local NormalIndex = L_sq_RA(AvatarEquiAddress + 0x1c);
local ExIndex = L_sq_RA(AvatarEquiAddress + 0x13E0);
Ab.append(NormalIndex);
Ab.append(ExIndex);
avataritemsbuf.append(Ab);
} else {
local Ab = [];
Ab.append(0);
Ab.append(0);
avataritemsbuf.append(Ab);
}
}
//记录装备
local equiitemsbuf = [];
local equiupbuf = [];
for (local i = 1; i< 13; ++i) {
//编号
local Index = L_sq_GetCharacterAttribute(0x1c, i);
//强化
local Upvalue = L_sq_GetCharacterAttribute(0x1054, i)
//是否有增幅属性
local IsZf = L_sq_GetCharacterAttribute(0x10A8, i)
//锻造
local DsUpvalue = L_sq_GetCharacterAttribute(0x10E8, i);
//附魔卡片
local Enchanting = L_sq_GetCharacterAttribute(0x1084, i);
equiitemsbuf.append(Index);
local Info = [];
if (IsZf) {
Info.append(0);
Info.append(Upvalue);
} else {
Info.append(Upvalue);
Info.append(0);
}
Info.append(DsUpvalue);
Info.append(Enchanting);
equiupbuf.append(Info);
// print(i);
// print(equiupbuf.len());
}
//记录宠物
local creitemsbuf = [];
foreach(offset in creInfoIdx) {
local creEquiAddress = L_sq_RA(C_Object + offset);
if (creEquiAddress >= 0x400000) {
local NormalIndex = L_sq_RA(creEquiAddress + 0x1c);
creitemsbuf.append(NormalIndex);
} else {
creitemsbuf.append(0);
}
}
//记录四维三攻属强i
local Attributes = 0;
Attributes += L_sq_GetCharacterAttribute(0x2364);
Attributes += L_sq_GetCharacterAttribute(0x2394);
Attributes += L_sq_GetCharacterAttribute(0x237c);
Attributes += L_sq_GetCharacterAttribute(0x23ac);
local AttackValue = 0;
AttackValue += L_sq_GetCharacterAttribute(0x1E54);
AttackValue += L_sq_GetCharacterAttribute(0x1E84);
AttackValue += L_sq_GetCharacterAttribute(0x22C8);
local Enhancement = 0; //火冰光暗 大概
Enhancement += L_sq_GetCharacterAttribute(0x1b54);
Enhancement += L_sq_GetCharacterAttribute(0x1b60);
Enhancement += L_sq_GetCharacterAttribute(0x1b78);
Enhancement += L_sq_GetCharacterAttribute(0x1b6c);
local T = {
op = 20072001,
ava = avataritemsbuf,
equ = equiitemsbuf,
sw = Attributes,
atk = AttackValue,
ele = Enhancement,
cre = creitemsbuf,
job = sq_getJob(obj),
exjob = sq_getGrowType(obj),
name = L_Sq_GetObjectName(obj),
equUp = equiupbuf
}
SendPackEx(T);
}
ChanageCombat = null;
MyCombat = null;
DrawAniTimeFlag = null;
function PlayerCombatChanageCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
//战斗力变动 绘制动画
if (Jso.Combat != 0) {
ChanageCombat = Jso.Combat;
MyCombat = Jso.zdlS;
DrawAniTimeFlag = Clock();
}
}
constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) {
Childrens = [];
//注册控件
RegisterWidget();
LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH);
Pack_Control.rawset(20069002, GetAvatarDrawInfoCallBack.bindenv(this));
Pack_Control.rawset(20072004, GetRankInfoCallBack.bindenv(this));
Pack_Control.rawset(20072002, PlayerCombatChanageCallBack.bindenv(this));
Pack_Control.rawset(20072102, PlayerChanageEquCallBack.bindenv(this));
//上传自身信息
PlayerChanageEquCallBack(1);
//获取排行榜信息
GetRankInfo();
}
function GetAvatarDrawInfoCallBack(Chunk) {
local Jso = Json.Decode(Chunk);
local ZlibStr = Jso.ZipS;
Jso.ZipS = Json.Decode(L_sq_Dezlib(Jso.ZipS));
local DrawAniArr = [];
foreach(DrawObj in Jso.ZipS.MoniPack) {
local FrameArr = [];
foreach(Buf in DrawObj.F) {
local T = {
ImgIndex = Buf[0],
Delay = Buf[1],
Pos = [Buf[2], Buf[3]]
}
FrameArr.append(T);
}
local Ani = Lenheart_Ani(DrawObj.B, FrameArr, [400, 400]);
DrawAniArr.append(Ani);
}
ShowCharacter[Jso.ZipS.flag] = DrawAniArr;
}
chrobj = null;
function GetAvatarDrawInfo(obj) {
local C_Object = L_Sq_GetObjectAddress(obj);
// 武器 帽子 头部 脸 上衣 下装 鞋子 胸部 腰部 皮肤 光环
local AvatarIdx = [0x3038, 0x3010, 0x3014, 0x3018, 0x301c, 0x3020, 0x3024, 0x3028, 0x302c, 0x3030, 0x3034];
local itemsbuf = [];
foreach(offset in AvatarIdx) {
local AvatarEquiAddress = L_sq_RA(C_Object + offset);
if (AvatarEquiAddress >= 0x400000) {
local Ab = [];
local NormalIndex = L_sq_RA(AvatarEquiAddress + 0x1c);
local ExIndex = L_sq_RA(AvatarEquiAddress + 0x13E0);
Ab.append(NormalIndex);
Ab.append(ExIndex);
itemsbuf.append(Ab);
}
}
}
function RegisterWidget() {
//关闭按钮
local CloseButton = LenheartNewUI_BaseButton(520, 2, 11, 12, "interface/lenheartwindowcommon.img", 276);
CloseButton.OnClick = function() {
this.Visible = false;
}.bindenv(this);
Childrens.append(CloseButton);
//左按钮
local LeftButton = LenheartNewUI_BaseButton(236, 500, 12, 9, "interface/lenheartwindowcommon.img", 511);
LeftButton.OnClick = function() {
if (Page > 1) Page--;
}.bindenv(this);
Childrens.append(LeftButton);
//关闭按钮
local RightButton = LenheartNewUI_BaseButton(304, 500, 12, 9, "interface/lenheartwindowcommon.img", 521);
RightButton.OnClick = function() {
if (Page< MaxPage) Page++;
}.bindenv(this);
Childrens.append(RightButton);
}
//绘制主界面
function DrawMain(obj) {
if (!PageInfo) return;
//窗口
L_sq_DrawImg("interface/rindro/new_rank.img", 0, X, Y);
//排名图标
L_sq_DrawImg("interface2/hud/information_button/information_button_cn.img", 136, X + 5, Y + 295);
for (local i = 0; i< PageInfo.len(); i++) {
local StrBuf = (i + 1 + (Page - 1) * 10).tostring();
L_sq_DrawCode(StrBuf, X + 16 - LenheartTextClass.GetStringLength(StrBuf) / 2, Y + 318 + (i * 16), sq_RGBA(179, 169, 135, 255), 0, 1);
}
//职业
L_sq_DrawCode("职业", X + 58, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1);
//角色名
L_sq_DrawCode("角色名", X + 152, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1);
//公会名
L_sq_DrawCode("公会名", X + 280, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1);
//战斗力
L_sq_DrawCode("战斗力", X + 438, Y + 299, sq_RGBA(179, 169, 135, 255), 0, 1);
//绘制页数
local PageStr = (Page + "/" + MaxPage);
L_sq_DrawCode(PageStr, X + 276 - LenheartTextClass.GetStringLength(PageStr) / 2, Y + 499, sq_RGBA(179, 169, 135, 255), 0, 1);
foreach(Index, CharObj in PageInfo) {
//绘制职业
L_sq_DrawCode(CharObj.jobname, X + 70 - LenheartTextClass.GetStringLength(CharObj.jobname) / 2, Y + 318 + (Index * 16), sq_RGBA(179, 169, 135, 255), 0, 1);
//绘制角色名
L_sq_DrawCode(CharObj.name, X + 169 - LenheartTextClass.GetStringLength(CharObj.name) / 2, Y + 318 + (Index * 16), sq_RGBA(179, 169, 135, 255), 0, 1);
local GuildName = "无公会";
//绘制公会名
if ("guildname" in CharObj) {
GuildName = CharObj.guildname;
}
L_sq_DrawCode(GuildName, X + 298 - LenheartTextClass.GetStringLength(GuildName) / 2, Y + 318 + (Index * 16), sq_RGBA(179, 169, 135, 255), 0, 1);
//绘制战斗力
L_sq_DrawCode(CharObj.zdlS, X + 456 - LenheartTextClass.GetStringLength(CharObj.zdlS) / 2, Y + 318 + (Index * 16), sq_RGBA(179, 169, 135, 255), 0, 1);
}
//绘制我自己
{
local StrBuf = (MyInfo.rank).tostring();
L_sq_DrawCode(StrBuf, X + 16 - LenheartTextClass.GetStringLength(StrBuf) / 2, Y + 321 + 160, sq_RGBA(229, 180, 83, 255), 0, 1);
//绘制职业
L_sq_DrawCode(MyInfo.jobname, X + 70 - LenheartTextClass.GetStringLength(MyInfo.jobname) / 2, Y + 321 + 160, sq_RGBA(229, 180, 83, 255), 0, 1);
//绘制角色名
L_sq_DrawCode(MyInfo.name, X + 169 - LenheartTextClass.GetStringLength(MyInfo.name) / 2, Y + 321 + 160, sq_RGBA(229, 180, 83, 255), 0, 1);
local GuildName = "无公会";
//绘制公会名
if ("guildname" in MyInfo) {
GuildName = MyInfo.guildname;
}
L_sq_DrawCode(GuildName, X + 298 - LenheartTextClass.GetStringLength(GuildName) / 2, Y + 321 + 160, sq_RGBA(229, 180, 83, 255), 0, 1);
//绘制战斗力
L_sq_DrawCode(MyInfo.zdlS, X + 456 - LenheartTextClass.GetStringLength(MyInfo.zdlS) / 2, Y + 321 + 160, sq_RGBA(229, 180, 83, 255), 0, 1);
}
if (ShowCharacter) {
foreach(Index, AniDrawObj in ShowCharacter) {
2025-05-27 21:24:22 +08:00
try {
local OffsetX = 270;
local OffsetY = 268;
if (Index == 1) {
OffsetX = 130;
OffsetY = 268;
}
if (Index == 2) {
OffsetX = 410;
OffsetY = 268;
2024-09-16 17:09:36 +08:00
}
2025-05-27 21:24:22 +08:00
if (AniDrawObj) {
foreach(AniObj in AniDrawObj) {
AniObj.X = X + OffsetX;
AniObj.Y = Y + OffsetY;
AniObj.Show(Duration);
}
}
} catch (exception) {
2024-09-16 17:09:36 +08:00
}
}
}
}
AlphaValue = 1.0;
function DrawImg(Path, Index, XPos, YPos, rate) {
L_sq_DrawImg(Path, Index, XPos, YPos, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), rate, rate);
}
NormalNumOffset = [22, 11, 22, 21, 21, 21, 22, 19, 22, 21];
function DrawCombatNormal(Num) {
local XLength = 0;
foreach(ac in Num) {
local Idx = (ac - 48).tointeger();
XLength += NormalNumOffset[Idx];
}
local NumOffset = {
X = ((getroottable().Rindro_Scr_Width - 55) / 2).tointeger(),
Y = 473
};
NumOffset.X -= XLength;
local Xoffset = 0;
foreach(index, value in Num) {
local Idx = (value - 48).tointeger();
DrawImg("interface/rindro/new_ranknum.img", 10 + Idx, NumOffset.X + Xoffset, NumOffset.Y, 1.0);
Xoffset += (NormalNumOffset[Idx]);
}
}
function DrawCombatChanage(Num, type) {
DrawImg("interface/rindro/new_rank.img", type ? 4 : 3, ((getroottable().Rindro_Scr_Width - 55) / 2).tointeger() + 60, 478, 0.5);
local NumOffset = {
X = ((getroottable().Rindro_Scr_Width - 55) / 2).tointeger() + 80,
Y = 473
};
local Xoffset = 0;
local ImgType = 30;
if (type) ImgType = 40;
foreach(index, value in Num) {
local Idx = (value - 48).tointeger();
DrawImg("interface/rindro/new_ranknum.img", ImgType + Idx, NumOffset.X + Xoffset, NumOffset.Y, 1.0);
Xoffset += (NormalNumOffset[Idx]);
}
}
function DrawCombat() {
if (DrawAniTimeFlag) {
local NowTime = Clock();
if ((NowTime - DrawAniTimeFlag) >= 2000) {
ChanageCombat = null;
MyCombat = null;
DrawAniTimeFlag = null;
return;
}
local PlayT = (NowTime - DrawAniTimeFlag);
AlphaValue = sq_GetUniformVelocity(300, 30, PlayT, 2000).tofloat() / 100.0;
if (AlphaValue > 1.0) AlphaValue = 1.0;
local IconOffset = {
X = ((getroottable().Rindro_Scr_Width - 55) / 2).tointeger(),
Y = 450
};
L_sq_SetDrawImgModel(2, 0);
L_sq_DrawImg("interface/rindro/new_rank.img", 2, IconOffset.X, IconOffset.Y, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 0.5, 0.5);
L_sq_ReleaseDrawImgModel();
L_sq_DrawImg("interface/rindro/new_rank.img", 1, IconOffset.X + 5, IconOffset.Y + 6, 1, sq_RGBA(255, 255, 255, (250 * AlphaValue).tointeger()), 0.5, 0.5);
if (PlayT <= 300) {
local Str = (MyCombat[0] - 48).tostring();
for (local i = 0; i< MyCombat.len(); i++) {
if (i != 0) Str += (sq_getRandom(0, 9));
}
DrawCombatNormal(Str);
} else {
DrawCombatNormal(MyCombat);
}
DrawCombatChanage(abs(ChanageCombat).tostring(), (ChanageCombat > 0) ? false : true);
}
}
function Show(obj) {
DrawMain(obj);
LenheartNewUI_Windows.Show(obj);
if (Visible) {
DrawCombat();
}
}
//逻辑入口
function Proc(obj) {
LenheartNewUI_Windows.SyncPos(X, Y);
if (!Visible) {
DrawCombat();
}
MainState = Visible;
}
MainState = false;
function OpenCallBack() {
Visible = true;
ResetFocus();
//上传自身信息
PlayerChanageEquCallBack(1);
//获取排行榜信息
GetRankInfo();
}
}
getroottable().rawdelete("CombatRankC_Obj");
function Lenheart_CombatRank_New(obj) {
local RootTab = getroottable();
if (!RootTab.rawin("CombatRankC_Obj")) {
RootTab.rawset("CombatRankC_Obj", true);
local Winobj = LenheartNewUI_CreateWindow(CombatRankC, "新战力排行榜窗口", ((getroottable().Rindro_Scr_Width - 542) / 2).tointeger(), 28, 542, 515, 28);
EventList_Obj.AddEvent("荣誉殿堂", 136, Winobj, "interface2/hud/information_button/information_button_cn.img");
}
}
if (getroottable().rawin("LenheartFuncTab")) {
getroottable()["LenheartFuncTab"].rawset("Lenheart_CombatRank_NewFunc", Lenheart_CombatRank_New);
} else {
local T = {};
T.rawset("Lenheart_CombatRank_NewFunc", Lenheart_CombatRank_New);
getroottable().rawset("LenheartFuncTab", T);
}