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