faraday.
Специалист
'Падающие плиты'
Лайтовая версия ивента, суть игры представлена на видео.
Проигравший кто упал с плоскости.
Победитель кто остался на последней плите.
Есть вероятность закончить игру без победителей, когда упадут все плиты. (не баг, а фича)
C++:
const MAX_OBJECT_FALL = 64; // Количество плит 8x8
const MAX_OBJECT_FALL_DESTROY = 4; // Сколько плит падает
//
const DIALOGID_EVENT = 1300;
//
new
object_fall[MAX_OBJECT_FALL],
timer_fall,
mp_fall_start,
bool:mp_active,
bool:mp_fall[MAX_PLAYERS],
//
random_object[MAX_OBJECT_FALL_DESTROY],
sel_destroyObject[MAX_OBJECT_FALL_DESTROY] = {-1, ...},
Float:posit_x[MAX_OBJECT_FALL_DESTROY], Float:posit_y[MAX_OBJECT_FALL_DESTROY], Float:posit_z[MAX_OBJECT_FALL_DESTROY]
;
Команды:
C++:
CMD:gomp(playerid) {
if(mp_fall[playerid])
return SendClientMessage(playerid, 0xCECFCEff, "Вы уже регистрировались");
if(mp_active == true)
return SendClientMessage(playerid, 0xCECFCEff, "Мероприятие уже началось.");
if(mp_fall_start == 0)
return SendClientMessage(playerid, 0xCECFCEff, "Регистрация на мероприятие закрыта.");
SetPlayerPos(playerid, 1593.22, -1136.10, 170.10);
mp_fall[playerid] = true;
return SendClientMessage(playerid, -1, "Вы зарегистрировались в Мероприятии 'Падающие плиты'");
}
CMD:mp(playerid) {
return ShowPlayerDialog(playerid, DIALOGID_EVENT, DIALOG_STYLE_LIST, "Создать мероприятие", "Создать мерпориятие 'Падение плит'\nЗапустить 'Падение плит'", "Выбор", "Отмена");
}
C++:
if(mp_fall[playerid])
fall_PlayerTimer(playerid);
В OnDialogResponse
C++:
if(dialogid == DIALOGID_EVENT) {
if(!response)
return 1;
switch(listitem) {
case 0: {
if(mp_fall_start == 1)
return SendClientMessage(playerid, -1, "Уже создан");
mp_fall_start = 1;
SendClientMessageToAll(0xffd100FF, "Открыта регистрация на Мероприятие {319AFF}Падающие плиты {ffffff}( /gomp )");
CreateFallMP();
}
case 1: {
if(mp_fall_start == 0)
return SendClientMessage(playerid, -1, "Сначала создайте мероприятие (/mp -> Создать мероприятие)");
mp_active = true;
foreach(Player, i) {
if(mp_fall[i])
GameTextForPlayer(i, "MP START!!!", 1000, 4);
}
timer_fall = SetTimer("EventTimer",4000, true);
return 1;
}
}
return 1;
}
C++:
fall_PlayerTimer(playerid) {
new Float:position_mp_x,Float:position_mp_y,Float:position_mp_z;
GetPlayerPos(playerid, position_mp_x, position_mp_y,position_mp_z);
if(mp_fall[playerid] && position_mp_z < 167.1 && mp_active) { // 167.1 Упав ниже этой координаты Z - проигрыш и спавн
SendClientMessage(playerid, 0xFF4F00FF, "Вы проиграли в мероприятии");
mp_fall[playerid] = false;
SpawnPlayer(playerid);
}
}
forward EventTimer();
public EventTimer() {
new destroy_count;
for(new d; d < MAX_OBJECT_FALL; d++) {
if(IsValidDynamicObject(object_fall[d]))
destroy_count++;
}
if(destroy_count == 1) {
SendClientMessageToAll(0x319AFFFF, "Мероприятие {ffd400}Падающие плиты{319AFF} завершилось.");
mp_active = false;
mp_fall_start = 0;
for(new d; d < MAX_OBJECT_FALL; d++) {
if(IsValidDynamicObject(object_fall[d]))
DestroyDynamicObject(object_fall[d]);
}
KillTimer(timer_fall);
new winner;
SendClientMessageToAll(0xffd100FF, "Список победителей:");
foreach(Player, i) {
if(!mp_fall[i])
continue;
new Float:position_mp_x,
Float:position_mp_y,
Float:position_mp_z,
player_name[MAX_PLAYER_NAME];
GetPlayerPos(i, position_mp_x, position_mp_y,position_mp_z);
if(mp_fall[i] && position_mp_z >= 169.1) { //
GetPlayerName(i, player_name, MAX_PLAYER_NAME);
SendClientMessageToAll(0xffd100FF, player_name);
mp_fall[i] = false;
SendClientMessage(i, 0x099619FF, "Поздравляем! Вы остались на последней плите и получаете свою награду!");
SendClientMessage(i, 0xffd100FF, "Награда: {ffffff} 15.000$");
SpawnPlayer(playerid);
GivePlayerMoney(i, 15000); //Замените выдачу денег на свою переменную
winner++;
}
}
if(!winner)
SendClientMessageToAll(0xCECFCEFF, "Победителей нет :(");
}
for(new i; i < MAX_OBJECT_FALL_DESTROY; i++) {
random_object[i] = random(MAX_OBJECT_FALL);
if(!IsValidDynamicObject(object_fall[random_object[i]]))
random_object[i] = random(MAX_OBJECT_FALL);
if(IsValidDynamicObject(object_fall[random_object[i]])) {
GetDynamicObjectPos(object_fall[random_object[i]], posit_x[i], posit_y[i], posit_z[i]);
MoveDynamicObject(object_fall[random_object[i]], posit_x[i], posit_y[i], posit_z[i], 1.0, -87.0);
sel_destroyObject[i] = 0;
}
}
return 1;
}
new Float:angle_rotation[5] = { -93.0, -87.0, -93.0, -87.0, 90.0 };
public OnDynamicObjectMoved(objectid) {
for(new i; i < MAX_OBJECT_FALL_DESTROY; i++) {
if(objectid == object_fall[random_object[i]]) {
if(sel_destroyObject[i] != 5) {
MoveDynamicObject(object_fall[random_object[i]], posit_x[i], posit_y[i], posit_z[i], 2.0, angle_rotation[sel_destroyObject[i]]);
sel_destroyObject[i]++;
} else {
DestroyDynamicObject(object_fall[random_object[i]]);
sel_destroyObject[i] = -1;
return 1;
}
}
}
return 1;
}
CreateFallMP() {
for(new i; i < MAX_OBJECT_FALL_DESTROY; i++)
sel_destroyObject[i] = -1;
for(new d; d < MAX_OBJECT_FALL; d++) {
if(IsValidDynamicObject(object_fall[d]))
DestroyDynamicObject(object_fall[d]);
}
//
new value_plate;
for(new Float:y = -3.33, i; i < 8; i++, y -= 3.33)
for(new Float:x = 4.44, d; d < 8; d++, x += 4.44)
object_fall[value_plate] = CreateDynamicObject(1649, 1563.9959 + x, -1125.93262 + y, 169.10271, -90.0, 0.0, 0.0),
value_plate++;
}
Автор: unreal.
Последнее редактирование:
