Exemplo n.º 1
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);
        }
Exemplo n.º 2
0
        /// <inheritdoc />
        public void UseItem(IPlayerEntity player, int itemUniqueId, int part)
        {
            Item itemToUse = player.Inventory.GetItemAtIndex(itemUniqueId);

            if (itemToUse == null)
            {
                throw new ArgumentNullException(nameof(itemToUse), $"Cannot find item with unique id: '{itemUniqueId}' in {player.Object.Name} inventory.");
            }

            if (part != -1)
            {
                if (part >= MaxHumanParts)
                {
                    throw new InvalidOperationException($"Invalid equipement part.");
                }

                if (!player.Battle.IsFighting)
                {
                    EquipItem(player, itemUniqueId, part);
                }
            }
            else
            {
                if (itemToUse.Data.IsUseable && itemToUse.Quantity > 0)
                {
                    _logger.LogTrace($"{player.Object.Name} want to use {itemToUse.Data.Name}.");

                    if (player.Inventory.ItemHasCoolTime(itemToUse) && !player.Inventory.CanUseItemWithCoolTime(itemToUse))
                    {
                        _logger.LogDebug($"Player '{player.Object.Name}' cannot use item {itemToUse.Data.Name}: CoolTime.");
                        return;
                    }

                    switch (itemToUse.Data.ItemKind2)
                    {
                    case ItemKind2.REFRESHER:
                    case ItemKind2.POTION:
                    case ItemKind2.FOOD:
                        _inventoryItemUsage.UseFoodItem(player, itemToUse);
                        break;

                    case ItemKind2.MAGIC:
                        _inventoryItemUsage.UseMagicItem(player, itemToUse);
                        break;

                    case ItemKind2.SYSTEM:
                        UseSystemItem(player, itemToUse);
                        break;

                    case ItemKind2.GMTEXT:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.GENERAL:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.BUFF:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.BUFF2:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.AIRFUEL:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.FURNITURE:
                    case ItemKind2.PAPERING:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.GUILDHOUSE_FURNITURE:
                    case ItemKind2.GUILDHOUSE_NPC:
                    case ItemKind2.GUILDHOUSE_PAPERING:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.GUILDHOUES_COMEBACK:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;

                    case ItemKind2.BLINKWING:
                        _inventoryItemUsage.UseBlinkwingItem(player, itemToUse);
                        break;

                    default:
                        _logger.LogDebug($"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        _textPacketFactory.SendSnoop(player, $"Item usage for {itemToUse.Data.ItemKind2} is not implemented.");
                        break;
                    }
                }
            }
        }