/* 文件名:SkinHub.nut 路径:Project/SkinHub/SkinHub.nut 创建日期:2024-09-27 22:44 文件用途:皮肤仓库 */ class DamageFontObjectC { X = 0; Y = 0; IDX = null; UIdx = null; gName = null; gImgPath = null; gMaxNumArr = null; ID = null; Parent = null; ItemId = null; constructor(ItemId, gName, gImgPath, gMaxNumArr, gId, Parent) { this.gName = gName; this.gImgPath = gImgPath; this.gMaxNumArr = gMaxNumArr; this.gMaxNumArr = gMaxNumArr; this.ID = gId; this.Parent = Parent; this.ItemId = ItemId; } //绘制 function Show(obj, x, y) { X = x; Y = y; //绘制底 L_sq_DrawImg("interface2/skinstorage/slots.img", 0, x, y); L_Sq_DrawItem(X + 22, Y + 23, ID, 1, 0, 0, 0); //绘制盖子 L_sq_DrawImg("interface2/skinstorage/slots.img", 2, x, y); // L_sq_DrawCode(gName, X + 84, Y + 23, sq_RGBA(178, 155, 113, 250), 0, 1); L_sq_DrawCode("Yosin皮肤字体", X + 84, Y + 40, sq_RGBA(255, 177, 0, 250), 0, 1); L_sq_DrawCode("无限制使用", X + 84, Y + 55, sq_RGBA(255, 85, 0, 250), 0, 1); //绘制选中效果 if (Parent.FocusPrintIdx == ItemId) L_sq_DrawImg("interface2/skinstorage/slots.img", 4, x, y); //绘制应用中 if (Parent.NowDamageSkinIndex == ItemId) L_sq_DrawImg("interface2/skinstorage/slots.img", 23, x + 290, y + 3); } } class SkinHubC extends LenheartNewUI_Windows { //调试模式 // DeBugMode = true; //不是窗口 // NoWindow = true; //是否可见 Visible = false; //当前字体皮肤编号 NowDamageSkinIndex = null; //拥有的字体列表 HasDamageSkinList = null; //字体皮肤数据 DamageSkinList = null; //数字伤害类型 RealType = null; //当前页面 NowPage = 0; //最大伤害数字 MaxDamageNumber = 99999999; //显示对象 FocusPrintIdx = 561320400; FocusPrintType = 0; //Nut白字倍率 NutWRate = 0; FontIdx = 0; MapBaseXPos = 0; MapBaseYPos = 0; DamageFontArray = null; //获取字体列表信息 function GetFontList() { local T = { op = 20076005, } SendPack(T); } //获取字体列表信息回调 function GetFontListCallBack(Chunk) { local Jso = Json.Decode(Chunk); NowDamageSkinIndex = Jso.damagefontCurrent; InitDamageFont(NowDamageSkinIndex); FocusPrintIdx = Jso.damagefontCurrent; foreach(value in Jso.damagefont) { DamageSkinList[value].IsHave = true; } } //基础信息包回调 function GetBaseInfoCallBack(Chunk) { DamageSkinList = {}; local Jso = Json.Decode(Chunk); local Info = Jso.ZipS; Info = Json.Decode(L_sq_Dezlib(Info)).info; foreach(Idx, value in Info) { value.IsHave <- false; DamageSkinList.rawset(Idx.tointeger(), value); } } //初始化伤害字体 function InitDamageFont(Idx) { if (Idx == null) { for (local i = 0; i< 7; i++) { L_sq_IntiNumberDraw("common/etc/damagefontskin/damagefont00.img", 0 + (i * 10), i); } } else { for (local i = 0; i< 7; i++) { L_sq_IntiNumberDraw(DamageSkinList[Idx].gImgPath, 0 + (i * 10), i); } } } //初始化数字伤害类型 function InitRealType() { RealType = [0, 5, 1, 5, 2, 5, 1, 2, 3, 5, 4, 5, 3, 5, 4, 5, 0, 5, 4, 5, 2, 5, 4]; } //设置NUT白字 function SetNutRate() { // local allRate = 1.0; // for (local i = 1; i < 41; i++) { // allRate = allRate * (sq_GetIntData(obj, 169, i) / 100).tofloat(); // } // for (local w = 1; w < 21; w++) { // allRate = allRate * (sq_GetIntData(obj, 174, w) / 100).tofloat(); // } NutWRate = 1.0; } //设置地图原点 function SetMapBasePos(obj) { local objectManager = obj.getObjectManager(); if (!objectManager) return; MapBaseXPos = objectManager.getFieldXPos(0, ENUM_DRAWLAYER_NORMAL); MapBaseYPos = objectManager.getFieldYPos(0, 0, ENUM_DRAWLAYER_NORMAL); } constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH) { Childrens = []; DamageFontArray = {}; DamageSkinList = {}; HasDamageSkinList = []; local T = { gIdx = 0, //伤害字体排列编号 gName = "默认伤害字体", //伤害字体名称 gImgPath = "common/etc/damagefontskin/damagefont00.img", //Img路径 gMaxNumArr = [73, 72], //普通999帧数数组 gKeyMaxNumArr = [71, 70], //暴击999帧数数组 itemId = 561320400, //道具ID IsHave = true } DamageSkinList.rawset(561320400, T); //注册控件 RegisterWidget(); LenheartNewUI_Windows.constructor(gObjectId, gX, gY, gWidth, gHeight, gTitleH); Pack_Control.rawset(20076006, GetFontListCallBack.bindenv(this)); Pack_Control.rawset(20076010, GetBaseInfoCallBack.bindenv(this)); PushDamageFontDataFuncTab.rawset("SkinHub", PushDamageFontArray.bindenv(this)); //初始化伤害类型 InitRealType(); //初始化伤害字体 InitDamageFont(NowDamageSkinIndex); } function RegisterWidget() { //关闭按钮 local CloseButton = LenheartNewUI_BaseButton(765, 2, 11, 12, "interface/lenheartwindowcommon.img", 276); CloseButton.OnClick = function() { this.Visible = false; }.bindenv(this); Childrens.append(CloseButton); for (local i = 0; i< 5; i++) { //激活按钮 local ActiveButton = LenheartNewUI_ButtonText(700, 140 + (i * 85), 15, "应 用"); ActiveButton.Data = i; ActiveButton.SetFrame(null, 172); ActiveButton.SetTextOffset(-3, 1); ActiveButton.OnClickEx = function(Button) { local T = { op = 20076007, itemId = HasDamageSkinList[Button.Data + abs(NowPage)], type = 0 } SendPackEx(T); NowDamageSkinIndex = HasDamageSkinList[Button.Data + abs(NowPage)]; FocusPrintIdx = HasDamageSkinList[Button.Data + abs(NowPage)]; InitDamageFont(HasDamageSkinList[Button.Data + abs(NowPage)]); }.bindenv(this); ActiveButton.SetCallBackFunc(function(Button) { if (Button.Data >= (HasDamageSkinList.len())) { Button.Visible = false; } else { Button.Visible = true; } }.bindenv(this)) AddChild(ActiveButton); } //测试伤害按钮 local TestButton = LenheartNewUI_ButtonText(10, 536, 15, "测试字体"); TestButton.SetFrame(null, 172); TestButton.SetTextOffset(-7, 1); TestButton.OnClickEx = function(Button) { PushDamageFontArray(0x1AB7CDC, 400, 300, 0, Clock(), FocusPrintType, 0, 0); }.bindenv(this); TestButton.SetCallBackFunc(function(Button) { if (Button.isInRect) { L_sq_DrawWindow(X + 10, Y + 500, 160, 12, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); L_sq_DrawCode("按下[空格键]以测试伤害数字。", X + 18, Y + 512, sq_RGBA(178, 155, 113, 250), 0, 1); } }.bindenv(this)) AddChild(TestButton); } //绘制主界面 function DrawMain(obj) { //绘制窗口 L_sq_DrawImg("interface2/skinstorage/skinstorage.img", 0, X, Y); //绘制字体排列窗口 L_sq_DrawImg("interface2/skinstorage/skinstorage.img", 5, X + 421 - 9, Y + 108 - 67); //总览 L_sq_DrawImg("interface2/skinstorage/tab/tab_summary.img", 3, X + 421 - 8, Y + 46 - 8); //边框 L_sq_DrawImg("interface2/skinstorage/tab/tab_partyframe.img", 3, X + 487 - 8, Y + 46 - 8); //伤害字体 L_sq_DrawImg("interface2/skinstorage/tab/tab_damagefonts.img", 2, X + 533 + 4, Y + 42 - 3); //觉醒插图 L_sq_DrawImg("interface2/skinstorage/tab/tab_cutscene.img", 3, X + 609 - 7, Y + 52 - 14); //表情 L_sq_DrawImg("interface2/skinstorage/tab/tab_instantemoticon.img", 3, X + 674 - 16, Y + 49 - 11); //表情 L_sq_DrawImg("interface2/skinstorage/tab/tab_weaponlook.img", 3, X + 722 - 7, Y + 55 - 17); L_sq_DrawCode("伤害字体类型: " + FocusPrintType, X + 84, Y + 542, sq_RGBA(178, 155, 113, 250), 0, 1); local RealDrawPos = 0; HasDamageSkinList = []; foreach(Pos, v in DamageSkinList) { //如果拥有字体 if (v.IsHave) { HasDamageSkinList.append(v.itemId); local Yoffset = ((RealDrawPos + NowPage) * 85); RealDrawPos++; if (Yoffset > 400 || Yoffset< 0) continue; local Dobj = DamageFontObjectC(v.itemId, v.gName, v.gImgPath, v.gMaxNumArr, v.itemId, this); Dobj.Show(obj, X + 425, Y + 114 + Yoffset); } } //绘制页数 local Page = (abs(NowPage) + 1) + " / " + (abs(HasDamageSkinList.len() - 5) + 1); L_sq_DrawCode(Page, X + 586 + LenheartTextClass.GetStringLength(Page) / 2, Y + 537, sq_RGBA(150, 255, 30, 250), 0, 1); local chr = sq_GetCNRDObjectToSQRCharacter(obj); local charAni = chr.sq_GetStayAni(); sq_AnimationProc(charAni); sq_drawCurrentFrame(charAni, X + 210, Y + 364, false); local MonsterAni = T_DrawDynamicAni_Fx(obj, "monster/goblin/animation_goblin2/down.ani", X + 360, Y + 364, "伤害字体哥布林倒地"); local NeArray = TryGetArry(1); if (sq_GetCurrentTime(MonsterAni) >= 1000 && NeArray.len() == 0) { local Timer = Clock(); local T = { gIdx = "演示字体" + FontIdx, XPos = X + 166, YPos = Y + 230, DamageNum = 999999999, Type = 5, TimeObj = Timer, isKeyHit = false, } NeArray.append(T); DamageFontArray.rawset(1, NeArray); sq_Rewind(MonsterAni); } } function TryGetArry(Type) { if (DamageFontArray.rawin(Type)) return DamageFontArray[Type]; else return []; } //将伤害字体数据Push进数组 function PushDamageFontArray(ObjAddress, X, Y, Z, Value, Type, A1, A2) { local Timer = Clock(); local gRealType; if (Type <= 7) gRealType = RealType[Type]; else gRealType = RealType[((Type - 7) % 16) + 7]; //暴击 local KeyHit = false; if (Type == 17) KeyHit = true; //是扣血还是回血 if (Type == 7) { if (Value< 0) gRealType = 4; } if (Type == 4) { if (Value< 0) gRealType = 0; } if (Type == 1 || Type == 17) { //记录总伤害 local oldDamageNum = Value; //计算我的真是伤害 Value = (Value / NutWRate).tointeger(); //减去真实伤害 就是nut伤害 local newDamageNum = oldDamageNum - Value; //如果有Nut伤害存在 if (newDamageNum > 0) { local NeArray = TryGetArry(Type); local Timer = Clock(); local T = { gIdx = ObjAddress + FontIdx, XPos = X, YPos = Y - Z - (NeArray.len() * 16), DamageNum = Value, Type = 0, TimeObj = Timer, isKeyHit = KeyHit, } NeArray.append(T); DamageFontArray.rawset(Type, NeArray); ++FontIdx; } } local NeArray = TryGetArry(Type); local T = { gIdx = ObjAddress + FontIdx, XPos = X + sq_getRandom(-15, 15), YPos = Y - Z + sq_getRandom(-20, 20), DamageNum = Value, Type = gRealType, TimeObj = Timer, isKeyHit = KeyHit, } NeArray.append(T); DamageFontArray.rawset(Type, NeArray); ++FontIdx; return false; } function DrawFontImg(X, Y, Type, DamageNum, Time, isKeyHit) { local rate = sq_GetUniformVelocity(60, 100, Time, 100); rate = rate.tofloat() / 100.0; //如果暴击 if (isKeyHit) { rate *= 1.3; Type = 4; } //白字 if (Type == 0) { rate *= 0.7; Y += 60; } local UpOffset = 0; local Alpha = 0; //超过0.3秒开始飘 if (Time >= 300) { UpOffset = sq_GetUniformVelocity(0, 15, Time - 300, 500); } //超过0.3秒开始飘 if (Time >= 800) { UpOffset = sq_GetAccel(15, 100, Time - 800, 500, true); Alpha = sq_GetUniformVelocity(0, 250, Time - 800, 500); } if (DamageNum > MaxDamageNumber) { if (isKeyHit) { foreach(imgpos in DamageSkinList[FocusPrintIdx].gKeyMaxNumArr) { L_sq_DrawImg(DamageSkinList[FocusPrintIdx].gImgPath, imgpos, X + ((30 * (MaxDamageNumber.tostring().len())) - ((20 * (MaxDamageNumber.tostring().len())) * rate)), Y + (20 - (20 * rate)) - UpOffset, 0, sq_RGBA(255, 255, 255, 255 - Alpha), rate, rate); } } else { foreach(imgpos in DamageSkinList[FocusPrintIdx].gMaxNumArr) { L_sq_DrawImg(DamageSkinList[FocusPrintIdx].gImgPath, imgpos, X + ((30 * (MaxDamageNumber.tostring().len())) - ((20 * (MaxDamageNumber.tostring().len())) * rate)), Y + (20 - (20 * rate)) - UpOffset, 0, sq_RGBA(255, 255, 255, 255 - Alpha), rate, rate); } } } else { // L_sq_DrawNumber(X + ((30 * (DamageNum.tostring().len())) - ((20 * (DamageNum.tostring().len())) * rate)), Y + (20 - (20 * rate)) - UpOffset, sq_RGBA(255, 255, 255, 255 - Alpha), rate, rate, Type, 18 * rate, 6, sq_Abs(DamageNum)); L_sq_DrawNumber(X, Y - UpOffset, sq_RGBA(255, 255, 255, 255 - Alpha), rate, rate, Type, sq_Abs(DamageNum)); } } //伤害字体绘制 function DrawFont(obj) { foreach(Type, FontArrayObject in DamageFontArray) { if (Type == 0) continue; for (local i = 0; i< FontArrayObject.len(); i++) { local FontObject = FontArrayObject[i]; if (FontObject) { local Timer = FontObject.TimeObj; if (Timer) { local Time = Clock() - Timer; if (Time >= 1300) { FontObject.TimeObj = null; FontArrayObject.remove(i); continue; } else { DrawFontImg(FontObject.XPos - MapBaseXPos, FontObject.YPos - MapBaseYPos, FontObject.Type, FontObject.DamageNum, Time, FontObject.isKeyHit); } } } } } //白字 foreach(Type, FontArrayObject in DamageFontArray) { if (Type != 0) break; for (local i = 0; i< FontArrayObject.len(); i++) { local FontObject = FontArrayObject[i]; if (FontObject) { local Timer = FontObject.TimeObj; if (Timer) { local Time = Clock() - Timer; if (Time >= 1100) { FontObject.TimeObj = null; FontArrayObject.remove(i); continue; } else { DrawFontImg(FontObject.XPos - MapBaseXPos, FontObject.YPos - MapBaseYPos, FontObject.Type, FontObject.DamageNum, Time, FontObject.isKeyHit); } } } } } } function T_DrawDynamicAni_Fx(obj, aniFileName, x, y, aniname) { local ani = obj.getVar().GetAnimationMap(aniname, aniFileName); ani.setImageRateFromOriginal(-1.0, 1.0); sq_AnimationProc(ani); sq_drawCurrentFrame(ani, x, y, true); return ani; } function Show(obj) { DrawMain(obj); LenheartNewUI_Windows.Show(obj); } function TopShow(obj) { //绘制字体 DrawFont(obj); if (MousePosFlag == 1) { L_sq_DrawWindow(X + 60, Y + 500, 160, 12, "interface/lenheartwindowcommon.img", 97, 11, 12, 11, 13); L_sq_DrawCode("使用鼠标滚轮以改变字体类型。", X + 68, Y + 512, sq_RGBA(178, 155, 113, 250), 0, 1); } } MousePosFlag = 0; //override //鼠标滚轮事件回调 function OnMouseWheel(Flag, MousePos_X, MousePos_Y) { MousePos_X -= X; MousePos_Y -= Y; //鼠标在滚动字体类型区域 if (MousePosFlag == 1) { if (Flag) { if (FocusPrintType< 17) FocusPrintType++; } else { if (FocusPrintType > 0) FocusPrintType--; } } else if (MousePosFlag == 2) { if (Flag) { if (NowPage< 0) NowPage++; } else { if ((HasDamageSkinList.len()) > abs(NowPage - 5)) NowPage--; } } //调用原生方法 LenheartNewUI_Windows.OnMouseWheel(Flag, MousePos_X, MousePos_Y); } //override function OnMouseProc(Flag, MousePos_X, MousePos_Y) { //调用原生方法 LenheartNewUI_Windows.OnMouseProc(Flag, MousePos_X, MousePos_Y); MousePos_X -= X; MousePos_Y -= Y; //鼠标在滚动字体类型区域 if (MousePos_X >= 82 && MousePos_Y >= 538 && MousePos_X <= 188 && MousePos_Y <= 558) { MousePosFlag = 1; } else if (MousePos_X >= 420 && MousePos_Y >= 110 && MousePos_X <= 782 && MousePos_Y <= 564) { MousePosFlag = 2; } else { MousePosFlag = 0; } } //逻辑入口 function Proc(obj) { LenheartNewUI_Windows.SyncPos(X, Y); //绘制字体 if (sq_GetCurrentModuleType() == 3) DrawFont(obj); //回到城镇清空字体数组 else if (Visible == false) { DamageFontArray = null; DamageFontArray = {}; MapBaseXPos = 0; MapBaseYPos = 0; } //设置地图原点 SetMapBasePos(obj); //设置NUT白字 SetNutRate(); if (KeyPressNB.isKeyPress(7, "damage") && this.Visible && sq_GetCurrentModuleType() != 3) { PushDamageFontArray(0x1AB7CDC, 400, 300, 0, Clock(), FocusPrintType, 0, 0); } } function OpenCallBack() { this.Visible = true; ResetFocus(); GetFontList(); } } function Lenheart_SkinHub_Fun(obj) { local RootTab = getroottable(); if (!RootTab.rawin("SkinHub_Obj")) { local Winobj = LenheartNewUI_CreateWindow(SkinHubC, "皮肤仓库窗口", ((getroottable().Rindro_Scr_Width - 788) / 2).tointeger(), 12, 788, 576, 26); EventList_Obj.AddEvent("皮肤仓库", 670, Winobj, "interface2/hud/information_button/information_button_cn.img"); RootTab.rawset("SkinHub_Obj", Winobj); } } getroottable()["LenheartFuncTab"].rawset("SkinHubFuncN", Lenheart_SkinHub_Fun);