private void MoveHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { return; } UserAiStateInfo info = user.GetAiStateInfo(); AiData_UserSelf_General data = GetAiData(user); Vector3 targetPos = info.TargetPos; Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); if (null != data && !IsReached(srcPos, targetPos)) { if (info.IsTargetPosChanged) { info.IsTargetPosChanged = false; data.FoundPath.Clear(); } PathToTargetPro(user, data.FoundPath, targetPos, deltaTime); } else { user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; info.Target = 0; info.TargetPos = Vector3.Zero; data.Time = 0; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Idle); } }
protected override void OnStateLogicInit(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { UserAiStateInfo info = user.GetAiStateInfo(); info.HomePos = user.GetMovementStateInfo().GetPosition3D(); info.Time = 0; user.GetMovementStateInfo().IsMoving = false; }
private void UpdateTowards(UserInfo playerself, float towards) { if (null != playerself && float.NegativeInfinity != towards) { playerself.GetMovementStateInfo().SetFaceDir(towards); playerself.GetMovementStateInfo().SetWantFaceDir(towards); playerself.GetMovementStateInfo().SetMoveDir(towards); } }
private void PrintPosition(int key_code, int what) { UserInfo myself = WorldSystem.Instance.GetPlayerSelf(); if (null != myself && what == (int)Keyboard.Event.Down) { Vector3 pos = myself.GetMovementStateInfo().GetPosition3D(); float dir = myself.GetMovementStateInfo().GetFaceDir(); LogSystem.Debug("PrintPosition {0:F2} {1:F2} {2:F2} {3:F2}", pos.X, pos.Y, pos.Z, dir); } }
private void MoveUser(UserInfo obj, long deltaTime) { MovementStateInfo msi = obj.GetMovementStateInfo(); if (null != obj.ControlledObject) { MovementStateInfo ctrlMsi = obj.ControlledObject.GetMovementStateInfo(); ctrlMsi.IsMoving = msi.IsMoving; ctrlMsi.SetFaceDir(msi.GetFaceDir()); ctrlMsi.SetMoveDir(msi.GetMoveDir()); } if (obj.IsHaveStateFlag(CharacterState_Type.CST_Sleep) || obj.IsHaveStateFlag(CharacterState_Type.CST_FixedPosition)) { return; } //玩家移动中忽略阻挡,由客户端与AI来规划路径。 if (!obj.IsDead() && msi.IsMoving && !msi.IsSkillMoving && !msi.IsMoveMeetObstacle) { Vector3 pos = msi.GetPosition3D(); float speed = (float)obj.GetRealControlledObject().GetActualProperty().MoveSpeed *(float)obj.VelocityCoefficient; float distance = (speed * (float)(int)deltaTime) / 1000.0f; //LogSystem.Debug("MovementSystem user:{0} speed:{1} deltaTime:{2} distance:{3}", obj.GetId(), speed, deltaTime, distance); float x = 0, y = 0; Vector2 newPos = new Vector2(); if (obj.GetAiStateInfo().CurState != (int)AiStateId.Invalid && msi.CalcDistancSquareToTarget() < distance * distance) { x = msi.TargetPosition.X; y = msi.TargetPosition.Z; AdjustPosition(obj.SpatialSystem, ref x, ref y); newPos = new Vector2(x, y); msi.SetPosition2D(newPos); } else { float cosV = (float)msi.MoveDirCosAngle; float sinV = (float)msi.MoveDirSinAngle; y = pos.Z + distance * cosV; x = pos.X + distance * sinV; AdjustPosition(obj.SpatialSystem, ref x, ref y); newPos = new Vector2(x, y); msi.SetPosition2D(newPos); } if (null != obj.ControlledObject) { obj.ControlledObject.GetMovementStateInfo().SetPosition2D(newPos); } } }
private void OnDropoutPlayEffect(UserInfo user, NpcInfo npc, string effect, string path, int dropType, int dropNum) { CharacterView view = EntityManager.Instance.GetCharacterViewById(user.GetId()); if (null != view) { if (!String.IsNullOrEmpty(effect)) { GfxSystem.CreateAndAttachGameObject(effect, view.Actor, path, 1.0f); } GfxSystem.PlaySound(view.Actor, "Sound/Scene/UI_UP_PickupMoney", user.GetMovementStateInfo().GetFaceDir()); } Network.NetworkSystem.Instance.SyncPickUpNpc(npc); }
public static void ExecPlayerSelfMoveCommand(float x, float y, float z) { Vector3 pos = new Vector3(); pos.x = x; pos.y = y; pos.z = z; UserInfo user = WorldSystem.Instance.GetPlayerSelf(); if (null != user) { if (!user.UnityPathFinding) { List <Vector3> waypoints = user.SpatialSystem.FindPath(user.GetMovementStateInfo().GetPosition3D(), pos, 1); waypoints.Add(pos); UserAiStateInfo aiInfo = user.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(waypoints); aiInfo.AiDatas.AddData(data); } data.WayPoints = waypoints; data.Index = 0; data.EstimateFinishTime = 0; data.IsFinish = false; aiInfo.ChangeToState((int)AiStateId.MoveCommand); } else { UserAiStateInfo aiInfo = user.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(null); aiInfo.AiDatas.AddData(data); } user.PathFindingFinished = false; user.GetAiStateInfo().ChangeToState((int)AiStateId.PathFinding); user.GetAiStateInfo().PreviousState = (int)AiStateId.MoveCommand; GfxSystem.ForMoveCommandPathToTarget(user, pos); } } }
private void StopFindPath(UserInfo playerself, UserAiStateInfo aiInfo) { if (null == playerself || null == aiInfo) { return; } AiData_UserSelf_General data = playerself.GetAiStateInfo().AiDatas.GetData <AiData_UserSelf_General>(); if (null == data) { data = new AiData_UserSelf_General(); playerself.GetAiStateInfo().AiDatas.AddData(data); } playerself.GetMovementStateInfo().IsMoving = false; aiInfo.Time = 0; data.Time = 0; data.FoundPath.Clear(); aiInfo.ChangeToState((int)AiStateId.Idle); }
private CharacterInfo GetCanAttackUserTarget(UserInfo user) { //float dist = user.GetActualProperty().AttackRange; float dist = 3f; LinkedListDictionary <int, UserInfo> list = user.SceneContext.UserManager.Users; for (LinkedListNode <UserInfo> node = list.FirstValue; null != node; node = node.Next) { UserInfo other = node.Value; if (null != other && CharacterRelation.RELATION_ENEMY == CharacterInfo.GetRelation(user, other)) { if (Geometry.DistanceSquare(user.GetMovementStateInfo().GetPosition3D(), other.GetMovementStateInfo().GetPosition3D()) <= dist * dist) { return(other); } } } return(null); }
internal void Create(UserInfo user) { Init(); if (null != user) { m_User = user; ObjectInfo.UnitId = m_User.GetUnitId(); ObjectInfo.CampId = m_User.GetCampId(); ObjectInfo.LinkId = m_User.GetLinkId(); MovementStateInfo msi = m_User.GetMovementStateInfo(); Vector3 pos = msi.GetPosition3D(); float dir = msi.GetFaceDir(); CreateActor(m_User.GetId(), m_User.GetModel(), pos, dir, m_User.Scale); user.ActorId = Actor; UpdateXSoulEquip(); InitAnimationSets(); ObjectInfo.IsPlayer = true; if (user.GetId() == WorldSystem.Instance.PlayerSelfId) { GfxSystem.MarkPlayerSelf(Actor); } } }
internal void Tick() { long now = TimeUtility.GetServerMilliseconds(); m_LastTickIntervalMs = now - m_LastTickTime; m_LastTickTime = now; if (WorldSystem.Instance.IsObserver && !WorldSystem.Instance.IsFollowObserver) { bool keyPressed = false; float x = 0.5f, y = 0.5f; if (GfxSystem.IsKeyPressed(Keyboard.Code.A)) { x = 0.1f; keyPressed = true; } else if (GfxSystem.IsKeyPressed(Keyboard.Code.D)) { x = 0.9f; keyPressed = true; } if (GfxSystem.IsKeyPressed(Keyboard.Code.W)) { y = 0.1f; keyPressed = true; } else if (GfxSystem.IsKeyPressed(Keyboard.Code.S)) { y = 0.9f; keyPressed = true; } if (keyPressed) { WorldSystem.Instance.UpdateObserverCamera(x, y); } return; } UserInfo playerself = WorldSystem.Instance.GetPlayerSelf(); if (null == playerself) { return; } // if move input is disable // MotionStatus is MoveStop, and MotionChanged is reflect the change accordingly if (EnableMoveInput) { if (!IsKeyboardControl()) { CheckJoystickControl(); } } if (!m_IsJoystickControl) { pm_.Update(EnableMoveInput); } MovementStateInfo msi = playerself.GetMovementStateInfo(); Vector3 pos = msi.GetPosition3D(); //LogSystem.Debug("Pos : {0}, Dir : {1}", pos.ToString(), playerself.GetMovementStateInfo().GetFaceDir()); bool reface = false; if (m_LastTickIsSkillMoving && !msi.IsSkillMoving) { reface = true; } //操作同步机制改为发给服务器同时本地就开始执行(服务器转发给其它客户端,校验失败则同时发回原客户端进行位置调整) Vector3 mouse_pos = new Vector3(GfxSystem.GetMouseX(), GfxSystem.GetMouseY(), GfxSystem.GetMouseZ()); if (pm_.MotionStatus == PlayerMovement.Motion.Moving || pm_.JoyStickMotionStatus == PlayerMovement.Motion.Moving) { if (pm_.MotionChanged || pm_.JoyStickMotionChanged || !m_LastTickIsMoving) { StopAiMove(); playerself.SkillController.AddBreakSkillTask(); float moveDir = RoundMoveDir(pm_.MoveDir); //GfxSystem.GfxLog("PlayerControl.Tick MoveDir:{0} RoundMoveDir:{1}", pm_.MoveDir, moveDir); if (!m_LastTickIsMoving || !Geometry.IsSameFloat(moveDir, m_lastMoveDir)) { msi.SetMoveDir(moveDir); //ControlSystemOperation.AdjustCharacterMoveDir(playerself.GetId(), moveDir); msi.IsMoving = true; msi.TargetPosition = Vector3.Zero; if (WorldSystem.Instance.IsPvpScene() || WorldSystem.Instance.IsMultiPveScene()) { NetworkSystem.Instance.SyncPlayerMoveStart(moveDir); } } if (EnableRotateInput) { if (reface || !m_LastTickIsMoving || !Geometry.IsSameFloat(pm_.MoveDir, m_lastDir)) { msi.SetFaceDir(pm_.MoveDir); //ControlSystemOperation.AdjustCharacterFaceDir(playerself.GetId(), pm_.MoveDir); msi.SetWantFaceDir(pm_.MoveDir); if (WorldSystem.Instance.IsPvpScene() || WorldSystem.Instance.IsMultiPveScene()) { NetworkSystem.Instance.SyncFaceDirection(pm_.MoveDir); } } } m_lastDir = pm_.MoveDir; m_lastMoveDir = moveDir; } m_LastTickIsMoving = true; } else { if (m_LastTickIsMoving) { playerself.SkillController.CancelBreakSkillTask(); playerself.GetMovementStateInfo().IsMoving = false; if (WorldSystem.Instance.IsPvpScene() || WorldSystem.Instance.IsMultiPveScene()) { NetworkSystem.Instance.SyncPlayerMoveStop(); } if (EnableRotateInput) { if (reface) { msi.SetFaceDir(m_lastDir); //ControlSystemOperation.AdjustCharacterFaceDir(playerself.GetId(), m_lastDir); msi.SetWantFaceDir(m_lastDir); if (WorldSystem.Instance.IsPvpScene() || WorldSystem.Instance.IsMultiPveScene()) { NetworkSystem.Instance.SyncFaceDirection(m_lastDir); } } } } m_LastTickIsMoving = false; } m_LastTickIsSkillMoving = msi.IsSkillMoving; old_mouse_pos_ = mouse_pos_; mouse_pos_.X = GfxSystem.GetMouseX(); mouse_pos_.Y = GfxSystem.GetMouseY(); UserAiStateInfo aiInfo = playerself.GetAiStateInfo(); if (null != aiInfo && (int)AiStateId.Idle == aiInfo.CurState) { m_lastSelectObjId = -1; } }
private void PursuitHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { user.GetMovementStateInfo().IsMoving = false; return; } if (user.IsUnderControl()) { user.GetMovementStateInfo().IsMoving = false; return; } if (user.GetSkillStateInfo().IsSkillActivated()) { user.GetMovementStateInfo().IsMoving = false; return; } UserAiStateInfo info = user.GetAiStateInfo(); AiData_UserSelf_General data = GetAiData(user); if (null != data) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(user, info.Target); if (null != target) { float dist = (float)user.GetActualProperty().AttackRange; float distGoHome = (float)user.GohomeRange; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); float powDistToHome = Geometry.DistanceSquare(srcPos, info.HomePos); TryCastSkill(user, target, powDist); // 大于攻击距离 跑向目标 if (powDist > m_AttackRange * m_AttackRange) { info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; if (!user.UnityPathFinding) { AiLogicUtility.PathToTargetWithoutObstacle(user, data.FoundPath, targetPos, m_IntervalTime, true, this); } else { if (info.PreviousState != (int)AiStateId.PathFinding) { user.PathFindingFinished = false; GfxSystem.UserSelfGeneralPathToTarget(user, targetPos); ChangeToState(user, (int)AiStateId.PathFinding); } else { AiLogicUtility.PathToTargetWithoutObstacle(user, data.FoundPath, targetPos, m_IntervalTime, true, this); } } } } else { user.GetMovementStateInfo().IsMoving = false; NotifyUserMove(user); } } else { user.GetMovementStateInfo().IsMoving = false; NotifyUserMove(user); info.Time = 0; ChangeToState(user, (int)AiStateId.Idle); } } }
private UserInfo CreateArenaTarget(ArenaTargetInfo target) { if (target == null) { return(null); } int image_res_id = target.HeroId; UserInfo image_player = m_UserMgr.AddUser(image_res_id); if (null != image_player) { image_player.SceneContext = m_SceneContext; int campid = NetworkSystem.Instance.CampId == (int)CampIdEnum.Blue ? (int)CampIdEnum.Red : (int)CampIdEnum.Blue; image_player.SetCampId(campid); Data_Unit unit = m_CurScene.StaticData.ExtractData(DataMap_Type.DT_Unit, GlobalVariables.GetUnitIdByCampId(campid)) as Data_Unit; if (null != unit) { image_player.GetAiStateInfo().AiLogic = unit.m_AiLogic; image_player.SetAIEnable(true); image_player.GetMovementStateInfo().SetPosition(unit.m_Pos); image_player.GetMovementStateInfo().SetFaceDir(unit.m_RotAngle); } image_player.SetLevel(target.Level); image_player.SetNickName(target.Nickname); image_player.SkillController = new SwordManSkillController(image_player, GfxModule.Skill.GfxSkillSystem.Instance); if (null != m_SpatialSystem) { m_SpatialSystem.AddObj(image_player.SpaceObject); } /// skills if (null != target.Skills) { image_player.GetSkillStateInfo().RemoveAllSkill(); int skill_ct = target.Skills.Count; for (int i = 0; i < skill_ct; i++) { SkillInfo info = target.Skills[i]; if (null != info) { SkillCategory cur_skill_pos = SkillCategory.kNone; if (info.Postions.Presets[0] == SlotPosition.SP_A) { cur_skill_pos = SkillCategory.kSkillA; } else if (info.Postions.Presets[0] == SlotPosition.SP_B) { cur_skill_pos = SkillCategory.kSkillB; } else if (info.Postions.Presets[0] == SlotPosition.SP_C) { cur_skill_pos = SkillCategory.kSkillC; } else if (info.Postions.Presets[0] == SlotPosition.SP_D) { cur_skill_pos = SkillCategory.kSkillD; } info.Category = cur_skill_pos; image_player.GetSkillStateInfo().AddSkill(info); WorldSystem.Instance.AddSubSkill(image_player, info.SkillId, cur_skill_pos, info.SkillLevel); } } } Data_PlayerConfig playerData = PlayerConfigProvider.Instance.GetPlayerConfigById(image_player.GetLinkId()); if (null != playerData && null != playerData.m_FixedSkillList && playerData.m_FixedSkillList.Count > 0) { foreach (int skill_id in playerData.m_FixedSkillList) { SkillInfo info = new SkillInfo(skill_id, 1); image_player.GetSkillStateInfo().AddSkill(info); } } image_player.ResetSkill(); /// equips if (null != target.Equips) { int equip_ct = target.Equips.Length; for (int i = 0; i < equip_ct; i++) { ItemDataInfo image_equip = target.Equips[i]; if (null != image_equip) { image_player.GetEquipmentStateInfo().ResetEquipmentData(i); image_equip.ItemConfig = ItemConfigProvider.Instance.GetDataById(image_equip.ItemId); if (null != image_equip.ItemConfig) { image_player.GetEquipmentStateInfo().SetEquipmentData(i, image_equip); } } } } /// if (null != target.Legacys) { int legacy_ct = target.Legacys.Length; for (int i = 0; i < legacy_ct; i++) { ItemDataInfo image_legacy = target.Legacys[i]; if (null != image_legacy && image_legacy.IsUnlock) { image_player.GetLegacyStateInfo().ResetLegacyData(i); image_legacy.ItemConfig = ItemConfigProvider.Instance.GetDataById(image_legacy.ItemId); if (null != image_legacy.ItemConfig) { image_player.GetLegacyStateInfo().SetLegacyData(i, image_legacy); } } } image_player.GetLegacyStateInfo().UpdateLegacyComplexAttr(); } foreach (ArenaXSoulInfo x in target.XSoulInfo) { ItemDataInfo item = new ItemDataInfo(); item.ItemId = x.ItemId; item.Level = x.Level; item.Experience = x.Experience; item.UpdateLevelByExperience(); ItemConfig config = ItemConfigProvider.Instance.GetDataById(item.ItemId); if (config == null) { continue; } item.ItemConfig = config; XSoulPartInfo part = new XSoulPartInfo((XSoulPart)config.m_WearParts, item); part.ShowModelLevel = x.ModelLevel; image_player.GetXSoulInfo().SetXSoulPartData((XSoulPart)config.m_WearParts, part); } image_player.SetPartnerInfo(target.ActivePartner); SetArenaCharacterCoefficient(image_player); UserAttrCalculator.Calc(image_player); image_player.SetHp(Operate_Type.OT_Absolute, image_player.GetActualProperty().HpMax); image_player.SetRage(Operate_Type.OT_Absolute, 0); image_player.SetEnergy(Operate_Type.OT_Absolute, image_player.GetActualProperty().EnergyMax); target.CreatedPartners.Clear(); int total_hp = image_player.GetActualProperty().HpMax; //LogSystem.Error("---challenge target hp=" + image_player.GetActualProperty().HpMax); foreach (PartnerInfo partner in target.FightPartners) { NpcInfo partner_npc = CreateParterner(image_player, partner); if (partner_npc != null) { target.CreatedPartners.Add(partner.Id, partner_npc); //LogSystem.Error("---parnter {0} hp={1}", partner.Id, partner_npc.GetBaseProperty().HpMax); total_hp += partner_npc.GetBaseProperty().HpMax; } } //LogSystem.Error("-----challenge target total hp=" + total_hp); EntityManager.Instance.CreateUserView(image_player.GetId()); UserView image_view = EntityManager.Instance.GetUserViewById(image_player.GetId()); image_view.UpdateEquipment(); image_view.UpdateXSoulEquip(); } SyncGfxUserInfo(image_player.GetId()); return(image_player); }
private void SummonPartner(int key_code, int what) { RoleInfo roleself = LobbyClient.Instance.CurrentRole; if (null == roleself) { return; } UserInfo playerself = WorldSystem.Instance.GetPlayerSelf(); if (null == playerself) { return; } /// if ((int)Keyboard.Event.Up == what) { // summonpartner PartnerInfo partnerInfo = roleself.PartnerStateInfo.GetActivePartner(); if (null != partnerInfo) { Data_Unit data = new Data_Unit(); data.m_Id = -1; data.m_LinkId = partnerInfo.LinkId; data.m_CampId = playerself.GetCampId(); data.m_Pos = playerself.GetMovementStateInfo().GetPosition3D(); data.m_RotAngle = 0; data.m_AiLogic = partnerInfo.GetAiLogic(); data.m_AiParam[0] = ""; data.m_AiParam[1] = ""; data.m_AiParam[2] = partnerInfo.GetAiParam().ToString(); data.m_IsEnable = true; NpcInfo npc = WorldSystem.Instance.NpcManager.AddNpc(data); if (null != npc) { AppendAttributeConfig aac = AppendAttributeConfigProvider.Instance.GetDataById(partnerInfo.GetAppendAttrConfigId()); float inheritAttackAttrPercent = partnerInfo.GetInheritAttackAttrPercent(); float inheritDefenceAttrPercent = partnerInfo.GetInheritDefenceAttrPercent(); if (null != aac) { // attack npc.GetBaseProperty().SetAttackBase(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().AttackBase *inheritAttackAttrPercent)); npc.GetBaseProperty().SetFireDamage(Operate_Type.OT_Absolute, playerself.GetActualProperty().FireDamage *inheritAttackAttrPercent); npc.GetBaseProperty().SetIceDamage(Operate_Type.OT_Absolute, playerself.GetActualProperty().IceDamage *inheritAttackAttrPercent); npc.GetBaseProperty().SetPoisonDamage(Operate_Type.OT_Absolute, playerself.GetActualProperty().PoisonDamage *inheritAttackAttrPercent); // defence npc.GetBaseProperty().SetHpMax(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().HpMax *inheritDefenceAttrPercent)); npc.GetBaseProperty().SetEnergyMax(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().EnergyMax *inheritDefenceAttrPercent)); npc.GetBaseProperty().SetADefenceBase(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().ADefenceBase *inheritDefenceAttrPercent)); npc.GetBaseProperty().SetMDefenceBase(Operate_Type.OT_Absolute, (int)(playerself.GetActualProperty().MDefenceBase *inheritDefenceAttrPercent)); npc.GetBaseProperty().SetFireERD(Operate_Type.OT_Absolute, playerself.GetActualProperty().FireERD *inheritDefenceAttrPercent); npc.GetBaseProperty().SetIceERD(Operate_Type.OT_Absolute, playerself.GetActualProperty().IceERD *inheritDefenceAttrPercent); npc.GetBaseProperty().SetPoisonERD(Operate_Type.OT_Absolute, playerself.GetActualProperty().PoisonERD *inheritDefenceAttrPercent); // reset hp & energy npc.SetHp(Operate_Type.OT_Absolute, npc.GetActualProperty().HpMax); npc.SetEnergy(Operate_Type.OT_Absolute, npc.GetActualProperty().EnergyMax); } npc.SetAIEnable(true); npc.GetSkillStateInfo().RemoveAllSkill(); npc.BornTime = TimeUtility.GetServerMilliseconds(); List <int> skillList = partnerInfo.GetSkillList(); if (null != skillList) { for (int i = 0; i < skillList.Count; ++i) { SkillInfo skillInfo = new SkillInfo(skillList[i]); npc.GetSkillStateInfo().AddSkill(skillInfo); } } npc.SkillController = new SwordManSkillController(npc, GfxModule.Skill.GfxSkillSystem.Instance); npc.OwnerId = playerself.GetId(); playerself.PartnerId = npc.GetId(); EntityManager.Instance.CreateNpcView(npc.GetId()); if (partnerInfo.BornSkill > 0) { SkillInfo skillInfo = new SkillInfo(partnerInfo.BornSkill); npc.GetSkillStateInfo().AddSkill(skillInfo); npc.SkillController.ForceStartSkill(partnerInfo.BornSkill); } CharacterView view = EntityManager.Instance.GetCharacterViewById(npc.GetId()); if (null != view) { GfxSystem.SetLayer(view.Actor, "PhysicObj"); } } } } }
private void CombatHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { return; } UserAiStateInfo info = user.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > 100) { AiData_UserSelf_General data = GetAiData(user); if (null != data) { data.Time += info.Time; info.Time = 0; //info.IsAttacked = false; CharacterInfo target = AiLogicUtility.GetSeeingLivingCharacterInfoHelper(user, info.Target); Vector3 targetPos = Vector3.Zero; float dist = info.AttackRange; if (null != target) { targetPos = target.GetMovementStateInfo().GetPosition3D(); } else { targetPos = info.TargetPos; } Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); if (!info.IsAttacked) { if (powDist < dist * dist) { data.Time = 0; m_AttackRangeLast = info.AttackRange; info.AttackRange = 0; info.IsAttacked = true; float dir = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); user.GetMovementStateInfo().SetFaceDir(dir); user.GetMovementStateInfo().SetMoveDir(dir); if (null != target) { if (null != OnUserStartAttack) { OnUserStartAttack(user, targetPos.X, targetPos.Y, targetPos.Z); } } else { NotifyUserSkill(user, 1); info.IsAttacked = false; } /// user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Idle); } else { user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; info.IsAttacked = false; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Pursuit); } } } else { info.Time = 0; } } }
private void PathToTarget(UserInfo user, AiPathData data, Vector3 pathTargetPos, long deltaTime) { UserAiStateInfo info = user.GetAiStateInfo(); if (null != data) { data.UpdateTime += deltaTime; Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float dir = user.GetMovementStateInfo().GetMoveDir(); bool findObstacle = false; bool havePathPoint = data.HavePathPoint; if (havePathPoint) {//沿路点列表移动的逻辑 Vector3 targetPos = data.CurPathPoint; if (!data.IsReached(srcPos)) {//向指定路点移动(避让移动过程) user.GetMovementStateInfo().TargetPosition = targetPos; float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); if (!Geometry.IsSameDouble(angle, user.GetMovementStateInfo().GetMoveDir())) { user.GetMovementStateInfo().SetFaceDir(angle); user.GetMovementStateInfo().SetMoveDir(angle); user.GetMovementStateInfo().IsMoving = true; NotifyUserMove(user); } } else {//改变路点或结束沿路点移动 data.UseNextPathPoint(); if (data.HavePathPoint) { targetPos = data.CurPathPoint; user.GetMovementStateInfo().TargetPosition = targetPos; float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); user.GetMovementStateInfo().SetFaceDir(angle); user.GetMovementStateInfo().SetMoveDir(angle); user.GetMovementStateInfo().IsMoving = true; NotifyUserMove(user); } else { data.Clear(); } } } if (!user.UnityPathFinding) { if (!havePathPoint || findObstacle) {//获得路点过程(寻路) data.Clear(); Vector3 targetPos = pathTargetPos; if (Geometry.DistanceSquare(srcPos, targetPos) > 400) { targetPos = user.SpatialSystem.CalcNearstReachablePoint(srcPos, targetPos, 20); } bool canGo = true; /* * if (!user.SpatialSystem.GetCellMapView(user.AvoidanceRadius).CanPass(targetPos)) { * if (!AiLogicUtility.GetWalkablePosition(user.SpatialSystem.GetCellMapView(user.AvoidanceRadius), targetPos, srcPos, ref targetPos)) * canGo = false; * }*/ if (canGo) { List <Vector3> posList = null; if (user.SpatialSystem.CanPass(user.SpaceObject, targetPos)) { posList = new List <Vector3>(); posList.Add(srcPos); posList.Add(targetPos); } else { long stTime = TimeUtility.GetElapsedTimeUs(); posList = user.SpatialSystem.FindPath(srcPos, targetPos, user.AvoidanceRadius); long endTime = TimeUtility.GetElapsedTimeUs(); long calcTime = endTime - stTime; if (calcTime > 1000) { // LogSystem.Warn("pvp FindPath consume {0} us,user:{1} from:{2} to:{3} radius:{4} pos:{5}", calcTime, user.GetId(), srcPos.ToString(), targetPos.ToString(), user.AvoidanceRadius, user.GetMovementStateInfo().GetPosition3D().ToString()); } } if (posList.Count >= 2) { data.SetPathPoints(posList[0], posList, 1); targetPos = data.CurPathPoint; user.GetMovementStateInfo().TargetPosition = targetPos; float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); user.GetMovementStateInfo().SetFaceDir(angle); user.GetMovementStateInfo().SetMoveDir(angle); user.GetMovementStateInfo().IsMoving = true; NotifyUserMove(user); } else { user.GetMovementStateInfo().IsMoving = false; NotifyUserMove(user); } } else { user.GetMovementStateInfo().IsMoving = false; NotifyUserMove(user); } } } else { if (!havePathPoint || findObstacle) { user.GetMovementStateInfo().IsMoving = false; NotifyUserMove(user); } } } }
private void IdleHandler(NpcInfo npc, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { NpcAiStateInfo info = npc.GetAiStateInfo(); info.Time += deltaTime; if (info.Time > m_IntervalTime) { info.Time = 0; DropOutInfo dropInfo = npc.GetAiStateInfo().AiDatas.GetData <DropOutInfo>(); if (null != dropInfo) { if (npc.IsBorning) { Vector3 curPos = npc.GetMovementStateInfo().GetPosition3D(); if (dropInfo.BornTarget == Vector3.Zero) { double tempAngle = CrossEngineHelper.Random.NextFloat() * Math.PI; float length = CrossEngineHelper.Random.NextFloat() * 3.0f; dropInfo.BornTarget = curPos + new Vector3((float)Math.Cos(tempAngle), 0, (float)Math.Sin(tempAngle)) * length; dropInfo.BornAngle = (float)tempAngle; } //npc.GetMovementStateInfo().SetMoveDir(dropInfo.BornAngle); //npc.GetMovementStateInfo().IsMoving = true; //NotifyNpcWalk(npc); return; } else { if (!dropInfo.IsBornOver) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); } } } UserInfo target = null; target = AiLogicUtility.GetNearstTargetHelper(npc, CharacterRelation.RELATION_FRIEND, AiTargetType.USER) as UserInfo; if (null != target && !npc.NeedDelete) { Vector3 srcPos = npc.GetMovementStateInfo().GetPosition3D(); Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); float dis = Geometry.Distance(srcPos, targetPos); float angle = Geometry.GetYAngle(new Vector2(srcPos.X, srcPos.Z), new Vector2(targetPos.X, targetPos.Z)); if (dis <= m_AttractRange && dis > m_PickUpRange) { // 吸取 float move = npc.GetActualProperty().MoveSpeed *m_IntervalTime / 1000; npc.GetMovementStateInfo().SetMoveDir(angle); //npc.GetMovementStateInfo().PositionY = targetPos.Y + (1 - dis / m_AttractRange) * m_Height; //npc.GetMovementStateInfo().SetPosition2D(srcPos.X + move * (float)Math.Cos(angle), srcPos.Z + move * (float)Math.Sin(angle)); npc.GetMovementStateInfo().IsMoving = true; NotifyNpcRun(npc); } else if (dis <= m_PickUpRange) { npc.GetMovementStateInfo().IsMoving = false; NotifyNpcMove(npc); string path = ""; if (null != dropInfo) { switch (dropInfo.DropType) { case DropOutType.GOLD: target.Money += dropInfo.Value; target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value); path = "ef_head"; break; case DropOutType.HP: int addHp = (int)(target.GetActualProperty().HpMax *dropInfo.Value / 100.0f); if (target.GetActualProperty().HpMax > addHp + target.Hp) { target.SetHp(Operate_Type.OT_Relative, addHp); } else { target.SetHp(Operate_Type.OT_Absolute, target.GetActualProperty().HpMax); } target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, addHp, 0); path = "Bone_Root"; break; case DropOutType.MP: int addEnergy = (int)(target.GetActualProperty().EnergyMax *dropInfo.Value / 100.0f); if (target.GetActualProperty().EnergyMax > addEnergy + target.Energy) { target.SetEnergy(Operate_Type.OT_Relative, addEnergy); } else { target.SetEnergy(Operate_Type.OT_Absolute, target.GetActualProperty().EnergyMax); } target.UserManager.FireDamageEvent(target.GetId(), -1, false, false, 0, addEnergy); path = "Bone_Root"; break; case DropOutType.MULT_GOLD: target.Money += dropInfo.Value; target.UserManager.FireGainMoneyEvent(target.GetId(), dropInfo.Value); path = "ef_head"; break; } if (null != OnDropoutPlayEffect) { OnDropoutPlayEffect(target, npc, dropInfo.Particle, path, (int)dropInfo.DropType, dropInfo.Value); } } npc.NeedDelete = true; } } } }
private void PursuitHandler(UserInfo user, AiCommandDispatcher aiCmdDispatcher, long deltaTime) { if (user.IsDead()) { return; } UserAiStateInfo info = user.GetAiStateInfo(); AiData_UserSelf_General data = GetAiData(user); if (null != data) { if (info.Target > 0) { CharacterInfo target = AiLogicUtility.GetLivingCharacterInfoHelper(user, info.Target); if (null != target) { float dist = info.AttackRange - 1.0f; Vector3 targetPos = target.GetMovementStateInfo().GetPosition3D(); Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); if (powDist < dist * dist) { user.GetMovementStateInfo().IsMoving = false; info.Time = 0; data.Time = 0; ChangeToState(user, (int)AiStateId.Combat); NotifyUserMove(user); } else { info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; CharacterInfo target2 = GetCanAttackUserTarget(user); if (null == target2) { AiLogicUtility.GetNearstTargetHelper(user, CharacterRelation.RELATION_ENEMY); } if (null == target2 || target == target2) { PathToTargetPro(user, data.FoundPath, targetPos, deltaTime); } else { info.Target = target2.GetId(); return; } } } } else { user.GetMovementStateInfo().StopMove(); NotifyUserMove(user); info.Time = 0; data.Time = 0; data.FoundPath.Clear(); ChangeToState(user, (int)AiStateId.Idle); } } else { float dist = info.AttackRange; Vector3 targetPos = info.TargetPos; Vector3 srcPos = user.GetMovementStateInfo().GetPosition3D(); float powDist = Geometry.DistanceSquare(srcPos, targetPos); if (powDist < dist * dist) { user.GetMovementStateInfo().IsMoving = false; info.Time = 0; data.Time = 0; ChangeToState(user, (int)AiStateId.Combat); NotifyUserMove(user); } else { info.Time += deltaTime; if (info.Time > 100) { info.Time = 0; PathToTargetPro(user, data.FoundPath, targetPos, deltaTime); } } } } }
public static void ExecObjMoveCommand(int objId, float x, float y, float z) { Vector3 pos = new Vector3(x, y, z); CharacterInfo obj = WorldSystem.Instance.GetCharacterById(objId); UserInfo user = obj as UserInfo; if (null != user) { if (!user.UnityPathFinding) { List <Vector3> waypoints = user.SpatialSystem.FindPath(user.GetMovementStateInfo().GetPosition3D(), pos, 1); waypoints.Add(pos); UserAiStateInfo aiInfo = user.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(waypoints); aiInfo.AiDatas.AddData(data); } data.WayPoints = waypoints; data.Index = 0; data.EstimateFinishTime = 0; data.IsFinish = false; aiInfo.ChangeToState((int)AiStateId.MoveCommand); } else { UserAiStateInfo aiInfo = user.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(null); aiInfo.AiDatas.AddData(data); } user.PathFindingFinished = false; user.GetAiStateInfo().ChangeToState((int)AiStateId.PathFinding); user.GetAiStateInfo().PreviousState = (int)AiStateId.MoveCommand; GfxSystem.ForMoveCommandPathToTarget(user, pos); } } else { NpcInfo npc = obj as NpcInfo; if (null != npc) { if (!npc.UnityPathFinding) { List <Vector3> waypoints = npc.SpatialSystem.FindPath(npc.GetMovementStateInfo().GetPosition3D(), pos, 1); waypoints.Add(pos); NpcAiStateInfo aiInfo = npc.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(waypoints); aiInfo.AiDatas.AddData(data); } data.WayPoints = waypoints; data.Index = 0; data.EstimateFinishTime = 0; data.IsFinish = false; aiInfo.ChangeToState((int)AiStateId.MoveCommand); } else { NpcAiStateInfo aiInfo = npc.GetAiStateInfo(); AiData_ForMoveCommand data = aiInfo.AiDatas.GetData <AiData_ForMoveCommand>(); if (null == data) { data = new AiData_ForMoveCommand(null); aiInfo.AiDatas.AddData(data); } npc.PathFindingFinished = false; npc.GetAiStateInfo().ChangeToState((int)AiStateId.PathFinding); npc.GetAiStateInfo().PreviousState = (int)AiStateId.MoveCommand; GfxSystem.ForMoveCommandPathToTarget(npc, pos); } } } }