Другое Падение в анимацию при низком уровне HP

Pakulichev

Software Developer & System Administrator
Автор темы
Друг
1,789
2,130
Привет-привет, читатели данной темы.

Сегодня мне бы хотелось показать простенькую систему стадий для RP сервера.
В конце у нас получится что-то на подобии этого:
DQ8PQ.png
Давайте начинать. Предупреждаю, что система может конфликтовать с системой больницы.
• Ко всем переменным в начале кода нужно добавить:
PHP:
new Text3D:stadia_text[MAX_PLAYERS];
new stadia_timer[MAX_PLAYERS];

• Ко всем DEFINE:
PHP:
#define COLOR_GREY 0xD0D0D0FF

• Теперь в public OnPlayerUpdate добавляем:
PHP:
if (GetPlayerState(playerid) != PLAYER_STATE_DRIVER)
{
    new Float:php;
    GetPlayerHealth(playerid, php);
    if (php > 0.0 && php < 10.0 && GetPVarInt(playerid, "nokaut") == 0) // можете ещё сделать проверку на больницу, если она у Вас есть
    {
        SendClientMessage(playerid, COLOR_GREY, "Ваш персонаж ранен и находится без сознания.");
        SendClientMessage(playerid, COLOR_GREY, "Вы можете прописать команду /acceptdeath, если согласны принять смерть.");
        TogglePlayerControllable(playerid, 0);
        ApplyAnimation(playerid,"PED","FLOOR_hit_f",4.1,0,1,1,1,0);
        stadia_timer[playerid] = SetTimerEx("StadiaTimer", 1500, true, "d", playerid);
        stadia_text[playerid] = Create3DTextLabel("(( ДАННЫЙ ПЕРСОНАЖ БЕЗ СОЗНАНИЯ ))", COLOR_GREY, pX, pY, pZ, 25.0, GetPlayerVirtualWorld(playerid), 1);
        Attach3DTextLabelToPlayer(stadia_text[playerid], playerid, 0.0, 0.0, 0.7);
        SetPVarInt(playerid, "nokaut", 1);
    }
}

• В конце мода создаём forward и public для таймера:
PHP:
forward StadiaTimer(playerid);
public StadiaTimer(playerid)
{
    new Float:php;
    GetPlayerHealth(playerid, php);
    if (php > 9.0) //если персонажа вылечили или админ выдал HP
    {
        TogglePlayerControllable(playerid, 1);
        ApplyAnimation(playerid,"CARRY","crry_prtial",4.0,0,0,0,0,0,0); //сбиваем анимку
        Delete3DTextLabel(stadia_text[playerid]);
        SetPVarInt(playerid, "nokaut", 0);
        return KillTimer(stadia_timer[playerid]);
    }
    return 1;
}

• Теперь идём в public OnPlayerDeath и прописываем в конец:
PHP:
if (GetPVarInt(playerid, "nokaut") == 1)
{
     TogglePlayerControllable(playerid, 1);
     ApplyAnimation(playerid,"CARRY","crry_prtial",4.0,0,0,0,0,0,0); //сбиваем анимку
     Delete3DTextLabel(stadia_text[playerid]);
     SetPVarInt(playerid, "nokaut", 0);
     KillTimer(stadia_timer[playerid]);
}

• Ну и под конец идём в public OnPlayerDisconnect и пишем:
PHP:
if (GetPVarInt(playerid, "nokaut") == 1)
{
     Delete3DTextLabel(stadia_text[playerid]);
     SetPVarInt(playerid, "nokaut", 0);
     KillTimer(stadia_timer[playerid]);
}

Надеюсь такое решение Вам подойдет и Вы будете использовать его в своих модах.
Возможно есть какие-то недостатки, т.к. сам недавно начал писать на PAWN.​
 
Последнее редактирование:
  • Нравится
Реакции: Shepi и lfhrnthhjh

Pakulichev

Software Developer & System Administrator
Автор темы
Друг
1,789
2,130
почему тогда нет пояснений этих строк? вот щас какой-нибудь коля из саратова вставит в свой мод и ему выдаст кучу ошибок
KillTimer стандартная функция, переменная прописана сверху. Ошибок не будет.
DEFINE для COLOR_GREY добавлю.
 

sаnеk

Всефорумный sanek
Друг
2,107
2,057
кстати да, лучше в секундный таймер затолкать
 

Pakulichev

Software Developer & System Administrator
Автор темы
Друг
1,789
2,130
Смертельный способ, может взорваться мод. Позже оптимизирую и починю.
 

Sire Like

Blanche Bier
Друг
487
232
Пвары медленнее переменных, а еще переменные удобнее пваров в плане использования.
Хотя разница там несущественная, но за такое могут закидать тапками.
Здрасте.
Медленнее и чо????
Можно бесконечно спорить
 

Dugger

Потрачен
30
1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Из OnPlayerUpdate убери в секундный таймер который будет идти циклом, с большим онлайном серверу придёт песба