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