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