Доступ к архиву

Переход в группу "Пользователь"

300.00 ₽
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

[Мануал] Система уровня розыска с сохранением

Статус
В этой теме нельзя размещать новые ответы.

Immortal116

Умник
Здравствуйте, ребята. С Вами Ильназ(Immortal116), я пишу первый мануал, речь будет идти о системе уровня розыска с сохранением.
Для начала в enum pInfo вставляем:
PHP:
pWanted,
Дальше нужно обеспечить показ звездочек. Для этого в public OnPlayerConnect вставляем:
PHP:
 SetPlayerWantedLevel(playerid,PlayerInfo[playerid][pWanted]);
А также в этот же паблик вставляем это:
PHP:
PlayerInfo[playerid][pWanted] = 0;
Теперь нужно тоже самое вставить в public OnPlayerSpawn, вот:
PHP:
 	SetPlayerWantedLevel(playerid,PlayerInfo[playerid][pWanted]);
Можно сделать, чтобы после спавна появлялось сообщение о том, сколько у него звезд, делается так:
PHP:
 	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 вставляем:
PHP:
 		if(PlayerInfo[killerid][pJailed] == 0) // Если игрок не в тюрьму, то идет следующее действие 
	{
		if(IsACop(killerid)) { SendDeathMessage(killerid, playerid, reason); return 1; } // Эта строка отвечает за проверку на законника, у меня фракции закона в public IsACop, если у Вас другой, то меняйте на свой, если же у Вас его нет, то тут два выхода, или пишете public что-то типо IsACop или указывайте проверку на фракции прямо тут. Если убийца законник, то выдается сообщение в киллстате и ему не дается уровень розыска.
		if(PlayerInfo[killerid][pWanted] == 6) {SendDeathMessage(killerid, playerid, reason); return 1; }// Если у игрока уже 6 звезд, то выдается сообщение в киллстате и ему не дается уровень розыска.
		Else // Но, если убийца – не законник или у него меньше 6 то выполняется действия(е), которое описано ниже.
		{
			PlayerInfo[killerid][pWanted] += 1;// Дается 1 уровень розыска.
			SendClientMessage(killerid,COLOR_YELLOW,"Вы получили 1 уровень розыска. Причина: Убийство.");// Выводится сообщение убийце желтым цветом, что он получил 1 уровень розыска.
			SetPlayerWantedLevel(killerid,PlayerInfo[killerid][pWanted]);// Функция для показа звезд сверху, как его называют некоторые текст драв звезд.
			SendDeathMessage(killerid, playerid, reason);// Выводится сообщение в киллстате.
		}
	}
Теперь надо сделать так, чтобы когда игрока с уровнем розыска убивал законник, то его сажало в тюрьму, делается это так(Вставляем в public OnPlayerStateChange):
PHP:
 		if(PlayerInfo[playerid][pWanted] >= 1)//Если у игрока есть звезды
		{
			new price = PlayerInfo[playerid][pWanted] * 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);// Отнимаем все его оружие
				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, PlayerInfo[playerid][pWanted]);// Показываем кол-во звезд в текст драве.
			}
		}
	}
Теперь нужно добавить public CrimInRange(Float:radi, playerid,copid);, ко всем форвардам(forward):
PHP:
forward CrimInRange(Float:radi, playerid,copid);
И сам паблик, ко всем пабликам добавляйте:
PHP:
 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:
PHP:
 	ini_setInteger(iniFile, "Wanted", PlayerInfo[playerid][pWanted]);
Теперь в Ваш паблик или сток сохранения аккаунта, например stock SaveAccounts и т.п, вот код:
PHP:
 	ini_setInteger(iniFile, "Wanted", PlayerInfo[playerid][pWanted]);
Теперь в stock OnPlayerLogin:
PHP:
 	ini_getInteger(iniFile, "Wanted", PlayerInfo[playerid][pWanted]);
Самое главное и основное я рассказал вроде как. Пишите вопросы, если они у Вас есть. Буду рад Вам помочь.
И еще, если у Вас другая функция выдачи денег, то GiveMoney меняйте на свой, просто у меня античит стоит. :)
А также, Уважаемая Администрация, прошу поменять префикс на [Мануал].
Автор урока: Immortal116
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу