• Страница 1 из 1
  • 1
[Мануал] Система уровня розыска с сохранением
Дмитрий Дата: Среда, 26.09.2012, 22:20 | Сообщение # 1 | Сообщить о нерабочей теме


Аватар для Дмитрий

Здравствуйте, ребята. С Вами Ильназ(Immortal116), я пишу первый мануал, речь будет идти о системе уровня розыска с сохранением.
Для начала ко всем new вставляем это:
Code
new WantedLevel[MAX_PLAYERS];  


Дальше в enum pInfo вставляем:
Code
pWanted,  


Дальше нужно обеспечить показ звездочек. Для этого в public OnPlayerConnect вставляем:
Code
SetPlayerWantedLevel(playerid,WantedLevel[playerid]);  


А также в этот же паблик вставляем это:
Code
PlayerInfo[playerid][pWanted] = 0;  


Теперь нужно тоже самое вставить в public OnPlayerSpawn, вот:
Code
SetPlayerWantedLevel(playerid,WantedLevel[playerid]);  


Можно сделать, чтобы после спавна появлялось сообщение о том, сколько у него звезд, делается так:
Code
if(PlayerInfo[playerid][pWanted] != 0)// Если у игрока больше 0 звезд
     {
         new string[64]; // объявляем string в 64 символа.
         format(string, sizeof(string), "Ваш уровень розыска: %d.",PlayerInfo[playerid][pWanted]);// То ему(ей) выводится сообщение с информацией об уровне розыска.
         SendClientMessage(playerid, COLOR_YELLOW, string);// Сам показ сообщение, то есть кому будет показываться, каким цветом.
         SetPlayerWantedLevel(playerid, PlayerInfo[playerid][pWanted]);// Показ звезд наверху в текст драве как в сингле.
     }  


Ну, а теперь нужно сделать так, что если игрок убьет кого-нибудь, то ему дастся 1 уровень розыска.
Делается это так, в public OnPlayerDeath вставляем:
Code
   if(PlayerInfo[killerid][pJailed] == 0) // Если игрок не в тюрьму, то идет следующее действие  
     {
         if(IsACop(killerid)) { SendDeathMessage(killerid, playerid, reason); return 1; } // Эта строка отвечает за проверку на законника, у меня фракции закона в public IsACop, если у Вас другой, то меняйте на свой, если же у Вас его нет, то тут два выхода, или пишете public что-то типо IsACop или указывайте проверку на фракции прямо тут. Если убийца законник, то выдается сообщение в киллстате и ему не дается уровень розыска.
         if(WantedLevel[killerid] == 6) {SendDeathMessage(killerid, playerid, reason); return 1; }// Если у игрока уже 6 звезд, то выдается сообщение в киллстате и ему не дается уровень розыска.
         Else // Но, если убийца – не законник или у него меньше 6 то выполняется действия(е), которое описано ниже.
         {
             WantedLevel[killerid] += 1;// Дается 1 уровень розыска.
             SendClientMessage(killerid,COLOR_YELLOW,"Вы получили 1 уровень розыска. Причина: Убийство.");// Выводится сообщение убийце желтым цветом, что он получил 1 уровень розыска.
             SetPlayerWantedLevel(killerid,WantedLevel[killerid]);// Функция для показа звезд сверху, как его называют некоторые текст драв звезд.
             SendDeathMessage(killerid, playerid, reason);// Выводится сообщение в киллстате.
         }
     }  


Теперь надо сделать так, чтобы когда игрока с уровнем розыска убивал законник, то его сажало в тюрьму, делается это так(Вставляем в public OnPlayerStateChange):

