Статьи по GTA мультиплеерам, на этих страницах находятся статьи GTA SAMP, GTA 4, MTA.
Главная » Статьи GTA » Работа с модами и скриптами SAMP »



Информация по созданию модов SAMP [2]
Исчерпывающая информация и фак'и по созданию модов и скриптов GTA SAMP
Информация по соданию скриптов SAMP [3]
Инструкции и описания по созданию SAMP скриптов
Оптимизация модов и скриптов [4]
Статьи по оптимизации модов и скриптов SAMP
Ошибки и их решения [0]
Ошибки при работе с созданием и оптимизацией SAMP модов и скриптов
FAQ по установке и настройке [1]
Вопрос-ответ по установке и настройке модов и скриптов SAMP
Статьи о компиляции PAWN [1]
Вся информация, касающаяся компиляции на языке PAWN с помощью компилятора.
Руководства по NPC [13]
Как работать с NPC в SAMP узнаем из этого раздела



В разделе статей: 24
Показано статей: 1-20
Страницы: 1 2 »

Мануал по добавлению объектов на сервер.

Мануал подготовил DeadSmile

 

Допустим вы расставили объекты в МТА или скачали карту.Тут то и у большинства новичков возникает вопрос:"Как же поставить всё это на сервер?"

 

Ниже я поясню весь процесс пошагово.

 

Шаг 1 - Конвертация объектов из МТА в pawn код.

 

Карты МТА имеют расширение .map (англ "карта").Открываем свой файл в любом текстовом редакторе и видим много каракулей:это и есть наши объекты.Копируем содержимое (Ctr+C) и заходим на сайт

convertffs. com

 

Вставляем скопированный код в окошко:

 

 

Жмём Convert и получаем наш pawno код,выглядит он примерно вот так:

 

 

 

Сделали?Отлично,переходим ко второму шагу.

 

Шаг 2 - добавление кода в мод.

 

Открываем ваш мод(я взял new.pwn для наглядности) .Жмём Ctrl+F и

вписываем вот так

Программа находит нужный нам public

 

 

После первой скобки вставляем наши переконвертированные объекты,выглядеть будет вот так:

 

Но это ещё не всё!

Вы мысленно спросите "Что же ещё?!"

Если вам не плевать на код,то советую выполнить табуляцию,тоесть выравнить код,после табуляции код будет выглядеть так:

 

 

 

Далее компилируем мод(надеюсь вы знаете как это делать),как вы увидите ниже - мой мод скомпилировался без ошибок:

 

 

Финиш!

Информация по соданию скриптов SAMP | Просмотров: 907 | Дата: 20.03.2015

Читайте предыдущую часть статьи по ссылкеРазбор скрипта "NPC боксёр в SAMP" (Часть 6)

switch(random(3)) выбираем из трех вариантов, либо NPC

нажмет правую кнопку, а затем левую, попробуйте сделать так сами, когда противоположный игрок находится вблизи от вас, что выполнит комбо 1, либо ох, вообщем запутаешься в этих кнопках, дело в том, что все их переназначают обычно, мало у кого на пробел спринт, а на шифт прыжок. Поэтому вот, что я Вам скажу, потестите на Вашем друге какие кнопки Вы нажимаете, затем гляньте, если пробел это уже прыжок, а не бег, как в оригинале, то она будет KEY_JUMP, иначе KEY_JUMP будет шифт, думаю разберетесь, здесь правда ничего сложного, а домашнее задание всем сделать 3е комбо, в кунг-фу, например, это удар с ноги в прыжке. Итак, что у нас получилось на данные момент – 2 комба и блок, всё используется случайно каждые 250 секунд, то ударим, то заблокируем, не предугадать ведь в схватке)

if(dist> 0.8 && dist<15.0 && GetPVarInt(pid, "box")== 1)

                   {

                            SetPVarInt(npc[npcid][npc_ID], "Condition",0);

                   }

Если игрок далее чем в 0.8 метров от нас, но не далее 15, то ставим состояние 0, и теперь выполняется оно.

if(dist>26.0)

                   {

                       for (new i = 0; i < 499; i++) {

                   if(GetPVarInt(i, "box")== 1){

                            DeletePVar(i,"box");}}

                            KillTimer(boxertimer);

                            FCNPC_Destroy(npc[npcid][npc_ID]);

                            ringused=0;

                            SetTimer("Renewbox",15000,0);

         } если же дистанция между игроком, вызвавшим на бой NPC и NPC более 26 метров, удаляем NPC, можете и бан сразу вписать, ибо ринг, в который портает, из него вообщем нереально выбраться, только с читами, ну может кто-то баги знает, лично я нет, а так если вдруг так получилось, ну вдруг админ портнул Вас далеко, то удаляем NPC и обновляем пикап, что из-за одного другим-то мучиться?

public OnPlayerCommandText(playerid, cmdtext[])

{

    if(!strcmp(cmdtext, "/bc", true))

    {

        SetPlayerInterior(playerid, 5);

        SetPlayerPos(playerid,767.5128,6.9371,1000.7142);

                   SetPlayerFacingAngle(playerid,90.9281);

    }

    return 0;

}

Пишем команду /bc и нас портает в спортзал.

Проблемы скрипта

Итак, здесь мы обсудим, чем же неидеален наш скрипт, ничто не идеально, наверное, но тем не менее. Про дистанцию, я подбирал такую дистанцию, когда NPC ещё не врезается в игрока, ведь если тупо писать goto в игрока, то он будет бежать и бежать в игрока, расстояние 0.8 по практическим исследования показалось оптимальным, дело в том, что если мы будет стоять далеко от нашего соперника и жать кнопки, то мы его даже в фокус не возьмем, данном расстояние позволяет брать игрока в фокус, можно же было бы как-то получать угол, или, для продвинутых кватернион, ну точнее изменять кватернион NPC, чтобы он плавно поворачивался к игроку и дрался с ним, но я не знаю как это делается, кватернионы – это типа повороты в пространстве, но плавные, а не сразу с 45, например, градусов перескачить в 180. Идея типа получать зеркальный угол от игрока – бред, если игрок стоит не лоб в лоб, то NPC будет бить по воздуху, вообщем работает очень не круто, если у кого-то есть способы оптимизации скрипта, значительной оптимизации, пишите в комментариях.

Вернуться в начало статьи: Разбор скрипта "NPC боксёр в SAMP" (Часть 1)

 

Руководства по NPC | Просмотров: 952 | Дата: 02.11.2014

Читайте предыдущую часть статьи по ссылкеРазбор скрипта "NPC боксёр в SAMP" (Часть 5)

Паблик для вычисления ближайшего игрока – примем как данное, это математика.

forward boxerfight();

public boxerfight()

{ начинается самое интересное, готовы? Поехали!

for (new npcid = 0; npcid < 1; npcid++) {

                   new Float:dist;

                   new pid = GetClosestPlayer(npc[npcid][npc_ID],dist);

для NPC-боксера задаем переменную дистанция, через переменную pid мы получаем ближайшего игрока к NPC на какой-либо дистанции.

if(dist<15.0 && GetPVarInt(pid, "box")== 1)

                   {

                            SetPVarInt(npc[npcid][npc_ID], "Condition",0);

                   }

Собственно сама дистанция, если дистанция менее 15 и этот человек именно тот, кто бросил вызов NPC, задать состояние NPC равное нулю.

Так как таймер каждые 250 миллисекунд всё проверяет, то просканировав в следующий раз он такой смотрит

if(GetPVarInt(pid, "box")== 1 && GetPVarInt(npc[npcid][npc_ID], "Condition")==0)

                   {

                            new Float:xnc, Float:ync, Float:znc;

                            GetPlayerPos(pid,xnc,ync,znc);

                            FCNPC_GoTo(npc[npcid][npc_ID],xnc,ync,znc,MOVE_TYPE_RUN,0,0);

                   }

Игрок, мол есть, идентификатор у него бокс, а теперь и у NPC ещё состояние нулевое, что означает состояние “беги” в данном случае. Задаем локальные координаты, получаем координаты ближайшего игрока через pid, ну и, конечно же, функцию GetPlayerPos, фишка в том, что pvar нам нужен для того, чтобы NPC не бил просто ближайшего игрока, он будет бить именно того, что бросил вызов, надеюсь теперь немного понятно зачем они здесь. Далее говорим NPC беги в игрока.

Таймер все также по 250 миллисекунд сканирует, вот подбегает он к игроку и тут

if(dist < 0.8 && dist<15.0 && GetPVarInt(pid, "box")== 1)

                   {

                            FCNPC_Stop(npc[npcid][npc_ID]);

                            SetPVarInt(npc[npcid][npc_ID], "Condition",1);

                   }

Опа, дистанция то у нас теперь менее 0.8 и не более 15, а игрок наш тот, что вызов бросил, говорим NPC прекратить бег, бегая удар-то не нанесешь, нормальный по крайней мере, хотя есть такая функция для FCNPC, но лучше её не использовать, итак остановили NPC и перевели его в состояние 1.

Таймер снова сканирует всё

if(GetPVarInt(pid, "box")== 1 && GetPVarInt(npc[npcid][npc_ID], "Condition")==1)

                   {

                            switch(random(3))

                            {

                            case 0: FCNPC_SetKeys(npc[npcid][npc_ID],KEY_HANDBRAKE+KEY_FIRE);

                            case 1: FCNPC_SetKeys(npc[npcid][npc_ID],KEY_HANDBRAKE+KEY_SECONDARY_ATTACK);

                            case 2: FCNPC_SetKeys(npc[npcid][npc_ID],KEY_HANDBRAKE+KEY_JUMP);

                            }

                   }

Теперь у нас выполняется условие, что игрок с индентификатором бокс рядом, в пределах от 0.8 до 15, а состояние NPC равно единичке. Про то, почему такие дистанции, напишу позже.

Читай скорее далее: Разбор скрипта "NPC боксёр в SAMP" (Заключение и выводы)

 

Руководства по NPC | Просмотров: 993 | Дата: 02.11.2014

Читайте предыдущую часть статьи по ссылкеРазбор скрипта "NPC боксёр в SAMP" (Часть 4)

SetTimer("spawnNPC", 500, 0); - феил, не стер со старого скрипта, он ничего не делает, раньше NPC вызывался через паблик, паблик удалил, а вот то, что его вызывать один раз не удалил, вообщем он ни на что не влияет можете смело удалить эту строчку.

} – закрываем пикап.

Return 1; - ну обычно его ставят, пусть постоит, он нужен не везде, например, вы вызывали выдачу какого-то сообщения через таймер, таймер крайне мал по времени, в том плане, что вызывается каждые 200 секунд, скажем, чтобы Вам 2 раза не выдало одно и то же, ставим в конце return 0, типа не повторять и удаляем его, это как пример, подробнее на samp wiki)

}Закрываем паблик скобочкой.

forward destroyNPC(npcid);

public destroyNPC(npcid)

{

        FCNPC_Destroy(npcid);

}

Удаляем NPC, используется при смерти NPC.

forward Renewbox(npcid);

public Renewbox(npcid)

{

        pickupkase = CreatePickup(1314,2, 757.4380,5.8088,1000.7014, -1);

        SendClientMessageToAll(-1,"Боксерский ринг обновлен!");

}

Обновляем боксерский ринг и пишем об этом всем

public FCNPC_OnDeath(npcid, killerid, weaponid) вызывается когда NPC умер

{

Проверяем если скин NPC 81 и его состояния равно 0, либо 1, либо 2, то

    if(FCNPC_GetSkin(npcid)==81 && GetPVarInt(npcid, "Condition")== 0 || GetPVarInt(npcid, "Condition")== 1 || GetPVarInt(npcid, "Condition")== 2)

    {

    if(ringused==1) если стоит, что ринг используется, перевести в не используется

    {

    ringused=0;

    SetTimer("Renewbox",15000,0); обновляем ринг

    }

    DeletePVar(npcid,"Condition"); удаляем Pvar для NPC

    SetTimerEx("destroyNPC",5000,0,"dd",npcid); удаляем конкретного NPC

    KillTimer(boxertimer); убиваем таймер

    if(GetPVarInt(killerid, "box")== 1){ если игрок убивший NPC имел идентификатор box, выдадим ему стиль и напишем об этом

    SetPlayerFightingStyle(killerid,FIGHT_STYLE_BOXING);

    SendClientMessage(killerid,COLOR_GREEN,"Вы овладели боксом! ");}

    for (new i = 0; i < 499; i++) {

для всех игроков, если у них идентификатор 1, то зададим виртуальный мир, позицию и угол, а так же удалим идентификатор.

    if(GetPVarInt(i, "box")== 1){

    SetPlayerInterior(i, 5);

    SetPlayerPos(i, 766.2117,6.1029,1000.7167);

    SetPlayerFacingAngle(i, 170.4782);

         DeletePVar(i,"box");}}

    }

         return 1;

}

static stock GetClosestPlayer(playerid,&Float:cdist)

{

         new cid = INVALID_PLAYER_ID;

         new Float:dist;

         new Float:x,Float:y,Float:z;

         new Float:mx,Float:my,Float:mz;

         cdist = 65000.0;

         GetPlayerPos(playerid,mx,my,mz);

         for(new i = GetMaxPlayers();i >= 0;i--)

         {

                   if(playerid == i) continue;

                   if(!IsPlayerConnected(i)) continue;

                   if (IsPlayerNPC(i)) continue;

                   GetPlayerPos(i,x,y,z);

                   x -= mx;

                   y -= my;

                   z -= mz;

                   dist = floatsqroot(x*x + y*y + z*z);

                   if(dist < cdist)

                   {

                            cdist = dist;

                            cid = i;

                   }

         }

         return cid;

}

Читай далее: Разбор скрипта "NPC боксёр в SAMP" (Часть 6)

 

Руководства по NPC | Просмотров: 1031 | Дата: 02.11.2014

Читайте предыдущую часть статьи по ссылкеРазбор скрипта "NPC боксёр в SAMP" (Часть 3)

ringused=1; - в принципе необязательно это использовать было, можно было бы как-то по-другому сделать, но пусть будет так. Мы сделаем так, что при ringused=1 ринг будет занят, а при ringused=0 ринг свободен, опять же говорю, здесь можно было продумать и по-другому, но когда я создавал какие-то арены, для всех пользователей это было критично, потому что вход туда производился через команду рядом с NPC, которая проверяла, есть ли кто сейчас на арене или нет, чтобы не писать проверки по всем игрокам или какие-то Pvar’ы сканировать, просто одна переменная и проблема решена.

for (new npcid = 0; npcid < 1; npcid++) {

открываем наш цикл, для самого первого нашего NPC имеющего идентификатор в цикле 0 (да-да всё тут начинается на с единички, а с нуля), и говорим, что же от него хотим.

npc[npcid][npc_ID] = FCNPC_Create(npc[npcid][npc_Name]);

Об этом написано в прошлом уроке, вместо имени для каждого NPC из enum’а берем его.

FCNPC_Spawn(npc[npcid][npc_ID], npc[npcid][npc_Skin], npc[npcid][npc_X], npc[npcid][npc_Y], npc[npcid][npc_Z]); - спавним NPC на ринге с такими-то координатами и скином, указанном в enum’е.

FCNPC_SetAngle(npc[npcid][npc_ID], npc[npcid][npc_A]); - угол поворота задаем из enum’а.

FCNPC_SetInterior(npc[npcid][npc_ID], npc[npcid][npc_Interior]); - задаем интерьер, я написал в комментариях, но напишу и тут, извиняюсь, пока не делал этот скрипт, забыл, что виртуальные миры и интерьеры разные вещи, интерьер – это место где находится наш зал, который тоже в данном случае берется из enum’а, а виртульных миров может быть очень и очень много, но в данном случае нам не нужны виртуальные миры, а вот интерьер, для зала бокса в ЛС нужен.

SetPlayerFightingStyle(npc[npcid][npc_ID], npc[npcid][npc_FightStyle]); - зададим для NPC стиль боя, указанный в enum’е.

SetPVarInt(npc[npcid][npc_ID], "Condition",0); - задаем для NPC состояние равном нулю, про смену Pvar’ов и их наглядное действие вы увидите позже в цикле самого боя для NPC.

boxertimer = SetTimer("boxerfight", 250, 1); - чтобы действия не выполнялись разово мы говорим, что каждые 250 миллисекунд (1/4 секунды) выполнять таймер, который мы обозначили как boxertimer. Таймеры работают и без обозначений, но имея обозначения таймера, позже его можно удалить, это важно, чтобы не было нагрузок, да и багов, чтобы не было, а то по 100 раз будете один и тот же таймер вызывать, даже не знаю, что будет, он ведь не разовый, а постоянный о чём свидетельствует цифра 1, а “boxerfight” – это тот паблик, куда нам надо перейти, то есть тот паблик, который выполнять каждые 250 миллисекунд.

}

Далее закрываем цикл для данного NPC, больше нам от него здесь ничего не надо.

Читаем далее: Разбор скрипта "NPC боксёр в SAMP" (Часть 5)

 

Руководства по NPC | Просмотров: 1006 | Дата: 02.11.2014

Читайте предыдущую часть статьи по ссылкеРазбор скрипта "NPC боксёр в SAMP" (Часть 2)

Начнем с функции public OnPlayerPickUpPickup(playerid, pickupid)

{ - открываем паблик

Функция вызывается тогда, когда игрок подбирает какой-либо пикап, наиболее яркие примеры пикапов в сингле это броня, аптечки, оружие.

if (pickupid == pickupkase) в этом строке мы указываем, что будет если игрок подберет пикап с идентификатором pickupkase.

{ - открываем всё, что нам надо сделать при подборе этого пикапа.

SendClientMessage(playerid,COLOR_GREEN,"Сражайтесь с мастером, чтобы овладеть стилем!"); - Посылаем игроку, подобравшему пикап текстовое сообщение зеленым цветом.

SetPlayerPos(playerid, 762.9995,2.5302,1001.5942); - задаем игроку позицию,  точнее мы портаем его на ринг, данная функция выглядит как playerid – это тот, кого портать, а дальше через запятую идут некие цифры, которые являются координатами по x,y,z.

SetPlayerFacingAngle(playerid, 138.2046); - телепортировав игрока на ринг зададим ему некий угол поворота, чтобы он смотрел в центр ринга.

DestroyPickup(pickupkase); - уничтожаем пикап, на самом деле эту строчку можно было бы написать выше всех, возможно, так было бы логичней, но вследствие того, что данный процесс происходит очень быстро, то мы не почувствуем разницы, в данном случае это не принципиально, но бывают случаи, когда это критично, если такое встретиться в моих скриптах, мы обязательно это обсудим. Зачем уничтожать пикап, спросите Вы? Для того, чтобы не было такого, что 2 и более игроков так же телепортируются на ринг – одного портировали и хватит, умрет или выйдет с сервера – удалим боксера и обновим пикап, но об этом далее.

SetPVarInt(playerid, "box",1); - что за ужасы пошли, «пвары» какие-то? На самом деле это «АРХИполезная» функция. «Пвары» это такие «присваиватели». Если так можно сказать. В данном случае здесь обозначается игрок ,находящийся на ринге. Для NPC Pvar’ы очень и очень важны, с помощью них мы можем производить контроль по принципу state_machine, об этом позже. Здесь же у нас всё просто: для игрока взявшего пикап, мы говорим  -этот человек на ринге! Ну, как говорим,  NPC-то пока об этом ничего не знает, об это знаем только мы, но, вскоре, мы расскажем ему этот секрет)

Читаем далее: Разбор скрипта "NPC боксёр в SAMP" (Часть 4)

 

 

Руководства по NPC | Просмотров: 763 | Дата: 02.11.2014

Добавилось то, что теперь мы дописываем в строку к NPC интерьер, где он будет и его боевой стиль. Об этом мы писали в серии статей "Руководство по созданию NPC в SAMP"

public OnFilterScriptInit() – вызывается, когда скрипт начинает работу

{

        ringused=0; - скрипт загрузился – говорим, на ринге никого нет

        for (new i = 0; i < 499; i++) {

        DeletePVar(i, "box");  для всех игроков удаляем pvar box

        }

        pickupkase = CreatePickup(1314,2, 757.4380,5.8088,1000.7014, -1);

создаем пикап с идентификатором pickupkase по таким-то координатам, 1314 – моделька пикапа, далее идут координаты по x,y,z, затем идет в каком виртуальном мире, ставьте -1 для всех виртуальных миров, ну а так-то по идее можно и 0, для 0вого мира.

       

}

public OnPlayerDisconnect(playerid, reason) – что будет, когда игрок отключится

{

Проверяем для NPC нашего, боксера то есть

                   for (new npcid = 0; npcid < 1; npcid++) {

                   if(GetPVarInt(playerid, "box")== 1)

если игрок был с идентификатором box, что значит на ринге

                   {

Выполнить для всех игроков имеющих идентификатор box его удаление, убиваем таймер, уничтожаем NPC, ставим ринг в положение – не используется, задаем таймер на обновление пикапа для входа на ринг.

                   for (new i = 0; i < 499; i++) {

                   if(GetPVarInt(i, "box")== 1){

                   DeletePVar(i,"box");}}

                   KillTimer(boxertimer);

                   FCNPC_Destroy(npc[npcid][npc_ID]);

                   ringused=0;

                   SetTimer("Renewbox",15000,0);

                   }

                   }

}

public OnPlayerDeath(playerid, killerid, reason) вызывается когда игро умирает

{

 Всё то же самое

    for (new npcid = 0; npcid < 1; npcid++) {

         if(GetPVarInt(playerid, "box")== 1)

         {

         for (new i = 0; i < 499; i++) {

         if(GetPVarInt(i, "box")== 1){

         DeletePVar(i,"box");}}

         KillTimer(boxertimer);

         FCNPC_Destroy(npc[npcid][npc_ID]);

         ringused=0;

         SetTimer("Renewbox",15000,0);

         }

         }

    return 1;

}

public OnFilterScriptExit() когда выключаем скрипт

{

Всё то же самое, кроме

        for (new npcid = 0; npcid < sizeof(npc); npcid++) {

                FCNPC_Destroy(npc[npcid][npc_ID]);

        }

        for (new i = 0; i < 499; i++) {

         if(GetPVarInt(i, "box")== 1){

скрипт выключили, а игроку на ринге быть? Ну уж нет, все кто имеют подобные идентификатор должны быть немедленно телепортированы с него, а идентификатор удален с них

         SetPlayerPos(i, 766.2117,6.1029,1000.7167);

         SetPlayerFacingAngle(i, 170.4782);

                   DeletePVar(i,"box");}}

        KillTimer(boxertimer);

        DestroyPickup(pickupkase);

        return 1;

}

Вернуться в первую частьРазбор скрипта "NPC боксёр в SAMP" (Часть 3)

 

Руководства по NPC | Просмотров: 849 | Дата: 02.11.2014

Дабы не было много флуда будем писать скрипт построчно. И объяснять почти всё, вдруг кто-то только учиться скриптить

#include <a_samp>

#include <fcnpc>

В самом начале скрипта как всегда пишутся include’ы. Include переводится как включение/вложение. Стандартным include, необходимым для работы какого-либо скрипта,  является include <a_samp>, который и содержит базовые функции. Так как стандартных функций нам недостаточно пишем, что, помимо основного include, у нас будет ещё некий include <fcnpc>, который отвечает за NPC  плагина FCNPC. Все include должны находится в папке yourserver\pawno\include. Идем далее.

#define COLOR_GREEN 0x16BC37AA

Осталось с каких-то тестовых скриптов, но раз уж используется в скрипте, то опишем, что же это за зверь) Итак, define переводится как определять/обозначать/устанавливать, то есть эта функция в данном примере устанавливает для зеленого цвета обозначение COLOR_GREEN. Дело в том, что ни один цвет, где бы то ни было не записывается как color_red, color_blue и прочее, все цвета (в SA:MP) имеют формат 0x16BC37AA, в данном случае такое выражение описывает оттенок зеленого цвета ну или как-то так, дизайнеры могут уточнить, ведь каждый цвет имеет очень много оттенков и описать все их словами было бы проблематично, да и кто бы это смог запомнить, поэтому цвета имеют такой формат. Чтобы не писать, например, в SendClientMessage(playerid, 0x16BC37AA, “Привет”) , мы заменяем 0x16BC37AA на простое и понятное для нас COLOR_GREEN, если Вы пишете большой мод, то наверняка у Вас там будет много дефайнов как для цветов, так и для чего-то иного, поэтому определения очень важны, чтобы самому не затеряться в коде.

new boxertimer;

new pickupkase;

new ringused;

Обозначим, что у нас будут некие переменные для всего скрипта, переменные бывают локальные, внутри цикла, например, и вот как здесь – для всего скрипта, мы ставим их вначале скрипта и они одни для всего сервера boxertimer – таймер, по которому вызывается ведения боя боксера;

Pickupkase – используем для обозначения пикапа, чтобы его потом удалить, а то баги будут, если вкратце, ringused используем для обозначения есть ли кто на ринге сейчас или нет.

enum npcInfo {

        npc_Name[MAX_PLAYER_NAME],

        npc_Skin,

        npc_FightStyle,

        npc_Interior,

        Float:npc_X,

        Float:npc_Y,

        Float:npc_Z,

        Float:npc_A,

        npc_ID,

}

new npc[][npcInfo] = {

        {"Master_of_Boxing", 81, FIGHT_STYLE_BOXING, 5, 758.4869,-1.7879,1001.5942,313.0229}

};

Продолжение: Разбор скрипта "NPC боксёр в SAMP" (Часть 2)

 

Руководства по NPC | Просмотров: 1156 | Дата: 02.11.2014

<< Учимся создавать свой первый NPC

Итак мы пишем /killnpc, наш NPC умирает, выполняется паблик OnDeath,  данный паблик у нас работает для всех NPC вообще, так как мы не указали для кого именно выполнять таймер, то для всех NPC это будет работать, но можно сделать и для одного NPC конкретно, так как данный NPC у нас единственный допишем в паблик OnDeath:

public FCNPC_OnDeath(npcid)

{

    for (new npcids = 0; npcids < 1; npcids++) {

         SetTimerEx("NPC_Death",5000,0,"dd",npcid);}

}

Теперь только для нашего NPC будет осуществлен переход в паблик NPC_Death, где собственное и выполнится функция по респавну (оживлению NPC), NPC респавнится там, где вы его убили, а не там, где он был изначально. Для чего мы задали выполнять перерождение лишь для NPC под номером 0 нашего цикла? Потому что другие NPC могут иметь и другой таймер, вдруг вам захочется сделать какого-нибудь NPC-босса с таймером в полчаса, а может вы и вовсе захотите, чтобы вашего NPC нельзя было убить. Если это так, допишем паблик:

public FCNPC_OnTakeDamage()

{

    for (new npcids = 0; npcids < 1; npcids++) {

    FCNPC_SetHealth(npc[npcids][npc_ID],100);

    }

}

Теперь при нанесении урона по NPC он будет лечиться на 100 хп, обычно сверхдамаг не проходит и этого вполне достаточно, впрочем, это лишь пример, можно вообще игнорить дамаг, но NPC все ещё можно убить с ножа сзади, перерезав горло, чтобы этого не было, проверяйте кнопки игрока, если игрок рядом с NPC, то чтобы ПКМ и ЛКМ не работали, ну это для каких-то особых NPC, которых Вы не хотели бы убивать.

На этом я заканчиваю первую часть руководства по NPC, если данная книга, станет нужной определенному кругу лиц и они потребуют продолжение, я с радостью продолжу её, углубляясь всё дальше и дальше, и рассматривая новые методы, алгоритмы и подходы. Во второй части, если такая будет, мы напишем такой вот скрипт: помните же бокс в Лос Сантосе? У нас будет стоять там пикап, при подборе пикапа нас перемещает на ринг к битве с боксером, который будет не тупо жать ЛКМ, но ещё исполнять какие-то более сложные вещи; при победе над боксером вы получите его стиль. Может ещё какие-то скрипты, я их так много сделал, если найдутся единомышленники, мы вместе обсудим их и способы их оптимизации,  а так же рассмотрим способы контроля NPC, методы передвижений и прочие интересности.

 

Руководства по NPC | Просмотров: 1430 | Дата: 08.10.2014

<< Учим NPC в SAMP ездить на машине

Создание NPC

В данном разделе мы создадим простейшего NPC и будем его усложнять.

#include <a_samp>

#include <fcnpc>   // подгружаем наши include, находящиеся в D:\server\ pawno\include

enum npcInfo {     // создаем enum для создания таблицы с данными

        npc_Name[MAX_PLAYER_NAME],

        npc_Skin,

        npc_FightStyle,

        Float:npc_X,

        Float:npc_Y,

        Float:npc_Z,

        Float:npc_A,

        npc_ID,    

}

new npc[][npcInfo] = {

{"Test_NPC", 255, FIGHT_STYLE_BOXING, 368.2780,1864.0972,7.6719,185.1584}

};

// согласно enum’у выше создаем нашего NPC с именем Test_NPC, скином 255, стилем боя боксом, координатами x,y,z и углом поворота.

public OnFilterScriptInit() // что произойдет при загрузке скрипта

{        SetTimer("spawnNPC", 3500, 0);  // таймер необязателен, но пусть прогрузится.

        return 1;

}

public OnFilterScriptExit() //что произойдет при отключении скрипта

{

        for (new npcids = 0; npcids < sizeof(npc); npcids++) {

        FCNPC_Destroy(npc[npcids][npc_ID]);} // удаляем всех созданных NPC в скрипте

        return 1;}

}

forward spawnNPC(); // паблик, где создается наш NPC

public spawnNPC()

{

            for (new npcids = 0; npcids < sizeof(npc); npcids++) {  //для всех npc в enum’е

            npc[npcids][npc_ID] = FCNPC_Create(npc[npcids][npc_Name]); //делаем ID, а не имя

            FCNPC_Spawn(npc[npcids][npc_ID], npc[npcids][npc_Skin], npc[npcids][npc_X], npc[npcids][npc_Y], npc[npcids][npc_Z]); //спавним NPC

            FCNPC_SetAngle(npc[npcids][npc_ID], npc[npcids][npc_A]); // задаем угол

            FCNPC_StopAttack(npc[npcids][npc_ID]); //при спавне NPC тупит, остановим

            }

}

Вот пример простейшего скрипта, у нас создается NPC с 255 скином по таким-то координатам и угол поворота такой-то.

Усложним скрипт, ведь если мы убьем нашего NPC он же не возродиться, поможем ему обрести жизнь, для этого рекомендуется перейти на версию плагина 0.3x для Windows, ибо тут мы NPC не убьем, хотя на некоторых серверах убиваются, и у меня убивались, но кто знает, что за сервер у Вас, но если все же вам влом что-то менять, то убьём NPC скриптово, чисто для теста функции, добавим в скрипт:

forward NPC_Death(npcid);

public NPC_Death(npcid)

{

    FCNPC_Respawn(npcid);

}

public FCNPC_OnDeath(npcid)

{

            SetTimerEx("NPC_Death",5000,0,"dd",npcid);

}

public OnPlayerCommandText(playerid, cmdtext[])

{

    if(!strcmp(cmdtext, "/killnpc", true))

    {

        for (new npcids = 0; npcids < 1; npcids++) {

        FCNPC_Kill(npc[npcids][npc_ID]);

        }

        return 1;

    }

    return 0;

}

Самое интересное дальше: Оживляем NPC после смерти в SAMP >>

 

Руководства по NPC | Просмотров: 917 | Дата: 08.10.2014

<< Координаты скорости NPC в GTA SAMP

FCNPC_StopAttack(npcid) – останавливает безумие, описанное выше)

FCNPC_IsAiming(npcid) – выполняется, если NPC целиться.

FCNPC_IsShooting(npcid) – выполняется, если NPC стреляет.

FCNPC_IsReloading(npcid) – выполняется, если NPC перезаряжается, ну как выполняется, там значение-то 0 или 1, типа да или нет.

FCNPC_EnterVehicle(npcid, vehicleid, seatid, type) – ммм, начинается веселье. Сажает NPC в машинку или прочее ТС, где vehicleid пишем id машинки, затем место, на которое NPC сядет от 0, 0 – водительское место и тип, не знаю зачем он тут, ну я писал DRIVE, о типах выше. Итак, что же делает данная функция? Если машинка заспавнена правильно (колеса по z не проседают), то NPC бежит к машине и садиться в неё, да-да вы не ослышались САДИТСЯ, прямо как настоящий человек)

FCNPC_ExitVehicle(npcid) – как настоящий человек выходит изТС.

FCNPC_PutInVehicle(npcid, vehicleid, seatid)  - ТС далеко или ещё что-то, сажаем NPC, в отличие от функции выше, здесь не будет никакой красивой посадке тупо ТП в машину туда-то и да, вы не сможете использовать ExitVehicle, если посадили через PutInVehicle, для этого существует функция FCNPC_RemoveFromVehicle(npcid)  (хотя может и сможете, я хз, лично я не смог:D) .

FCNPC_GetVehicleID(npcid) – получаем id машины NPC, не пробовал, но скорее всего можно как и GetPlayerVehicleID.

FCNPC_GetVehicleSeat(npcid) – получаем сидение для NPC.

FCNPC_StartRecordingPlayback(npcid, file[]) – стартуем запись для NPC. Записи рекомендую использовать при езде NPC на машине, некоторые участки не запрограммируешь, это архисложно, так что если наш NPC куда-то едет, то лучше использовать запись, но опять же, смотря что вам надо если местность относительно ровная и плавная, можно замутить и через goto перемещения.

FCNPC_StopRecordingPlayback(npcid) – прерывает действие записи.

FCNPC_PauseRecordingPlayback(npcid) – приостанавливает действие записи. Зачем это нужно, спросите Вы? Отвечаю: создали мы бота автобусника, перед нами впереди человек или машина, нам что давить его что ли ну или машину таранить? Нет! Мы просто приостановим запись, от имени NPC что-то напишем хулиганам, перекрывающим путь, ну и дальше как ваша фантазия пойдет, можно сделать, чтобы хоть NPC с битой выходил и разбирался, а если машина впереди без человека можно и тарануть это всё очень на любителя, плагин позволит всё это выполнить.

FCNPC_ResumeRecordingPlayback(npcid) – продолжаем воспроизведения записи. Устранили препятствие впереди нас – едем дальше).

Фух, описал-таки эти функции, про ноды писать не буду – не уникально и крашит ИМХО, так же как и FCNPC_GetZGround(Float:x, Float:y, &Float:z) – тоже ненужная вещь, связанная с неидеальностью zmap.

Подведем итоги: плагин имеет относительно большой функционал, функции работают, версия на линуксе уже имеется, но NPC там не убиваемые и сами не могут убить ( текущая версия SA:MP 0.3z R1-2), лучшая версия для тренировки с NPC на плагине на данный момент это 0.3x последнее обновление плагина для этой версии, там вообще нет линукс версии, но зато в Windows версии NPC стреляют и нормально так, хотя как запрограммируете, но в то же время, есть небольшой минус в 0.3x в виде ников у NPC над головой, который местами багают, в 0.3 z в связи с вводом официальных повреждений для NPC Вы не увидите ников NPC, а так же их нахождении в табличке на TAB. Так вот, плагин в целом рабочий, осуществим можно очень и очень многое, стоит как минимум потренироваться.

Продолжение: Учимся создавать свой первый NPC >>

Руководства по NPC | Просмотров: 1279 | Дата: 08.10.2014

<< Продолжаем работать с NPC в GTA SAMP

Идем дальше! Координата скорости нужна только тогда, когда NPC находится в транспортном средстве, последний же пункт UseZMap, спрашивает нас хотим ли мы, чтобы NPC бежал сам или используя Zmap. Пара слов о Zmap – это такая карта высот, то есть, чтобы NPC не бегал через стены в здании zmap портнет его на крышу, моё мнение о zmap – не использовать никогда и не при каких обстоятельствах. Объясняю: zmap архи-неточен, не динамичен (создали вы объект свой, а zmap это не учитывает и машины он вам пропустит, и чего он только не сделает, чтобы огорчить вас, но добивающим комбо является отнятие 70 Мегабайт оперативки сверху, при использовании плагина map andreas). В общем, вещь недоделанная, была бы она детально проработана, было бы по-настоящему круто, мы могли бы делать круто умных NPC в плане нахождения и поиска пути, а на том этапе, что есть сейчас он нам не нужен, конечно если Вы поставите единичку сервер не отнимет у вас 70 МБ оперативки (наверное) , если и отнимет, то на время движения NPC, просто договоримся, что у нас всегда будет стоять нулик, а не единичка в этом месте.

FCNPC_Stop(npcid) – остановить NPC. Работает остановка при движении NPC, при выполнении анимации и может чем-то ещё, так сразу и не вспомнишь)

FCNPC_IsMoving(npcid) – ну здесь уже вещь по нужнее чем IsSpawn или IsDead, работает, когда NPC движется.

FCNPC_AimAt(npcid, Float:X, Float:Y, Float:Z, shoot) – заставляет NPC целиться/стрелять, если вместо shoot мы ставик нулик, то NPC целиться, если единичку, то стреляет, напоминаю, NPC без патронов не будет в Вас стрелять, ибо воздух в SA:MP не наносит урона.

FCNPC_StopAim(npcid) – останавливает прицеливание, если NPC целиться он не может двигаться и прочее, для этого и останавливаем ему прицеливание.

FCNPC_MeleeAttack(npcid, delay) – заставляет NPC жать ЛКМ так часто, как скажите, вместо delay пишем время в миллисекундах, оптимально, как я считаю, это 250. Функция нафиг ненужная ИМХО, на первый взгляд для кого-то и жизненно важная, но только для тех, кто не видит возможностей SetKey для NPC. Собственно, здесь мы и возвращаемся к боксеру, тупо жмущему ЛКМ, или же с помощью задания алгоритма по правильному использованию передвижений и кнопок, делаем нормального блочащего боксера и атакующего не только ЛКМ, но и разными комбо, ну не только боксер, можно и кунг фу, суть Вы уловили, я надеюсь.

Читайте продолжение: Учим NPC в SAMP ездить на машине >>

 

Руководства по NPC | Просмотров: 888 | Дата: 08.10.2014

<< Руководство по работе с NPC в GTA SAMP

FCNPC_GetPosition(npcid, &Float:X, &Float:Y, &Float:Z) – получаем позицию NPC, например пишем new Float:X, Float:Y, Float:Z; и в эти координаты уже пишем: FCNPC_GetPosition(npcid,X,Y,Z);

Используется функция довольно-таки часто, смотря какой скрипт.

FCNPC_SetAngle(npcid, Float:Angle) – задать угол для NPC, аналогично примеру выше, только создаем new Float:angle, далее догадаетесь.

Float:FCNPC_GetAngle(npcid) – получаем угол NPC. Уникальность в том, что вам не надо создавать отдельную переменную под получение угла NPC.

FCNPC_SetQuaternion(npcid, Float:X, Float:Y, Float:Z, Float:A) – простым смертным не понять:D Если честно я не использую эту функцию, но она чаще вредит, чем помогает, кватернион это поворот NPC в пространстве, можете почитать об этом в гугле, то есть мы можем заспавнить NPC, который не прямо стоит на месте, а скажем на 45 градусов под наклоном, когда плагин багает (NPC, кстати, очень придираются к вашему коду, можно сказать исправляя некоторые ошибки, хотя pawn всё пропускает и сервер тоже:D) то они могут заспавниться даже вверх ногами.

FCNPC_GetQuaternion(npcid, &Float:X, &Float:Y, &Float:Z, &Float:A) – получаем кватернион.

FCNPC_SetVelocity(npcid, Float:X, Float:Y, Float:Z) -  задать скорость NPC, имеет смысл чаще всего, если NPC находится в транспортном средстве.

FCNPC_GetVelocity(npcid, &Float:X, &Float:Y, &Float:Z) – получить скорость, честно говоря, я не использую эти функции, как-то без них обходился.

FCNPC_SetInterior(npcid, interiorid) – задать интерьер для NPC, скажем хотите в Калигуле заспавнить, зная id мира Калигулы можно и NPC туда переместить, конечно, через FCNPC_SetPosition, либо спавнить там уже, не знаю работает ли это, очередная бесполезная функция, ибо всё работает и с SetPlayerVirtualWorld.

FCNPC_GetInterior(npcid) – получаем id интерьера.

FCNPC_SetHealth(npcid, Float:health) – задаем жизни для NPC.

FCNPC_GetHealth(npcid) – получаем жизни. Обычно используется:

if(FCNPC_GetHealth(npcid)==0){};

FCNPC_SetArmour(npcid, Float:armour) –задаем броню для NPC.

FCNPC_GetArmour(npcid) – получаем броню NPC.

FCNPC_SetSkin(npcid, skinid) – задаем скин, актуально если NPC уже заспавнен.

FCNPC_GetSkin(npcid) – получаем скин NPC.

FCNPC_SetWeapon(npcid, weaponid) – выдаем NPC оружие. Огнестрельное оружие не работает без патронов, но об этом дальше.

FCNPC_GetWeapon(npcid) – получаем оружие NPC.

FCNPC_SetAmmo(npcid, ammo) – очень важная функция, если у NPC нет патронов он будет лишь целиться, функция нацеливания/стрельбы далее, выдавайте NPC патроны.

FCNPC_GetAmmo(npcid) – получаем патроны для NPC.

FCNPC_SetKeys(npcid, Keys) – задаем нажатие клавиш для NPC. Очень важная вещь для некоторых моментов. Например, хотите Вы создать NPC-боксера, хотите, чтобы он защищался, а не был просто мешком для битья, так скажите ему об этом, конечно же, на языке pawn.

FCNPC_GetKeys(npcid, &UDAnalog, &LRAnalog, &Keys) – получаем клавиши для NPC.

FCNPC_SetSpecialAction(npcid, actionid) – тут у нас не прокатит, как с виртуальными мирами, но зато анимации работают как виртуальные миры и для них нет отдельных функций в плагине, а вот для специальных действий функция имеется.

FCNPC_GetSpecialAction(npcid) – получаем особое действие NPC.

FCNPC_GoTo(npcid, Float:X, Float:Y, Float:Z, type, Float:speed, UseZMap)  - уже интереснее. Заставляем NPC двигаться к координатам, обращаю внимание, что type – это способ передвижения NPC, способы написаны ниже:

MOVE_TYPE_WALK - NPC идет пешком;    

MOVE_TYPE_RUN - NPC перемещается легким бегом;       

MOVE_TYPE_SPRINT - NPC перемещается быстрым бегом;

MOVE_TYPE_DRIVE - NPC перемещается на машине.

Читаем продолжение статьи: Координаты скорости NPC в GTA SAMP >>

Руководства по NPC | Просмотров: 1102 | Дата: 08.10.2014

РУКОВОДСТВО ПО ИСПОЛЬЗОВАНИЮ NPC в SAMP

ЧАСТЬ 1

Большинство серверов в наше время не использует NPC, в каком бы то ни было виде. Причин на это несколько:

  1. Серверы, использующие NPC, не могут быть 1000 слотными, точнее NPC там не работают;
  2. NPC занимают дополнительные слоты, а так же “отнимают” память сервера;
  3. “С людьми же интереснее играть”;
  4. Для создания “хороших” NPC нужно владеть минимальными знаниями об искусственном интеллекте.

Поверьте, все эти недостатки ничто по сравнению с возможностями, которые вы можете открыть. Хотели бы Вы иметь на своём сервере NPC-патрульных, NPC-поваров или официантов, таксистов, NPC-девушку, да что угодно – единственное ограничение – ваше воображение, и ... возможности SAMP.

Если всё это вдохновило вас на создание NPC (хоть как-то), то смело читайте дальше.

Основные функции

В этом разделе мы рассмотрим основные функции плагина FCNPC, с помощью которого и будем создавать NPC.  Рассмотрим основные функции и паблики, а так же сделаем выводы, плюс пара слов о личном опыте использования, итак, поехали!

FCNPC_SetUpdateRate(rate) – обновление какого-либо/каких-либо NPC, мы не будем использовать эту функцию, вместо неё используем таймеры, некоторые вещи будет нереально осуществить, используя эту функцию.

FCNPC_Create(name[]) – создание NPC. При создании NPC уникальным его идентификатор является имя, которое мы зададим, но об этом позже.

FCNPC_Destroy(npcid) – удаляет NPC. Думаю здесь всё понятно, данная функция должна обязательно в  “ public OnFilterScriptExit()”.

FCNPC_Spawn(npcid, skinid, Float:X, Float:Y, Float:Z) – указываем место появления NPC в следующем формате: к какому NPC обращаемся, какой у него будет скин, координаты x,y,z.

FCNPC_Respawn(npcid) – перерождает NPC. Работает, когда вы убили NPC ( не удалять же его с сервера, поэтому используем данную функцию, но об этом позже).

FCNPC_IsSpawned(npcid) – выполняется если NPC заспавнен, лично я не использую подобные функции, они бесполезны ИМХО, а в большинстве случаев и не работают, плагин-то ещё 0.1 версия.

FCNPC_Kill(npcid) – убить NPC. Если NPC получают урон, то зачем нам эта функция спросите Вы? Отвечаю: функция полезнейшая, например, вы стреляете по NPC, сидящему на мотоцикле, что же происходит: его хп снижается до 0, но он так и продолжает сидеть ( не порядок), делаем проверку и выполняем эту функцию: теперь, когда у нашего NPC на мотоцикле 0 хп он умрет.

FCNPC_IsDead(npcid) – очередная ненужная функция выполняется, когда NPC умер.

FCNPC_SetPosition(npcid, Float:X, Float:Y, Float:Z) – задает позицию NPC, думаю сами уже догадались по какому принципу. Выполняется непосредственно, когда NPC уже заспавнен.

Читаем продолжение статьи:  Продолжаем работать с NPC в GTA SAMP >>

Руководства по NPC | Просмотров: 1060 | Дата: 08.10.2014

Здравствуйте пользователи портала samp-rus.com. Предлагаю вашему вниманию урок по созданию системы регистрации, используя Y_INI. Надеюсь, что эта статья кому-нибудь пригодится.

Для начала давайте скачаем необходимые инклюды. Скачать

Перед нами 5 папки: pawno, внутри нее папка include, внутри нее папка YSI; PHP; scriptfiles, внутри нее папка YSI.

Теперь разместим файлы в папках своего сервера. Из архива берем папку YSI (которая лежит в pawno/include) и помещаем ее в свою папку pawno/includes. Дальше из архива в папке scriptfiles берем папку YSI (уже другую!) и помещаем ее в папку scriptfiles вашего сервера. И папку PHP помещаем в главную директорию вашего сервера. Все, с файлами мы закончили. 

Теперь открываем ваш мод и наверх ко всем инклюдам добавляем строку

#include <YSI\y_ini>

Приступим к основной части. Во-первых добавляем ко всем #define вот эти строки:

#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2


Вот эту строчку: 

#define PATH "/Users/%s.ini"

И цвета, которые нам еще понадобятся: 

#define COL_WHITE "{FFFFFF}" 
#define COL_RED "{F81414}"
#define COL_GREEN "{00FF22}"
#define COL_LIGHTBLUE "{00CED1}"


Далее нам необходимо создать некий "хранитель" информации:

После всех new (если они у вас есть) добавляем вот это:

enum pInfo 
{
pPass,
pCash,
pAdmin,
pKills,
pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];


Теперь нам необходимо создать stock, чтобы наша информация сохранялась (деньги, пароль, уровень админки, кол-во убийств и смертей)

forward LoadUser_data(playerid,name[],value[]); 
public LoadUser_data(playerid,name[],value[])
{
INI_Int("Password",PlayerInfo[playerid][pPass]);
INI_Int("Cash",PlayerInfo[playerid][pCash]);
INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
INI_Int("Kills",PlayerInfo[playerid][pKills]);
INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
return 1;
}


Дальше создаем вот этот stock 

stock UserPath(playerid) 
{
new string[128],playername[MAX_PLAYER_NAME];
GetPlayerName(playerid,playername,sizeof(playername));
format(string,sizeof(string),PATH,playername);
return string;
}


И вот этот:

stock udb_hash(buf[]) { 
new length=strlen(buf);
new s1 = 1;
new s2 = 0;
new n;
for (n=0; n<length; n++)
{
s1 = (s1 + buf[n]) % 65521;
s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
 }


Теперь мы должны сделать так, чтобы при подключении игрока на сервер ему на экран выводилось диалоговое окно.

В паблик

public OnPlayerConnect(playerid)
{
return 1;
}


Перед return 1; добавить вот это

if(fexist(UserPath(playerid)))
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Вход на сервер",""COL_WHITE"Пожалуйста, введите Ваш пароль","Ввод","Выход");
}
else
{
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT,""COL_WHITE"Регистрация на сервере",""COL_WHITE"Пожалуйста, введите Ваш пароль, чтобы зарегистрировать аккаунт","Регистрация","Выход");
}

Чтобы наши диалоговые окна работали, мы должны в паблик 

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) 
{
return 1;
}


Перед return 1; добавить вот это: 

switch( dialogid ) 
{
case DIALOG_REGISTER:
{
if (!response) return Kick(playerid);
if(response)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_WHITE"Регистрация",""COL_RED"Вы ввели некорректный пароль.\n"COL_WHITE"Пожалуйста, введите Ваш пароль, чтобы зарегистрироваться.","Регистрация","Выход");
new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Password",udb_hash(inputtext));
INI_WriteInt(File,"Cash",0);
INI_WriteInt(File,"Admin",0);
INI_WriteInt(File,"Kills",0);
INI_WriteInt(File,"Deaths",0);
INI_Close(File);

SetSpawnInfo(playerid, 0, 0, 1958.33, 1343.12, 15.36, 269.15, 0, 0, 0, 0, 0, 0);
SpawnPlayer(playerid);
}
}

case DIALOG_LOGIN:
{
if ( !response ) return Kick ( playerid );
if( response )
{
if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);
}
else
{
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,""COL_WHITE"Вход на сервер",""COL_RED"Вы ввели некорректный пароль.\n"COL_WHITE"Пожалуйста, введите Ваш пароль","Вход","Выход");
}
return 1;
}
}
}


Теперь мы должны сделать так, чтобы при выходе наша статистика сохранялась: 

в паблик

public OnPlayerDisconnect(playerid, reason)
{
return 1;
}


new INI:File = INI_Open(UserPath(playerid)); 
INI_SetTag(File,"data");
INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
INI_Close(File);


Выходим на финишную прямую. Нам нужно добавить в паблик: 

public OnPlayerDeath(playerid, killerid, reason) 
{
return 1;
}


Перед  return 1; вот это

PlayerInfo[killerid][pKills]++; 
 PlayerInfo[playerid][pDeaths]++;

от и все, теперь при входе на сервер вы сможете зарегистрировать аккаунт, сохранять статистику и заходить на свой аккаунт снова.

Обсуждение туториала


Информация по соданию скриптов SAMP | Просмотров: 9143 | Дата: 11.02.2013

Недавно SAMP обновился до версии 0.3z, многие новички задались вопросом, как перевести мод, что работает на версии 0.3x, на новую версию 0.3z. Для этого нам всего-то понадобится сам сервер новой версии и pawno в папке обновлённого сервера.

1. Заходим в наше любимое pawno (в папке сервера 0.3z) и компилируем мод заново.

2. Мод может запрашивать инклуды (библиотеки pawn), если такое случится, заходим в раздел и ищем недостающий инклуд. Его в дальнейшем нужно будет скопировать в папку pawno\include.

3. Готово! Если останутся вопросы, заходим на форум сайта и спрашиваем.

Оптимизация модов и скриптов | Просмотров: 4598 | Дата: 11.02.2013

Q: Как установить мод, который я скачал с вашего сайта.
A: Для начала его нужно распаковать из архива, далее ищем в распакованной папке файл расширения amx, например (Penls.amx). Если такого нет, а есть pwn, например penls.pwn, то вам нужно прочитать вот это: "Как компилировать из .pwn в .amx". После того, как нашли файл amx, копируем его, идём в папку со своим сервером, в папке с сервером находим папку gamemodes, открываем её, вставляем файл. После этого, если Вы решили, что мод удостоен вашего внимания, открываем файл Server.cfg, который находится в папке вашего сервера (открываем перетащив файл в блокнот) и находим строку "gamemode0 nazvanie_moda"
Это означает что мод который прописан в этой строке, например у меня gamemode0 penls, будет запускаться при включении сервера. Если хотите чтобы на сервере автоматически сменивались моды и активных было несколько, то дописываем в Server.cfg ещё пару строк:
gamemode0 penls
gamemode1 sftdm
gamemode2 area51

Теперь в моём "плэйлисте" модов на сервере, будет поочерёдно включаться 3 мода, на каждый из них по ~30 мин.
А теперь вернёмся к моду, что вы скачали у нас на сайте.

Q: Нашли amx или pwn файлы, скопировали их, но там есть ещё какие-то папки и файлы, что мне делать с ними?
A: Если есть что-то ещё, кроме файлов amx или pwn, значит не спроста и это не лишнее. Если файлы имеют расширение .inc, например у вас там float.inc, то это файл библиотеки, необходимые для правильной компиляции мода, берём и копируем все файлы которые там есть с таким разрешением, идём в директорию
samp\pawno\include и вставляем их в папку include.
Q: Я скопировал amx и pwn файлы куда надо, так же скопировал библиотеки в нужную директорию, но там ещё есть какие-то файлы и они находятся в папке scriptfiles, что с ними нужно делать?.
A: Копируете все эти файлы, находите в папке вашего сервера папку scriptfiles и вставляете туда все скопированные файлы.
Q: Я всё сделал, но когда запускаю сервер он сразу же закрывается, что случилось?
A: Скорее всего вы не установили rcon пароль, чтобы его установить, открываем Server.cfg (блокнотом) находим строку rcon_password change_me и заменяем слово change_me на свой пароль (любой)
Q: Наконец-то сервер запустился и мод загрузился, но я как обычный игрок, не могу ничего делать, что делает обычно админ. Как стать админом на своём SAMP сервере?
А: Очень просто, после того как вы установили свой rcon пароль в файле Server.cfg, Вам просто нужно в игре прописать /rcon login пароль ( /rcon login - так и пишем, а вот слово "пароль" заменяем своим установленным паролем) После того, как появится надпись You are logged in as admin, которая означает что всё сделано правильно, Вам нужно сделать себя админом в моде. Конкретной команды нет, у каждого мода свои команды установки админа, но чаще всего это /makeadmin ID 1337, где ID - это ваш айди номер, чтобы узнать свой айди номер нужно нажать tab и посмотреть какая цифра стоит рядом с Вашим ником - это и есть ваш айди. А вот 1337 - это уровень админа, он может быть так же 1, 2, 3 и т.д. в зависимости от мода, так что если не работает при вводе /makeadmin ID 1337, попробуйте ввести /makeadmin ID 1.
Второй вариант это /setadmin ID 1 - ну тут как и выше, команда, айди, уровень админа. Можно например себя назначить главным админом, уровня 1337 или первого, а можно ещё взять себе в помощники кого-то, прописать /makeadmin ID 3или2, и ваш помощник будет админом, но с ограниченными возможностями. Чтобы узнать доступные в моде уровни админа, пишем в чате /help или /adminhelp (/ahelp).
FAQ по установке и настройке | Просмотров: 1917 | Дата: 20.01.2013

Чтобы скомпилировать из pwn в amx вам нужен встроенный компилятор Pawno, который находится в папке с вашим сервером. Запускаем pawn.exe, жмём открыть. Находим свой pwn файл, который хотим скомпилировать и жмём открыть. Код перед вами. Много чего не понятного, если Вы со мной согласны, то лучше пока что ничего в этом коде не трогать, чтобы не напортачить. Далее жмём на синенькую стрелочку либо F5. Это нужно, чтобы дать команду программе: "Скомпилировать" Если вы видите в появившемся окошке либо такое:
Pawn compiler 3.2.3664     Copyright (c) 1997-2006, ITB CompuPhase

