Дмитрий |
Дата: Среда, 26.09.2012, 22:20 | Сообщение # 1 | Сообщить о нерабочей теме
|
Регистрация: | 03.12.2011
|
Страна: | Российская Федерация |
Репутация: |
14
|
Сообщений: | 1421 |
Награды: |
4
+
|
Статус: |
|
| Здравствуйте, ребята. С Вами Ильназ(Immortal116), я пишу первый мануал, речь будет идти о системе уровня розыска с сохранением. Для начала ко всем new вставляем это: Code new WantedLevel[MAX_PLAYERS];
Дальше в enum pInfo вставляем:
Дальше нужно обеспечить показ звездочек. Для этого в 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!
|
|
|
|