Работа сварщика - писал сам

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
Пользователь
Регистрация
11 Май 2025
Сообщения
18

Основной код (gamemodes/crmp_welder.pwn)

```pawn

#include <a_samp>
#include <streamer> // Для создания объектов и зон
#include <sscanf2> // Для обработки команд
#include <zcmd> // Для удобных команд

#define WELDER_JOB_PAYMENT 100 // Зарплата за 1 цикл работы
#define WELDER_JOB_COOLDOWN 60 // КД между заданиями (секунды)

// Переменные игрока
new bool:IsPlayerWelding[MAX_PLAYERS];
new WelderTimer[MAX_PLAYERS];
new PlayerWeldingProgress[MAX_PLAYERS];

// Координаты рабочей зоны сварщика
new Float:WelderJobPos[][] = {
{2165.5417, -1733.1182, 13.5634}, // Место работы (стройплощадка LS)
{2167.8530, -1732.4761, 13.5634} // Место для инструментов
};

public OnGameModeInit() {
// Создаем объекты для работы
CreateDynamicObject(1484, WelderJobPos[1][0], WelderJobPos[1][1], WelderJobPos[1][2], 0.0, 0.0, 0.0); // Ящик с инструментами
CreateDynamicCP(WelderJobPos[0][0], WelderJobPos[0][1], WelderJobPos[0][2], 2.0, -1, -1, -1, 5.0); // Чекпоинт работы
return 1;
}

// Команда для начала работы
CMD:startwelding(playerid) {
if (!IsPlayerInRangeOfPoint(playerid, 5.0, WelderJobPos[0][0], WelderJobPos[0][1], WelderJobPos[0][2])) {
SendClientMessage(playerid, 0xFF0000AA, "Вы не на стройплощадке!");
return 1;
}

if (IsPlayerWelding[playerid]) {
SendClientMessage(playerid, 0xFF0000AA, "Вы уже работаете!");
return 1;
}

SendClientMessage(playerid, 0x33AA33AA, "Начните сварку: используйте /weldnear или подойдите к металлоконструкции.");
IsPlayerWelding[playerid] = true;
return 1;
}

// Анимация сварки
StartWeldingAnimation(playerid) {
ApplyAnimation(playerid, "CARRY", "crry_prtial", 4.1, 1, 0, 0, 0, 0);
PlayerWeldingProgress[playerid] = 0;
WelderTimer[playerid] = SetTimerEx("UpdateWelding", 1000, true, "i", playerid);
}

forward UpdateWelding(playerid);
public UpdateWelding(playerid) {
if (!IsPlayerWelding[playerid]) {
KillTimer(WelderTimer[playerid]);
return 0;
}

PlayerWeldingProgress[playerid] += 10;

// Прогресс бар (условный)
new str[32];
format(str, sizeof(str), "Прогресс: %d%%", PlayerWeldingProgress[playerid]);
SendClientMessage(playerid, 0xFFFF00AA, str);

if (PlayerWeldingProgress[playerid] >= 100) {
GivePlayerMoney(playerid, WELDER_JOB_PAYMENT);
SendClientMessage(playerid, 0x00FF00AA, "Работа завершена! Заработано $100.");
KillTimer(WelderTimer[playerid]);
IsPlayerWelding[playerid] = false;
ApplyAnimation(playerid, "CARRY", "crry_prtial", 4.0, 0, 0, 0, 0, 0);
}
return 1;
}

// Команда для сварки ближайших объектов
CMD:weldnear(playerid) {
if (!IsPlayerWelding[playerid]) {
SendClientMessage(playerid, 0xFF0000AA, "Сначала начните работу: /startwelding");
return 1;
}

new Float:dist = GetPlayerDistanceFromPoint(playerid, WelderJobPos[0][0], WelderJobPos[0][1], WelderJobPos[0][2]);
if (dist > 5.0) {
SendClientMessage(playerid, 0xFF0000AA, "Подойдите к рабочей зоне!");
return 1;
}

StartWeldingAnimation(playerid);
return 1;
}

// При входе в чекпоинт
public OnPlayerEnterDynamicCP(playerid, checkpointid) {
if (checkpointid == 0) { // ID чекпоинта работы
SendClientMessage(playerid, 0x33AA33AA, "Нажмите /startwelding чтобы начать сварку.");
}
return 1;
}



Как это работает? Ответ ниже!!

1. **Рабочая зона**: Игрок приходит на стройплощадку (координаты в `WelderJobPos`).
2. *Начало работы**: Команда `/startwelding` активирует профессию.
3. **Сварка**:
- Используйте `/weldnear` для начала анимации.
- Прогресс заполняется каждую секунду.
- По завершении игрок получает $100.
4. **Анимации**: Реалистичная анимация сварки из GTA SA.

База данных : Для сохранения данных добавьте MySQL, пример :​

// При выходе
public OnPlayerDisconnect(playerid, reason) {
new query[128];
format(query, sizeof(query), "UPDATE players SET welding_jobs = welding_jobs + %d WHERE id = %d",
PlayerWeldingJobs[playerid],
GetPlayerAccountID(playerid));
mysql_tquery(g_DB, query);
return 1;
}

Проверка инструментов :​

CMD:weldnear(playerid) {
if (!IsPlayerHaveWelderTools(playerid)) {
SendClientMessage(playerid, 0xFF0000AA, "Купите инструменты в магазине!");
return 1;
}
// ...
}

Совет для новичков -
1. Для работы требуется плагин Streamer ( для чекпойнтов и т.п)
2. Настройте координаты под ВАШ сервер
3.Добавьте звуки сварки через PlaySound
 
Сверху