/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); } }
/// <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}$"); }
/// <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); } }
/// <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); }
/// <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, "Игрок отклонил звонок"); } }
/// <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); } } }
/// <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); }
/// <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); }
/// <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); }
/// <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}"); } }
/// <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); }
/// <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)); }
/// <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> 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 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); }