public override void GameTick(Entity entity, float dt) { EntityPlayer entityplayer = entity as EntityPlayer; EntityControls controls = entityplayer.Controls; string playerUID = entity.WatchedAttributes.GetString("playerUID"); IPlayer player = entity.World.PlayerByUid(playerUID); if (entity.World is IServerWorldAccessor && ((IServerPlayer)player).ConnectionState != EnumClientState.Playing) { return; } if (player != null) { IClientWorldAccessor clientWorld = entity.World as IClientWorldAccessor; // Tyron Nov. 10 2020: This line of code was from August 2020 where it fixed jitter of other players related to climbing ladders? // Cannot repro. But what I can repro is this line breaks player animations. They are stuck in a permanent land pose, so disabled for now. //if (clientWorld != null && clientWorld.Player.ClientId != player.ClientId) return; // We pretend the entity is flying to disable gravity so that EntityBehaviorInterpolatePosition system // can work better controls.IsFlying = player.WorldData.FreeMove || (clientWorld != null && clientWorld.Player.ClientId != player.ClientId); controls.NoClip = player.WorldData.NoClip; controls.MovespeedMultiplier = player.WorldData.MoveSpeedMultiplier; } EntityPos pos = entity.World is IServerWorldAccessor ? entity.ServerPos : entity.Pos; if (controls.TriesToMove && player is IClientPlayer) { IClientPlayer cplr = player as IClientPlayer; float prevYaw = pos.Yaw; if (entity.Swimming) { float prevPitch = pos.Pitch; pos.Yaw = cplr.CameraYaw; pos.Pitch = cplr.CameraPitch; controls.CalcMovementVectors(pos, dt); pos.Yaw = prevYaw; pos.Pitch = prevPitch; } else { pos.Yaw = cplr.CameraYaw; controls.CalcMovementVectors(pos, dt); pos.Yaw = prevYaw; } float desiredYaw = (float)Math.Atan2(controls.WalkVector.X, controls.WalkVector.Z) - GameMath.PIHALF; float yawDist = GameMath.AngleRadDistance(entityplayer.WalkYaw, desiredYaw); entityplayer.WalkYaw += GameMath.Clamp(yawDist, -8 * dt * GlobalConstants.OverallSpeedMultiplier, 8 * dt * GlobalConstants.OverallSpeedMultiplier); entityplayer.WalkYaw = GameMath.Mod(entityplayer.WalkYaw, GameMath.TWOPI); if (entity.Swimming) { float desiredPitch = -(float)Math.Sin(pos.Pitch); // (float)controls.FlyVector.Y * GameMath.PI; float pitchDist = GameMath.AngleRadDistance(entityplayer.WalkPitch, desiredPitch); entityplayer.WalkPitch += GameMath.Clamp(pitchDist, -2 * dt * GlobalConstants.OverallSpeedMultiplier, 2 * dt * GlobalConstants.OverallSpeedMultiplier); entityplayer.WalkPitch = GameMath.Mod(entityplayer.WalkPitch, GameMath.TWOPI); } else { entityplayer.WalkPitch = 0; } } else { controls.CalcMovementVectors(pos, dt); } TickEntityPhysics(pos, controls, dt); }
public override void GameTick(Entity entity, float dt) { EntityPlayer entityplayer = entity as EntityPlayer; EntityControls controls = entityplayer.Controls; string playerUID = entity.WatchedAttributes.GetString("playerUID"); IPlayer player = entity.World.PlayerByUid(playerUID); if (entity.World is IServerWorldAccessor && ((IServerPlayer)player).ConnectionState != EnumClientState.Playing) { return; } if (player != null) { IClientWorldAccessor clientWorld = entity.World as IClientWorldAccessor; // We pretend the entity is flying to disable gravity so that EntityBehaviorInterpolatePosition system // can work better controls.IsFlying = player.WorldData.FreeMove || (clientWorld != null && clientWorld.Player.ClientId != player.ClientId); controls.NoClip = player.WorldData.NoClip; controls.MovespeedMultiplier = player.WorldData.MoveSpeedMultiplier; } EntityPos pos = entity.World is IServerWorldAccessor ? entity.ServerPos : entity.Pos; if (controls.TriesToMove && player is IClientPlayer) { IClientPlayer cplr = player as IClientPlayer; float prevYaw = pos.Yaw; if (entity.Swimming) { float prevPitch = pos.Pitch; pos.Yaw = cplr.CameraYaw; pos.Pitch = cplr.CameraPitch; controls.CalcMovementVectors(pos, dt); pos.Yaw = prevYaw; pos.Pitch = prevPitch; } else { pos.Yaw = cplr.CameraYaw; controls.CalcMovementVectors(pos, dt); pos.Yaw = prevYaw; } float desiredYaw = (float)Math.Atan2(controls.WalkVector.X, controls.WalkVector.Z) - GameMath.PIHALF; float yawDist = GameMath.AngleRadDistance(entityplayer.WalkYaw, desiredYaw); entityplayer.WalkYaw += GameMath.Clamp(yawDist, -10 * dt, 10 * dt); entityplayer.WalkYaw = GameMath.Mod(entityplayer.WalkYaw, GameMath.TWOPI); if (entity.Swimming) { float desiredPitch = -(float)Math.Sin(pos.Pitch); // (float)controls.FlyVector.Y * GameMath.PI; float pitchDist = GameMath.AngleRadDistance(entityplayer.WalkPitch, desiredPitch); entityplayer.WalkPitch += GameMath.Clamp(pitchDist, -2 * dt, 2 * dt); entityplayer.WalkPitch = GameMath.Mod(entityplayer.WalkPitch, GameMath.TWOPI); //Console.WriteLine(entityplayer.WalkPitch); } else { entityplayer.WalkPitch = 0; } } else { controls.CalcMovementVectors(pos, dt); } TickEntityPhysics(pos, controls, dt); }