public static void AdjustUserPosition(int id, float x, float y, float z, float time, float dir) { CharacterInfo info = WorldSystem.Instance.GetCharacterById(id); if (null != info) { MovementStateInfo msi = info.GetMovementStateInfo(); if (time < 1000) { Vector3 pos = msi.GetPosition3D(); float speed = info.GetActualProperty().MoveSpeed; float distance = (speed * time) / 1000; float len = pos.Length(); float nz = (float)(z + distance * Math.Cos(dir)); float nx = (float)(x + distance * Math.Sin(dir)); int ctrlId = ControllerIdCalculator.Calc(ControllerType.Position, id); PositionController ctrl = ControlSystem.Instance.PositionControllerPool.Alloc(); if (null != ctrl) { ctrl.Init(ctrlId, id, nx - pos.X, 0, nz - pos.Z, 1000); ControlSystem.Instance.AddController(ctrl); } LogSystem.Debug("PositionController start, dx:{0} dz:{1} time:{2}", nx - pos.X, nz - pos.Z, 500); } else { msi.SetPosition2D(x, z); LogSystem.Debug("PositionController just move to pos, x:{0} z:{1}", x, z); } } }
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); } }
public void Create(UserInfo user) { Init(); if (null != user) { m_User = user; m_User.OnBeginAttack = ResetShootAnimation; 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); InitAnimationSets(); UpdateWeaponModel(m_User); if (user.GetId() == WorldSystem.Instance.PlayerSelfId) { GfxSystem.MarkPlayerSelf(Actor); } } }
protected void UpdateMovement() { CharacterInfo obj = GetOwner(); if (null != obj && !obj.IsDead() && null != ObjectInfo) { MovementStateInfo msi = obj.GetMovementStateInfo(); ObjectInfo.FaceDir = msi.GetFaceDir(); if (msi.IsMoving) { ScriptRuntime.Vector3 pos = msi.GetPosition3D(); ObjectInfo.MoveCos = (float)msi.MoveDirCosAngle; ObjectInfo.MoveSin = (float)msi.MoveDirSinAngle; ObjectInfo.MoveSpeed = (float)obj.GetActualProperty().MoveSpeed *(float)obj.VelocityCoefficient; if (obj is UserInfo) { if (msi.TargetPosition.LengthSquared() < Geometry.c_FloatPrecision) { ObjectInfo.MoveTargetDistanceSqr = 100.0f; } else { ObjectInfo.MoveTargetDistanceSqr = msi.CalcDistancSquareToTarget(); } } else { ObjectInfo.MoveTargetDistanceSqr = msi.CalcDistancSquareToTarget(); } ObjectInfo.IsLogicMoving = true; } else { ObjectInfo.IsLogicMoving = false; } } else { ObjectInfo.IsLogicMoving = false; } }
internal static void Execute(object msg, User user) { Msg_CRC_GfxControlMoveStop _msg = msg as Msg_CRC_GfxControlMoveStop; if (_msg == null) { return; } Scene scene = user.OwnRoom.GetActiveScene(); if (null != scene) { CharacterInfo info = scene.SceneContext.GetCharacterInfoById(_msg.obj_id); if (null != info && (_msg.obj_id == user.RoleId || info.OwnerId == user.RoleId)) { MovementStateInfo msi = info.GetMovementStateInfo(); Vector3 pos; if (_msg.obj_id == user.RoleId) { pos = user.LastClientPosition; } else { pos = msi.GetPosition3D(); } Vector3 newPos = new Vector3(_msg.target_pos.x, 0, _msg.target_pos.z); msi.IsSkillMoving = false; bool enableControl = false; if (_msg.is_skill) { SkillInfo skillInfo = info.GetSkillStateInfo().GetSkillInfoById(_msg.skill_or_impact_id); float distance = Geometry.Distance(pos, newPos); if (null != skillInfo && (skillInfo.m_LeftEnableMoveCount > 0 || distance <= 0.3)) { //校验 --skillInfo.m_LeftEnableMoveCount; if (distance <= skillInfo.m_MaxMoveDistance + 1) { enableControl = true; //LogSys.Log(LOG_TYPE.WARN, "Msg_CRC_GfxControlMoveStopHandler {0} ({1} <= {2}) LeftEnableMoveCount:{3} skill:{4} accept by server ({5}->{6})", _msg.obj_id, distSqr, skillInfo.m_MaxMoveDistanceSqr, skillInfo.m_LeftEnableMoveCount, _msg.skill_or_impact_id, pos.ToString(), newPos.ToString()); } else { LogSys.Log(LOG_TYPE.ERROR, "Msg_CRC_GfxControlMoveStopHandler {0} ({1} > {2}) LeftEnableMoveCount:{3} skill:{4} can't accept by server ({5}->{6})", _msg.obj_id, distance, skillInfo.m_MaxMoveDistance, skillInfo.m_LeftEnableMoveCount, _msg.skill_or_impact_id, pos.ToString(), newPos.ToString()); } } else { LogSys.Log(LOG_TYPE.ERROR, "Msg_CRC_GfxControlMoveStopHandler {0} (LeftEnableMoveCount:{1} skill:{2}) can't accept by server ({3}->{4})", _msg.obj_id, skillInfo != null ? skillInfo.m_LeftEnableMoveCount : -1, _msg.skill_or_impact_id, pos.ToString(), newPos.ToString()); } } else { ImpactInfo impactInfo = info.GetSkillStateInfo().GetImpactInfoForCheck(_msg.skill_or_impact_id); if (null != impactInfo && impactInfo.m_LeftEnableMoveCount > 0) { //校验 --impactInfo.m_LeftEnableMoveCount; float distance = Geometry.Distance(pos, newPos); if (distance <= impactInfo.m_MaxMoveDistance + 1) { enableControl = true; //LogSys.Log(LOG_TYPE.WARN, "Msg_CRC_GfxControlMoveStopHandler {0} ({1} <= {2}) LeftEnableMoveCount:{3} skill:{4} impact:{5} accept by server ({6}->{7})", _msg.obj_id, distSqr, impactInfo.m_MaxMoveDistanceSqr, impactInfo.m_LeftEnableMoveCount, impactInfo.m_SkillId, _msg.skill_or_impact_id, pos.ToString(), newPos.ToString()); } else { LogSys.Log(LOG_TYPE.ERROR, "Msg_CRC_GfxControlMoveStopHandler {0} ({1} > {2}) LeftEnableMoveCount:{3} skill:{4} impact:{5} can't accept by server ({6}->{7})", _msg.obj_id, distance, impactInfo.m_MaxMoveDistance, impactInfo.m_LeftEnableMoveCount, impactInfo.m_SkillId, _msg.skill_or_impact_id, pos.ToString(), newPos.ToString()); } } else { LogSys.Log(LOG_TYPE.ERROR, "Msg_CRC_GfxControlMoveStopHandler {0} (LeftEnableMoveCount:{1} skill:{2} impact:{3}) can't accept by server ({4}->{5})", _msg.obj_id, impactInfo != null ? impactInfo.m_LeftEnableMoveCount : -1, impactInfo != null ? impactInfo.m_SkillId : -1, _msg.skill_or_impact_id, pos.ToString(), newPos.ToString()); } } if (enableControl) { msi.SetFaceDir(_msg.face_dir); msi.SetPosition(newPos); } else { //todo:记录违规次数 } if (_msg.obj_id == user.RoleId) { float velocity = (float)user.Info.GetActualProperty().MoveSpeed; user.SampleMoveData(msi.PositionX, msi.PositionZ, velocity, msi.MoveDirCosAngle, msi.MoveDirSinAngle, _msg.send_time); } } else { if (null == info) { LogSys.Log(LOG_TYPE.ERROR, "Msg_CRC_GfxControlMoveStopHandler, charactor {0} not exist", _msg.obj_id); } else { LogSys.Log(LOG_TYPE.ERROR, "Msg_CRC_GfxControlMoveStopHandler, charactor {0} or owner {1} not user {2}", info.GetId(), info.OwnerId, user.RoleId); } } } }
internal void Tick() { try { if (this.CurrentState != RoomState.Active && this.CurrentState != RoomState.Finish) { return; } long curTime = TimeUtility.GetServerMilliseconds(); if (m_LastLogTime + 60000 < curTime) { m_LastLogTime = curTime; LogSys.Log(LOG_TYPE.INFO, "Room.Tick {0}", RoomID); } if (this.CurrentState == RoomState.Active) { Scene scene = GetActiveScene(); if (null != scene) { scene.Tick(); scene.SightTick(); } disconnected_users_.Clear(); request_delete_users_.Clear(); foreach (User user in room_users_) { if (user != null) { user.Tick(); if (user.IsTimeout()) { if (user.UserControlState == (int)UserControlState.User) { disconnected_users_.Add(user); } else if (user.UserControlState == (int)UserControlState.Remove) { request_delete_users_.Add(user); } } } } foreach (User user in disconnected_users_) { DropUser(user); } foreach (User user in request_delete_users_) { RemoveUser(user); } //todo:观察者掉线处理 for (int i = 0; i < room_observers_.Length; ++i) { Observer observer = room_observers_[i]; if (!observer.IsIdle) { observer.Tick(); } } int userCount = GetActiveRoomUserCount(); if (userCount <= 0) { if (GetMinimizeElapsedDroppedTime() > c_finish_time_for_no_users_) { //若房间内玩家数目为0,结束战斗,关闭房间 EndBattle((int)CampIdEnum.Unkown); } } //每个Tick结束,将空间属性同步给Peer,用于Peer转发消息 foreach (User user in room_users_) { if (null != user && null != user.Info && null != user.Info.GetMovementStateInfo()) { RoomServer.RoomPeer peer = user.GetPeer(); if (null != peer) { MovementStateInfo info = user.Info.GetMovementStateInfo(); peer.Position = info.GetPosition3D(); peer.FaceDir = info.GetFaceDir(); } } } } else if (m_FinishTime + c_DeactiveWaitTime < curTime) { Deactive(); } } catch (Exception ex) { LogSys.Log(LOG_TYPE.ERROR, "Exception {0}\n{1}", ex.Message, ex.StackTrace); } }