Пример #1
0
        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);
        }
Пример #2
0
        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);
        }