/// <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); }
/// <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; } } } }