/* 文件名:MonsterBloodUi.nut 路径:UI/MonsterBloodUi/MonsterBloodUi.nut 创建日期:2022-10-14 18:19 文件用途: */ NowHitMonsterId <- null BOSSOpenDraw <- false class NewMonsterBlood extends BasicsDrawTool { Id = null; OldHp = null; NowHp = null; HpArr = null; MonsterBloodUiEffTimer = null; constructor(id) { HpArr = []; Id = id; //构造血条Timer MonsterBloodUiEffTimer = TimeSTL("MonsterBloodUiEffTimerid" + id, 2000); } function Delete() { MonsterBloodUiEffTimer.Delete(); } function SetDate(MonObject, Hp) { if (!MonObject || MonObject.isDead()) return; //if(MonsterBloodUiEffTimer.Get() >= 300 || MonsterBloodUiEffTimer.Get() == 0) //{ if (MonObject.getHp() > Hp) HpArr.append(Hp); //} } function Run(object) { if (!object || object.isDead()) return; if (!OldHp) { OldHp = object.getHp(); HpArr.append(OldHp); HpArr.append(OldHp); //重置时间容器 MonsterBloodUiEffTimer.Reset(); //开始计时 MonsterBloodUiEffTimer.Start(); } } //绘制简易静态Ani // obj -- ani路径 -- X -- Y -- 第几帧 -- ani名字 function DrawStayAni(obj, aniFileName, x, y, index, aniname, R, G, B, A) { if (!obj) return; local SelectAni = obj.getVar().GetAnimationMap(aniname, aniFileName); if (SelectAni) { SelectAni.setRGBA(R, G, B, A); //sq_AnimationProc(SelectAni); sq_DrawSpecificFrame(SelectAni, x, y, false, index, false, 1.0); } } //绘制跟随血条 function DrawF_MonsterHp(obj, OldRate, BloodRate, Time, ArrCount, Xpos, Ypos, MonObject) { local color = 0xFFffffff; if (MonObject.isObjectType(OBJECTTYPE_CHARACTER) && MonObject.getTeam() == 0) color = 0xFF4990aa; //角色对象 else if (MonObject.isObjectType(OBJECTTYPE_CHARACTER) && MonObject.getTeam() != 0) color = 0xFF0000CC; //敌对角色对象 else if (!MonObject.isObjectType(OBJECTTYPE_CHARACTER) && MonObject.getTeam() == 0) color = 0xFF00ff00; //友方对象 L_sq_DrawCode("Lv." + MonObject.GetLevel().tostring(), Xpos - 49, Ypos + 16, color, 0, 1); L_sq_DrawCode(MonObject.GetName(), Xpos - 17, Ypos + 16, color, 0, 1); local R = 0xff; local G = 0x00; local B = 0x00; if (MonObject.getTeam() == 0) { R = 0x00; G = 0xff; } else if (MonObject.getTeam() == 200) { R = 0xFF; G = 0x66; } local MR = 0x00; local MG = 0x99; local MB = 0xFF; T_DrawStayAni(obj, "common/monsterbloodui/new/normain.ani", Xpos - 47, Ypos + 30, 0, "怪物血槽nor底"); //绘制血槽特效 local v = sq_GetUniformVelocity((OldRate * 96.0).tointeger(), (BloodRate * 96.0).tointeger(), Time * (ArrCount - 1), 300); local av = sq_GetUniformVelocity(250, 100, Time * (ArrCount - 1), 300); if (v < 0) v = 0; setClip(Xpos - 47 + 2, Ypos + 30 + 1, Xpos - 47 + 3 + v, Ypos + 30 + 1 + 6); DrawStayAni(obj, "common/monsterbloodui/new/noreff.ani", Xpos - 47 + 3, Ypos + 30 + 2, 0, "怪物血槽nor", 255, 255, 255, av); releaseClip(); //裁切结束 //绘制血槽 setClip(Xpos - 47 + 2, Ypos + 30 + 1, Xpos - 47 + 3 + (BloodRate * 96.0).tointeger(), Ypos + 30 + 1 + 6); DrawStayAni(obj, "common/monsterbloodui/new/noreff.ani", Xpos - 47 + 3, Ypos + 30 + 2, 0, "怪物血槽norEFf", R, G, B, 250); releaseClip(); //如果需要绘制蓝槽 if (MonObject.isObjectType(OBJECTTYPE_CHARACTER) /*|| sq_IsMyControlObject(MonObject)*/ ) { T_DrawStayAni(obj, "common/monsterbloodui/new/normain.ani", Xpos - 47, Ypos + 38, 0, "怪物蓝槽nor底"); local m = ((MonObject.getMp().tofloat() / MonObject.getMpMax().tofloat()) * 96.0).tointeger(); setClip(Xpos - 47 + 2, Ypos + 38 + 1, Xpos - 47 + 3 + m, Ypos + 30 + 1 + 6); DrawStayAni(obj, "common/monsterbloodui/new/noreff.ani", Xpos - 47 + 3, Ypos + 38 + 2, 0, "怪物蓝槽nor", MR, MG, MB, 250); releaseClip(); //裁切结束 } } //绘制固定血条 基础坐标 血槽框补全坐标 血条偏移坐标 血条高度 function DrawFX_MonsterHp(obj, OldRate, BloodRate, Time, ArrCount, Type, X, Y, XF, YF, XS, YS, YM) { local v = sq_GetUniformVelocity((OldRate * 538.0).tointeger(), (BloodRate * 538.0).tointeger(), Time * (ArrCount - 1), 1000); local av = sq_GetUniformVelocity(250, 100, Time * (ArrCount - 1), 1000); if (v < 0) v = 0; //绘制血槽底 T_DrawStayAni(obj, "common/monsterbloodui/zh/normain.ani", X, Y, 0, 0 + "BOSSNewMonsterBloodUi_Main"); //绘制生命值 setClip(X, Y, X + v, Y + YM); local BloodEffAni = obj.getVar().GetAnimationMap(2 + "_NewMonsterBloodUi_BloodEff", "common/monsterbloodui/zh/normain.ani"); BloodEffAni.setRGBA(255, 255, 255, av); sq_DrawSpecificFrame(BloodEffAni, X, Y, false, 2, false, 1.0); releaseClip(); setClip(X, Y, X + (BloodRate * 538).tointeger(), Y + YM); T_DrawStayAni(obj, "common/monsterbloodui/zh/normain.ani", X, Y, 1, 1 + "_NewMonsterBloodUi_Blood"); releaseClip(); } function Draw(obj, MonObject) { if (!MonObject || !obj || MonObject.isDead() || obj.isDead()) return; local Xpos = sq_GetScreenXPos(MonObject); local Ypos = sq_GetScreenYPos(MonObject); //local Zpos = sq_GetHeightObject(MonObject); //Ypos -= (Zpos * 1.50).tointeger(); local ArrCount = HpArr.len(); if (ArrCount > 1) { ///print(11111); local Time = MonsterBloodUiEffTimer.Get(); if (Time == false) return; if ((Time * (ArrCount - 1)) >= 300 && ArrCount > 2) { HpArr.remove(0); //重置时间容器 MonsterBloodUiEffTimer.Reset(); //开始计时 MonsterBloodUiEffTimer.Start(); } OldHp = HpArr[0]; NowHp = HpArr[1]; local OldRate = OldHp.tofloat() / MonObject.getHpMax().tofloat(); local BloodRate = NowHp.tofloat() / MonObject.getHpMax().tofloat(); //普通怪物血条 //DrawFX_MonsterHp(obj, OldRate, BloodRate, Time, ArrCount, 0, 0, 110, 626, 15, 29, 17, 27); if (getroottable().rawin("S_MonsterBloodSB") && getroottable()["S_MonsterBloodSB"] == true) { //Boss血条 if (sq_IsBoss(MonObject)) { //DrawFX_MonsterHp(obj, OldRate, BloodRate, Time, ArrCount, 8, 0, 110, 628, 0, 34, 4, 50); } //普通怪物血条 else if (!sq_IsBoss(MonObject)) DrawF_MonsterHp(obj, OldRate, BloodRate, Time, ArrCount, Xpos, Ypos, MonObject); } else { } //Boss血条 if (sq_GetObjectId(MonObject) == NowHitMonsterId && sq_IsBoss(MonObject) && BOSSOpenDraw == true) { DrawFX_MonsterHp(obj, OldRate, BloodRate, Time, ArrCount, 8, 34, 130, 628, 0, 34, 4, 50); BOSSOpenDraw = false; } } } } function NewMonsterBloodUi(obj) { local RootTab = getroottable(); if (sq_GetCurrentModuleType() == 3 || sq_GetCurrentModuleType() == 10 || sq_GetCurrentModuleType() == 12 || sq_GetCurrentModuleType() == 13) { if (RootTab.rawin("MonBloodUI") == false) { local Map = {}; RootTab.rawset("MonBloodUI", Map); } } } //Hook获取是否要使用新版血条 function Sq_GetDrawMonBloodSw() { if (getroottable().rawin("S_MonsterBloodSB")) return getroottable()["S_MonsterBloodSB"]; else return false; } //新版怪物血条回调 function Sq_DrawMonsterBlood(Object, X, Y) { BOSSOpenDraw = true; //Sout("X: %L" , X); //Sout("Y: %L" , Y); } //附加Ap function MonsterBlood_ApAdd(obj) { local objectManager = obj.getObjectManager(); if (!objectManager) return; local CollisionObjectNumber = objectManager.getCollisionObjectNumber(); for (local i = 0; i < CollisionObjectNumber; i += 1) { local object = objectManager.getCollisionObject(i); if (object && object.isObjectType(OBJECTTYPE_ACTIVE)) { local activeObj = sq_GetCNRDObjectToActiveObject(object); //活動類 //沒死亡 if (!activeObj.isDead()) { if (!CNSquirrelAppendage.sq_IsAppendAppendage(activeObj, "appendage/currency_monster.nut")) { local append = CNSquirrelAppendage.sq_AppendAppendage(activeObj, obj, -1, true, "appendage/currency_monster.nut", false); CNSquirrelAppendage.sq_AppendAppendageID(append, activeObj, obj, 255, false); } } } } }