Code
if(WantedLevel[playerid] >= 1)//Если у игрока есть звезды
         {
             new price = WantedLevel[playerid] * 1000;//Объявим price, которая будет равна “уровень розыска умноженная на $1000”.
             new count;// Объявляем count.
             for(new i = 0; i < GetMaxPlayers(); i++)
             {
                 if(IsPlayerConnected(i))
                 {
                     if(IsACop(i))
                     {
                         if(CrimInRange(20.0, playerid,i))// Думаю, то, что написано выше понятно в принцепе. А это проверка на радиус так сказать, если законник убил игрока с розыском в радиусе 20, то его посадит.
                         {
                             count = 1;// присваиваем переменную равную 1.
                             GiveMoney(i, price);// выдаем деньги законнику, который посадил игрока(помните new price, так вот, это и есть кол-во денег)
                             format(string, sizeof(string),"~w~Running Suspect ~r~Killed ~n~Bonus ~g~$%d", price);// выводим сообщение справа внизу, мол преступник посажен в тюрьму, и ты получил бонул в размере равную price.
                             GameTextForPlayer(i, string, 5000, 1);// Кому выводим сообщение и на сколько секунд. В нашем случаи на 5 секундочек.
                             PlayerPlaySound(i, 1058, 0.0, 0.0, 0.0);// Звук, который будет воспроизведен после того, как игрока посадят.
                         }
                     }
                 }
             }
             if(count == 1)// Если count равен 1(помните, мы присваивали игроку переменную), то выполняется действие, что я написал ниже.
             {
                 GiveMoney(playerid, - price);// У игрока отнимаются деньги, то есть сумма, равная price.
                 PlayerInfo[playerid][pJailed] = 1;// Присваиваем игроку Jailed = 1.
                 PlayerInfo[playerid][pJailTime] = (WantedLevel[playerid])*(600);// Время, на сколько его посадит, то есть “кол-во звезд умноженная на 600 секунд”.
                 SetPlayerSkin(playerid, 268);// выдаем ему скин. ID: 268.
                 ResetPlayerWeapons(playerid);// Отнимаем все его оружие
                 WantedLevel[playerid] = 0;// Отнимаем звезды у игрока
                 SetPlayerInterior(playerid, 0);// Тут ставим id интерьера игроку после того, как его посадят.
                 PlayerInfo[playerid][pInt] = 6;// Интерьер  
                 SetPlayerVirtualWorld(playerid, 1);//Виртуальный мир
                 SetPlayerPos(playerid, 0.0,0.0,0.0);// Тут координаты, где он окажется после того, как его посадят.
                 format(string, sizeof(string), "Вы были посаженны на %d секунд в тюрьму. Штраф: $%d.", PlayerInfo[playerid][pJailTime], price);// выдаем ему(ей) сообщение о том, что он(а) посажен(а) в тюрьму со штрафом.
                 SendClientMessage(playerid, COLOR_LIGHTRED, string);// Сама выдача сообщения, красным цветом.
                 PlayerInfo[playerid][pWanted] = 0;// Обнуляем звезды
                 SetPlayerWantedLevel(playerid, WantedLevel[playerid]);// Показываем кол-во звезд в текст драве.
             }
         }
     }  


Теперь нужно добавить public CrimInRange(Float:radi, playerid,copid);, ко всем форвардам(forward):

Code
forward CrimInRange(Float:radi, playerid,copid);  


И сам паблик, ко всем пабликам добавляйте:

Code
public CrimInRange(Float:radi, playerid,copid)
{
     if(IsPlayerConnected(playerid)&&IsPlayerConnected(copid))
     {
         new Float:posx, Float:posy, Float:posz;
         new Float:oldposx, Float:oldposy, Float:oldposz;
         new Float:tempposx, Float:tempposy;
         GetPlayerPos(playerid, oldposx, oldposy, oldposz);
         GetPlayerPos(copid, posx, posy, posz);
         tempposx = (oldposx -posx);
         tempposy = (oldposy -posy);
         if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)))
         {
             return 1;
         }
     }
     return 0;
}  


Вроде все. Теперь само сохранение, в stock OnPlayerRegister:

Code
  ini_setInteger(iniFile, "Wanted", PlayerInfo[playerid][pWanted]);  


Теперь в Ваш паблик или сток сохранения аккаунта, например stock SaveAccounts и т.п, вот код:
Code
  ini_setInteger(iniFile, "Wanted", PlayerInfo[playerid][pWanted]);  


Теперь в stock OnPlayerLogin:

Code
   ini_getInteger(iniFile, "Wanted", PlayerInfo[playerid][pWanted]);  


Самое главное и основное я рассказал вроде как.
И еще, если у Вас другая функция выдачи денег, то GiveMoney меняйте на свой, просто у меня античит стоит.
Автор урока: Immortal116


From Russia With Love!
  • Страница 1 из 1
  • 1
Поиск: