[Tutorials] [BG] SAMP Scripting - 1

Раздел за уроци, свързани със скриптирането при SA:MP
Post Reply
User avatar
zepfiz
Потребител
Потребител
Posts: 5
Joined: 24 Nov 2018, 16:15

[Tutorials] [BG] SAMP Scripting - 1

Post by zepfiz »

Така, настанете се. Добре. Камера, светлина. Да започваме.
Добре дошли в първия епизод/тема/пост. В тези епизоди/теми/пости ще ви науча как да скриптирвате в самп.

Така единственото нещо което ще ви трябва е МНОГО МАЛКО знания за скриптирване. Просто да знаете как да отворите pawno. Ако знаете какво е това.

Нека да започнем.

Как се правят командите във самп сървърите?
Първо трябва да решите дали искате по лесния начин, или по по - сложния. За по лесния начин трябва да изтеглите така нареченият "include"(zcmd.inc) . За това няма да обяснявам тук.

Просто изтеглете го от тук: Download
и го вкарайте в папката pawno > include >

След това в гейммода ви трябва да има едно

Code: Select all

#include <a_samp>
Просто под него напишете:

Code: Select all

#include <zcmd>
За командите функцията се казва "OnPlayerCommandText"
Може да я намерите в вашия гейммод. (не г*й мод.)

По сложния начин командата трябва да изглежда ето така:

Code: Select all

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp(cmdtext, "/example", true))
    {
        //Функция
        return 1;
    }
    return 0;
}
По лесния начин командата трябва да изглежда ето така:

Code: Select all

CMD:example(playerid, params[])
{
     //Функция
     return 1;
}
Вие си преценете по кой начин искате да правите командите. (Аз лично бих избрал втория)

Така, ок. Това е командата, но това ли беше всичко?
Не. От долу на //Функция трябва да сложите функцията която командата да прави.
Да кажем примерно искаме да дадем на играча живот.

Лесния начин:

Code: Select all

CMD:heal(playerid, params[])
{
     SetPlayerHealth(playerid, 100);
     return 1;
}
Това е. Толкова просто? Да. За сега е толкова просто.
Не разбрахте?
Нека да го направим малко по детайлно и ще обясня за всичко.
Така:

Code: Select all

CMD:heal(playerid, params[]) 
Това ви е командата. След това

Code: Select all

CMD:
идва името на командата, напишете каквото искате. Но да го запомните после.

Тези { } са много прости. Просто едното отваря командата, другото я затваря.

Другото след него е функцията. Нека да я "разбием" и да разберем какво има вътре.

1. SetPlayerHealth означава функцията която ни трябва за да зададем на някой живота. Буквално на български означава

Set - задай. Player - игрaч. Health - живот.

