237 lines
8.9 KiB
Plaintext
237 lines
8.9 KiB
Plaintext
/*
|
|
文件名: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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |