Пример #1
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);
        }
Пример #2
0
 /// <summary>
 /// Обработчик вызова меню нпс
 /// </summary>
 private void PlayerComeToNpc(NetHandle entity)
 {
     PlayerHelper.ProcessAction(entity, player => {
         var vehicles    = _playerInfoManager.GetInfo(player).Vehicles.Values;
         var cars        = vehicles.Where(e => API.isVehicleACar((VehicleHash)e.Hash));
         var motos       = vehicles.Where(e => IsMotocicle((VehicleHash)e.Hash));
         var membersInfo = GetMembersInfo();
         API.triggerClientEvent(
             player, ServerEvent.SHOW_RACE_MENU, JsonConvert.SerializeObject(cars),
             JsonConvert.SerializeObject(motos), JsonConvert.SerializeObject(membersInfo)
             );
     });
 }
Пример #3
0
        /// <summary>
        /// Обработчик клановых сообщений
        /// </summary>
        private void ProcessClanMessage(Client player, string message)
        {
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (playerInfo.Clan == null)
            {
                API.sendNotificationToPlayer(player, "~r~Вы не состоите в банде", true);
            }
            message = message.Substring(2);
            var players = _playerInfoManager.GetWhere(info => info.Clan != null && info.Clan.ClanId == playerInfo.Clan.ClanId);

            SendMessage(players.Keys, $"~p~[Банда] ~w~{player.name}: {message}");
        }
Пример #4
0
        /// <summary>
        /// Награда за каждодневный вход в игру
        /// </summary>
        public void ProcessDaysGift(Client player, Account account)
        {
            if (account.LastLogin.Date == DateTime.Today)
            {
                return;
            }
            var totalHours = (DateTime.Now - account.LastLogin).TotalHours;

            if (totalHours >= 24 && totalHours < 48)
            {
                account.DaysInRow = account.DaysInRow < MAX_DAYS_IN_ROW ? account.DaysInRow + 1 : MAX_DAYS_IN_ROW;
            }
            else
            {
                account.DaysInRow = 0;
                return;
            }
            var playerInfo = _playerInfoManager.GetInfo(player);
            var reward     = account.DaysInRow * playerInfo.Level * DAYS_REWARD;

            _playerInfoManager.SetBalance(player, reward, true);
            API.sendNotificationToPlayer(player, "~b~Выдана награда за каждодневный вход в игру");
        }
Пример #5
0
        /// <summary>
        /// Обновить состояния игроков
        /// </summary>
        public void UpdatePlayers()
        {
            var players = API.getAllPlayers();

            foreach (var player in players)
            {
                var playerInfo = _playerInfoManager.GetInfo(player);
                if (playerInfo == null)
                {
                    continue;
                }
                UpdateSatiety(player, playerInfo);
            }
        }
        /// <summary>
        /// Перенести игрока в примерочную
        /// </summary>
        private void GoToDressingRoom(Client player, object[] args)
        {
            var playerInfo   = _playerInfoManager.GetInfo(player);
            var dressingRoom = JsonConvert.DeserializeObject <DressingRoomPositions>(args[0].ToString());

            player.setData(PlayerData.LAST_POSITION, player.position);
            player.setData(PlayerData.LAST_DIMENSION, player.dimension);
            API.setEntityRotation(player, dressingRoom.Rotation);
            API.setEntityPosition(player, dressingRoom.Position);
            API.setEntityDimension(player, (int)-playerInfo.AccountId);
            player.freeze(true);
            player.setSyncedData(IN_DRESSING_ROOM, true);
            API.triggerClientEvent(player, ServerEvent.SHOW_CLOTHES_LIST, args[0]);
            API.triggerClientEvent(player, ServerEvent.SHOW_HINT, "Если случайно закрылось меню, нажмите О, чтобы снова открыть", 120);
        }
Пример #7
0
        /// <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));
        }
Пример #8
0
        /// <summary>
        /// Может ли игрок работать на выбранной работе
        /// </summary>
        protected virtual bool CanWork(Client player, int minLevel, bool needDrive = true)
        {
            var playerInfo = PlayerInfoManager.GetInfo(player);
            var result     = true;

            if (needDrive && !playerInfo.Driver.CanDriveB)
            {
                API.sendNotificationToPlayer(player, "~r~Необходимо получить водительскую лицензию", true);
                result = false;
            }
            if (playerInfo.Level < minLevel)
            {
                API.sendNotificationToPlayer(player, $"~r~Необходим {minLevel}-й уровень и выше", true);
                result = false;
            }
            return(result);
        }
Пример #9
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);
        }
        /// <summary>
        /// Вход игрока в тс
        /// </summary>
        public void OnPlayerEnterVehicle(Client player, NetHandle vehicle, int seat)
        {
            API.triggerClientEvent(player, ServerEvent.HIDE_SPEEDOMETER);

            var hash = (VehicleHash)API.getEntityModel(vehicle);

            if (seat == DRIVER_SEAT && CanShowSpeedometer(hash))
            {
                var settings = _playerInfoManager.GetInfo(player).Settings;
                API.triggerClientEvent(player, ServerEvent.SHOW_SPEEDOMETER, settings.SvgSpeedometer);
                ActionHelper.SetAction(player, 5000, () => API.triggerClientEvent(player, ServerEvent.HIDE_HINT));
            }
            API.resetEntityData(vehicle, AFK_KEY);
            if (!API.isVehicleABicycle(hash))
            {
                API.triggerClientEvent(player, ServerEvent.SHOW_SUBTITLE, "~y~F2~w~ - меню управления транспортом");
            }
        }