Мисля че тук разбрахте какво имам предвид.
след това идва скоба ( и след това идва "playerid" което означава ид-то на играча. Тоест самия играч. Като влезете в сървър ви дава ИД от 0 до ....
"playerid" означава играча който пише командата. (Сигурен съм, че ще има въпроси за това, защото не го обясних като хората, ако има питайте и ще отговоря)

и след това идва запетайка, и след това числото 100.
Тук можете да напишете каквото искате. Смисъл това означава колко живот искате да дадете на играча. Ако искате половин. Напишете 50.
(С това можете да направите още една команда която е /die която е да се самоубиеш. Просто направи същото. Преименувай командата и на цифрата сложи едно 0)

И след това затваряме скобата. И след това идва ; с това затваряме цялата функция.

След това идва "return 1;"
което означава на българския. Върни 1. Тук това означава да ви направи командата 1 път (ако тук не съм го обяснил както трябва ако има по добри от мен да го обяснят).

И това е командата.

Ако има въпроси, питайте.
User avatar
SprRayZ
V.I.P
V.I.P
Posts: 36
Joined: 06 Nov 2013, 17:13
Skype: N/A
CS Nick: sf4n
Favorite version: CS: 1.6
Location: Търговище, Шумен, Русе

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by SprRayZ »

Щеше да бъде добре да обясниш как да се използва команда за дадено ID.
Та нека помогна с нещо и аз.
Започваме като задаваме командата нашият пример ще бъде "heal", като вие може да си го промените в зависимост какво ви устройва повече, може да е "sethealth" и така нататък.

Code: Select all

CMD:heal(playerid, params[], help)
Отваряме една скоба, която отваря командата.

Code: Select all

{
Трябва да зададем функция, която проверява дали играчът има админ права. В края съм обяснил по-подробно какво е това.

Code: Select all

if(IsPlayerAdmin(playerid))
Отваряме скоба, която отваря функцията.

Code: Select all

{
И сега следва по сложната част, но ще се опитам да обясня колкото се може повече за по лесно усвояване.
първо ако искаме всички функции да работят трябва да дефинираме.

Code: Select all

new id;
new string[256];
new health;
new tname[24];
new pname[24];
Та чудите се какво дефинираме в момента?
id - ID-то на играча, който искаме да зададем кръвта.
string - това помага на съобщенията, който ще напишем след малко. препоръчително е да се използва така нареченият "string" защото с него можем да пратим съобщение при което се вижда кой използва командата и на кого я използва. Какво представляват тези скоби след "string, tname и pname"? Това задава колко знака може да се използват в съобщението, което ще направим следмалко.
health - това го дефинираме за да може командата да работи без проблем.
tname - накратко от "TargetName", това е името на играча върху, който ще използвате командата.
pname - накратко от "PlayerName", та може да се досетите това е вашето име, което по късно ще бъде използвано
Та нека започнем с направата на фукнцията. Тя проверява дали командата е правилно използвана. в противен случай изпраща съобщение, което показва как е правилно да се използва командата.

Code: Select all

if(sscanf(params, "dd", id, health)) 

Code: Select all

return SendClientMessage(playerid, COLOR_RED, "Използвайте: /heal [id] [health]");
Завършен вид на функцията за проверка на командата.

Code: Select all

if(sscanf(params, "dd", id, health)) return SendClientMessage(playerid, COLOR_RED, "Използвайте: /heal [id] [health]");
След това трябва да зададем функцията, която добавя кръв на избрания играч. Тя задава кръвта на играча. id - това е играча на, когото използвате командата. health - това задава кръвта която сте избрали при използването на командата. Пример /heal 0(id-то на играча) 100 , това задава кръвта на играча да е 100.

Code: Select all

SetPlayerHealth(id, health);
Нека вземем имената, който трябва да се показвам при използване на командата.

Code: Select all

GetPlayerName(id, tname, sizeof(tname));
GetPlayerName(playerid, pname, sizeof(pname));
tname - е името на играча на ,когото бъде използвана командата.
pname - е вашето име.
Защо трябва да направим това? Отговора е защото трябва да се намерят имената на хората в противен случай няма да бъдат изписани в съобщението.
Сега нека да направим съобщението.

Code: Select all

format(string, sizeof(string), "ADMIN: %s зададе кръвта на %d. Кръв[%d]!",pname , tname, health);
SendClientMessageToAll(0xFF0000, string);
Питате се какво е "%s" - това позволява да бъдат показани само БУКВИ в този случай име на играч.
А какво е "%d" - това позволява да бъдат показани само ЦИФРИ в този случай кръвта му.
Време е да затворим функциите отново със скоба.

Code: Select all

}
Нека зададем какво да изписва, ако играч, който не е админ използва командата.

Code: Select all

else SendClientMessage(playerid, 0xFF0000, "Вие не сте АДМИН!");
След него добавяме.

Code: Select all

return 1;

Което подпомага за нормалната работа на командата.
Какво е "else"? При зададената проверка дали играча има админ права, това прави така, че ако играчът няма права да не му позволява да използва командата.
Слагаме последната скоба за да затворим командата.

Code: Select all

}
И нашата команда е готова.
Функция на командата:
1. Задава кръвта на избран от вас човек.
2. Изпраща съобщение до всички играчи в сървъра с информация т.е "Кой е използвал командата, На кого е използвана командата и колко кръв е зададена на играча".

Краен вид на командата.

Code: Select all

CMD:heal(playerid, params[], help)
{
      if(IsPlayerAdmin(playerid))
      {
            new id;
            new string[256];
            new health;
            new tname[24];
            new pname[24];
            if(sscanf(params, "dd", id, health)) return SendClientMessage(playerid, COLOR_RED, "Използвайте: /heal [id] [health]");
            SetPlayerHealth(id, health);
            GetPlayerName(id, tname, sizeof(tname));
            GetPlayerName(playerid, pname, sizeof(pname));
            format(string, sizeof(string), "ADMIN: %s зададе кръвта на %s. Кръв[%d]!",pname , tname, health);
            SendClientMessageToAll(0xFF0000, string);
      }
      else SendClientMessage(playerid, 0xFF0000, "Вие не сте АДМИН!");
      return 1;
}
Надявам се да съм бил достатъчно изчерпателен за да може по лесно да се усвой/научи писането на дадена команда.
Бих искал да добавя, че е препоръчително да се използва "ZCMD" като основа на командите, не съм съгласен с написаното от другия потребител, че "ZCMD" е по-лесно за писане от колкото "STRCMP". Долу горе еднакво е за писане зависи от това на кое от двете си свикнал. Плюса на "ZCMD" е ,че е много по бързо от "STRCMP", което е от голямо значение при голям проект в ,който има многобройни команди.

Поздрави.
User avatar
zepfiz
Потребител
Потребител
Posts: 5
Joined: 24 Nov 2018, 16:15

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by zepfiz »

Да, но все пак това ми е първия "tutorial". Дано хората нещо са научили от това което обясних.

Също искам да попитам. Как искате да ви правя уроците?

За всеки урок нова тема или да поствам новите уроци ето тук.
User avatar
iVoka
CS-bg.info Admin
CS-bg.info Admin
Posts: 1317
Joined: 29 Jun 2007, 12:21
Favorite version: CS: 1.6
Steam Community ID: ivobg92
Contact:

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by iVoka »

Може като нови теми, както и можеш да ги групираш по някакъв начин, за да не станат стотици примерно.
User avatar
SprRayZ
V.I.P
V.I.P
Posts: 36
Joined: 06 Nov 2013, 17:13
Skype: N/A
CS Nick: sf4n
Favorite version: CS: 1.6
Location: Търговище, Шумен, Русе

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by SprRayZ »

За съжаления я няма предишната активност по този раздел. Бих се радвал да се върне, но бавно по бавно ще стане. Хората, който в момента се занимават да помогнат на, някой писал в раздела се броят на пръсти... Ivaka ако няма нищо против може да добави Под-Раздел "Scripting Tutorials", който ще позволи на потребителите лесно да намерят каквото търсят :wink:
User avatar
iVoka
CS-bg.info Admin
CS-bg.info Admin
Posts: 1317
Joined: 29 Jun 2007, 12:21
Favorite version: CS: 1.6
Steam Community ID: ivobg92
Contact:

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by iVoka »

Готов е, щом имате желание да пишете уроци, нека бъде по-лесно намирането им. Благодаря и желая успех повече хора да ги четат и да се включат.
User avatar
GGTELNET
Потребител
Потребител
Posts: 26
Joined: 27 Jun 2018, 11:06
Skype: live:martin.dimitrov03
CS Nick: WhiteNigga_
Steam Community ID: 76561198385677

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by GGTELNET »

Браво за урока ама други няма ли да има? :( :(
User avatar
SprRayZ
V.I.P
V.I.P
Posts: 36
Joined: 06 Nov 2013, 17:13
Skype: N/A
CS Nick: sf4n
Favorite version: CS: 1.6
Location: Търговище, Шумен, Русе

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by SprRayZ »

GGTELNET wrote:Браво за урока ама други няма ли да има? :( :(
Ще има доста полезни уроци, но след време защото написването на 1 добър урок, който ще се възприеме добре от потребителите отнема минимум 30 минути писане и обясняване :) Дано има и повече, който изявяват желание да помогнат и напишат някой друг полезен урок.

Поздрави.
User avatar
Define
Потребител
Потребител
Posts: 5
Joined: 26 Feb 2019, 14:23

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by Define »

Не че нещо, евала за труда но че return 1; ще направи командата един път ми стана смешно щото по логика ако напиша return 250; ще я направи 250 пъти. Всъщност, return 1; връща стойноста обратно към OnPlayerCommandText при strcmp или при OnPlayerCommandPerformed ако е ZCMD, това казва че командата е стигнала до края успешно, ако напимем 0 тя пак ще работи(с малки изключения) но след като функциите се изпълнят сървъра ще каже на играча че такава команда няма, SERVER: Unknown Command или нещо което вие сте си накодили да казва. Така се правят и скрити команди които без права ще ти кажат че не съществуват пример: if(!IsPlayerAdmin(playerid)) return 0; ще каже на играча че командата не съществува а if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, -1, "Нямаш право да използваш тази команда!"); ще му каже че я има но няма достъп до нея, ако се чудите защо не изписва и че не съществува заедно с това че няма достъп, това е защото след използване на SendClientMessage, OnPlayerCommandText или OnPlayerCommandPerformed получават цифрата 1.
User avatar
Shmek3r
Потребител
Потребител
Posts: 36
Joined: 18 Dec 2017, 11:52
Skype: LS
CS Nick: Shmek3r
Favorite version: CS: 1.6
Contact:

Re: [Tutorials] [BG] SAMP Scripting - 1

Post by Shmek3r »

Имам въпрос с тези команди... след като сложа някоя команда от рода на "трудния начин" в сървъра ми изписва, че такава команда несъществува.
А като сложих команда от рода на тази:

Code: Select all

CMD:heal(playerid, params[])
{
     SetPlayerHealth(playerid, 100);
     return 1;
}
Ми излиза този ерор в pawno https://imgur.com/drpHgkt

Благодаря предваритетлно! :)
Post Reply

Return to “GTA SA:MP Scripting Tuts”