internal static Msg_RC_CreateNpc BuildCreateNpcMessage(NpcInfo npc) { Msg_RC_CreateNpc bder = new Msg_RC_CreateNpc(); bder.npc_id = npc.GetId(); bder.unit_id = npc.GetUnitId(); Vector3 pos = npc.GetMovementStateInfo().GetPosition3D(); ArkCrossEngineMessage.Position pos_bd = new ArkCrossEngineMessage.Position(); pos_bd.x = (float)pos.X; pos_bd.z = (float)pos.Z; bder.cur_pos = pos_bd; bder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir(); bder.link_id = npc.GetLinkId(); if (npc.GetUnitId() <= 0) { bder.camp_id = npc.GetCampId(); } if (npc.OwnerId > 0) { bder.owner_id = npc.OwnerId; } bder.level = npc.GetLevel(); return(bder); }
internal static Msg_RC_NpcMove BuildNpcMoveMessage(NpcInfo npc) { Msg_RC_NpcMove npcMoveBuilder = new Msg_RC_NpcMove(); if (npc.GetMovementStateInfo().IsMoving) { npcMoveBuilder.npc_id = npc.GetId(); npcMoveBuilder.is_moving = true; npcMoveBuilder.move_direction = (float)npc.GetMovementStateInfo().GetMoveDir(); npcMoveBuilder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir(); npcMoveBuilder.cur_pos_x = npc.GetMovementStateInfo().GetPosition3D().X; npcMoveBuilder.cur_pos_z = npc.GetMovementStateInfo().GetPosition3D().Z; NpcAiStateInfo data = npc.GetAiStateInfo(); npcMoveBuilder.target_pos_x = npc.GetMovementStateInfo().TargetPosition.X; npcMoveBuilder.target_pos_z = npc.GetMovementStateInfo().TargetPosition.Z; npcMoveBuilder.velocity_coefficient = (float)npc.VelocityCoefficient; npcMoveBuilder.velocity = npc.GetActualProperty().MoveSpeed; npcMoveBuilder.move_mode = (int)npc.GetMovementStateInfo().MovementMode; } else { npcMoveBuilder.npc_id = npc.GetId(); npcMoveBuilder.is_moving = false; npcMoveBuilder.cur_pos_x = npc.GetMovementStateInfo().GetPosition3D().X; npcMoveBuilder.cur_pos_z = npc.GetMovementStateInfo().GetPosition3D().Z; } return(npcMoveBuilder); }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_PvpNpc_General data = GetAiData(npc); if (null != data) { npc.GetMovementStateInfo().IsMoving = false; if (data.PatrolPath.HavePathPoint) { info.HomePos = npc.GetMovementStateInfo().GetPosition3D(); info.Time = 0; data.FoundPath.Clear(); ChangeToState(npc, (int)AiStateId.Patrol); } else { ChangeToState(npc, (int)AiStateId.Combat); } } }
private void GoHomeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } ChangeToState(npc, (int)AiStateId.Idle); NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; AiData_Demo_Melee data = GetAiData(npc); if (null != data) { Vector3 targetPos = info.HomePos; ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); if (powDistToHome <= 1) { npc.GetMovementStateInfo().IsMoving = false; info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } else { AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, 100, true, this); } } } }
private void MoveHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { npc.GetMovementStateInfo().IsMoving = false; ChangeToState(npc, (int)AiStateId.Wait); return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 10) { info.Time = 0; Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); Vector3 startPos = info.HomePos; Vector3 targetPos = npc.GetMovementStateInfo().TargetPosition; if (!IsReached(srcPos, targetPos)) { float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); npc.GetMovementStateInfo().SetMoveDir(angle); npc.GetMovementStateInfo().IsMoving = true; } } }
protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); info.HomePos = npc.GetMovementStateInfo().GetPosition3D(); info.Time = 0; info.Target = 0; npc.GetMovementStateInfo().IsMoving = false; }
private void PursuitHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); bool goHome = false; AiData_PveNpc_General data = GetAiData(npc); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(npc, info.Target); if (null != target) { float dist = (float)npc.GetActualProperty().AttackRange; float distGoHome = (float)npc.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); if (powDist < dist * dist) { npc.GetMovementStateInfo().IsMoving = false; info.Time = 0; data.Time = 0; ChangeToState(npc, (int)AiStateId.Combat); NotifyNpcMove(npc); } else if (true) // 目标存活的情况下屏蔽掉gohome。 { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; AiLogicUtility.PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, m_IntervalTime, true, this); } } else { goHome = true; } } else { goHome = true; } if (goHome) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; data.Time = 0; ChangeToState(npc, (int)AiStateId.GoHome); } } }
internal static Msg_RC_NpcEnter BuildNpcEnterMessage(NpcInfo npc) { Msg_RC_NpcEnter bder = new Msg_RC_NpcEnter(); bder.npc_id = npc.GetId(); Vector3 pos = npc.GetMovementStateInfo().GetPosition3D(); bder.cur_pos_x = (float)pos.X; bder.cur_pos_z = (float)pos.Z; bder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir(); return(bder); }
protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); AiData_PvpNpc_General data = GetAiData(npc); if (null != data) { info.Time = 0; npc.GetMovementStateInfo().IsMoving = false; info.HomePos = npc.GetMovementStateInfo().GetPosition3D(); info.Target = 0; } }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; if (GetAiData(npc).HasPatrolData) { npc.GetMovementStateInfo().IsMoving = false; ChangeToState(npc, (int)AiStateId.PatrolCommand); } else { CharacterInfo target = null; if (info.IsExternalTarget) { target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(npc, info.Target); if (null == target) { target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY); if (null != target) { info.Target = target.GetId(); } } } else { target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY); if (null != target) { info.Target = target.GetId(); } } if (null != target) { NotifyNpcTargetChange(npc); npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; ChangeToState(npc, (int)AiStateId.Pursuit); } } } }
private void TickDebugSpaceInfo() { if (GlobalVariables.Instance.IsDebug) { bool needDebug = false; foreach (User user in m_Room.RoomUsers) { if (user.IsDebug) { needDebug = true; break; } } if (needDebug) { Msg_RC_DebugSpaceInfo builder = new Msg_RC_DebugSpaceInfo(); for (LinkedListNode <UserInfo> linkNode = UserManager.Users.FirstValue; null != linkNode; linkNode = linkNode.Next) { UserInfo info = linkNode.Value; Msg_RC_DebugSpaceInfo.DebugSpaceInfo infoBuilder = new Msg_RC_DebugSpaceInfo.DebugSpaceInfo(); infoBuilder.obj_id = info.GetId(); infoBuilder.is_player = true; infoBuilder.pos_x = (float)info.GetMovementStateInfo().GetPosition3D().X; infoBuilder.pos_z = (float)info.GetMovementStateInfo().GetPosition3D().Z; infoBuilder.face_dir = (float)info.GetMovementStateInfo().GetFaceDir(); builder.space_infos.Add(infoBuilder); } for (LinkedListNode <NpcInfo> linkNode = NpcManager.Npcs.FirstValue; null != linkNode; linkNode = linkNode.Next) { NpcInfo info = linkNode.Value; Msg_RC_DebugSpaceInfo.DebugSpaceInfo infoBuilder = new Msg_RC_DebugSpaceInfo.DebugSpaceInfo(); infoBuilder.obj_id = info.GetId(); infoBuilder.is_player = false; infoBuilder.pos_x = (float)info.GetMovementStateInfo().GetPosition3D().X; infoBuilder.pos_z = (float)info.GetMovementStateInfo().GetPosition3D().Z; infoBuilder.face_dir = (float)info.GetMovementStateInfo().GetFaceDir(); builder.space_infos.Add(infoBuilder); } foreach (User user in m_Room.RoomUsers) { if (user.IsDebug) { user.SendMessage(builder); } } } } }
private void CombatHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; float rps = npc.GetActualProperty().Rps; if (rps > 0.001f && info.Time > 1000 / rps) { info.Time = 0; bool toIdle = false; CharacterInfo target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(npc, info.Target); if (null != target && npc.SpatialSystem.CanShoot(npc.SpaceObject, target.GetMovementStateInfo().GetPosition3D())) { ScriptRuntime.Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float dist = (float)npc.GetActualProperty().AttackRange; float distView = (float)npc.ViewRange; if (powDist < dist * dist) { npc.GetMovementStateInfo().IsMoving = false; } else if (powDist < distView * distView) { npc.GetMovementStateInfo().IsMoving = false; } else { toIdle = true; } } else { toIdle = true; } if (toIdle) { info.Time = 0; npc.GetMovementStateInfo().IsMoving = false; ChangeToState(npc, (int)AiStateId.Idle); } } }
private void CheckImpact(NpcInfo npc) { DashFireSpatial.ISpatialSystem spatialSys = npc.SpatialSystem; if (null != spatialSys) { bool existNpcInAttackRange = false; ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); spatialSys.VisitObjectInCircle(srcPos, npc.GetActualProperty().AttackRange, (float distSqr, ISpaceObject obj) => { if (obj.GetObjType() == SpatialObjType.kNPC && (int)obj.GetID() != npc.GetId()) { NpcInfo npcObj = obj.RealObject as NpcInfo; if (null != npcObj && npcObj.NpcType != (int)NpcTypeEnum.PvpTower) { existNpcInAttackRange = true; return(false); } } return(true); }); if (existNpcInAttackRange) { ImpactInfo impactInfo = npc.GetSkillStateInfo().GetImpactInfoById(c_ImpactForTower); if (null == impactInfo) { ServerNpcImpact(npc, c_ImpactForTower, npc); } } } }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; CharacterInfo target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_ENEMY); if (null != target) { npc.GetMovementStateInfo().IsMoving = false; info.Time = 0; info.Target = target.GetId(); ChangeToState(npc, (int)AiStateId.Combat); NotifyNpcTargetChange(npc); } else { } } }
public static void DoMoveCommandState(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { //执行状态处理 AiData_ForMoveCommand data = GetAiDataForMoveCommand(npc); if (null == data) { return; } if (!data.IsFinish) { if (WayPointArrived(npc, data)) { MoveToNext(npc, data); } } //判断是否状态结束并执行相应处理 if (null != data && data.IsFinish) { npc.GetMovementStateInfo().IsMoving = false; npc.GetAiStateInfo().PopState(); } }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); npc.GetMovementStateInfo().IsMoving = false; ChangeToState(npc, (int)AiStateId.Wait); }
private static void MoveToNext(NpcInfo npc, AiData_ForMoveCommand data) { if (++data.Index >= data.WayPoints.Count) { data.IsFinish = true; return; } var move_info = npc.GetMovementStateInfo(); Vector3 from = move_info.GetPosition3D(); Vector3 to = data.WayPoints[data.Index]; float move_dir = MoveDirection(from, to); float now = TimeUtility.GetServerMilliseconds(); float distance = Geometry.Distance(from, to); float speed = npc.GetActualProperty().MoveSpeed; data.EstimateFinishTime = now + 1000 * (distance / speed); DLog._("ai_move", "[{0}]: now({1}), from({2}), to({3}), distance({4}), speed({5}), move_time({6}), estimate({7})", npc.GetId(), now, from.ToString(), to.ToString(), distance, speed, 1000 * (distance / speed), data.EstimateFinishTime); move_info.IsMoving = true; move_info.SetMoveDir(move_dir); move_info.SetFaceDir(move_dir); }
private void PatrolHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; AiData_PvpNpc_General data = GetAiData(npc); if (null != data) { CharacterInfo interestestTarget = GetInterestestTargetHelper(npc, CharacterRelation.RELATION_ENEMY); if (null != interestestTarget) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; info.Target = interestestTarget.GetId(); data.FoundPath.Clear(); ChangeToState(npc, (int)AiStateId.Pursuit); } else { ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); if (!data.PatrolPath.IsReached(srcPos)) { PathToTargetWithoutObstacle(npc, data.FoundPath, data.PatrolPath.CurPathPoint, 100); } else { data.PatrolPath.UseNextPathPoint(); data.FoundPath.Clear(); if (!data.PatrolPath.HavePathPoint) { info.Time = 0; ChangeToState(npc, (int)AiStateId.Idle); } } info.HomePos = npc.GetMovementStateInfo().GetPosition3D(); } } } }
internal static Msg_RC_NpcFace BuildNpcFaceMessage(NpcInfo npc) { Msg_RC_NpcFace npcFaceBuilder = new Msg_RC_NpcFace(); npcFaceBuilder.npc_id = npc.GetId(); npcFaceBuilder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir(); return(npcFaceBuilder); }
private void DropNpc(Vector3 pos, int money, string model, string particle) { //给每个玩家掉落一个 Data_Unit unit = new Data_Unit(); unit.m_Id = -1; unit.m_LinkId = 100001; unit.m_AiLogic = (int)AiStateLogicId.DropOut_AutoPick; unit.m_RotAngle = 0; for (LinkedListNode <UserInfo> linkNode = UserManager.Users.FirstValue; null != linkNode; linkNode = linkNode.Next) { UserInfo userInfo = linkNode.Value; if (null != userInfo) { float x = CrossEngineHelper.Random.NextFloat() * 4 - 2; float z = CrossEngineHelper.Random.NextFloat() * 4 - 2; pos.X += x; pos.Z += z; NpcInfo npcInfo = NpcManager.AddNpc(unit); npcInfo.GetMovementStateInfo().SetPosition(pos); npcInfo.GetMovementStateInfo().SetFaceDir(0); npcInfo.GetMovementStateInfo().IsMoving = false; npcInfo.SetAIEnable(true); npcInfo.SetCampId((int)CampIdEnum.Friendly); npcInfo.OwnerId = userInfo.GetId(); npcInfo.DropMoney = money; DropOutInfo dropInfo = new DropOutInfo(); dropInfo.DropType = DropOutType.GOLD; dropInfo.Value = money; dropInfo.Model = model; dropInfo.Particle = particle; npcInfo.GetAiStateInfo().AiDatas.AddData <DropOutInfo>(dropInfo); npcInfo.SetModel(dropInfo.Model); User us = userInfo.CustomData as User; if (null != us) { Msg_RC_CreateNpc builder = DataSyncUtility.BuildCreateNpcMessage(npcInfo); us.SendMessage(builder); } } } }
private void GoHomeHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; AiData_PvpNpc_General data = GetAiData(npc); if (null != data) { Vector3 targetPos = info.HomePos; ScriptRuntime.Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); if (powDistToHome <= 1) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); info.Time = 0; data.FoundPath.Clear(); ChangeToState(npc, (int)AiStateId.Patrol); } else { PathToTargetWithoutObstacle(npc, data.FoundPath, targetPos, 100); /* * float angle = MathUtil.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); * npc.GetMovementStateInfo().SetFaceDir(angle); * npc.GetMovementStateInfo().SetMoveDir(angle); * npc.GetMovementStateInfo().TargetPosition = targetPos; * npc.GetMovementStateInfo().IsMoving = true; */ } } } }
private void OnNpcImpact(NpcInfo npc, int impactId) { Scene scene = npc.SceneContext.CustomData as Scene; if (null != scene) { Msg_CRC_SendImpactToEntity sendImpactBuilder = new Msg_CRC_SendImpactToEntity(); sendImpactBuilder.duration = -1; sendImpactBuilder.impact_id = impactId; sendImpactBuilder.sender_dir = npc.GetMovementStateInfo().GetFaceDir(); sendImpactBuilder.sender_id = npc.GetId(); Vector3 pos = npc.GetMovementStateInfo().GetPosition3D(); sendImpactBuilder.sender_pos = new Position3D(); sendImpactBuilder.sender_pos.x = pos.X; sendImpactBuilder.sender_pos.y = pos.Y; sendImpactBuilder.sender_pos.z = pos.Z; sendImpactBuilder.skill_id = -1; sendImpactBuilder.target_id = npc.GetId(); scene.NotifyAreaUser(npc, sendImpactBuilder); } }
private void OnNpcMove(NpcInfo npc) { Scene scene = npc.SceneContext.CustomData as Scene; if (null != scene && !npc.GetMovementStateInfo().IsSkillMoving) { Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(npc); if (null != npcMoveBuilder) { scene.NotifyAreaUser(npc, npcMoveBuilder); } } }
private static bool WayPointArrived(NpcInfo npc, AiData_ForMoveCommand data) { if (TimeUtility.GetServerMilliseconds() >= data.EstimateFinishTime) { var move_info = npc.GetMovementStateInfo(); Vector3 to = data.WayPoints[data.Index]; Vector3 now = move_info.GetPosition3D(); float distance = Geometry.Distance(now, to); DLog._("ai_move", "[{0}]: closest distance({1}) ", npc.GetId(), distance); return(true); } return(false); }
protected override void OnStateLogicInit(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time = 0; npc.GetMovementStateInfo().IsMoving = false; info.HomePos = npc.GetMovementStateInfo().GetPosition3D(); info.Target = 0; if (!string.IsNullOrEmpty(info.AiParam[0])) { if (int.Parse(info.AiParam[0]) == 0) { InitPatrolData(npc); } else if (int.Parse(info.AiParam[0]) == 1) { InitIdleAnim(npc); } } npc.GetActualProperty().SetMoveSpeed(Operate_Type.OT_Absolute, GetWalkSpeed(npc)); npc.GetMovementStateInfo().MovementMode = MovementMode.LowSpeed; }
internal NpcInfo SummonNpc(int id, int owner_id, int owner_skillid, int npc_type_id, string modelPrefab, int skillid, int ailogicid, bool followsummonerdead, float x, float y, float z, string aiparamstr) { CharacterInfo charObj = SceneContext.GetCharacterInfoById(owner_id); if (charObj == null) { return(null); } NpcInfo npc = null; SkillInfo ownerSkillInfo = charObj.GetSkillStateInfo().GetSkillInfoById(owner_skillid); if (null != ownerSkillInfo) { if (null != ownerSkillInfo.m_EnableSummonNpcs && ownerSkillInfo.m_EnableSummonNpcs.Contains(npc_type_id)) { //ownerSkillInfo.m_EnableSummonNpcs.Remove(npc_type_id); Data_Unit data = new Data_Unit(); data.m_Id = -1; data.m_LinkId = npc_type_id; data.m_CampId = charObj.GetCampId(); data.m_IsEnable = true; data.m_Pos = new Vector3(x, y, z); data.m_RotAngle = 0; data.m_AiLogic = ailogicid; if (!string.IsNullOrEmpty(aiparamstr)) { string[] strarry = aiparamstr.Split(new char[] { ',' }, 8); int i = 0; foreach (string str in strarry) { data.m_AiParam[i++] = str; } } npc = NpcManager.AddNpc(data); if (!string.IsNullOrEmpty(modelPrefab)) { npc.SetModel(modelPrefab); } npc.FollowSummonerDead = followsummonerdead; SkillInfo skillinfo = new SkillInfo(skillid); npc.GetSkillStateInfo().AddSkill(skillinfo); npc.GetMovementStateInfo().SetPosition(data.m_Pos); npc.SummonOwnerId = charObj.GetId(); charObj.GetSkillStateInfo().AddSummonObject(npc); AbstractNpcStateLogic.OnNpcSkill(npc, skillid); } } return(npc); }
public void Create(NpcInfo npc) { Init(); if (null != npc) { m_Npc = npc; m_Npc.OnBeginAttack = ResetShootAnimation; MovementStateInfo msi = m_Npc.GetMovementStateInfo(); Vector3 pos = msi.GetPosition3D(); float dir = msi.GetFaceDir(); CreateActor(m_Npc.GetId(), m_Npc.GetModel(), pos, dir, m_Npc.Scale); InitAnimationSets(); UpdateWeaponModel(m_Npc); } }
private void OnNpcSkill(NpcInfo npc, int skillId) { Scene scene = npc.SceneContext.CustomData as Scene; if (null != scene) { SkillInfo skillInfo = npc.GetSkillStateInfo().GetCurSkillInfo(); if (null == skillInfo || !skillInfo.IsSkillActivated) { SkillInfo curSkillInfo = npc.GetSkillStateInfo().GetSkillInfoById(skillId); if (null != curSkillInfo) { long curTime = TimeUtility.GetServerMilliseconds(); if (!curSkillInfo.IsInCd(curTime / 1000.0f)) { curSkillInfo.StartTime = curTime / 1000.0f; curSkillInfo.BeginCD(); scene.SkillSystem.StartSkill(npc.GetId(), skillId); Msg_RC_NpcSkill skillBuilder = new Msg_RC_NpcSkill(); skillBuilder.npc_id = npc.GetId(); skillBuilder.skill_id = skillId; ArkCrossEngineMessage.Position posBuilder1 = new ArkCrossEngineMessage.Position(); posBuilder1.x = npc.GetMovementStateInfo().GetPosition3D().X; posBuilder1.z = npc.GetMovementStateInfo().GetPosition3D().Z; skillBuilder.stand_pos = posBuilder1; skillBuilder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir(); LogSystem.Debug("Send Msg_RC_NpcSkill, EntityId={0}, SkillId={1}", npc.GetId(), skillId); scene.NotifyAreaUser(npc, skillBuilder); } } } } }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (npc.IsDead()) { return; } NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; npc.GetMovementStateInfo().IsMoving = false; ChangeToState(npc, (int)AiStateId.PatrolCommand); } }
private Vector3 GetHomePosition(NpcInfo npc, AiData_PvpNpc_General data) { Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); Vector3 pt = new Vector3(); if (data.PatrolPath.GetNearstPoint(npc.SpatialSystem, npc.AvoidanceRadius, srcPos, ref pt)) { if (!npc.SpatialSystem.GetCellMapView(npc.AvoidanceRadius).CanPass(pt)) { if (!AiLogicUtility.GetWalkablePosition(npc.SpatialSystem.GetCellMapView(npc.AvoidanceRadius), pt, srcPos, ref pt)) { pt = srcPos; } } } return(pt); }