Динамическая эпидемия с ролевым выживанием

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

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

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
Пользователь
Регистрация
11 Май 2025
Сообщения
18
/*==================
ОСНОВНЫЕ НАСТРОЙКИ
==================*/
#define MAX_SICK_PLAYERS 10
#define INFECTION_RADIUS 2.0
#define OUTBREAK_INTERVAL 180000 // 3 минуты для теста (вместо 2-4 часов)

new bool:playerInfected[MAX_PLAYERS];
new PlayerInfectionStage[MAX_PLAYERS];
new InfectionType[MAX_PLAYERS];
new OutbreakTimer;

/*==================
ТИПЫ ВИРУСОВ
==================*/
enum {
VIRUS_FLU,
VIRUS_PLAGUE,
VIRUS_ZOMBIE
};

/*==================
ИНИЦИАЛИЗАЦИЯ
==================*/
public OnGameModeInit() {
OutbreakTimer = SetTimer("StartRandomOutbreak", OUTBREAK_INTERVAL, true);
return 1;
}

/*==================
СЛУЧАЙНАЯ ВСПЫШКА
==================*/
forward StartRandomOutbreak();
public StartRandomOutbreak() {
new virus = random(3);
new area = random(10); // Заменить на реальные координаты зон

// Поиск "нулевого пациента"
new patient = FindRandomPlayerInArea(area);
if(patient != INVALID_PLAYER_ID) {
InfectPlayer(patient, virus);
SendClientMessageToAll(0xFF0000FF, "ВНИМАНИЕ! Обнаружена вспышка неизвестного заболевания!");
}
return 1;
}

/*==================
МЕХАНИКА ЗАРАЖЕНИЯ
==================*/
public OnPlayerUpdate(playerid) {
// Проверка контактов каждую секунду
if(GetTickCount() % 1000 == 0 && PlayerInfected[playerid]) {
new Float:x, Float:y, Float:z;
GetPlayerPos(playerid, x, y, z);

foreach(new i : Player) {
if(IsPlayerInRangeOfPoint(i, INFECTION_RADIUS, x, y, z)) {
if(!PlayerInfected && random(100) < 30) { // 30% шанс заразить
InfectPlayer(i, InfectionType[playerid]);
}
}
}
}
return 1;
}

InfectPlayer(playerid, virus) {
PlayerInfected[playerid] = true;
InfectionType[playerid] = virus;
PlayerInfectionStage[playerid] = 0;

// Старт прогрессии болезни
switch(virus) {
case VIRUS_ZOMBIE: SetTimerEx("VirusProgression", 60000, true, "ii", playerid, virus);
default: SetTimerEx("VirusProgression", 300000, true, "ii", playerid, virus);
}

ApplyInfectionEffects(playerid, virus, 0);
}

/*==================
ПРОГРЕССИЯ БОЛЕЗНИ
==================*/
forward VirusProgression(playerid, virus);
public VirusProgression(playerid, virus) {
if(!PlayerInfected[playerid]) return 0;

PlayerInfectionStage[playerid]++;

switch(virus) {
case VIRUS_ZOMBIE: {
switch(PlayerInfectionStage[playerid]) {
case 1: {
ApplyAnimation(playerid, "SWEET", "Sweet_injuredloop", 4.1, 1, 1, 1, 1, 0);
SetPlayerHealth(playerid, GetPlayerHealth(playerid) - 10);
}
case 2: {
// Превращение в зомби
SetPlayerSkin(playerid, 134);
SetPlayerFightingStyle(playerid, 4);
}
}
}
// ... аналогично для других вирусов
}
return 1;
}

/*==================
СИСТЕМА ЛЕЧЕНИЯ
==================*/
CMD:heal(playerid, params[]) {
if(IsPlayerMedic(playerid)) { // Проверка профессии
new targetid;
if(sscanf(params, "u", targetid)) return SendClientMessage(playerid, 0xFFFFFFFF, "Используйте: /heal [id]");

if(PlayerInfected[targetid]) {
new success_chance = 80 - (PlayerInfectionStage[targetid] * 20);
if(random(100) < success_chance) {
CurePlayer(targetid);
SendClientMessage(playerid, 0x00FF00FF, "Пациент успешно вылечен!");
}
}
}
return 1;
}

CurePlayer(playerid) {
PlayerInfected[playerid] = false;
// Сброс всех эффектов
ClearAnimations(playerid);
SetPlayerHealth(playerid, 100);
// ... остальные сбросы
}

/*==================
ВИЗУАЛЬНЫЕ ЭФФЕКТЫ
==================*/
ApplyInfectionEffects(playerid, virus, stage) {
switch(virus) {
case VIRUS_ZOMBIE: {
switch(stage) {
case 0: SetPlayerAttachedObject(playerid, 0, 1240, 2); // Кровь на лице
case 1: GameTextForPlayer(playerid, "~r~ВЫ ЗАРАЖЕНЫ!", 5000, 3);
}
}
// ... эффекты для других вирусов
}
}

Писал месяц назад , но не куда не выкладывал, на 10 лайков расскажу подробнее об данной инициативе!
 
Сверху