𝕊𝕙𝕚𝕗𝕦 𝕌𝕣𝕒𝕘𝕒𝕟
Свой на районе
ИГРОК
Регистрация:21.05.2025
Сообщения:18
Реакции:7
Баллы:35
1. Суть проблемы (Обоснование)
На данный момент система исправительных работ в Деморгане не выполняет свою главную функцию - вовлечение игрока в процесс исправления.
Предлагаю ввести шкалу прокачки навыка заключенного (назовем это "Авторитет" или "Навык труда").
Цель: Сделать так, чтобы 1 минута реального активного труда снимала от 1.5 до 2 минут срока. Это справедливо: игрок тратит усилия, а не просто стоит.
А. Ребаланс старых:
):
На данный момент система исправительных работ в Деморгане не выполняет свою главную функцию - вовлечение игрока в процесс исправления.
- Дисбаланс времени: Тратить 30 секунд на токаря ради списания 5 секунд срока (КПД 1:6) - нерационально. Игрокам выгоднее просто стоять AFK, что нагружает сервер "мертвыми душами" и убивает геймплей.
- Скудность выбора: Мытье полов (которое часто багуется и не снижает срок), ящики и токарь быстро надоедают.
Предлагаю ввести шкалу прокачки навыка заключенного (назовем это "Авторитет" или "Навык труда").
- За каждое выполненное действие игрок получает не только списание времени, но и XP.
- Уровни:
- Новичок: Стандартный коэффициент списания.
- Бывалый: +15% к списанию времени за те же действия.
- Авторитет: +30% к списанию времени + доступ к "Легким работам" (менее пыльные, но эффективные).
Цель: Сделать так, чтобы 1 минута реального активного труда снимала от 1.5 до 2 минут срока. Это справедливо: игрок тратит усилия, а не просто стоит.
А. Ребаланс старых:
- Токарь: Увеличить снижение срока с 5 сек до 20 сек (процесс занимает 30 сек).
- Ящики: Увеличить снижение с 2 сек до 10 сек (процесс занимает 10-15 сек).
- Мытье полов: Починить механику, добавить мини-игру (как протирание столов в кафе), снижение 15 сек.
- Швейный цех (Пошив формы):
- Механика: Мини-игра QTE (Quick Time Event) (либо другой вариант). На экране появляется ползунок, нужно вовремя нажать пробел, когда иголка находится в зеленой зоне.
- Снижение: 25 секунд.
- Логика: Шьем тюремные робы для новых заключенных.
- Кухонная дежурство (Чистка картошки/Мытье посуды):
- Механика: Круговое меню, где нужно быстро прокликивать появляющиеся грязные пятна на тарелке или срезать кожуру (движения мышкой).
- Снижение: 15 секунд (быстрая мини-игра).
- Электрик (Починка щитков):
- Механика: Соединение проводов одного цвета (классическая мини-игра Among Us или GTA V Hacking). Доступно с уровня "Бывалый".
- Снижение: 40 секунд (сложнее, но выгоднее).
- Сортировка мусора/вещей:
- Механика: На конвейере едут предметы (бутылки, бумага, объедки), нужно клавишами A/D или стрелками скидывать их в правильные контейнеры.
- Снижение: Зависит от серии правильных попаданий. Комбо х10 = бонусное списание.
Техническая часть (Для разработчиков)
Здесь описана логика реализации с точки зрения кода (RAGE:MP, C# Server + JS/Vue Client).Серверная часть (Backend Logic - C#)
Необходим класс-хендлер для расчета коэффициентов.public class PrisonWorkHandler
{
// Конфигурация работ
private Dictionary<string, WorkData> works = new Dictionary<string, WorkData>
{
{ "lathe", new WorkData { BaseTimeReduction = 20, XpReward = 5 } },
{ "sewing", new WorkData { BaseTimeReduction = 25, XpReward = 7 } },
{ "electrician", new WorkData { BaseTimeReduction = 40, XpReward = 10, MinLevel = 2 } }
};
// Метод, вызываемый при завершении работы клиентом
[RemoteEvent("server:completePrisonWork")]
public void OnWorkComplete(Player player, string workId)
{
if (!works.ContainsKey(workId)) return;
var work = works[workId];
var charData = player.GetCharacterData(); // Псевдокод получения данных
// Проверка уровня
if (charData.PrisonLevel < work.MinLevel) {
player.Notify("Ваш авторитет слишком мал для этой работы.");
return;
}
// Расчет бонуса от уровня (Мультипликатор)
double multiplier = 1.0 + (charData.PrisonLevel * 0.15); // +15% за уровень
int timeToReduce = (int)(work.BaseTimeReduction * multiplier);
// Применение изменений
player.ReduceJailTime(timeToReduce);
player.AddPrisonXP(work.XpReward);
// Логика повышения уровня
CheckLevelUp(player);
player.Notify($"Срок снижен на {timeToReduce} сек. Получено {work.XpReward} опыта.");
}
private void CheckLevelUp(Player player)
{
// Логика проверки порогов опыта (например, 100, 500, 1000 XP)
}
}
{
// Конфигурация работ
private Dictionary<string, WorkData> works = new Dictionary<string, WorkData>
{
{ "lathe", new WorkData { BaseTimeReduction = 20, XpReward = 5 } },
{ "sewing", new WorkData { BaseTimeReduction = 25, XpReward = 7 } },
{ "electrician", new WorkData { BaseTimeReduction = 40, XpReward = 10, MinLevel = 2 } }
};
// Метод, вызываемый при завершении работы клиентом
[RemoteEvent("server:completePrisonWork")]
public void OnWorkComplete(Player player, string workId)
{
if (!works.ContainsKey(workId)) return;
var work = works[workId];
var charData = player.GetCharacterData(); // Псевдокод получения данных
// Проверка уровня
if (charData.PrisonLevel < work.MinLevel) {
player.Notify("Ваш авторитет слишком мал для этой работы.");
return;
}
// Расчет бонуса от уровня (Мультипликатор)
double multiplier = 1.0 + (charData.PrisonLevel * 0.15); // +15% за уровень
int timeToReduce = (int)(work.BaseTimeReduction * multiplier);
// Применение изменений
player.ReduceJailTime(timeToReduce);
player.AddPrisonXP(work.XpReward);
// Логика повышения уровня
CheckLevelUp(player);
player.Notify($"Срок снижен на {timeToReduce} сек. Получено {work.XpReward} опыта.");
}
private void CheckLevelUp(Player player)
{
// Логика проверки порогов опыта (например, 100, 500, 1000 XP)
}
}
Клиентская часть (Frontend/UI - JS + CEF)
Использование CEF (Chromium Embedded Framework) для мини-игр, так как нативные GTA-интерфейсы скудны.let isSewing = false;
let successZone = { start: 40, end: 60 }; // % полосы
let cursorPosition = 0;
// Запуск игры
mp.events.add('client:startSewingMinigame', () => {
isSewing = true;
browser.execute(
// Анимация персонажа
mp.players.local.taskPlayAnim("amb@world_human_seat_sewing@female@base", "base", 8.0, 1, -1, 1, 0, false, false, false);
});
// Обработка нажатия (например, Пробел)
mp.keys.bind(0x20, true, function() {
if (isSewing && browser.active) {
// Получаем позицию курсора из UI браузера
let result = browser.executeReturn(
if (result >= successZone.start && result <= successZone.end) {
mp.events.callRemote('server:completePrisonWork', 'sewing');
mp.game.graphics.notify("~g~Отличная работа!");
} else {
mp.game.graphics.notify("~r~Брак! Иголка сломалась.");
// Можно добавить штраф или кулдаун
}
isSewing = false;
mp.players.local.clearTasks(); // Сброс анимации
browser.execute(
}
});
let successZone = { start: 40, end: 60 }; // % полосы
let cursorPosition = 0;
// Запуск игры
mp.events.add('client:startSewingMinigame', () => {
isSewing = true;
browser.execute(
showSewingUI()); // Показать HTML/CSS интерфейс// Анимация персонажа
mp.players.local.taskPlayAnim("amb@world_human_seat_sewing@female@base", "base", 8.0, 1, -1, 1, 0, false, false, false);
});
// Обработка нажатия (например, Пробел)
mp.keys.bind(0x20, true, function() {
if (isSewing && browser.active) {
// Получаем позицию курсора из UI браузера
let result = browser.executeReturn(
getSliderPosition()); if (result >= successZone.start && result <= successZone.end) {
mp.events.callRemote('server:completePrisonWork', 'sewing');
mp.game.graphics.notify("~g~Отличная работа!");
} else {
mp.game.graphics.notify("~r~Брак! Иголка сломалась.");
// Можно добавить штраф или кулдаун
}
isSewing = false;
mp.players.local.clearTasks(); // Сброс анимации
browser.execute(
hideSewingUI());}
});