private void HandleTeleportViaNpc(CharacterTeleportViaNpcPacket teleportViaNpcPacket) { var npc = Map.GetNPC(CellId, teleportViaNpcPacket.NpcId); if (npc is null) { _logger.LogWarning($"Character {Id} is trying to get non-existing npc via teleport packet."); return; } if (!npc.ContainsGate(teleportViaNpcPacket.GateId)) { return; } var gate = npc.Gates[teleportViaNpcPacket.GateId]; if (Gold < gate.Cost) { SendTeleportViaNpc(NpcTeleportNotAllowedReason.NotEnoughMoney); return; } var mapConfig = _mapLoader.LoadMapConfiguration(gate.MapId); if (mapConfig is null) { SendTeleportViaNpc(NpcTeleportNotAllowedReason.MapCapacityIsFull); return; } // TODO: there should be somewhere player's level check. But I can not find it in gate config. ChangeGold((uint)(Gold - gate.Cost)); SendTeleportViaNpc(NpcTeleportNotAllowedReason.Success); Teleport(gate.MapId, gate.X, gate.Y, gate.Z); }
public void HandleNpcTeleport(WorldClient client, CharacterTeleportViaNpcPacket packet) { var npc = _mapProvider.Map.GetNPC(_gameWorld.Players[_gameSession.CharId].CellId, packet.NpcId); if (npc is null) { _logger.LogWarning("Character {Id} is trying to get non-existing npc via teleport packet.", _gameSession.CharId); return; } if (!npc.ContainsGate(packet.GateId)) { _logger.LogWarning("NPC type {type} type id {typeId} doesn't contain teleport gate {gateId}. Check it out!", npc.Type, npc.TypeId, packet.GateId); return; } if (_mapProvider.Map is GuildHouseMap) { if (!_guildManager.HasGuild) { _packetFactory.SendGuildHouseActionError(client, GuildHouseActionError.LowRank, 30); return; } var allowed = _guildManager.CanUseNpc(npc.Type, npc.TypeId, out var requiredRank); if (!allowed) { _packetFactory.SendGuildHouseActionError(client, GuildHouseActionError.LowRank, requiredRank); return; } allowed = _guildManager.HasNpcLevel(npc.Type, npc.TypeId); if (!allowed) { _packetFactory.SendGuildHouseActionError(client, GuildHouseActionError.LowLevel, 0); return; } } var gate = npc.Gates[packet.GateId]; if (_inventoryManager.Gold < gate.Cost) { _packetFactory.SendTeleportViaNpc(client, NpcTeleportNotAllowedReason.NotEnoughMoney, _inventoryManager.Gold); return; } var mapConfig = _mapLoader.LoadMapConfiguration((ushort)gate.MapId); if (mapConfig is null) { _packetFactory.SendTeleportViaNpc(client, NpcTeleportNotAllowedReason.MapCapacityIsFull, _inventoryManager.Gold); return; } // TODO: there should be somewhere player's level check. But I can not find it in gate config. _inventoryManager.Gold = (uint)(_inventoryManager.Gold - gate.Cost); _packetFactory.SendTeleportViaNpc(client, NpcTeleportNotAllowedReason.Success, _inventoryManager.Gold); _teleportationManager.Teleport((ushort)gate.MapId, gate.Position.X, gate.Position.Y, gate.Position.Z); }
private void HandleTeleportViaNpc(CharacterTeleportViaNpcPacket teleportViaNpcPacket) { var npc = Map.GetNPC(CellId, teleportViaNpcPacket.NpcId); if (npc is null) { _logger.LogWarning($"Character {Id} is trying to get non-existing npc via teleport packet."); return; } if (!npc.ContainsGate(teleportViaNpcPacket.GateId)) { _logger.LogWarning($"NPC type {npc.Type} type id {npc.TypeId} doesn't contain teleport gate {teleportViaNpcPacket.GateId}. Check it out!"); return; } if (Map is GuildHouseMap) { if (!HasGuild) { _packetsHelper.SendGuildHouseActionError(Client, GuildHouseActionError.LowRank, 30); return; } var allowed = _guildManager.CanUseNpc((int)GuildId, npc.Type, npc.TypeId, out var requiredRank); if (!allowed) { _packetsHelper.SendGuildHouseActionError(Client, GuildHouseActionError.LowRank, requiredRank); return; } allowed = _guildManager.HasNpcLevel((int)GuildId, npc.Type, npc.TypeId); if (!allowed) { _packetsHelper.SendGuildHouseActionError(Client, GuildHouseActionError.LowLevel, 0); return; } } var gate = npc.Gates[teleportViaNpcPacket.GateId]; if (Gold < gate.Cost) { SendTeleportViaNpc(NpcTeleportNotAllowedReason.NotEnoughMoney); return; } var mapConfig = _mapLoader.LoadMapConfiguration(gate.MapId); if (mapConfig is null) { SendTeleportViaNpc(NpcTeleportNotAllowedReason.MapCapacityIsFull); return; } // TODO: there should be somewhere player's level check. But I can not find it in gate config. ChangeGold((uint)(Gold - gate.Cost)); SendTeleportViaNpc(NpcTeleportNotAllowedReason.Success); Teleport(gate.MapId, gate.X, gate.Y, gate.Z); }