Esempio n. 1
0
        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;
        }
Esempio n. 2
0
        /// <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);
        }