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

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

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

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

Исправляем выдачу звезд

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

Luke_Parker

Новичок
Здравствуйте. Видимо, никто не замечал баг с выдачей звезд, так как не были заданы вопросы, например, "Вроде, дал 6 звезд, а в /wanted показывает 9. Как исправить?". Ладно, приступим сначала к рассмотрению команды /su, я взял ее из PIv5.0, так как в своем моде этот баг давно исправил, а искать rls не стал:
PHP:
if(strcmp(cmd, "/suspect", true) == 0 || strcmp(cmd, "/su", true) == 0)
	{
			tmp = strtok(cmdtext, idx);
			if(!strlen(tmp)) return		SendClientMessage(playerid, COLOR_WHITE, "::: Введите: (/su)spect [id] [преступление]");
			giveplayerid = ReturnUser(tmp);
			if (PlayerInfo[playerid][pMember] == 1 || PlayerInfo[playerid][pLeader] == 1 || PlayerInfo[playerid][pMember] == 10 || PlayerInfo[playerid][pLeader] == 10 || PlayerInfo[playerid][pMember] == 21 || PlayerInfo[playerid][pLeader] == 21  || PlayerInfo[playerid][pMember] == 2 || PlayerInfo[playerid][pLeader] == 2)
			{
				if(IsPlayerConnected(giveplayerid))
				{
				    if(giveplayerid != INVALID_PLAYER_ID)
				    {
		                if(PlayerInfo[giveplayerid][pJailed] == 0)
		                {
		                    if(WantedPoints[giveplayerid] >= 6) return    SendClientMessage(playerid, COLOR_GREY, "У данного игрока уже 6 уровней розыска!");
		    			if (IsACop(giveplayerid)) return SendClientMessage(playerid, COLOR_GRAD2, "Вы не можете давать розыск законникам!");
							   	GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
							   	GetPlayerName(playerid, sendername, sizeof(sendername));
							   	new length = strlen(cmdtext);
						       	while ((idx < length) && (cmdtext[idx] <= ' '))
							   	{
							    	idx++;
							   	}
							   	new offset = idx;
							   	new result[64];
							   	while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
							   	{
							    	result[idx - offset] = cmdtext[idx];
								    idx++;
							   	}
							   	result[idx - offset] = EOS;
							   	if(!strlen(result)) return 	SendClientMessage(playerid, COLOR_WHITE, "::: Введите: (/su)spect [id] [преступление]");
							   	//if(WantedPoints[giveplayerid] == 0) { WantedPoints[giveplayerid] = 1; }
							   	//else { WantedPoints[giveplayerid]++; }
							   	//WantedPoints[giveplayerid];
							   	WantedPoints[giveplayerid]++;
							   	PlayerInfo[giveplayerid][pZvezdi]+=1;
							   	SetPlayerCriminal(giveplayerid,playerid, result);//
							   	return 1;
	                    }
						else
		                {
							SendClientMessage(playerid, COLOR_GRAD2, "Этот Человек в тюрьме!");
			            }
					}
				}
				else
				{
						SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Человек не найден!");
						return 1;
				}
			}
			else
			{
				SendClientMessage(playerid, COLOR_GRAD2, "Вы не член Полиция/ФБР!");
			}
		return 1;
	}
