Spec system (система слежения)
#1

Здравствуйте, у меня проблема когда спектишь игрока, то через текстдрав появляется имя того игрока который спектит и этот текстдрав даётся тому кого спектишь, но получается баг с никами.


Code:
for(new i = 0; i < GetMaxPlayers(); i++)
{
if(IsPlayerConnected(i))
{
new spectext[255], spectext2[255];
format(spectext, 256, "~y~~p~Spectators:~w~");
spectext2 = " ";
for(new x = 0; x < GetMaxPlayers(); x++)
{
if(IsPlayerConnected(x))
{
if ((GetPlayerState(x) == PLAYER_STATE_SPECTATING) && (Player[x][gSpectateID] == i))
{
format(spectext2, 255, "%s~n~ - %s", spectext2, PNM(x));
format(spectext, 255, "%s%s", spectext, spectext2);
TextDrawSetString(Spectext[i], spectext);
TextDrawShowForPlayer(i, Spectext[i]);
}
else
{
TextDrawHideForPlayer(i, Spectext[i]);
}
}
}
Давно пытаюсь решить эту проблему, но все никак.



з.ы. у меня некоторые посты в каракули превращаются подскажите как решить эту тоже проблему)
Reply
#2

Поставь условие - && x != i

должно помочь.


в настройки зайди, смени язык форума на русский.



ахахахаха вот что значит копировать чужие корявые моды. заценил код получше:

Quote:

format(spectext2, 255, "%s~n~ - %s", spectext2, PNM(x));
format(spectext, 255, "%s%s", spectext, spectext2);
TextDrawSetString(Spectext[i], spectext);

у меня в моде так всё устроено

Code:
TextDrawSetString(RequestClass[playerid],string);
// Player List
strcat(RequestPlayerClass[playerid], "~g~Players:");
for(new i = 0; i < GetMaxPlayers(); i++){
if(IsPlayerConnected(i) && team[i] == team[playerid] && i != playerid){
format(string,128,"~n~~y~%s",GetName(i));
strcat(RequestPlayerClass[playerid],string);
}
}
//TextDrawUseBox(RequestClassPlayers[playerid],1);
//TextDrawBoxColor(RequestClassPlayers[playerid],0x000000A0);
TextDrawSetString(RequestClassPlayers[playerid],RequestPlayerClass[playerid]);
RequestPlayerClass[playerid] = "";
Reply
#3

Quote:
Originally Posted by crone
з.ы. у меня некоторые посты в каракули превращаются подскажите как решить эту тоже проблему)
Это у тебя в настройках профиля стоит язык English, поставь Русский, и все пройдет.
Reply
#4

совет(оффтоп): не используйте НИКОГДА GetMaxPlayers();
у меня , при использовании этой функции GameModeInit виснет не дойдя до конца...
а представте что с остальными функциями будет
Reply
#5

мб руки кривые? Всё время юзаю, и всё окей
Reply
#6

Quote:
Originally Posted by [JIeXa
]
не используйте НИКОГДА GetMaxPlayers();
Всегда использовал, когда программировал на pawn, проблем с этой функцией не замечал (правда часто в моде использовалась только 1 раз -при запуске мода устанавливалась глобальная переменная, которая уже дальше везде использовалась в коде).
Reply
#7

Давно хотел создать такую систему .... (для cw мода) .. Суть в том что после того как игрок умирает в раунде он хочет следить за теми кто остался жив и продолжает играть.
Вот он допустим вводит /spec id и начинает спектить за тем игроком НО все бы хорошо , но нет одной нужной вещи.. когда игрок вводит эту команду у него начинается слежение за игроком НО хочется сделать так чтобы появлялся текстдрав со следущими надписями:
Spectators:
Player
player
player
plyaer


(где player ники игроков .. + чтобы они не были ограниченными ^_^)
Люди добрые помогите сотворить данную систему =)) буду очень признателен!
А вот код из моего мода:

