示例#1
0
        /// <summary>
        /// Положить предмет в багажник
        /// </summary>
        public bool PutInTrunk(Client player, Vehicle vehicle, InventoryItem item, int count)
        {
            if (!EnoughItems(player, item, count))
            {
                return(false);
            }
            var vehicleCarring = VehicleManager.GetCarrying((VehicleHash)vehicle.model);
            var vehicleInfo    = _vehicleInfoManager.GetInfoByHandle(player, vehicle);
            var trunk          = vehicleInfo.GetTrunk();

            if (!_inventoryHelper.CanCarry(trunk, item, count, vehicleCarring))
            {
                API.sendColoredNotificationToPlayer(player, "Превышена грузоподъемность транспорта", 0, 6);
                return(false);
            }
            var playerInfo = _playerInfoManager.GetInfo(player);

            playerInfo.Inventory.First(ItemPredicate(item)).DecreaseCount(count);
            var itemInTrunk = trunk.FirstOrDefault(ItemPredicate(item));

            if (itemInTrunk == null)
            {
                item.Count = count;
                trunk.Add(item);
            }
            else
            {
                itemInTrunk.Count += count;
            }
            vehicleInfo.SetTrunk(trunk);
            _vehicleInfoManager.SetInfo(player, vehicleInfo);
            _playerInfoManager.RefreshUI(player, playerInfo);
            _inventoryManager.EquipWeapon(player);
            return(true);
        }
示例#2
0
        /// <summary>
        /// Обработчик покупки тюнинга значение тюнинга детали
        /// </summary>
        private void SelectOrBuyVehicleMod(Client player, object[] args)
        {
            var price      = (int)args[0];
            var slot       = (int)args[1];
            var value      = (int)args[2];
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (!PlayerHelper.EnoughMoney(player, playerInfo, price))
            {
                return;
            }
            var vehicleInfo = GetVehicleInfo(player);
            var mods        = vehicleInfo.Tuning.GetMods();

            if (mods.ContainsKey(slot))
            {
                SetMod(player, mods, slot, value);
            }
            else
            {
                AddMod(player, mods, slot, value);
            }
            if (value != DEFAULT)
            {
                playerInfo.Balance -= price;
            }
            vehicleInfo.Tuning.SetMods(mods);
            _vehicleInfoManager.SetInfo(player, vehicleInfo);
            _playerInfoManager.RefreshUI(player, playerInfo);
        }
        /// <summary>
        /// Заправить машину игрока
        /// </summary>
        private void FillVehicle(Client player, object[] args)
        {
            var stationKey = string.Format(FillingStation.STATION_KEY, args[0]);
            var vehicle    = PlayerHelper.GetData <Vehicle>(player, stationKey, null);

            if (vehicle == null)
            {
                API.sendColoredNotificationToPlayer(player, "Транспорт не находится рядом с бензоколонкой", 0, 6);
                return;
            }
            var currentFuel   = API.getVehicleFuelLevel(vehicle);
            var maxFuel       = (int)vehicle.getData(VehicleManager.MAX_FUEL);
            var fillingAmount = (int)args[1];
            var playerInfo    = _playerInfoManager.GetInfo(player);

            if (!CanFillVehicle(player, playerInfo, maxFuel, currentFuel, fillingAmount))
            {
                return;
            }
            API.setVehicleFuelLevel(vehicle, currentFuel + fillingAmount);
            playerInfo.Balance -= fillingAmount;
            _playerInfoManager.RefreshUI(player, playerInfo);
            var district = (int)args[2];

            _clanManager.ReplenishClanBalance(district, fillingAmount);
            API.sendNotificationToPlayer(player, $"Приобретено ~b~{fillingAmount}л. ~w~бензина");
            API.triggerClientEvent(player, ServerEvent.HIDE_FILLING_MENU);
        }