Либо такое:

Pawn compiler 3.2.3664     Copyright (c) 1997-2006, ITB CompuPhase
Header size:           5768 bytes
Code size:           720992 bytes
Data size:           870824 bytes
Stack/heap size:      16384 bytes; estimated max. usage=4737 cells (18948 bytes)
Total requirements: 1613968 bytes


Либо такое:
C:\DOCUME~1\AXE\0016~1\cng.pwn(119) : warning 217: loose indentation
Pawn compiler 3.2.3664     Copyright (c) 1997-2006, ITB CompuPhase
1 Warning.


Значит мод скомпилировался правильно и амх файл появился в директории где и находился pwn.
Если увидете надпись в конце Warning * то ничего страшного, это всего лишь предупреждение.
А вот если в конце будут Error: * то это уже ошибка в коде и ваш файл не скомпилировался. Если в коде есть ошибка, то надпись будет выглядеть так:

C:\DOCUME~1\AXE\0016~1\penls.pwn(20178) : error 029: invalid expression, assumed zero
Compilation aborted.Pawn compiler 3.2.3664     Copyright (c) 1997-2006, ITB CompuPhase
26 Errors.


То это уже чтото не так в строение кода, возможно гдето чтото не доработано и не исправлено.

Если ошибка выглядит так:
C:\Documents and Settings\AXE\Ðàáî÷èé ñòîë\penls.pwn(1) : fatal error 100: cannot read from file: "a_samp"
Compilation aborted.Pawn compiler 3.2.3664     Copyright (c) 1997-2006, ITB CompuPhase
1 Error.


  То у вас нет необходимых include для компиляции, это можно исправить скачав их с нашего сайта "Скачать инклуды SAMP" и скопировав в папку компилятора include.
  Удачных вам компиляций.
Статьи о компиляции PAWN | Просмотров: 2926 | Дата: 20.01.2013

null

Команда SAMP The Godfather


/rules
- Показывает список правил.
/login [password]
- чтобы входить в систему когда подключаешся к серверу.
/saveme
- Сохраняет прогресс
/stats
- Обеспечивает информацию как например, ваш уровень, работа, уважение и др!
/buylevel
- Эта команда позволит, чтобы Вы приобрели новый уровень. Вы должны иметь полное уважение (т.е.. 8/8; 10/10; 12/12; и т.п..).
/upgrade [UpgradeName]
- После того, как Вы приобретете новый уровень, вам будут даны 2 улучшения.


Общие команды

/pay [id] [сумма]- Используя ID игрока, Вы будете способны послать им денег. Если Вы - уровень 1 или 2, Вы только будете способными послать 1,000$ за один раз. Если Вы - уровень 3 или выше, Вы только будете способными послать $99,999 за один раз.
/charity [cash]- Если вам даны "cheat money" Вам нужно использовать эту команду, чтобы отделываться от этих денег. Если Вы пойманы принимая деньги из обманщика, Вы будете Забанены.
/time - Отображает времени сервера.
/buy [пункт тавара] - Используйте эту команду можно использовать в 24-7 (расположенные вокруг Los Santos и некоторых в Las Venturas), чтобы приобретать пункт..
/rentcar - Используйте эту команду когда Вы хотите арендовать автомобиль.
/unrentcar - Это остановит Вашу из аренду автомобиля которы вы прежде арендовали. Это не дает Вам ваши наличные.
/givekey [id] - Дает этому игроку ключи вашего автомобиля (если у вас есть ключи для одного)
/switchkey [id] - Дает этому игроку ваши автомобильные ключи и Вы получаете их. Это использован когда Вы торгуете автомобилями. Вы должны оба имеют ключи для этой команды, чтобы работать.
/id [PlayerName] - Дает Вам ID игрока. Нажимая ТАБ. и PageUp + PageDown даст Вам список всех игроков на сервере.
/drink [DrinkName]- Используйте эту команду когда в баре, чтобы приобретать напиток.
/music [Number]- Будет играть ваш CD Player. *Примечание, которое Вы должны приобрести в 24-7, до использования этой команды.
/showlicenses [ID]- Показывает какие лицензии Вы имеете.
/clothes- Изменение Скина и для гражданских.
/resetupgrades - Использование этой команды позволит, чтобы Вы сняли ваши модернизации. (/UPGRADES) Тем не менее, чтобы использовать эту команду, это будет стоить Вам 100,000$.
/buygun [имя оружия] [патроны]- Используйте эту команду когда в магазине оружия, чтобы приобретать оружие. И происто /buygun, чтобы рассматривать имена оружия и цены.
/lock - Эта команда запрет и деблокирует ваш автомобиль, если Вы обладаете им (автомобиль у дома), арендовал это или приобрел ключ/замок для этого. Если Вы используете эту команду когда около вашего дома, это если закрыта/открыта дверь дома.
/skill [№ работы] - Это покажет Вам какой ваш профессиональный уровень - для каждой профессии. Как ваше профессиональное увеличение, Вы получите bonuses. т.е.. Если Вы - профессионал 5-го уровня Детектива, время перезагрузки, чтобы находить что кто-нибудь полностью упразднен.
/portable - Эта команда только пригодная для Hitmen.
/licenses - Используйте эту команду, чтобы рассматривать какие лицензии, Вы к настоящему времени имеете.
/lotto [номер] - Приобретите билет лото. Призовое пул может колебаться от десятков тысяч до сотен тысяч.
/spawnchange - Переключатель между вашими доступными возможностями (если Вы аренда/обладание домом и - в фракции)
/report [id] [name] [reason] - Сообщения к админу,о игроках нарушают правила. Так же, чтобы быть использованн если Вам нужно становиться в контакте с администрацией.
/cancel [ServiceName] - Отмените услугу, которую Вам предлагают. (/cancel Taxi, bus, drugs, и т.п..)
/accept [ServiceName] - Примите услугу, которую Вам предлагают. (/accept Drugs, и т.п..)
/eject [ID] - Выкидывает этого игрока из вашей машины. Вы должны быть водитель, чтобы использовать эту команду.
/usedrugs - Используйте любые лекарства, которые Вы к настоящему времени имеете. Чтобы видеть если у вас есть лекарства, наберите /stats. Использование лекарств даст Вам 'одурманенный наркотиком эффект.
/contract [ID] [Amount >$10,000] - Контракт с HITMANом на игрока.
/fill - Используйте эту команду на заправке. Это автоматически заполнит бак вашего автомобиля на 100%.
/get fuel - Используйте эту команду на станции заправки, чтобы дозаправлять ваш бак.
/fillcar - Используйте эту команду, чтобы дозаправлять ваш автомобиль.
/clear [id] - Только высоко упорядоченные члены семьи (который - часть организации), может использовать эту команду. Эта команда не может быть использована на себе.
/service [НАЗВАНИЕ СЕРВИСА] - Попросите услугу используя эту команду. Доступные имена - /service такси, автобус, скорая помощь, механик. Полный список - когда Вы набираете /service.
/families - Показывает список официальных семейств, которые существуют в сервере. Информация предусмотренная здесь - не 100% правильная и количество участников в пределах семейства или количество официального семейства может быть другим чем что показано.

Команды чата
/w [ID] [Text]- Шепните игроку.
/s [Text] - Этот тип разговора будет иметь значительно продвигать дипазон чем разговор нормально.
/c [Text] - Разговор с людьми только очень близко к вам. Имеет расстояние короткого радиуса чем разговор нормально.
/l [Text] - Поговорите локально с людьми. Этот тип разговора только достигнет людей сравнительно близких к Вам (~20m)
/b [Text] - Используйте эту команду если Вы хотите отговаривать От Символа [Not RolePlaying] в In Символе [RolePlaying] беседе. Также используйте эту команду если Вы хотите говорить другой язык кроме Английского в In Символе [RolePlaying] беседе. Использование /b если Вы хотите использовать Smilies (т.е.: , > , , и т.п.) или условия OOC (т.е.: Lol, wtf, omg, и т.п.) в In Символе [RolePlaying] беседе.
/ad [Text] - Используйте эту команду, чтобы устанавливать глобальную рекламу. Не рекламируйте глупые вещи (!) как например, "Мне нужно оружие, или прося незаконные пункты в беседе". Беседа рекламы требует, чтобы её оплатили когда Вы устанавливаете рекламу. Это автоматически будет оформлен ваших наличных с рук, когда Вы устанавливаете ad. (!)
/f [text] - Это - семейная беседа для членов семьи.
/me [action] - /me позволяет Вам, чтобы выражать ваши мысли или действия другим игрокам. Пример: /me ломает окно соседнего автомобиля с бейсболом bat. появится как: *Player_Name бьёт окна соседнего автомобиля с дубинкой для бейсбола.
/togooc - Используя эту команду Вы можете включить текст беседы в чате. Если Вы находите, что Вы не хотите участвовать или слушать любую беседу чата, Вы можете использовать эту команду, чтобы переключать беседу.
/tognews - Используйте эту команду, чтобы переключаться в любых объявлениях новостей.
/togfam - Используйте эту команду, чтобы переключаться в семейной беседе.
/togwhisper - Используйте эту команду, чтобы переключаться в вашем шепоте, предохраняясь или допуская другие, чтобы шептаться Вам.
/fuel - Используйте эту команду когда в машине, чтобы видеть сколько топливо оставалось в вашем бензобаке. - в процентах (%).


Банковские

/balance - Показывает Вам скольк наличных Вы имеете на вашем счете в банке.
/withdraw [сумма] - Забирает наличные с вашего счета в банке. Очевидно Вы должны иметь эти наличные, чтобы забираться из банка.
/deposit [cash] - Депозитные наличные с кормана (бумажник) до вашего счета в банке.
/bank [cash] - Используйте чтобы положить деньки с кармана (бумажник) в банка. *Выполняет то же действие как /deposit [cash]*
/wiretransfer [ID] [cash] - Наличные Передачи от вашего счета в банке до другого счета в банке игрока.


Помощь

/help - Показывает Вам список доступных команд
/cellphonehelp - Показывает Вам список доступных команд для телефона.
/househelp - Показывает Вам список доступных команд для вашего дома (если Вы обладаете домом).
/renthelp - Показывает Вам список доступных команд для аренды (если Вы арендуете дом).
/businesshelp - Показывает Вам список доступных команд для вашего бизнеса (если Вы обладаете бизнесом.)
/leaderhelp - Показывает Вам список доступных команд для лидеров (если Вы - лидер)
/fishhelp - Показывает Вам список доступных команд если для рыболовства.
/cookhelp - Показывает Вам список доступных команд для кухни.
/irchelp - Показывает Вам список доступных команд для использования IRC.


Телефонные Команды:

/call [номер] - Звонок другому игроку.
/call 911 - Звонок в полицию или скорую
/sms [номер] [текст] - SMS ДРУГому игроку.
/p - Взять телефон когда он звонит.
/h - Отключите телефон после того, как Вы завершите разговор
/number [id] - Найдите номер игрока смотря в телефонной книге. Вы должны приобрести 'Телефонную Книгу' в 24-7, до использования этой команды.
/togphone - Используя эту команду, никто не будет способным назвать ваш телефон, тем не менее они все еще будут способными послать SMS Вам.


P.S. не точный перевод

Оптимизация модов и скриптов | Просмотров: 3815 | Дата: 23.03.2011

nullИтак, залогинившись на сервере, выбираете персонажа из 12 доступных группировок, а это банды (Баллас, Грув, Азтекос, Байкеры, Триада, Рус. мафия и другие), гражданские или чел на службе закона (SAPD, SAMD), всего 275 скинов, а там думайте кто вы: послушный гражданин, плохой парень, S.W.A.T., FBI, а может местный шериф.
Вобщем, перед вами город Лос Сантос, 5000 зеленых в кармане (на пиво в SA хватит) покоряйте недвижимость. В сценарии вы можете покупать дома, машины и оружие; позднее, когда заведетесь бизнесом - это все продавать :D . У вас есть уйма команд, которые сделают вашу жизнь веселее (все они написаны внизу этой статьи ).
Конечно, $5000 маловато будет, поэтому вам предоставлены разнообразные миссии: Racing - гонки по улицам и загородом, Cashbox - грабануть банк или кассу, Deathmatch - и так понятно, набираете фраги для победы. А также в наличии: угнать тачку, арестовать, убить и т.д. Но это еще не все, существует много способов подзаработать, которые узнаете, собственно, в игре. Интервал между началами миссий 6 мин., столько же времени необходимо для побега от полиции (или вражеской банды), иначе догонят, арестуют, отберут прибыль, что ооочень обидно.
И самое главное это опыт и повышение уровня , RPG все-таки. Вначале у вас 1 лвл, для достижения следующего лвл, необходимо, выполняя миссии, набрать некоторое количество exp (1exp за миссию), и в сочетании с некоторым количеством денег пишете /buylevel, для просмотра этих Х-количеств, а также для просмотра своего статуса и скилла пишете просто /level. Также от уровня зависит ваша ежедневная зарплата (на шару). Не забудьте и про апгрэйд как тачки и недвижимости, так и собственного персонажа. С каждым уровнем ты можешь выбрать 2 из 3 апгрэйда (введите /upgrade и смотрите что доступно):

кто только начал гамать - читать в обязательном порядке

ВАЖНО: СПИСОК ИСПОЛЬЗУЕМЫХ КОМАНД

Пишем без скобок!

1) на выбор новое оружие (теперь ты будешь появляться на сервере с этим оружием, но с малым кол-вом патронов)
/upgrade [название оружия];
2) увеличить кол-во патронов в уже имеющимся оружии /upgrade [назване патронов];
3) увеличить максимальное здоровье /upgrade [health].

/help - покажет в поле чата все основные команды.
Вот, кажись, и все как для основы игры на этом сценарии, но далеко не полностью.

Основные команды для RPG-мода:

- /regnick [password] (зарегистрировать профиль)
- /login [password] (загрузить ранее зарегистрированный профиль)
- /pay [ID/name] [Amount] (перевезти сумму денег на счёт другому (другой должен находится рядом))
- /level (проверить свои достижения (exp))
- /buylevel (за набранные exp купить новый уровень)
- /upgrade [upgradename] (если возможно, сделать апгрейт (здоровье, новое оружие, патроны))
- /resetupgrades (освободить все занятые слоты по апгрейту)
- /time (проверить текущее время)
- /kill (самоубийство)
- /job (проверить текущее задание)
- /rules (посмотреть основные правила игры)
- /vote (?) - подскажите функцию
- /betrace [ID] [amount] (сделать ставку на гонку)
- /betdm [ID] [amount] (сделать ставку на Дес Матч)
- /admins (проверить, кто из админов онлайн)
- /help (открыть список доступных комманд)
- /afk (сказать что типа отлучился от компа)
- /back (типа вернулся)
- /busy (сказать что занят)
- /iamtaxi (сообщить всем что ты таксист и готов кого-то подвести)
- /nt [location] (...а другой типа услышал и вызывает такси, сообщая своё местонахождение)
- /is [question] (типа задать вопрос)

Chat

- /w [Message] (прошептать сообщение только определённому игроку из тех кто сейчас рядом)
- /o [Message] (сделать "оранжевое" сообщение)
- /s [Message] (крикнуть)
- /l [Message] (сказать только тем, кто сейчас находится рядом)
- /ad [Message] (сделать объявление)
- /me [Message] (Looks like you are doing something)
- /togooc [Message] (OC Chat Channel, disabled)
- /pm [ID] [Message] (написать игроку сообщение, которое увидит только он)

House

- /buyhouse (купить дом)
- /sellhouse (продать дом)
- /rentroom (снять комнату в чужом доме)
- /enter (если открыто, войти в дом)
- /exit (выйти из дома)
- /lock (отпереть/запереть дом)
- /home (на карте появляется красный маркер, указывающий напрвление к дому)
- /homeupgrade [Item ID] (сделать апгрейт на дом)
- /hu [Item ID] (сделать апгрейт на дом)
- /setrent [Amount] (назначить стоимость аренды вашей комнаты)
- /setrentable [1/0] (вкл/выкл аренду)
- /evict [ID/name] (принудительно выселить определённого игрока, арендующего вашу комнату)
- /evictall (выселить всех гадов, орендующих вашу комнату)
- /housewithdraw [Amount] (забрать выручку с аренды)
- /heal (пополнить здоровье и броню, если сделаны специальные апгрейты)
- /tv on (если сделан специальный апгрейт - включить режим наблюдения за другими игроками (гонкой, ДМ))
- /tv off (выключить режим наблюдения)
- /unrent (если вы снимаете у кого-то комнату, то выселиться)

Cellphone

- /c [Number] (позвонить по специальному номеру (игроку). Пока трубка не сбросится, чат будет вестись только между двумя челами и видеть его будут только они)
- /call 911 (позвонить 911)
- /txt [Number] [Message] (отослать СМС на указанный номер)
- /p (снять трубку)
- /h (положить трубку)

SAPD (police)
- /d [Message] - передать сообщение по радио всех экстренных служб (police/medics)

- /r [Message] (передать сообщение по радио полиции)
- /m [Message] (использовать мегафон)
- /su [ID/Name] [Reason] (объявить игрока в розыск (арестовать))
- /mdc [ID/Name] (проверить состояние игрока)
- /free[ID/Name] [Reason] (освободить арестованного)
- /jail [ID/Name] (посадить игрока в тюрьму)
- /duty (превратиться в копа/гражданского + увеличить кол-во патронов в имеющимуся оружии (в любом доме))

SAMD

- /r [Message] (передать сообщение по радио скорой помощи)
- /heal [ID/Name] (вылечить игрока, находящегося внутри машины скорой помощи (вылечиному игроку даётся +150 ед. здоровья))

Bank / 24/7

- /balance (состояние вашего счёта)
- /bank (состояние вашего счёта)
- /bank [Amount] (положить сумму в рост)
- /withdraw [Amount] (снять деньги со своего счёта)
- /loan [Amount] (взять деньги в кредит)

Business

- /buybiz (купить бизнес)
- /bizupgrade (открыт меню апгрейта на бизнес)
- /bizinfo (посмотреть информацию о своём бизнессе)
- /bizwithdraw (забрать выручку с бизнеса)
- /sellbiz (продать бизнес)
- /bizfee [number] - установить цену на вход (/enter)
- /bizbank [number] - вложить в бизнес деньги.
- /lock - открыть или закрыть бизнес
- /compprice [amount] (назначить цену на компы)
- /pricemod [amount ( % )] (измененить цены на товары)

(с) samp-rus.com

Оптимизация модов и скриптов | Просмотров: 4097 | Дата: 23.03.2011

1-20 21-24