Ивент ко дню космонавтики

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

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

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

Основной код ( gamemodes/space_event.pan )​

#include <a_samp>
#include <streamer>
#include <sscanf2>
#include <zcmd>
#include <dialog>

#define SPACE_BASE_POS {312.25, 1943.67, 17.64} // Координаты космической базы
#define MAX_ASTRONAUTS 10 // Макс. число игроков в миссии
#define ROCKET_LAUNCH_TIME 30 // Время подготовки запуска (сек)
#define SPACE_REWARD 5000 // Награда за успешную миссию

// Переменные игрока
new bool:IsInSpaceMission[MAX_PLAYERS];
new PlayerSpaceLevel[MAX_PLAYERS];
new PlayerRocketPart[MAX_PLAYERS];
new SpaceMissionTimer[MAX_PLAYERS];

// Объекты
new RocketObject;
new AsteroidZone;

public OnGameModeInit() {
// Создаем космическую базу
CreateDynamicObject(19817, SPACE_BASE_POS[0], SPACE_BASE_POS[1], SPACE_BASE_POS[2] - 1.0, 0.0, 0.0, 0.0); // Ракета
CreateDynamicCP(SPACE_BASE_POS[0], SPACE_BASE_POS[1], SPACE_BASE_POS[2], 3.0, -1, -1, -1, 50.0); // Чекпоинт базы

// Зона астероидов (куб)
AsteroidZone = CreateDynamicCube(100.0, 200.0, 50.0, 300.0, 400.0, 200.0);
return 1;
}

// Диалог выбора миссии
Dialog:SpaceMission(playerid, response, listitem) {
if(!response) return 1;

switch(listitem) {
case 0: { // Миссия "Запуск ракеты"
if(PlayerSpaceLevel[playerid] < 1) {
SendClientMessage(playerid, 0xFF0000AA, "Требуется уровень астронавта: 1");
return 1;
}
StartRocketMission(playerid);
}
case 1: { // Миссия "Ремонт спутника"
if(PlayerSpaceLevel[playerid] < 2) {
SendClientMessage(playerid, 0xFF0000AA, "Требуется уровень астронавта: 2");
return 1;
}
StartSatelliteRepair(playerid);
}
}
return 1;
}

// Запуск ракеты
StartRocketMission(playerid) {
IsInSpaceMission[playerid] = true;
SetPlayerPos(playerid, SPACE_BASE_POS[0], SPACE_BASE_POS[1], SPACE_BASE_POS[2] + 2.0);
ApplyAnimation(playerid, "BOMBER", "BOM_Plant_Loop", 4.1, 1, 0, 0, 1, 0);

SendClientMessage(playerid, 0x33CCFFAA, "Запуск ракеты через 30 секунд! Подготовьте системы.");
SpaceMissionTimer[playerid] = SetTimerEx("OnRocketLaunch", ROCKET_LAUNCH_TIME * 1000, false, "i", playerid);
}

forward OnRocketLaunch(playerid);
public OnRocketLaunch(playerid) {
if(!IsInSpaceMission[playerid]) return 0;

// Запуск анимации ракеты
MoveDynamicObject(RocketObject, SPACE_BASE_POS[0], SPACE_BASE_POS[1], SPACE_BASE_POS[2] + 500.0, 10.0);
SendClientMessage(playerid, 0x00FF00AA, "Ракета успешно запущена! Миссия выполнена.");
GivePlayerMoney(playerid, SPACE_REWARD);
PlayerSpaceLevel[playerid]++;
IsInSpaceMission[playerid] = false;
return 1;
}

// Команды
CMD:spacemenu(playerid) {
if(!IsPlayerInRangeOfPoint(playerid, 10.0, SPACE_BASE_POS[0], SPACE_BASE_POS[1], SPACE_BASE_POS[2])) {
SendClientMessage(playerid, 0xFF0000AA, "Вы не на космической базе!");
return 1;
}

ShowPlayerDialog(playerid, DIALOG_SPACE_MISSION, DIALOG_STYLE_LIST,
"Космические миссии",
"Запуск ракеты\nРемонт спутника",
"Выбрать", "Отмена");
return 1;
}

CMD:abortmission(playerid) {
if(!IsInSpaceMission[playerid]) return SendClientMessage(playerid, 0xFF0000AA, "Вы не в миссии!");

KillTimer(SpaceMissionTimer[playerid]);
IsInSpaceMission[playerid] = false;
SetPlayerPos(playerid, SPACE_BASE_POS[0], SPACE_BASE_POS[1], SPACE_BASE_POS[2]);
SendClientMessage(playerid, 0xFF6600AA, "Миссия отменена.");
return 1;
}

// Обработка зоны астероидов
public OnPlayerEnterDynamicArea(playerid, areaid) {
if(areaid == AsteroidZone && IsInSpaceMission[playerid]) {
SendClientMessage(playerid, 0xFF3300AA, "Внимание! Зона астероидов. Уклоняйтесь!");
ApplyAnimation(playerid, "PED", "FALL_back", 4.1, 0, 1, 1, 0, 0);
}
return 1;
}

public OnPlayerDeath(playerid, killerid, reason) {
if(IsInSpaceMission[playerid]) {
SendClientMessage(playerid, 0x990000AA, "Миссия провалена! Вы погибли.");
IsInSpaceMission[playerid] = false;
}
return 1;
}

Система квестов ( дополнение )​

// В OnGameModeInit добавьте:
CreateDynamic3DTextLabel("Космическая база\nНажмите ~k~~CONVERSATION_YES~", 0x33CCFFAA, SPACE_BASE_POS[0], SPACE_BASE_POS[1], SPACE_BASE_POS[2], 50.0);

// Квест "Найти деталь ракеты"
CMD:findpart(playerid) {
if(PlayerSpaceLevel[playerid] < 1) return 0;

new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);
if(IsPlayerInRangeOfPoint(playerid, 3.0, 224.11, 1877.45, 13.55)) { // Координаты детали
PlayerRocketPart[playerid]++;
SendClientMessage(playerid, 0x00FF00AA, "Вы нашли деталь ракеты! (1/3)");
if(PlayerRocketPart[playerid] >= 3) {
SendClientMessage(playerid, 0x00FF00AA, "Все детали собраны! Вернитесь на базу.");
GivePlayerMoney(playerid, 2000);
}
}
return 1;
}

Интеграция с MySQL ( сохранение прогресса )​

// При загрузке данных игрока
public OnPlayerLogin(playerid) {
new query[128];
format(query, sizeof(query), "SELECT space_level, rocket_parts FROM space_stats WHERE username = '%s'", GetPlayerNameEx(playerid));
mysql_tquery(g_DB, query, "LoadSpaceData", "d", playerid);
return 1;
}

forward LoadSpaceData(playerid);
public LoadSpaceData(playerid) {
if(cache_num_rows() > 0) {
PlayerSpaceLevel[playerid] = cache_get_field_content_int(0, "space_level");
PlayerRocketPart[playerid] = cache_get_field_content_int(0, "rocket_parts");
}
return 1;
}

Как использовать??​

1. **Начало миссии**:
- Подойдите к космической базе → `/spacemenu` → выберите миссию.
2. **Поиск деталей**:
- Используйте `/findpart` возле точек с деталями (заранее разместите объекты).
3. **Запуск ракеты**:
- После сбора деталей → запустите миссию → выживите 30 секунд.


Требования:
1. Плагины: `Streamer`, `MySQL`, `sscanf2`.
2. Добавьте объекты ракеты (`ID 19817`), ангаров и зон.
3. Настройте координаты под ваш сервер.
 
Сверху