示例#4
0
        /// <summary>
        /// Проверяет время ареста заключенных
        /// </summary>
        private void CheckPrisoners()
        {
            var playersToRelease = new List <Client>();

            foreach (var prisoner in _prisoners)
            {
                var info = _playerInfoManager.GetInfo(prisoner);
                if (info.Wanted.WantedLevel > 0)
                {
                    var timeToAdd = CalculateJailTime(info);
                    info.Wanted.JailTime += timeToAdd;
                    _playerInfoManager.ClearWanted(prisoner);
                    API.sendNotificationToPlayer(prisoner, $"~b~{CHAT} Добавлено время за плохое поведение: {info.Wanted.JailTime} мин.");
                }
                info.Wanted.JailTime -= 1;
                _playerInfoManager.RefreshUI(prisoner, info);
                if (info.Wanted.JailTime > 0)
                {
                    API.sendNotificationToPlayer(prisoner, $"~b~{CHAT} До освобождения осталось: {info.Wanted.JailTime} мин.");
                    continue;
                }
                playersToRelease.Add(prisoner);
            }
            ReleasePrisoner(playersToRelease);
        }
示例#5
0
        /// <summary>
        /// Вступить в клан
        /// </summary>
        private void JoinClan(Client player, object[] args)
        {
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (playerInfo.Clan != null)
            {
                API.sendNotificationToPlayer(player, "~r~Вы уже состоите в банде", true);
                return;
            }
            if (playerInfo.Level < MIN_LEVEL)
            {
                API.sendNotificationToPlayer(player, $"~r~Необходимо достигнуть {MIN_LEVEL}-го уровня", true);
                return;
            }
            var clanId = (int)args[0];

            if (_clanManager.ClanIsFull(clanId))
            {
                API.sendNotificationToPlayer(player, "~r~В банде слишком много участников");
                API.sendNotificationToPlayer(player, "~r~Попробуйте позже или вступите в другую");
                return;
            }
            _clanManager.JoinClan(player, playerInfo, clanId);
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.triggerClientEvent(player, ServerEvent.HIDE_CLAN_MENU);
        }
示例#6
0
        /// <summary>
        /// Покупка оружия
        /// </summary>
        private void BuyWeapon(Client player, object[] args)
        {
            var goodItem   = JsonConvert.DeserializeObject <WeaponGood>(args[0].ToString());
            var playerInfo = _playerInfoManager.GetInfo(player);
            var district   = (int)args[1];

            if (!HasMoney(player, playerInfo, goodItem.Price) || district != Validator.INVALID_ID && !HasLicense(player, playerInfo))
            {
                return;
            }
            var item = CreateWeaponItem(playerInfo, goodItem);

            if (!_inventoryHelper.CanCarry(playerInfo.Inventory, item, item.Count))
            {
                API.sendColoredNotificationToPlayer(player, "Превышена грузоподъемность персонажа", 0, 6);
                return;
            }
            playerInfo.Inventory.Add(item);
            playerInfo.Balance -= goodItem.Price;
            _playerInfoManager.RefreshUI(player, playerInfo);
            if (!player.hasData(WorkData.IS_POLICEMAN))
            {
                _inventoryManager.EquipWeapon(player);
            }
            API.sendNotificationToPlayer(player, $"Приобретено ~b~\"{goodItem.Name}\"");
            if (district != Validator.INVALID_ID)
            {
                _clanManager.ReplenishClanBalance(district, goodItem.Price);
            }
        }
示例#7
0
        /// <summary>
        /// Передает деньги другому игроку
        /// </summary>
        private void SendMoneyToPlayer(Client player, object[] args)
        {
            var targetName   = args[0].ToString().Trim();
            var amount       = (int)args[1];
            var targetPlayer = API.getPlayerFromName(targetName);

            if (targetPlayer == null)
            {
                API.sendNotificationToPlayer(player, "~r~Игрок не в сети или не существует", true);
                return;
            }
            if (targetPlayer == player)
            {
                API.sendNotificationToPlayer(player, "~r~Нельзя передать деньги самому себе", true);
                return;
            }
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (!PlayerHelper.EnoughMoney(player, playerInfo, amount))
            {
                return;
            }
            playerInfo.Balance -= amount;
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.sendNotificationToPlayer(player, $"~b~Вы передали {targetPlayer.name}'у {amount}$");
            var targetInfo = _playerInfoManager.GetInfo(targetPlayer);

            targetInfo.Balance += amount;
            _playerInfoManager.RefreshUI(targetPlayer, targetInfo);
            API.sendNotificationToPlayer(targetPlayer, $"~b~{player.name} передал вам {amount}$");
        }
