Sqr/UI/MonsterBloodUi/MonsterBloodUi.nut

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);
}
}
}
}
}