Code:
//=========================[Spec]===================================
	new specid;
	new cmd[256],idx;
	cmd = adminspec_strtok(cmdtext, idx);

 	if(strcmp(cmd, "/spec", true) == 0)
  {
	new tmp[256];
	tmp = adminspec_strtok(cmdtext, idx);

	if(!strlen(tmp))
	{
  SendClientMessage(playerid, AAD_COLOR_GREY, "Используйте: /spec <ID игрока> .");
	return 1;
	}

	specid = strval(tmp);
	if(!IsPlayerConnected(specid))
	{
	SendClientMessage(playerid, AAD_COLOR_GREY, "Игрок не обнаружен.");
	return 1;
	}
	else if(specid == playerid)
	{
	SendClientMessage(playerid, AAD_COLOR_GREY, "Вы не можете наблюдать за собой");
	return 1;
  }

	else if(Player[specid][pTeam] != Player[playerid][pTeam] && Player[playerid][pTeam] != T_REF)
	{
	SendClientMessage(playerid, AAD_COLOR_GREY, "Вы можете наблюдать только за игроком своей команды");
  return 1;
	}

	else if(Player[playerid][pPlaying] == true && Player[playerid][pTeam] != T_REF)
	{
	SendClientMessage(playerid, AAD_COLOR_GREY, "Вы можете только наблюдать если вы не в этом раунде");
	return 1;
	}

	else if(GetPlayerState(specid) == PLAYER_STATE_SPECTATING && gSpectateID[specid] != INVALID_PLAYER_ID)
	{
	SendClientMessage(playerid, AAD_COLOR_GREY, "Игрок тоже наблюдает за кем-то");
	return 1;
	}

	else if(GetPlayerState(specid) != 1 && GetPlayerState(specid) != 2 && GetPlayerState(specid) != 3)
	{
	SendClientMessage(playerid, AAD_COLOR_GREY, "Игрок не в игре");
	return 1;
	}
	
	else if(game[playerid] == 1)
	{
	SendClientMessage(playerid, AAD_COLOR_GREY, "Игрок не находится в раунде!");
	return 1;
	}


	StartSpectate(playerid, specid);
  spectating[playerid] = 1;
  new specname[STR];
  new spectext[STR];
  new Float:spechp;
	GetPlayerName(specid, specname, sizeof(specname));
	GetPlayerHealth(specid, spechp);
	format(spectext,STR,"~w~%s",specname,spechp);
  TextDrawSetString(spec, spectext);
  TextDrawShowForPlayer(playerid,spec);
  return 1;
	}


//=========================[Specoff]===================================
 	if(strcmp(cmd, "/specoff", true) == 0)
	{
  if(Player[playerid][pPlaying] || !spectating[playerid]) return SendClientMessage(playerid, AAD_COLOR_GREY, " Ошибка");
  StopSpectate(playerid);
  spectating[playerid] = 0;
  SpawnPlayer(playerid);
	TextDrawHideForPlayer(playerid, spec);
	return 1;
	}
	return SendClientMessage(playerid,0xC1C1FFAA,"***Неизвестная команда, используйте /help");
  }

  spec = TextDrawCreate(183.000000,371.000000,"Spectators:");
  TextDrawAlignment(spec,0);
  TextDrawBackgroundColor(spec,0x00000033);
  TextDrawFont(spec,1);
  TextDrawLetterSize(spec,1.000000,1.000000);
  TextDrawColor(spec,0xffffffff);
  TextDrawSetOutline(spec,1);
  TextDrawSetProportional(spec,1);
  TextDrawSetShadow(spec,2);
Помогите ^_^ пожалуйста
Reply
#8

ах да ... есть ещё одна проблемка с балансированием команд!!
вот код:
Code:
//====================[balance]====================
  if(!strcmp(cmdtext,"/balance",true,8))
	{
	if(!IsPlayerAdmin(playerid) || Current != -1) return SendClientMessage(playerid, AAD_COLOR_GREY, "Вы должны быть администратором для использования данной команды!");

	new PlayersPlaying;
  for(new i = 0; i < MAX_PLAYERS; i ++)
	  {
			if(IsPlayerConnected(i))
      PlayersPlaying ++;
	  }

  if(PlayersPlaying <= 1) return SendClientMessage(playerid, AAD_COLOR_GREY, "Ошибка в балансировке команд!");

  new Divisor = floatround(PlayersPlaying / 2);
  new Temp;
  new bool:HomeFull = false;

  for(new i = 0; i < MAX_PLAYERS; i ++)
	  {
	  	if(IsPlayerConnected(i) && (Player[i][pTeam] == T_ATT || Player[i][pTeam] == T_DEF))
			{
			  if(HomeFull == false)
			  {
      	    Player[i][pTeam] = T_DEF;
          mySetPlayerColor(i,COLOR_DEF);
          GunSet[i] = 0;
          SetSpawnInfo(i,99,DEFENDER_SKIN,0,0,0,0,0,0,0,0,0,0);
			    Temp ++;
			    if(Temp >= Divisor)
			    {
			      HomeFull = true;
			    }
			  }
			  else if(HomeFull == true)
			  {
          Player[i][pTeam] = T_ATT;
          mySetPlayerColor(i,COLOR_ATT);
          GunSet[i] = 1;
          SetSpawnInfo(i,99,ATTACKER_SKIN,0,0,0,0,0,0,0,0,0,0);
				}
			}
		}

	new string[60];
	format(string, 60, " Команды сбалансированы администратором.");
	SendClientMessageToAll(AAD_COLOR_GREEN, string);

	return 1;
 	}
после юзания данной команды пишет что сбалансировал а на самом деле ни чего не происходит =((((
Reply
#9

Ипать, скока можно.. Даже тему для таких как вы создали.

А по теме, уже проскакивал такой вопрос, я написал решение. Иди в поиск.
Reply
#10

чувак ипа я весь поиск облазил по всем похожим словам ^_^
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)