示例#8
0
        /// <summary>
        /// Использовать предмет из инвентаря
        /// </summary>
        private void UseInventoryItem(Client player, object[] args)
        {
            var item       = JsonConvert.DeserializeObject <InventoryItem>(args[0].ToString());
            var countToUse = (int)args[1];
            var playerInfo = _playerInfoManager.GetInfo(player);

            switch (item.Type)
            {
            case InventoryType.Medicine:
                UseMedicine(player, playerInfo, countToUse);
                break;

            case InventoryType.Food:
                UsePackedLunch(player, playerInfo, countToUse);
                break;

            case InventoryType.Canister:
                FillVehicle(player, playerInfo, countToUse);
                break;

            case InventoryType.TempoSkin:
                SetRandomSkin(player, playerInfo);
                break;

            default:
                API.sendNotificationToPlayer(player, $"~r~Нельзя применить \"{item.Name}\"");
                break;
            }
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.triggerClientEvent(player, ServerEvent.SHOW_INVENTORY, JsonConvert.SerializeObject(GetInventory(player)));
        }
        /// <summary>
        /// Обработать данные владельца дома
        /// </summary>
        private void ProcessOwner(HouseInfo house)
        {
            var player = _playerInfoManager.GetWithData(house.OwnerId);

            if (PlayerHelper.PlayerCorrect(player.Player))
            {
                var houseId = PlayerHelper.GetData(player.Player, HouseMenuHandler.IN_HOUSE, NO_OWNER);
                if (houseId == house.Id)
                {
                    player.Player.resetData(HouseMenuHandler.IN_HOUSE);
                    API.setEntityPosition(player.Player, PositionConverter.ToVector3(house.Position));
                    API.setEntityDimension(player.Player, 0);
                }
                MoveVehiclesOnParking(player.PlayerInfo.Vehicles.Values, player.Player);
                _playerInfoManager.RefreshUI(player.Player, player.PlayerInfo);
                API.sendNotificationToPlayer(player.Player, "~b~Аренда дома подошла к концу");
            }
            else
            {
                MoveVehiclesOnParking(player.PlayerInfo.Vehicles.Values);
                player.PlayerInfo.LastPosition = house.Position;
                player.PlayerInfo.Dimension    = 0;
                _playerInfoManager.Set(player.PlayerInfo);
            }
        }
        /// <summary>
        /// Обработчик получения повреждений
        /// </summary>
        public void OnPlayerDamaged(Client player, Client enemy, int cause, int id)
        {
            if (player.health <= 0 || IsEnemyIncorrect(enemy))
            {
                return;
            }
            if (enemy.hasData(WorkData.IS_POLICEMAN))
            {
                var playerInfo = _playerInfoManager.GetInfo(player);
                if (playerInfo.Wanted.WantedLevel == 0)
                {
                    API.sendNotificationToPlayer(enemy, "~b~Постарайтесь не причинять вред игроку");
                    _workInfoManager.SetSalary(enemy, WorkType.Police, POLICEMAN_PENALTY);
                }
                return;
            }
            _policeAlertManager.SendAlert(enemy.position, PoliceAlertManager.HASSLE_ALERT);
            var info      = _playerInfoManager.GetInfo(enemy);
            var oldWanted = info.Wanted.WantedLevel;

            info.Wanted.Beatings += 1;
            _playerInfoManager.RefreshUI(enemy, info);
            if (oldWanted != info.Wanted.WantedLevel)
            {
                API.sendNotificationToPlayer(enemy, $"~m~Уровень розыска увеличен до: {info.Wanted.WantedLevel}");
            }
        }
        /// <summary>
        /// Одеть или купить вещь
        /// </summary>
        private void DressOrBuyGood(Client player, object[] args)
        {
            var good       = JsonConvert.DeserializeObject <ClothesModel>(args[0].ToString());
            var playerInfo = _playerInfoManager.GetInfo(player);
            var playerGood = playerInfo.Clothes.FirstOrDefault(e => e.Slot == good.Slot && e.Variation == good.Variation);

            if (playerGood == null)
            {
                if (!BuyGood(player, playerInfo, good))
                {
                    return;
                }
                playerGood = CreateGood(good);
                playerInfo.Clothes.Add(playerGood);
            }
            else if (!playerGood.Textures.Contains(good.Texture))
            {
                if (!BuyGood(player, playerInfo, good))
                {
                    return;
                }
                playerGood.Textures.Add(good.Texture);
            }
            ChangeGood(playerInfo, playerGood, good.Texture);
            _playerInfoManager.RefreshUI(player, playerInfo);
            _gtaCharacter.SetClothes(player, playerGood);
            var district = (int)args[1];

            if (district != Validator.INVALID_ID)
            {
                _clanManager.ReplenishClanBalance(district, good.Price);
            }
        }