Пример #11
0
        /// <summary>
        /// Возвращает данные о транспорте салона и игрока
        /// </summary>
        private Task <Tuple <string, string> > SerializeVehicles(Client player, ShowroomType type)
        {
            var showroomVehiclesData = JsonConvert.SerializeObject(ShowroomsGetter.GetVehicles(type));
            var playerVehicles       = new List <ShowroomVehicle>();

            foreach (var vehicle in _playerInfoManager.GetInfo(player).Vehicles.Values)
            {
                var price = ShowroomsGetter.GetSellPrice(vehicle.Hash);
                if (Validator.IsValid(price))
                {
                    playerVehicles.Add(new ShowroomVehicle {
                        Id = (int)vehicle.Id, Hash = vehicle.Hash, Price = price
                    });
                }
            }
            var playerVehiclesData = JsonConvert.SerializeObject(playerVehicles);

            return(Task.FromResult(new Tuple <string, string>(showroomVehiclesData, playerVehiclesData)));
        }
        /// <summary>
        /// Обработчик респавна игрока
        /// </summary>
        public void OnPlayerRespawn(Client player)
        {
            _inventoryManager.EquipWeapon(player);
            if (player.hasData(PlayerData.ON_EVENT) || player.hasData(PlayerData.FIGHTER))
            {
                return;
            }
            if (ProcessRacer(player))
            {
                return;
            }
            var playerInfo = _playerInfoManager.GetInfo(player);

            if (ProcessPrisoner(player, playerInfo))
            {
                return;
            }
            ProcessPlayer(player, playerInfo);
        }
Пример #13
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);
        }
Пример #14
0
        /// <summary>
        /// Сохранить кастомизацию персонажа
        /// </summary>
        private void SaveCharacter(Client player, object[] args)
        {
            var name        = args[1].ToString();
            var surname     = args[2].ToString();
            var playerInfo  = _playerInfoManager.GetInfo(player);
            var playerName  = $"{GetPretty(name)} {GetPretty(surname)}";
            var nameSuccess = _playersProvider.SetName(playerInfo.AccountId, playerName);

            if (!nameSuccess)
            {
                API.triggerClientEvent(player, ServerEvent.NAME_ALREADY_EXIST);
                return;
            }
            var character = JsonConvert.DeserializeObject <PlayerAppearance>(args[0].ToString());

            _gtaCharacter.SetAppearance(player, character);
            SetPlayerInfo(player, playerInfo, playerName, character.Skin);
            _playersAppearanceProvider.Save(playerInfo.AccountId, character);
            SetPlayerInStartLocation(player);
            API.sendNativeToPlayer(player, Hash.DISPLAY_RADAR, true);
        }
Пример #15
0
        /// <summary>
        /// Устанавливает ранг
        /// </summary>
        public void SetReputation(Client player, int value, PlayerInfo playerInfo = null)
        {
            if (playerInfo == null)
            {
                playerInfo = _playerInfoManager.GetInfo(player);
            }
            if (value > 0 && playerInfo.IsPremium())
            {
                value += (int)(value * 0.3);
            }
            playerInfo.Clan.Reputation += value;
            var prefix = value > 0 ? "~b~Получено" : "~w~Потеряно";

            API.sendNotificationToPlayer(player, $"{prefix} {Math.Abs(value)} очков репутации банды");
            var rank = GetRank(playerInfo.Clan.Reputation);

            if (rank != playerInfo.Clan.Rank)
            {
                playerInfo.Clan.Rank = rank;
                API.sendNotificationToPlayer(player, $"~g~Изменение ранга. Новый ранг: {rank.GetDescription()}");
            }
        }
Пример #16
0
        /// <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);
        }
        /// <summary>
        /// Обработчик выбранного клиентом маршрута
        /// </summary>
        public void ProcessPassengerTarget(Client player, Vector3 target)
        {
            var driver = GetTaxiDriver(player);

            if (driver == null)
            {
                API.sendNotificationToPlayer(player, "~r~В машине нет водителя", true);
                return;
            }
            var balance = _playerInfoManager.GetInfo(player).Balance;
            var cost    = CalculateRideCost(player, target);

            if (balance < cost)
            {
                API.sendNotificationToPlayer(player, $"~r~У вас не хватает денег на данную поездку", true);
                return;
            }
            player.setData(TAXI_DRIVER, driver);
            player.setData(RIDE_COST, cost);
            API.sendNotificationToPlayer(player, $"Стоимость поездки ~y~{cost}$");
            API.triggerClientEvent(player, ServerEvent.SHOW_GPS_TARGET, target);
            API.triggerClientEvent(driver, ServerEvent.SHOW_GPS_TARGET, target);
            API.triggerClientEvent(player, ServerEvent.HIDE_GPS_MENU);
        }