public override bool OnTransport(NPCInstance npc) { if (null == npc) { return(false); } if (npc.IsMoving) { return(false); } TriggerInstance trigger = npc.HostMap.InTriggerRange(npc); if (null == trigger) { npc.ChangeState(eNPCState.Pause); mPathNodes.CleanUp(); npc.OnLeaveMap(); } else { if (!mPathNodes.NextTargetPos()) { npc.ChangeState(eNPCState.Pause); return(false); } npc.Trigger = trigger; npc.OnJumpToMap(); npc.ChangeState(eNPCState.WaitJumpMap); } return(true); }
private static void __InstanceKillMonster_Listener(EventDispatcher listener, object data) { //获取副本数据 ChallengeInstance instance = listener as ChallengeInstance; if (null == instance || null == instance.mCopyTplData) { return; } NPCInstance target = data as NPCInstance; if (null == target) { return; } instance.mKilledMobNum++; if (instance.mCopyTplData.targetId == 0) //杀光所有怪物 { if (instance.mKilledMobNum == instance.mTotalMobNum) { instance.OnFinish(true); } } else { if (instance.mCopyTplData.targetId == target.NPCData.TemplateId) { instance.OnFinish(true); } } }
private static void __InstanceProtectTarget_Listener(EventDispatcher listener, object data) { //获取副本数据 ChallengeInstance instance = listener as ChallengeInstance; if (null == instance || null == instance.mCopyTplData) { return; } NPCInstance target = data as NPCInstance; if (null == target) { return; } instance.mKilledMobNum++; if (instance.mCopyTplData.targetId == target.NPCData.TemplateId) //保护目标已死,任务失败 { instance.OnFinish(false); } else { if (instance.mKilledMobNum == instance.mTotalMobNum) { NPCInstance protectTarget = instance.GetNPC(instance.mCopyTplData.targetId); if (null != protectTarget && !protectTarget.IsDie) { instance.OnFinish(true); } } } }
public virtual bool OnKilled(NPCInstance npc) { npc.ChangeState(eNPCState.Dead); npc.mAttackTarget = 0; return(true); }
public void AddNPC(NPCInstance npc) { lock (mAddedNPCList) { mAddedNPCList.Add(npc); } }
public override bool FollowTarget(NPCInstance npc, RoleActor target) { if (!base.FollowTarget(npc, target)) { return(false); } Vector3 standPos = target.GetSurroundPosition(npc.GetPosition(), (int)npc.mCastSpellDistance, npc.Id); if (!Util.PassableForMod(npc.HostMap.Navigator, standPos)) { if (!Util.PassableForMod(npc.HostMap.Navigator, target.GetPosition())) { return(false); } standPos = target.GetPosition(); } if (!npc.MoveTo(standPos)) { return(false); } npc.ChangeState(eNPCState.FollowTarget); return(true); }
public virtual void OnInit() { foreach (var NpcData in mMapInfo.MapDetail.NpcList) { try { var tplNpc = CSTable.StaticDataManager.NPCTpl[NpcData.tid]; if (tplNpc.type == (int)CSCommon.eNpcType.FoodCar || tplNpc.type == (int)CSCommon.eNpcType.MoneyCar) { continue; } NPCInstance.CreateNPCInstance(NpcData, this); } catch (System.Exception ex) { Log.Log.Server.Warning("CreateNPCInstance Error,id={0}", NpcData.tid); } } foreach (var portal in mMapInfo.MapDetail.PortalList) { try { var p = TriggerInstance.CreateTriggerInstance(portal, this); if (null == p) { continue; } AddTrigger(p); } catch (System.Exception ex) { Log.Log.Server.Warning("CreateTriggerInstance Error,id={0}", portal.id); } } foreach (var path in mMapInfo.MapDetail.PathList) { foreach (var node in path.PatrolNodeList) { try { var p = WayPoint.CreateWayPoint(node, this); if (null == p) { continue; } AddWayPoint(path.id, p); } catch (System.Exception ex) { Log.Log.Server.Warning("CreateWayPoint Error,pathId={0},nodeId={1}", path.id, node.id); } } } }
public void RemoveNPC(NPCInstance npc) { lock (mRemovedNPCList) { mRemovedNPCList.Add(npc); } //mNpcDictionary.Remove(npc.Id); }
public override bool OnWaitJumpMap(NPCInstance npc) { if (npc.mStateLastTime > 1000) { npc.ChangeState(eNPCState.Idle); } return(true); }
public override bool OnPatrol(NPCInstance npc) { if (!npc.IsMoving) { npc.ChangeState(eNPCState.Idle); } return(true); }
public override bool OnKilled(NPCInstance npc) { if (!base.OnKilled(npc)) { return(false); } return(true); }
public override bool OnIdle(NPCInstance npc) { if (npc.mStateLastTime > 1000) { StartTransport(npc); } return(true); }
private NPCInstance CreateNpc(MapInfo_Npc NpcData) { NpcData.rebornTime = -1; NpcData.guardRange = 1000; if (NpcData.camp == (int)eCamp.Friend) { NpcData.camp = (int)Owner.Camp; } return(NPCInstance.CreateNPCInstance(NpcData, this)); }
void OnTimeReborn(TimerEvent evt) { var map = evt.param as MapInstance; if (map == null || map.Planes == null) { return; } NPCInstance.CreateNPCInstance(InMapData, map); }
public override bool OnIdle(NPCInstance npc) { if (npc.mStateLastTime > GameSet.Instance.ChallengeWaitTime) { if (npc.SelectSpell()) { npc.ChangeState(eNPCState.FollowTarget); } } return(true); }
public override bool SelectTarget(NPCInstance npc) { if (!base.SelectTarget(npc)) { return(false); } RoleActor target = npc.GetTarget(npc.mAttackTarget); return(npc.FollowTarget(target)); }
public virtual bool FollowTarget(NPCInstance npc, RoleActor target) { if (null == npc) { return(false); } if (null == target || target.IsDie) { return(false); } return(true); }
public override bool StartTransport(NPCInstance npc) { if (null == npc.HostMap) { return(false); } if (mPathNodes.targetPosNode.Count == 0) { var tplMapWay = CommonUtil.GetMapWayDataByType(npc.Camp, eCarType.FoodCar); if (null == tplMapWay) { return(false); } mPathNodes.CleanUp(); mPathNodes.targetPosNode.AddLast(tplMapWay.path1); mPathNodes.targetPosNode.AddLast(tplMapWay.path2); mPathNodes.targetPosNode.AddLast(tplMapWay.path3); mPathNodes.targetPosNode.AddLast(tplMapWay.path4); mPathNodes.targetPosNode.AddLast(tplMapWay.path5); mPathNodes.currNode = mPathNodes.targetPosNode.First; } int targetPath = 0; if (!mPathNodes.GetCurTargetPos(ref targetPath)) { return(false); } List <UInt64> wayPoints = npc.HostMap.GetWayPointList(targetPath); LinkedList <Vector3> nodes = new LinkedList <Vector3>(); foreach (var id in wayPoints) { WayPoint wp = npc.HostMap.GetWayPoint(id); if (null == wp) { continue; } nodes.AddLast(wp.GetPosition()); } npc.SetMoveNodes(nodes); npc.ChangeState(eNPCState.Transport); return(true); }
public virtual void OnRoleLeaveMap(RoleActor role) { // 广播给客户端 BroadcastRoleLeave(role); var loc = role.GetPosition(); var mapCell = GetMapCell(loc.X, loc.Z); mapCell.RemoveRole(role); if (mTransmitingNpc == role) { mTransmitingNpc = null; mNpcCreatingQueue.Clear(); } }
public override bool FollowTarget(NPCInstance npc, RoleActor target) { if (!base.FollowTarget(npc, target)) { return(false); } //超出追击范围 if (Util.DistanceH(npc.GetPosition(), npc.mSpawnPoint) > npc.InMapData.followRange) { return(false); } npc.SelectSpell(); if (npc.CanCastSpell()) { //到释放技能距离 npc.ChangeState(eNPCState.WaitCoolDown); } else { if (npc.InMapData.followRange > 0) { Vector3 standPos = target.GetSurroundPosition(npc.GetPosition(), (int)npc.mCastSpellDistance, npc.Id); if (!Util.PassableForMod(npc.HostMap.Navigator, standPos)) { if (!Util.PassableForMod(npc.HostMap.Navigator, target.GetPosition())) { return(false); } standPos = target.GetPosition(); } if (!npc.MoveTo(standPos)) { return(false); } } npc.ChangeState(eNPCState.FollowTarget); } return(true); }
public override bool OnIdle(NPCInstance npc) { if (npc.mNextPatrolTime == 0) { int minMillisecond = (int)npc.InMapData.patrolInternalMin * 1000; int maxMillisecond = (int)npc.InMapData.patrolInternalMax * 1000; npc.mNextPatrolTime = (uint)Util.Rand.Next(minMillisecond, maxMillisecond); } if (npc.mStateLastTime > npc.mNextPatrolTime) { if (!StartPatrol(npc)) { npc.ChangeState(eNPCState.Idle); } npc.mNextPatrolTime = 0; } return(true); }
public void RolePositionChanged(RoleActor role, ref SlimDX.Vector3 loc) { if (this.IsNullMap) { Log.Log.Common.Print(string.Format("Role {0} call RoleDirectionChanged in nullmap", role.RoleName)); return; } if (role is NPCInstance) { NPCInstance npc = role as NPCInstance; if (npc.Type == eNpcType.FoodCar) { var a = 0; a++; } } RPC.PackageWriter pkg = new RPC.PackageWriter(); Wuxia.H_RpcRoot.smInstance.HIndex(pkg, role.Id).RPC_SyncPostion(pkg, loc.X, loc.Z); this.SendPkg2Clients(role, loc, pkg); }
private static void __TaskKillMonster_Listener(EventDispatcher listener, object data) { Task task = listener as Task; if (null == task) { return; } if (task.TaskData.Template == null) { Log.Log.Common.Info("mTaskData Template is null"); return; } if (string.IsNullOrEmpty(task.TaskData.Template.arg1) || string.IsNullOrEmpty(task.TaskData.Template.arg2)) { Log.Log.Common.Info("mTaskData Template arg1 is null{0}", task.TaskData.TemplateId); return; } NPCInstance target = data as NPCInstance; if (null == target) { return; } if (target.NPCData.TemplateId == Convert.ToInt32(task.TaskData.Template.arg1)) { var pro = task.TaskData.Process + 1; task.SetTaskProcess(pro); var needcount = Convert.ToInt32(task.TaskData.Template.arg2); if (task.TaskData.Process >= needcount) { task.SetTaskProcess(needcount); task.OnFinish(); } } }
public bool MapNpcGuid2UInt32(NPCInstance role) { if (role.SingleId != 0) { return(false); } NPCInstance temp; if (mTableNpcs.TryGetValue(role.Id, out temp)) { return(false); } UInt32 singleId = 0; for (int count = 0; count < (UInt32)EIdIndexInfo.MaxNpcInPlanes; count++) { if (mSingeIdNPCs.TryGetValue(mNextNpcId, out temp) == false) { singleId = mNextNpcId; mNextNpcId++; break; } else { ++mNextNpcId; if (mNextNpcId >= (UInt32)EIdIndexInfo.NpcEnd) { mNextNpcId = (UInt32)EIdIndexInfo.NpcStart; } } } if (singleId == 0) { return(false); } role._SetSingleId(singleId); mTableNpcs.Add(role.Id, role); mSingeIdNPCs.Add(singleId, role); return(true); }
public override bool StartPatrol(NPCInstance npc) { if (npc.InMapData.patrolRange <= 0) { return(false); } Vector3 randPos = new Vector3(); //Vector3 randPos = Util.RandInRadius(npc.mSpawnPoint, npc.InMapData.patrolRange); //if (Util.PassableForMod(npc.HostMap.Navigator, randPos)) if (Util.FindRandomPoint(npc.HostMap.Navigator, npc.GetPosition(), npc.mSpawnPoint, npc.InMapData.patrolRange, ref randPos)) { if (npc.MoveTo(randPos)) { npc.ChangeState(eNPCState.Patrol); return(true); } } return(false); }
public MoveNodes <int> mPathNodes = new MoveNodes <int>(); //镖车行走路线 public static NPCInstance CreateNPCInstance(CSCommon.MapInfo_Npc nd, MapInstance map) { NPCInstance ret = new NPCInstance(); ret.mId = ServerFrame.Util.GenerateObjID(ServerFrame.GameObjectType.NPC); var init = new NpcInit(); init.GameType = eActorGameType.Npc; init.Data = nd; init.OwnerMapData = map.MapInfo; if (!ret.Initialize(init)) { return(null); } ret.Reborn(); ret.OnEnterMap(map); return(ret); }
private static void __Kill_Listener(EventDispatcher listener, object data) { var achieve = listener as Achieve; if (null == achieve) { return; } NPCInstance target = data as NPCInstance; if (null == target) { return; } List <int> targetIds = GetListIdParseString(achieve.mTemplate.target); if (targetIds.Count > 0 && !targetIds.Contains(target.NPCData.TemplateId)) { return; } achieve.AddTargetNum(1); }
public override bool OnFollowTarget(NPCInstance npc) { if (npc.CanCastSpell()) { //到释放技能距离 npc.ChangeState(eNPCState.WaitCoolDown); } else { if (npc.IsMoving) { return(false); } if (!npc.FollowTarget(npc.GetTarget(npc.mAttackTarget))) { npc.ReturnSpawnPoint(); return(false); } } return(true); }
public virtual bool SelectTarget(NPCInstance npc) { RoleActor target = null; npc.mScanLastTime = 0; if (npc.mAttackTarget != 0) { target = npc.GetTarget(npc.mAttackTarget); if (null != target) { if (target.IsDie) { npc.KickOneFromEnmityList(npc.mAttackTarget); npc.mAttackTarget = 0; target = null; } } else { npc.mAttackTarget = 0; } } //从警戒范围找目标 if (null == target) { target = npc.FindHatredTarget(); } if (null == target) { return(false); } npc.UpdateEnmityList(target.Id, 1); return(true); }
public void Tick(Int64 elapsedMiliSeccond) { try { mRpcProcessor.Tick(); foreach (PlayerInstance i in mPlayerPool) {//这个不怕迭代中删除 if (i != null) { i.Tick(elapsedMiliSeccond); } } lock (mAddedNPCList) { foreach (var i in mAddedNPCList) { mNpcDictionary[i.Id] = i; } mAddedNPCList.Clear(); } lock (mRemovedNPCList) { foreach (var npc in mRemovedNPCList) { mNpcDictionary.Remove(npc.Id); } mRemovedNPCList.Clear(); } foreach (var npc in mNpcDictionary) { npc.Value.Tick(elapsedMiliSeccond); } foreach (var npc in mGatherDictionary) { npc.Value.Tick(elapsedMiliSeccond); } // tick trigger foreach (var trigger in mTriggerDictionary.Values) { trigger.Tick(elapsedMiliSeccond); } if (null == mTransmitingNpc && mNpcCreatingQueue.Count == 0) { for (var i = 0; i < mNpcCreatingPool.Count; i++) { if (mNpcCreatingQueue.Count < mLimitCount) { mNpcCreatingQueue.Add(mNpcCreatingPool[i]); mNpcCreatingPool.RemoveAt(i); i--; } } } for (var i = 0; i < mNpcCreatingQueue.Count; i++) { if (null == mNpcCreatingQueue[i]) { continue; } if (IServer.timeGetTime() - mLastCreateTime >= mIntervalTime) { NPCInstance npc = NPCInstance.CreateNPCInstance(mNpcCreatingQueue[i], this); mLastCreateTime = IServer.timeGetTime(); mNpcCreatingQueue[i] = null; if (i == (int)mLimitCount - 1) { mTransmitingNpc = npc; } } } } catch (System.Exception ex) { Log.Log.Common.Print(ex.ToString() + "==>"); Log.Log.Common.Print(ex.StackTrace.ToString()); } }