Доступ к готовым решениям

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Ивент 'Падающие плиты'

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.
 
Последнее редактирование:
Сверху Снизу