/// <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 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) ); }); }
/// <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}"); }
/// <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~Выдана награда за каждодневный вход в игру"); }
/// <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); }
/// <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> 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); }
/// <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~ - меню управления транспортом"); } }
/// <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); }
/// <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); }
/// <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); }
/// <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()}"); } }
/// <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); }