示例#12
0
        /// <summary>
        /// Обработка покупки тс
        /// </summary>
        private void BuyVehicle(Client player, object[] args)
        {
            var vehicleInfo = JsonConvert.DeserializeObject <ShowroomVehicle>(args[0].ToString());
            var playerInfo  = _playerInfoManager.GetInfo(player);

            if (playerInfo.Balance < vehicleInfo.Price)
            {
                API.sendNotificationToPlayer(player, "~r~Недостаточно средств!", true);
                return;
            }
            playerInfo.Balance -= vehicleInfo.Price;
            var primaryColor  = (int)args[1];
            var secondColor   = (int)args[2];
            var toHouse       = (bool)args[3];
            var vehicle       = CreateVehicle(vehicleInfo, playerInfo.AccountId, primaryColor, secondColor);
            var targetMessage = toHouse && SetVehicleInHouse(player, vehicle, playerInfo.AccountId) ? "в гараж" : "на главную парковку";

            API.sendNotificationToPlayer(player, $"~g~Машина приобретена и отправлена {targetMessage}");
            _vehiclesProvider.Add(vehicle);
            _vehicleInfoManager.SetInfo(player, vehicle);
            var district = (int)args[4];

            if (district != Validator.INVALID_ID)
            {
                _clanManager.ReplenishClanBalance(district, vehicleInfo.Price);
            }
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.triggerClientEvent(player, ServerEvent.HIDE_SHOWROOM_MENU);
        }
示例#13
0
        /// <summary>
        /// Ответ на звонок
        /// </summary>
        private void AnswerCall(Client player, object[] args)
        {
            if (!player.hasData(DATA_CALL_OPPONENT) || player.hasData(DATA_CALL_IS_CALLER) || HasActiveCall(player))
            {
                return;
            }
            var decision = (bool)args[0];
            var caller   = (Client)player.getData(DATA_CALL_OPPONENT);

            if (decision)
            {
                var calleeVoice = player.GetVoiceClient();
                var callerVoice = caller.GetVoiceClient();
                if (!calleeVoice.Connected || !callerVoice.Connected)
                {
                    API.sendNotificationToPlayer(player, "~r~Вы не подключены к голосовому чату", true);
                    ResetCallData(caller, player);
                    return;
                }
                calleeVoice.SetRelativeSpeakerPosition(callerVoice, _speakingPosition);
                callerVoice.SetRelativeSpeakerPosition(calleeVoice, _speakingPosition);
                player.setData(DATA_CALL_STATUS, true);
                caller.setData(DATA_CALL_STATUS, true);
                var playerInfo = _playerInfoManager.GetInfo(player);
                playerInfo.PhoneBalance -= CALL_COST;
                _playerInfoManager.RefreshUI(player, playerInfo);
            }
            else
            {
                ResetCallData(caller, player);
                CancelPhoneAction(player);
                CancelPhoneAction(caller, "Игрок отклонил звонок");
            }
        }
示例#14
0
        /// <summary>
        /// Выдать награду каждому участнику
        /// </summary>
        private void SetRewardToMembers(IReadOnlyCollection <PlayerWithData> members, int rankBalance)
        {
            var memberReward = rankBalance / members.Count;

            if (memberReward == 0)
            {
                return;
            }
            foreach (var member in members)
            {
                if (member.PlayerInfo.IsPremium())
                {
                    memberReward += (int)(memberReward * 0.25);
                }
                member.PlayerInfo.Balance += memberReward;
                if (member.Player != null)
                {
                    API.sendNotificationToPlayer(member.Player, $"~b~Зачислена доля от банды в размере {memberReward}$");
                    _playerInfoManager.RefreshUI(member.Player, member.PlayerInfo);
                }
                else
                {
                    _playerInfoManager.Set(member.PlayerInfo);
                }
            }
        }
示例#15
0
        /// <summary>
        /// Обработывает успешную авторизацию игрока
        /// </summary>
        private void ProcessLogin(Client player, PlayerInfo playerInfo)
        {
            var appearance = _playersAppearanceProvider.Get(playerInfo.AccountId);

            playerInfo.Skin       = (Skin)appearance.Skin;
            playerInfo.Appearance = appearance;
            API.triggerClientEvent(player, ServerEvent.SHOW_INTERFACE);
            _gtaCharacter.SetAppearance(player, appearance);
            _gtaCharacter.SetClothes(player, playerInfo.Clothes.Where(e => e.OnPlayer).ToList());
            SetPosition(player, playerInfo);
            PlayerManager.SetPlayerName(player, playerInfo);
            player.resetSyncedData(DISABLE_HOTKEYS);
            if (_admins.Contains(player.socialClubName))
            {
                player.setSyncedData("IsAdmin", true);
            }
            if (playerInfo.PhoneNumber != 0)
            {
                player.setSyncedData("HasPhone", true);
            }
            player.freeze(false);
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.sendNativeToPlayer(player, Hash.DISPLAY_RADAR, true);
            API.sendChatMessageToAll($"~g~[Информация]: {playerInfo.Name} зашел на сервер. Онлайн: {ServerState.Players.Count}");
        }
        /// <summary>
        /// Сохранить настройки игрока
        /// </summary>
        private void SaveSettings(Client player, object[] args)
        {
            var value      = (bool)args[0];
            var playerInfo = _playerInfoManager.GetInfo(player);

            playerInfo.Settings.SvgSpeedometer = value;
            _playerInfoManager.RefreshUI(player, playerInfo);
        }
示例#17
0
        /// <summary>
        /// Обновить сытость
        /// </summary>
        private void UpdateSatiety(Client player, PlayerInfo playerInfo)
        {
            var position     = API.getEntityPosition(player);
            var lastPosition = PlayerHelper.GetData(player, POSITION_KEY, new Vector3());
            var distance     = Vector3.Distance(position, lastPosition);

            player.setData(POSITION_KEY, position);
            SetSatiety(player, playerInfo, distance);
            _playerInfoManager.RefreshUI(player, playerInfo);
        }
示例#18
0
        /// <summary>
        /// Теоретический экзамен
        /// </summary>
        private void TheoryExam(Client player, object[] args)
        {
            var theoryPrice = (int)args[0];
            var info        = _playerInfoManager.GetInfo(player);

            if (!CanTakeTheTheory(player, info, theoryPrice))
            {
                return;
            }
            if (!info.Driver.TheoryExamPaid)
            {
                info.Balance -= theoryPrice;
                info.Driver.TheoryExamPaid = true;
                _playerInfoManager.RefreshUI(player, info);
                API.sendNotificationToPlayer(player, $"~b~Списано {theoryPrice}$");
            }
            API.triggerClientEvent(player, ServerEvent.HIDE_ANDREAS_MENU);
            API.triggerClientEvent(player, ServerEvent.SHOW_THEORY_EXAM);
        }
示例#19
0
        /// <summary>
        /// Устанавливает данные игрока
        /// </summary>
        private void SetPlayerInfo(Client player, PlayerInfo playerInfo, string playerName, int skin)
        {
            API.setPlayerName(player, playerName);
            playerInfo.Name = playerName;
            playerInfo.Skin = (Skin)skin;
            var clothes = CreateDefaultClothes(playerInfo.Skin);

            playerInfo.Clothes.AddRange(clothes);
            _gtaCharacter.SetClothes(player, clothes);
            _playerInfoManager.RefreshUI(player, playerInfo);
        }
        /// <summary>
        /// Обработка респавна обычного игрока
        /// </summary>
        private void ProcessPlayer(Client player, PlayerInfo playerInfo)
        {
            const int health = 15;

            playerInfo.Health = health;
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.setPlayerHealth(player, health);
            var hospital = HospitalHelper.GetNearestHospital(player.position);

            API.setEntityPosition(player, Hospital.SpawnPosition);
            _playerInfoManager.SetDimension(player, hospital.Dimension);
        }
        /// <summary>
        /// Обработчик покупки еды в магазине
        /// </summary>
        private void OnBuyFood(Client player, object[] args)
        {
            var price      = (int)args[1];
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (!PlayerHelper.EnoughMoney(player, playerInfo, price))
            {
                return;
            }
            playerInfo.Balance -= price;
            var satietyCount = (int)args[0];
            var newSatiety   = playerInfo.Satiety + satietyCount;

            playerInfo.Satiety = newSatiety <= PlayerInfo.MAX_VALUE ? newSatiety : PlayerInfo.MAX_VALUE;
            _playerInfoManager.RefreshUI(player, playerInfo);
            PlayerHelper.PlayEatAnimation(player);
            var district = (int)args[2];

            _clanManager.ReplenishClanBalance(district, price);
            API.sendNotificationToPlayer(player, $"~b~Списано {price}$");
        }
        /// <summary>
        /// Обработчик убийцы
        /// </summary>
        private void ProcessKiller(Client player, NetHandle handle, PlayerInfo deathPlayerInfo)
        {
            var killer = API.getPlayerFromHandle(handle);

            if (killer == null || player == killer)
            {
                return;
            }
            if (killer.hasData(WorkData.IS_POLICEMAN))
            {
                var playerInfo = _playerInfoManager.GetInfo(player);
                if (playerInfo.Wanted.WantedLevel > 0)
                {
                    player.setData(PoliceManager.PRISONER_KEY, killer);
                }
                else
                {
                    API.sendNotificationToPlayer(killer, "~b~Постарайтесь не причинять вред игрокам");
                    _workInfoManager.SetSalary(killer, WorkType.Police, POLICEMAN_PENALTY);
                }
                return;
            }
            _policeAlertManager.SendAlert(killer.position, PoliceAlertManager.MURDER_ALERT);
            var killerInfo = _playerInfoManager.GetInfo(killer);
            var oldWanted  = killerInfo.Wanted.WantedLevel;

            killerInfo.Wanted.Kills      += 1;
            killerInfo.Wanted.TotalKills += 1;
            if (BothHasClan(deathPlayerInfo, killerInfo))
            {
                var reputation = deathPlayerInfo.Clan.ClanId != killerInfo.Clan.ClanId ? 3 : -5;
                _clanManager.SetReputation(killer, reputation, killerInfo);
                _playerInfoManager.SetExperience(killer, CLAN_WAR_EXP);
            }
            _playerInfoManager.RefreshUI(killer, killerInfo);
            if (oldWanted != killerInfo.Wanted.WantedLevel)
            {
                API.sendNotificationToPlayer(killer, $"~m~Уровень розыска увеличен до: {killerInfo.Wanted.WantedLevel}");
            }
        }
示例#23
0
        /// <summary>
        /// Оплата аренды гоночного транспорта
        /// </summary>
        private bool PayRent(Client player, int cost)
        {
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (playerInfo.Balance < cost)
            {
                API.sendNotificationToPlayer(player, "~r~Недостаточно средств для аренды", true);
                return(false);
            }
            playerInfo.Balance -= cost;
            _playerInfoManager.RefreshUI(player, playerInfo);
            return(true);
        }
示例#24
0
        /// <summary>
        /// Списание платы за парковку
        /// </summary>
        private bool PayParking(Client player, int price)
        {
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (playerInfo.Balance < price)
            {
                API.sendNotificationToPlayer(player, "~r~Недостаточно средств для оплаты парковки", true);
                return(false);
            }
            playerInfo.Balance -= price;
            _playerInfoManager.RefreshUI(player, playerInfo);
            return(true);
        }
        /// <summary>
        /// Выполняет действие с хранилищем
        /// </summary>
        private void ProcessStorage(Client player, object[] args, Action <Client, PlayerInfo, long, int> action)
        {
            var item       = JsonConvert.DeserializeObject <InventoryItem>(args[0].ToString());
            var count      = (int)args[1];
            var playerInfo = _playerInfoManager.GetInfo(player);

            action(player, playerInfo, item.Id, count);
            if (item.Type == InventoryType.Weapon || item.Type == InventoryType.Ammo)
            {
                _inventoryManager.EquipWeapon(player);
            }
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.sendNotificationToPlayer(player, "~b~Предметы успешно перемещены");
            API.triggerClientEvent(player, ServerEvent.SHOW_HOUSE_STORAGE_MENU, JsonConvert.SerializeObject(playerInfo.Inventory));
        }
        /// <summary>
        /// Снять дом в аренду
        /// </summary>
        private void GetHouseRent(Client player, object[] args)
        {
            var house      = GetHouse(args[0]);
            var daysRent   = (int)args[1];
            var rentCost   = daysRent * house.DailyRent;
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (rentCost > playerInfo.Balance)
            {
                API.sendNotificationToPlayer(player, "~r~У вас не хватает денег на аренду", true);
                return;
            }
            playerInfo.Balance -= rentCost;
            _playerInfoManager.RefreshUI(player, playerInfo);
            SetRent(player, house, playerInfo, daysRent);
            API.triggerClientEvent(player, ServerEvent.SHOW_HOUSE_MENU, (int)HouseState.OwnerEnter, JsonConvert.SerializeObject(house));
        }
示例#27
0
        /// <summary>
        /// Покупка парашюта
        /// </summary>
        private void BuyParachute(Client player, object[] args)
        {
            var price      = (int)args[0];
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (playerInfo.Balance < price)
            {
                API.sendNotificationToPlayer(player, "~r~Недостаточно денег", true);
                return;
            }
            playerInfo.Balance -= price;
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.givePlayerWeapon(player, WeaponHash.Parachute, 1, true);
            _clanManager.ReplenishClanBalance(1, price);
            API.sendChatMessageToPlayer(player, $"~b~{NAME}: Нажми ЛЕВУЮ кнопку мыши в полёте, чтобы раскрыть парашют.");
            API.sendChatMessageToPlayer(player, $"~b~{NAME}: Надеюсь тебя не придется соскребать с асфальта!");
            API.triggerClientEvent(player, ServerEvent.HIDE_PARACHUTE_MENU);
        }
示例#28
0
        /// <summary>
        /// Забирает у игрока ставку на поединок
        /// </summary>
        private bool TakeBet(Client player)
        {
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (playerInfo.Level < MIN_LEVEL)
            {
                API.sendNotificationToPlayer(player, "~r~Необходимо достигнуть 3-го уровня и выше", true);
                return(false);
            }
            if (playerInfo.Balance < BET)
            {
                API.sendNotificationToPlayer(player, "~r~Недостаточно денег для взноса на поединок", true);
                return(false);
            }
            playerInfo.Balance -= BET;
            API.sendNotificationToPlayer(player, $"~b~Списано {BET}$", true);
            _playerInfoManager.RefreshUI(player, playerInfo);
            return(true);
        }
示例#29
0
        /// <summary>
        /// Оштрафовать
        /// </summary>
        private void OnGivePenalty(Client policeman, object[] args)
        {
            var prisoner = PlayerHelper.GetNearestPlayer(policeman, MAX_RANGE);

            if (!(HasNearby(policeman, prisoner, NO_PLAYERS_NEARBY) && IsWanted(policeman, prisoner)))
            {
                return;
            }
            var prisonerInfo = _playerInfoManager.GetInfo(prisoner);
            var penalty      = CalculatePenalty(prisonerInfo);

            if (!PlayerHasMoney(policeman, prisoner, penalty))
            {
                return;
            }
            prisonerInfo.Balance -= penalty;
            _playerInfoManager.RefreshUI(prisoner, prisonerInfo);
            _policeRewardManager.SetEffortReward(policeman, prisoner);
            _playerInfoManager.ClearWanted(prisoner);
            SendPenaltyNotify(policeman, prisoner, penalty);
            DetachPrisoner(policeman, prisoner, true);
            API.triggerClientEvent(policeman, ServerEvent.HIDE_POLICEMAN_MENU);
        }
        /// <summary>
        /// Восстановление здоворья игрока
        /// </summary>
        private void RestoreHealth(Client player, object[] args)
        {
            var healType   = (int)args[0];
            var healAmount = healType == FULL_HP_TYPE
                ? FULL_HP - player.health
                : HEALT_COEF * healType;
            var recoveryAmount = player.health + healAmount > FULL_HP
                ? FULL_HP - player.health
                : healAmount;
            var price      = GetPrice(healAmount);
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (price > playerInfo.Balance)
            {
                API.sendNotificationToPlayer(player, $"~r~{CHAT} Недостаточно денег!");
                return;
            }
            playerInfo.Balance -= price;
            playerInfo.Health  += healAmount;
            _playerInfoManager.RefreshUI(player, playerInfo);
            API.setPlayerHealth(player, playerInfo.Health);
            API.sendNotificationToPlayer(player, $"~b~{CHAT} Восстановлено {recoveryAmount} ед. здоровья");
            API.triggerClientEvent(player, ServerEvent.HIDE_NURSE_MENU);
        }