PDA

Просмотр полной версии : [Мануал] DeathMatch арена



TimoXa32
09.04.2017, 17:49
Всем привет. Сегодня я расскажу, как сделать простую DM арену для вашего сервера SAMP.

Оригинал ( на английском ) - Клик (http://forum.sa-mp.com/showthread.php?t=453540)

Ко всем new добавим:

new in_dm[MAX_PLAYERS];

К #define ( если нет ):

#define COLOR_GREEN 0x33AA33AA
#define COLOR_WHITE 0xFFFFFFFF

В public OnPlayerConnect:

in_dm[playerid] = 0;

В public OnPlayerSpawn:


if(in_dm[playerid] == 1)
{
SetPlayerHealth(playerid, 100); //здоровье
SetPlayerArmour(playerid, 100); //броня
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid, 26, cellmax); //оружие
GivePlayerWeapon(playerid, 28, cellmax);
GivePlayerWeapon(playerid, 24, cellmax);
GivePlayerWeapon(playerid, 34, cellmax);
SetPlayerInterior(playerid, 1); //спавн
switch(random(5)) //рандомный спавн
{
case 0: SetPlayerPos(playerid, 1412.639892,-1.787510,1000.924377);
case 1: SetPlayerPos(playerid, 1385.8126,-24.9797,1000.9221);
case 2: SetPlayerPos(playerid, 1410.6050,-43.1180,1000.9211);
case 3: SetPlayerPos(playerid, 1417.2075,-45.5887,1007.8926);
case 4: SetPlayerPos(playerid, 1417.8618,-32.7256,1007.8937);
}
SetPlayerVirtualWorld(playerid, 1);
SetPlayerSkin(playerid, 167); //скин
}


Ко всем stock ( если нет ):



stock GetName(playerid)
{
new player_name_id[24];
GetPlayerName(playerid,player_name_id,24);
return player_name_id;
}


В public OnPlayerDeatch:


if(in_dm[playerid] == 1)
{
new msg[60], msg2[60];
format(msg, sizeof(msg), "Вы убили %s!", GetName(playerid));
format(msg2, sizeof(msg2),"Вы были убиты %s!", GetName(killerid));
SendClientMessage(playerid, COLOR_GREEN, msg2);
SendClientMessage(killerid, COLOR_GREEN, msg);
SetPlayerHealth(killerid, 100);
SetPlayerArmour(killerid,100);
SpawnPlayer(playerid);
}


Теперь добавим команду, чтобы выйти с арены:


CMD:exitdm(playerid, params[])
{
if(in_dm[playerid] == 0)
{
SendClientMessage(playerid, -1, "Вы не на DM арене!");
return 1;
}
else if(in_dm[playerid] == 1)
{
InDM[playerid] = 0;
SetPlayerVirtualWorld(playerid, 0);
SetPlayerHealth(playerid, 0.00);
ForceClassSelection(playerid);
SetPlayerInterior(playerid, 0);
SendClientMessage(playerid, -1, "Вы покинули DM арену!");
return 1;
}
return 1;
}


Теперь, чтобы зайти на арену:


CMD:dm(playerid, params[])
{
in_dm[playerid] = 1;
GameTextForPlayer(playerid, "/exitdm to exit!", 3000, 4);
SendClientMessage(playerid, -1, "{66FF66}Добро пожаловать на DM арену! {BABABA}");
SetPlayerInterior(playerid, 1);
switch(random(5)) //рандомный спавн
{
case 0: SetPlayerPos(playerid, 1412.639892,-1.787510,1000.924377);
сase 1: SetPlayerPos(playerid, 1385.8126,-24.9797,1000.9221);
case 2: SetPlayerPos(playerid, 1410.6050,-43.1180,1000.9211);
case 3: SetPlayerPos(playerid, 1417.2075,-45.5887,1007.8926);
case 4: SetPlayerPos(playerid, 1417.8618,-32.7256,1007.8937);
}
SetPlayerVirtualWorld(playerid, 1);
SetPlayerTeam(playerid, playerid);
ResetPlayerWeapons(playerid);
SetPlayerColor(playerid, COLOR_WHITE);
SetPlayerSkin(playerid, 167);
SetPlayerHealth(playerid, 100);
SetPlayerArmour(playerid, 100);
GivePlayerWeapon(playerid, 26, cellmax); //cellmax - бесконечные патроны. Вы можете выставить свое значение, которое вам нужно
GivePlayerWeapon(playerid, 28, cellmax);
GivePlayerWeapon(playerid, 24, cellmax);
GivePlayerWeapon(playerid, 34, cellmax);
GivePlayerWeapon(playerid, 16, 2);
new str[144], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(str, sizeof(str), "{FFFFFF}%s {BABABA}(ID: %d) зашел на DM арену!", name, playerid);
SendClientMessageToAll(-1, str);
return 1;
}


