190 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | /* | ||
|  | 文件名:FiendFightLogic.nut | ||
|  | 路径:Plugins/Fiendwar/FiendFightLogic.nut | ||
|  | 创建日期:2024-05-27	19:18 | ||
|  | 文件用途:超时空战斗逻辑 | ||
|  | */ | ||
|  | class FiendFightLogicC { | ||
|  |     //进入BOSS房间发包告诉服务端的Flag | ||
|  |     IsBossActiveMsgPackFlag = false; | ||
|  | 
 | ||
|  |     constructor() { | ||
|  | 
 | ||
|  |         //注册回调包 | ||
|  |         Pack_Control.rawset(20063030, SetCharacterDamageRate.bindenv(this)); | ||
|  |         Pack_Control.rawset(20063600, CreatePassiveObjectById.bindenv(this)); | ||
|  |         Pack_Control.rawset(20063602, GetBossHp.bindenv(this)); | ||
|  |         Pack_Control.rawset(20063604, SetBossHp.bindenv(this)); | ||
|  |         Pack_Control.rawset(20063608, CheckMonsterIsV.bindenv(this)); | ||
|  |     } | ||
|  | 
 | ||
|  |     //检测怪物是否存在 | ||
|  |     function CheckMonsterIsV(Chunk) { | ||
|  |         if (!IsBossActiveMsgPackFlag) return; | ||
|  |         local Jso = Json.Decode(Chunk); | ||
|  |         local Idx = Jso.id; | ||
|  |         local ObjectBuf = GetObjectByIndex(Idx); | ||
|  |         if (!ObjectBuf) { | ||
|  |             local T = { | ||
|  |                 op = 20063609, | ||
|  |                 id = Idx | ||
|  |             } | ||
|  |             Rindro_BaseToolClass.SendPack(T); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //设置BOSS生命值 | ||
|  |     function SetBossHp(Chunk) { | ||
|  |         if (!IsBossActiveMsgPackFlag) return; | ||
|  |         local Jso = Json.Decode(Chunk); | ||
|  |         local BossObject = GetObjectByIndex(210994); | ||
|  | 
 | ||
|  |         //没找到BOSS | ||
|  |         if (!BossObject) { | ||
|  |             local T = { | ||
|  |                 op = 20063605, | ||
|  |             } | ||
|  |             Rindro_BaseToolClass.SendPack(T); | ||
|  |         } else { | ||
|  |             BossObject.setHp(Jso.hp, null, true); | ||
|  |         } | ||
|  | 
 | ||
|  |     } | ||
|  |     //获取BOSS生命值 | ||
|  |     function GetBossHp(Chunk) { | ||
|  |         if (!IsBossActiveMsgPackFlag) return; | ||
|  |         local BossObject = GetObjectByIndex(210994); | ||
|  |         local curthp = -1; | ||
|  |         local rmaxhp = -1; | ||
|  |         //找到BOSS | ||
|  |         if (BossObject) { | ||
|  |             curthp = BossObject.getHp(); | ||
|  |             rmaxhp = BossObject.getHpMax(); | ||
|  |         } | ||
|  | 
 | ||
|  |         local T = { | ||
|  |             op = 20063603, | ||
|  |             hp = curthp, | ||
|  |             maxhp = rmaxhp | ||
|  |         } | ||
|  |         Rindro_BaseToolClass.SendPack(T); | ||
|  |     } | ||
|  | 
 | ||
|  |     //设置伤害值回调 | ||
|  |     function SetCharacterDamageRate(Chunk) { | ||
|  |         local Jso = Json.Decode(Chunk); | ||
|  |         local Rate = Jso.damageMarkup.tofloat() / 100.0; | ||
|  |         //超时空伤害设置 | ||
|  |         if (getroottable().rawin("LenheartFiendModuleDamageRate")) { | ||
|  |             getroottable()["LenheartFiendModuleDamageRate"] = Rate; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //召唤PassiveObject回调 | ||
|  |     function CreatePassiveObjectById(Chunk) { | ||
|  |         local Jso = Json.Decode(Chunk); | ||
|  |         local ObjectId = Jso.id; | ||
|  |         local ZPos = Jso.z; | ||
|  | 
 | ||
|  |         //确保在BOSS房间才召唤免得游戏崩溃 | ||
|  |         if (IsBossActiveMsgPackFlag) { | ||
|  |             local obj = sq_GetMyMasterCharacter(); | ||
|  |             obj = sq_GetCNRDObjectToActiveObject(obj); | ||
|  |             // obj.sq_SendCreatePassiveObjectPacket(ObjectId, 0, 99999990, 0, ZPos); | ||
|  |             // sq_SendCreatePassiveObjectPacketFromPassivePos(obj, ObjectId, 0, 99999990, 0, ZPos); | ||
|  |             sq_SendCreatePassiveObjectPacket(obj, ObjectId, 0, 99999990, 0, ZPos, obj.getDirection()); | ||
|  |             local Jso = { | ||
|  |                 op = 20063601, | ||
|  |                 id = ObjectId, | ||
|  |                 z = ZPos | ||
|  |             } | ||
|  |             Rindro_BaseToolClass.SendPack(Jso); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     //获取指定对象 | ||
|  |     function GetObjectByIndex(Idx) { | ||
|  |         local obj = sq_GetMyMasterCharacter(); | ||
|  |         obj = sq_GetCNRDObjectToActiveObject(obj); | ||
|  |         local objectManager = obj.getObjectManager(); | ||
|  |         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); | ||
|  |                 local MonsterIndex = activeObj.getCollisionObjectIndex(); | ||
|  |                 if (MonsterIndex == Idx) { | ||
|  |                     return activeObj; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         return null; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     //获取地图ID | ||
|  |     function GetMapIndex() { | ||
|  |         local stage = sq_GetGlobaludpModuleStage(); | ||
|  |         local MapIndex = sq_GetMapIndex(stage); | ||
|  |         return MapIndex; | ||
|  |     } | ||
|  | 
 | ||
|  |     //检测是否在超时空BOSS图 | ||
|  |     function CheckBossIsActive() { | ||
|  |         //如果在副本中 | ||
|  |         if (sq_GetCurrentModuleType() == 3) { | ||
|  |             //在BOSS地图 | ||
|  |             if (GetMapIndex() == 24151) { | ||
|  |                 if (!IsBossActiveMsgPackFlag) { | ||
|  |                     IsBossActiveMsgPackFlag = true; | ||
|  |                     local Jso = { | ||
|  |                         op = 20063801 | ||
|  |                     } | ||
|  |                     Rindro_BaseToolClass.SendPack(Jso); | ||
|  |                     return; | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         //退出副本以后设置flag 还原 | ||
|  |         else { | ||
|  |             IsBossActiveMsgPackFlag = false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     //怪物死亡回调包 | ||
|  |     function MonsterDieCallBack(obj) { | ||
|  |         //遍历怪物死亡 | ||
|  |         local objectManager = obj.getObjectManager(); | ||
|  |         local CollisionObjectNumber = objectManager.getCollisionObjectNumber(); | ||
|  |         for (local i = 0; i< CollisionObjectNumber; i += 1) { | ||
|  |             local object = objectManager.getCollisionObject(i); | ||
|  |             if (object && object.isObjectType(OBJECTTYPE_ACTIVE) && obj.isEnemy(object) && object.isInDamagableState(obj) && object.getTeam() != 0) { | ||
|  |                 local activeObj = sq_GetCNRDObjectToActiveObject(object); | ||
|  |                 if (activeObj.isDead()) { | ||
|  |                     local MonsterIndex = activeObj.getCollisionObjectIndex(); | ||
|  |                     if (MonsterIndex >= 210994 && MonsterIndex <= 210999) { | ||
|  |                         local Jso = { | ||
|  |                             op = 20063503, | ||
|  |                             monster_id = MonsterIndex | ||
|  |                         } | ||
|  |                         Rindro_BaseToolClass.SendPack(Jso); | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     function Proc(obj) { | ||
|  | 
 | ||
|  |         //如果进入BOSS房间需要告诉服务端 | ||
|  |         CheckBossIsActive(); | ||
|  | 
 | ||
|  |         //如果在和BOSS干架 要检测所有怪物的死亡 | ||
|  |         if (IsBossActiveMsgPackFlag) { | ||
|  |             //怪物死亡检测 | ||
|  |             MonsterDieCallBack(obj); | ||
|  |         } | ||
|  |     } | ||
|  | } |