// 执行动作 // 若为瞬间动作,返回true; // 若为持续动作,该函数会每帧被调用,直到返回true public override bool Logic() { if (Pathea.PeGameMgr.IsMulti) { byte[] data = PETools.Serialize.Export(w => { BufferHelper.Serialize(w, obj); BufferHelper.Serialize(w, range); }); PlayerNetwork.RequestServer(EPacketType.PT_Custom_Kill, data); } else { if (obj.isPrototype) { if (obj.type == OBJECT.OBJECTTYPE.MonsterProto) { foreach (var item in Pathea.EntityMgr.Instance.All) { if (item.commonCmpt.entityProto.proto != Pathea.EEntityProto.Monster) { continue; } if (!PeScenarioUtility.IsObjectContainEntity(obj, item)) { continue; } if (!range.Contains(item.position)) { continue; } item.SetAttribute(Pathea.AttribType.Hp, 0, false); } } } else { Pathea.PeEntity entity = PeScenarioUtility.GetEntity(obj); if (null != entity && range.Contains(entity.position)) { entity.SetAttribute(Pathea.AttribType.Hp, 0, false); } } } return(true); }
// 判断条件 public override bool?Check() { Transform trans = PeScenarioUtility.GetObjectTransform(obj); if (trans == null) { return(range.type == RANGE.RANGETYPE.Anywhere); } return(range.Contains(trans.position)); }
/// <summary> /// 删除指定范围内Object /// </summary> /// <param name="proto">Object类型</param> /// <param name="range">删除范围</param> /// <returns></returns> public static bool RemoveObjects(OBJECT proto, RANGE range) { if (!proto.isPrototype) { return(false); } if (proto.isAnyPrototype) { SpawnDataSource data = PeCustomScene.Self.spawnData; if (proto.type == OBJECT.OBJECTTYPE.MonsterProto) { // Monster point _tempSPList.Clear(); foreach (var kvp in data.monsters) { if (range.Contains(kvp.Value.entityPos)) { _tempSPList.Add(kvp.Value); } } for (int i = 0; i < _tempSPList.Count; i++) { PeCustomScene.Self.RemoveSpawnPoint(_tempSPList[i]); } _tempSPList.Clear(); // Monster area foreach (var kvp in data.areas) { for (int i = 0; i < kvp.Value.Spawns.Count; i++) { for (int j = 0; j < kvp.Value.Spawns[i].spawnPoints.Count; j++) { MonsterSpawnPoint msp = kvp.Value.Spawns[i].spawnPoints[j]; if (range.Contains(msp.entityPos)) { if (msp.EntityID != -1) { CreatureMgr.Instance.Destory(msp.EntityID); } } } } } } else if (proto.type == OBJECT.OBJECTTYPE.ItemProto) { List <ISceneObjAgent> agents = SceneMan.GetSceneObjs <DragItemAgent>(); for (int i = 0; i < agents.Count; i++) { DragItemAgent drag_agent = agents[i] as DragItemAgent; if (range.Contains(drag_agent.position)) { DragItemAgent.Destory(drag_agent); } } } } else { SpawnDataSource data = PeCustomScene.Self.spawnData; if (proto.type == OBJECT.OBJECTTYPE.MonsterProto) { // Monster point _tempSPList.Clear(); foreach (var kvp in data.monsters) { if (kvp.Value.Prototype == proto.Id && range.Contains(kvp.Value.entityPos)) { _tempSPList.Add(kvp.Value); } } for (int i = 0; i < _tempSPList.Count; i++) { PeCustomScene.Self.RemoveSpawnPoint(_tempSPList[i]); } _tempSPList.Clear(); // Monster area foreach (var kvp in data.areas) { for (int i = 0; i < kvp.Value.Spawns.Count; i++) { for (int j = 0; j < kvp.Value.Spawns[i].spawnPoints.Count; j++) { MonsterSpawnPoint msp = kvp.Value.Spawns[i].spawnPoints[j]; if (kvp.Value.Prototype == proto.Id && range.Contains(msp.entityPos)) { if (msp.EntityID != -1) { CreatureMgr.Instance.Destory(msp.EntityID); } } } } } } else if (proto.type == OBJECT.OBJECTTYPE.ItemProto) { List <ISceneObjAgent> agents = SceneMan.GetSceneObjs <DragArticleAgent>(); for (int i = 0; i < agents.Count; i++) { DragArticleAgent drag_agent = agents[i] as DragArticleAgent; if (drag_agent.itemDrag.itemObj.protoId == proto.Id && range.Contains(drag_agent.position)) { DragItemAgent.Destory(drag_agent); } } } } return(true); }