( Прим. SooBad (http://pro-pawn.ru/member.php?7229-SooBad). Для бесконечного количества патронов вместо cellmax можно использовать число больше 10998 )

Вот и все. Будут вопросы - пиши

_[Bupyc]_
09.04.2017, 18:46
В OnPlayerDeath не хватает

if(InDM[playerid] == 1)

TimoXa32
09.04.2017, 18:58
Исправил

SooBad
10.04.2017, 00:32
Вопрос к автору только один.


GivePlayerWeapon(playerid, 26, cellmax);
WTF?! Причём тут cellmax?

ziggi
10.04.2017, 00:54
Вопрос к автору только один.


GivePlayerWeapon(playerid, 26, cellmax);
WTF?! Причём тут cellmax?

Ты спрашиваешь что такое cellmax или почему он здесь используется? cellmax - константа в Pawn, значение которой равно максимальному целому значению, которое можно записать в переменную (4 байта). Почему он здесь используется - не знаю, особенно учитывая, что для хранения патрон отводится всего 2 байта, а не 4.

arzumanov
10.04.2017, 01:47
Зачем в OnPlayerDeath объявлять два массива, если можно один массив использовать дважды?

TimoXa32
10.04.2017, 11:53
Вопрос к автору только один.


GivePlayerWeapon(playerid, 26, cellmax);
WTF?! Причём тут cellmax?

В оригинале есть пояснение:

// cellmax is to give the player infinite ammo.

SooBad
10.04.2017, 18:26
Ты спрашиваешь что такое cellmax или почему он здесь используется? cellmax - константа в Pawn, значение которой равно максимальному целому значению, которое можно записать в переменную (4 байта). Почему он здесь используется - не знаю, особенно учитывая, что для хранения патрон отводится всего 2 байта, а не 4.

Да, я, собственно, про то же (про использование в данном случае).

TimoXa32, так а смысл тут использовать cellmax, когда беск.патроны начинаются со значения 10998?

Daniel_Cortez
19.04.2017, 16:13
Да, я, собственно, про то же (про использование в данном случае).

TimoXa32, так а смысл тут использовать cellmax, когда беск.патроны начинаются со значения 10998?
Это форум для Pawn-, а не Cleo-скриптеров, чтобы знать такие подробности.

Автору темы к прочтению: http://pro-pawn.ru/showthread.php?8347.

(Знаю, что немного поздно, но всё же.)

Nexius_Tailer
19.04.2017, 17:54
Это форум для Pawn-, а не Cleo-скриптеров, чтобы знать такие подробности.
Это описано в вики, вроде в статье GetPlayerAmmo. И знать это важно хотя-бы потому, что при превышении некого значения патроны будут уходить в минус (а то и вообще возвращать что-то невнятное, что может повлиять на какие-то системы), в отличие от оформления.


...Да и вообще мне кажется, что целью было просто перевести иноязычную статью, хотя также неплохо было бы внести и какие-то свои изменения.

Daniel_Cortez
19.04.2017, 20:26
Это описано в вики, вроде в статье GetPlayerAmmo. И знать это важно хотя-бы потому, что при превышении некого значения патроны будут уходить в минус (а то и вообще возвращать что-то невнятное, что может повлиять на какие-то системы), в отличие от оформления.
Вполне возможно. Я проверил в SA-MP wiki все нативные функции, связанные с оружием, но нигде нет упоминания о 10998. Возможно, что-то подобное спрятано в русскоязычной версии?

Ещё один вопрос к ТС: зачем нужно было делать такой шрифт в 1-м посте?
P.S.: Жду поправок в тему в соответствии со стилем, описанным в теме по ссылке выше. Не стесняйтесь спросить, если что-то непонятно.

Nexius_Tailer
19.04.2017, 21:11
Я проверил в SA-MP wiki все нативные функции, связанные с оружием, но нигде нет упоминания о 10998. Возможно, что-то подобное спрятано в русскоязычной версии?
Не совсем 10998. Реальный лимит патронов равен вместимости переменной в две ячейки (что-то вроде 32767 или 32768). Автор выше скорее всего имел в виду значение, после которого патроны визуально для игрока перестают иметь счёт в окошке с оружием (но почему-то как мне помнится, там ровно с 10000 счёт пропадает).

Enrique_Black
19.04.2017, 23:00
Да, я, собственно, про то же (про использование в данном случае).

TimoXa32, так а смысл тут использовать cellmax, когда беск.патроны начинаются со значения 10998?

Да, но не может превышать превышать значения -32768 // 32768