Тут, вроде, все нормально, но заметить, что здесь есть public SetPlayerCriminal, в котором мы не знаем, что происходит. Давайте рассмотрим его:
PHP:
public SetPlayerCriminal(playerid,declare,reason[])
{
if(logs == 1)
{
printr("SetPlayerCriminal");
}
	if(IsPlayerConnected(playerid))
	{
	    PlayerInfo[playerid][pCrimes] += 1;
		new turned[MAX_PLAYER_NAME];
		new turner[MAX_PLAYER_NAME];
		new turnmes[128];
		new wantedmes[128];
		new points = WantedPoints[playerid];
		strmid(PlayerCrime[playerid][pAccusedof], reason, 0, strlen(reason), 255);
		GetPlayerName(playerid, turned, sizeof(turned));
		if (declare == 255)
		{
			format(turner, sizeof(turner), "Неизвестный");
			strmid(PlayerCrime[playerid][pVictim], turner, 0, strlen(turner), 255);
		}
		else
		{
		    if(IsPlayerConnected(declare))
		    {
				GetPlayerName(declare, turner, sizeof(turner));
				strmid(PlayerCrime[playerid][pVictim], turner, 0, strlen(turner), 255);
				strmid(PlayerCrime[declare][pBplayer], turned, 0, strlen(turned), 255);
				strmid(PlayerCrime[declare][pAccusing], reason, 0, strlen(reason), 255);
			}
		}
		if(!IsACop(playerid) || !IsAArm(playerid))
		{
		if(PlayerInfo[playerid][pZvezdi] <=6)
		{
		format(turnmes, sizeof(turnmes), "Вы совершили преступление: [ %s ]. Сообщает: %s.",reason,turner);
		SetPlayerWantedLevel(playerid,WantedLevel[playerid] += 1);
		WantedLevel[playerid] += 1;
		PlayerInfo[playerid][pZvezdi] +=1;
		SendClientMessage(playerid, COLOR_LIGHTRED, turnmes);
		}
		if(points > 0)
		{
		    new yesno;
			if(points == 1) { WantedLevel[playerid] = 1; yesno = 1; WantedTime[playerid] = 300; }
			else if(points == 2) { WantedLevel[playerid] = 2; yesno = 1; WantedTime[playerid] = 600; }
			else if(points == 3) { WantedLevel[playerid] = 3; yesno = 1; WantedTime[playerid] = 900; }
			else if(points == 4) { WantedLevel[playerid] = 4; yesno = 1; WantedTime[playerid] = 1200; }
			else if(points == 5) { WantedLevel[playerid] = 5; yesno = 1; WantedTime[playerid] = 1500; }
			else if(points >= 6) { WantedLevel[playerid] = 6; yesno = 1; WantedTime[playerid] = 1800; }
			if(WantedLevel[playerid] >= 1){		  }
			if(yesno)
			{
				format(wantedmes, sizeof(wantedmes), "Ваш уровень розыска: %d", WantedLevel[playerid]);
				SendClientMessage(playerid, COLOR_YELLOW, wantedmes);
				SetPlayerWantedLevel(playerid, WantedLevel[playerid]);
				for(new i = 0; i < MAX_PLAYERS; i++)
				{
					if(IsPlayerConnected(i))
					{
					    if(PlayerInfo[i][pMember] == 1 ||PlayerInfo[i][pLeader] == 1 || PlayerInfo[i][pMember] == 10 ||PlayerInfo[i][pLeader] == 10 || PlayerInfo[i][pMember] == 2 ||PlayerInfo[i][pLeader] == 2 || PlayerInfo[i][pMember] == 3 || PlayerInfo[i][pLeader] == 3 || PlayerInfo[i][pMember] == 19 || PlayerInfo[i][pLeader] == 19 || PlayerInfo[i][pMember] == 21 || PlayerInfo[i][pLeader] == 21)
					    {
							format(cbjstore, sizeof(turnmes), "Рация: Cообщает: %s. Преступление: %s. Подозреваемый: %s",turner,reason,turned);
							SendClientMessage(i, 0xFEBC41AA, cbjstore);
						}
					}
				}
			}
		}
	}
}
 return 1;
}
Тут, как вы видите, тоже дают звезды, поэтому у вас вместо того, чтобы дать 6 звезд, дает 9. Чтобы исправить данный баг, я подумал, что лучше удалить выдачу звезд в команде, а не public'е. Получается такой вид команды:
PHP:
if(strcmp(cmd, "/suspect", true) == 0 || strcmp(cmd, "/su", true) == 0)
	{
			tmp = strtok(cmdtext, idx);
			if(!strlen(tmp)) return		SendClientMessage(playerid, COLOR_WHITE, "::: Введите: (/su)spect [id] [преступление]");
			giveplayerid = ReturnUser(tmp);
			if (PlayerInfo[playerid][pMember] == 1 || PlayerInfo[playerid][pLeader] == 1 || PlayerInfo[playerid][pMember] == 10 || PlayerInfo[playerid][pLeader] == 10 || PlayerInfo[playerid][pMember] == 21 || PlayerInfo[playerid][pLeader] == 21  || PlayerInfo[playerid][pMember] == 2 || PlayerInfo[playerid][pLeader] == 2)
			{
				if(IsPlayerConnected(giveplayerid))
				{
				    if(giveplayerid != INVALID_PLAYER_ID)
				    {
		                if(PlayerInfo[giveplayerid][pJailed] == 0)
		                {
		                    if(WantedPoints[giveplayerid] >= 6) return    SendClientMessage(playerid, COLOR_GREY, "У данного игрока уже 6 уровней розыска!");
		    			if (IsACop(giveplayerid)) return SendClientMessage(playerid, COLOR_GRAD2, "Вы не можете давать розыск законникам!");
							   	GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
							   	GetPlayerName(playerid, sendername, sizeof(sendername));
							   	new length = strlen(cmdtext);
						       	while ((idx < length) && (cmdtext[idx] <= ' '))
							   	{
							    	idx++;
							   	}
							   	new offset = idx;
							   	new result[64];
							   	while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
							   	{
							    	result[idx - offset] = cmdtext[idx];
								    idx++;
							   	}
							   	result[idx - offset] = EOS;
							   	if(!strlen(result)) return 	SendClientMessage(playerid, COLOR_WHITE, "::: Введите: (/su)spect [id] [преступление]");
							   	SetPlayerCriminal(giveplayerid,playerid, result);
							   	return 1;
	                    }
						else
		                {
							SendClientMessage(playerid, COLOR_GRAD2, "Этот Человек в тюрьме!");
			            }
					}
				}
				else
				{
						SendClientMessage(playerid, COLOR_GREY, "[Ошибка] Человек не найден!");
						return 1;
				}
			}
			else
			{
				SendClientMessage(playerid, COLOR_GRAD2, "Вы не член Полиция/ФБР!");
			}
		return 1;
	}
А public SetPlayerCriminal замените на этот:
PHP:
public SetPlayerCriminal(playerid,declare,reason[])
{
	if(logs == 1)
	{
		printr("SetPlayerCriminal");
	}
	if(IsPlayerConnected(playerid))
	{
	    PlayerInfo[playerid][pCrimes] += 1;
		new turned[MAX_PLAYER_NAME];
		new turner[MAX_PLAYER_NAME];
		new turnmes[128];
		new wantedmes[128];
		new points = WantedPoints[playerid];
		strmid(PlayerCrime[playerid][pAccusedof], reason, 0, strlen(reason), 255);
		GetPlayerName(playerid, turned, sizeof(turned));
		if (declare == 255)
		{
			format(turner, sizeof(turner), "Неизвестный");
			strmid(PlayerCrime[playerid][pVictim], turner, 0, strlen(turner), 255);
		}
		else
		{
		    if(IsPlayerConnected(declare))
		    {
				GetPlayerName(declare, turner, sizeof(turner));
				strmid(PlayerCrime[playerid][pVictim], turner, 0, strlen(turner), 255);
				strmid(PlayerCrime[declare][pBplayer], turned, 0, strlen(turned), 255);
				strmid(PlayerCrime[declare][pAccusing], reason, 0, strlen(reason), 255);
			}
		}
		if(!IsACop(playerid) || !IsAArm(playerid))
		{
			if(PlayerInfo[playerid][pZvezdi] <=6)
			{
				format(turnmes, sizeof(turnmes), "Вы совершили преступление: [ %s ]. Сообщает: %s.",reason,turner);
				SetPlayerWantedLevel(playerid,WantedLevel[playerid] += 1);
				WantedLevel[playerid] += 1;
				WantedPoints[playerid] += 1;
				PlayerInfo[playerid][pZvezdi] +=1;
				SendClientMessage(playerid, COLOR_LIGHTRED, turnmes);
			}
			if(points > 0)
			{
		    	new yesno;
				if(points == 1)
				{
					WantedLevel[playerid] = 1;
					yesno = 1;
					WantedTime[playerid] = 300;
				}
				else if(points == 2)
				{
					WantedLevel[playerid] = 2;
					yesno = 1;
					WantedTime[playerid] = 600;
				}
				else if(points == 3)
				{
					WantedLevel[playerid] = 3;
					yesno = 1;
					WantedTime[playerid] = 900;
				}
				else if(points == 4)
				{
					WantedLevel[playerid] = 4;
					yesno = 1;
					WantedTime[playerid] = 1200;
				}
				else if(points == 5)
				{
					WantedLevel[playerid] = 5;
					yesno = 1;
					WantedTime[playerid] = 1500;
				}
				else if(points >= 6)
				{
					WantedLevel[playerid] = 6;
					yesno = 1;
					WantedTime[playerid] = 1800;
				}
				if(WantedLevel[playerid] >= 1)
				{
				}
				if(yesno)
				{
					format(wantedmes, sizeof(wantedmes), "Ваш уровень розыска: %d", WantedLevel[playerid]);
					SendClientMessage(playerid, COLOR_YELLOW, wantedmes);
					SetPlayerWantedLevel(playerid, WantedLevel[playerid]);
					for(new i = 0; i < MAX_PLAYERS; i++)
					{
						if(IsPlayerConnected(i))
						{
					    	if(PlayerInfo[i][pMember] == 1 ||PlayerInfo[i][pLeader] == 1 || PlayerInfo[i][pMember] == 10 ||PlayerInfo[i][pLeader] == 10 || PlayerInfo[i][pMember] == 2 ||PlayerInfo[i][pLeader] == 2 || PlayerInfo[i][pMember] == 3 || PlayerInfo[i][pLeader] == 3 || PlayerInfo[i][pMember] == 19 || PlayerInfo[i][pLeader] == 19 || PlayerInfo[i][pMember] == 21 || PlayerInfo[i][pLeader] == 21)
					    	{
								format(cbjstore, sizeof(turnmes), "Рация: Сообщает: %s. Преступление: %s. Подозреваемый: %s",turner,reason,turned);
								SendClientMessage(i, 0xFEBC41AA, cbjstore);
							}
						}
					}
				}
			}
		}
	}
 	return 1;
}
Автор: Luke_Parker.
Данный мануал для rls.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу