public void OnJoin(IWorldClient client, JoinPacket packet) { DbCharacter character = _database.Characters.Include(x => x.User).FirstOrDefault(x => x.Id == packet.PlayerId); if (character == null) { _logger.LogError($"Invalid player id received from client; cannot find player with id: {packet.PlayerId}"); return; } if (character.IsDeleted) { _logger.LogWarning($"Cannot connect with character '{character.Name}' for user '{character.User.Username}'. Reason: character is deleted."); return; } if (character.User.Authority <= 0) { _logger.LogWarning($"Cannot connect with '{character.Name}'. Reason: User {character.User.Username} is banned."); // TODO: send error to client return; } client.Player = _playerFactory.CreatePlayer(character); client.Player.Connection = client; _worldSpawnPacketFactory.SendPlayerSpawn(client.Player); client.Player.Object.Spawned = true; client.Player.PlayerData.LoggedInAt = DateTime.UtcNow; }
/// <inheritdoc /> public void Teleport(IPlayerEntity player, int mapId, float x, float?y, float z, float angle = 0) { if (player.Object.MapId != mapId) { IMapInstance destinationMap = _mapManager.GetMap(mapId); if (destinationMap == null) { _logger.LogError($"Cannot find map with id '{mapId}'."); _textPacketFactory.SendSnoop(player, $"Cannot find map with id '{mapId}'."); return; } if (!destinationMap.ContainsPosition(new Vector3(x, 0, z))) { _logger.LogError($"Cannot teleport. Destination position is out of map bounds."); return; } _visibilitySystem.DespawnEntity(player); player.Object.Spawned = false; player.Object.CurrentMap = _mapManager.GetMap(destinationMap.Id); player.Object.MapId = destinationMap.Id; player.Object.LayerId = destinationMap.DefaultMapLayer.Id; // TODO: get map height at x/z position float positionY = y ?? 100; player.Object.Position = new Vector3(x, positionY, z); player.Object.MovingFlags = ObjectState.OBJSTA_STAND; player.Moves.DestinationPosition.Reset(); player.Battle.Reset(); player.Follow.Reset(); _playerPacketFactory.SendPlayerReplace(player); _worldSpawnPacketFactory.SendPlayerSpawn(player); player.Object.Spawned = true; } else { if (!player.Object.CurrentMap.ContainsPosition(new Vector3(x, 0, z))) { _logger.LogError($"Cannot teleport. Destination position is out of map bounds."); return; } // TODO: get map height at x/z position float positionY = y ?? 100; player.Object.Position = new Vector3(x, positionY, z); player.Object.MovingFlags = ObjectState.OBJSTA_STAND; player.Moves.DestinationPosition.Reset(); player.Battle.Reset(); player.Follow.Reset(); } _playerPacketFactory.SendPlayerTeleport(player); }