PDA

Просмотр полной версии : [Вопрос] Как определить



lonin
22.07.2014, 12:11
Здравствуйте, нужно определить сколько игроков находиться онлайн в определенной команде, как это сделать? :bad:

Допустим команды у нас через
pStats[playerid][pMember] == %d;

Буду признателен за помощь!

L0ndl3m
22.07.2014, 12:15
Циклом это дело можно решить, один из способов:


new
i = GetMaxPlayers(),
count = 0;

do
{
--i;
if(IsPlayerConnected(i) && pStats[i][pMember] == ID)
count++;
}
while(i);


Кол-во игроков содержится в переменной "count".

lonin
22.07.2014, 12:25
Циклом это дело можно решить, один из способов:


new
i = GetMaxPlayers(),
count = 0;

do
{
--i;
if(IsPlayerConnected(i) && pStats[i][pMember] == ID)
count++;
}
while(i);


Кол-во игроков содержится в переменной "count".

Спасибо, но есть одно "но" :wacko: При коннекте
pStats[playerid][pMember] == 0;
Она выбирается только в OnPlayerRequestClass

Мне бы как то записывать в глобальную переменную(какую либо) при выборе класса + 1 игрока и в OnPlayerDisconnect(), отнимать одного при выходе. Нужно это для создания ТекстДрава с онлайном комманд:


switch(classid)
{
case 0,1,2,3,4,5,6,7,8:
{
SetPlayerPos(playerid, 1835.0920,-1302.5947,131.7344);
SetPlayerCameraPos(playerid, 1838.0920,-1300.5947,131.7344);
SetPlayerCameraLookAt(playerid, 1835.0920,-1302.5947,131.7344);
SetPlayerFacingAngle(playerid, 265.7347);
SetPlayerTeamFromClass(playerid, classid);
pStats[playerid][pMember] = 1;
GroovePl += 1; // Что то вроде этого.
}
}

wAx
22.07.2014, 16:28
Спасибо, но есть одно "но" :wacko: При коннекте
pStats[playerid][pMember] == 0;
Она выбирается только в OnPlayerRequestClass

Мне бы как то записывать в глобальную переменную(какую либо) при выборе класса + 1 игрока и в OnPlayerDisconnect(), отнимать одного при выходе. Нужно это для создания ТекстДрава с онлайном комманд:


switch(classid)
{
case 0,1,2,3,4,5,6,7,8:
{
SetPlayerPos(playerid, 1835.0920,-1302.5947,131.7344);
SetPlayerCameraPos(playerid, 1838.0920,-1300.5947,131.7344);
SetPlayerCameraLookAt(playerid, 1835.0920,-1302.5947,131.7344);
SetPlayerFacingAngle(playerid, 265.7347);
SetPlayerTeamFromClass(playerid, classid);
pStats[playerid][pMember] = 1;
GroovePl += 1; // Что то вроде этого.
}
}
Ну и чем мы должны помочь, если ты знаешь правильный ответ? Создавай переменную, записывай.

lonin
22.07.2014, 19:43
Ну и чем мы должны помочь, если ты знаешь правильный ответ? Создавай переменную, записывай.

Дело в том, что я уже сделал это, но вылезла другая проблема, в OnPlayerDisconnect не отнимает переменную почему то... Вот код, что в нем не так?



if(pStats[playerid][pMember] == 1)
{
GroovePl -=1;
}

underwoker
22.07.2014, 20:04
if(pStats[playerid][pMember] == 1)
{
--GroovePl;
}
пробуй так.

L0ndl3m
22.07.2014, 20:14
if(pStats[playerid][pMember] == 1)
{
--GroovePl;
}
пробуй так.

Разницы практически никакой. Можно было записать и так:

GroovePl = GroovePl - 1;
lonin, уберите инкремент переменной из паблика OnPlayerRequestClass. При выборе другого скина переменная будет всегда увеличиваться. Проверяйте скин игрока в паблике OnPlayerRequestSpawn, и попробуйте ещё раз проделать тоже самое.

lonin
22.07.2014, 21:03
Разницы практически никакой. Можно было записать и так:

GroovePl = GroovePl - 1;
lonin, уберите инкремент переменной из паблика OnPlayerRequestClass. При выборе другого скина переменная будет всегда увеличиваться. Проверяйте скин игрока в паблике OnPlayerRequestSpawn, и попробуйте ещё раз проделать тоже самое.

Попробую, сейчас написал вот такое отображение в текстдраве:



new i = GetMaxPlayers(),
count = 0;
do
{
--i;
if(IsPlayerConnected(i) && pStats[i][pMember] == 1)
count++;
}
while(i);
new i1 = GetMaxPlayers(),
count2 = 0;
do
{
--i1;
if(IsPlayerConnected(i) && pStats[i][pMember] == 2)
count2++;
}
while(i1);
new i2 = GetMaxPlayers(),
count3 = 0;
do
{
--i2;
if(IsPlayerConnected(i) && pStats[i][pMember] == 3)
count3++;
}
while(i2);
new i3 = GetMaxPlayers(),
count4 = 0;
do
{
--i3;
if(IsPlayerConnected(i) && pStats[i][pMember] == 4)
count4++;
}
while(i3);
new i4 = GetMaxPlayers(),
count5 = 0;
do
{
--i4;
if(IsPlayerConnected(i) && pStats[i][pMember] == 5)
count5++;
}
while(i4);
new seriu[10];
format(seriu, sizeof(seriu), "%d", count);
PlayerTextDrawSetString(playerid,Textdraw13_17[playerid][0],seriu);
new seriu1[10];
format(seriu1, sizeof(seriu1), "%d", count2);
PlayerTextDrawSetString(playerid,Textdraw13_17[playerid][1],seriu1);
new seriu2[10];
format(seriu2, sizeof(seriu2), "%d", count3);
PlayerTextDrawSetString(playerid,Textdraw13_17[playerid][2],seriu2);
new seriu3[10];
format(seriu3, sizeof(seriu3), "%d", count4);
PlayerTextDrawSetString(playerid,Textdraw13_17[playerid][3],seriu3);
new seriu4[10];
format(seriu4, sizeof(seriu4), "%d", count5);
PlayerTextDrawSetString(playerid,Textdraw13_17[playerid][4],seriu4);


Все верно? Но почему то начинает показывать 20 и более :D

L0ndl3m
23.07.2014, 00:36
А так?


new
mem_count_arr[5],
val_string[4],
i = GetMaxPlayers();

do
{
--i;
if(IsPlayerConnected(i) && (1 <= pStats[i][pMember] <= 5))
mem_count_arr[pStats[i][pMember] - 1]++;
}
while(i);

i = 5;

do
{
--i;
valstr(val_string, mem_count_arr[i]);
PlayerTextDrawSetString(playerid, Textdraw13_17[playerid][i], val_string);
}
while(i);

lonin
23.07.2014, 14:37
А так?


new
mem_count_arr[5],
val_string[4],
i = GetMaxPlayers();

do
{
--i;
if(IsPlayerConnected(i) && (1 <= pStats[i][pMember] <= 5))
mem_count_arr[pStats[i][pMember] - 1]++;
}
while(i);

i = 5;

do
{
--i;
valstr(val_string, mem_count_arr[i]);
PlayerTextDrawSetString(playerid, Textdraw13_17[playerid][i], val_string);
}
while(i);


Так работает, но вылезла другая проблема: Если на сервере два человека(предполагаю что, даже если больше чем два) и один из них выходит, у другого пропадают все текстдравы...

L0ndl3m
23.07.2014, 14:45
Инвестигируйте паблик OnPlayerConnect, и покажите всё, что связано в этом паблике с этими текстдравами.

lonin
23.07.2014, 14:56
Вот текстдравы в паблике OnPlayerConnect():



Textdraw8 = TextDrawCreate(191.000000, 420.000000, "Grove"); // Пропадает этот
TextDrawLetterSize(Textdraw8, 0.500000, 1.000000);
TextDrawAlignment(Textdraw8, 0);
TextDrawColor(Textdraw8, 10027263);
TextDrawSetShadow(Textdraw8, 1);
TextDrawSetOutline(Textdraw8, 1);
TextDrawBackgroundColor(Textdraw8, 255);
TextDrawFont(Textdraw8, 1);
TextDrawSetProportional(Textdraw8, 1);

Textdraw9 = TextDrawCreate(246.000000, 420.000000, "Vagos"); // Пропадает этот
TextDrawLetterSize(Textdraw9, 0.500000, 1.000000);
TextDrawAlignment(Textdraw9, 0);
TextDrawColor(Textdraw9, -3342081);
TextDrawSetShadow(Textdraw9, 1);
TextDrawSetOutline(Textdraw9, 1);
TextDrawBackgroundColor(Textdraw9, 255);
TextDrawFont(Textdraw9, 1);
TextDrawSetProportional(Textdraw9, 1);

Textdraw10 = TextDrawCreate(301.000000, 420.000000, "Ballas"); // Пропадает этот
TextDrawLetterSize(Textdraw10, 0.500000, 1.000000);
TextDrawAlignment(Textdraw10, 0);
TextDrawColor(Textdraw10, -872349697);
TextDrawSetShadow(Textdraw10, 1);
TextDrawSetOutline(Textdraw10, 1);
TextDrawBackgroundColor(Textdraw10, 255);
TextDrawFont(Textdraw10, 1);
TextDrawSetProportional(Textdraw10, 1);

Textdraw11 = TextDrawCreate(352.000000, 420.000000, "Aztecas"); // Пропадает этот
TextDrawLetterSize(Textdraw11, 0.500000, 1.000000);
TextDrawAlignment(Textdraw11, 0);
TextDrawColor(Textdraw11, 16777215);
TextDrawSetShadow(Textdraw11, 1);
TextDrawSetOutline(Textdraw11, 1);
TextDrawBackgroundColor(Textdraw11, 255);
TextDrawFont(Textdraw11, 1);
TextDrawSetProportional(Textdraw11, 1);

Textdraw12 = TextDrawCreate(418.000000, 420.000000, "Rifa"); // Пропадает этот
TextDrawLetterSize(Textdraw12, 0.500000, 1.000000);
TextDrawAlignment(Textdraw12, 0);
TextDrawColor(Textdraw12, 1718026239);
TextDrawSetShadow(Textdraw12, 1);
TextDrawSetOutline(Textdraw12, 1);
TextDrawBackgroundColor(Textdraw12, 255);
TextDrawFont(Textdraw12, 1);
TextDrawSetProportional(Textdraw12, 1);

Textdraw13_17[playerid][0] = CreatePlayerTextDraw(playerid,211.000000, 432.000000, "0"); // остается
PlayerTextDrawLetterSize(playerid,Textdraw13_17[playerid][0], 0.500000, 1.000000);

Textdraw13_17[playerid][1] = CreatePlayerTextDraw(playerid,267.000000, 432.000000, "0"); // остается
PlayerTextDrawLetterSize(playerid,Textdraw13_17[playerid][1], 0.500000, 1.000000);

Textdraw13_17[playerid][2] = CreatePlayerTextDraw(playerid,320.000000, 432.000000, "0"); // остается
PlayerTextDrawLetterSize(playerid,Textdraw13_17[playerid][2], 0.500000, 1.000000);

Textdraw13_17[playerid][3] = CreatePlayerTextDraw(playerid,378.000000, 432.000000, "0"); // остается
PlayerTextDrawLetterSize(playerid,Textdraw13_17[playerid][3], 0.500000, 1.000000);

Textdraw13_17[playerid][4] = CreatePlayerTextDraw(playerid,427.000000, 432.000000, "0"); //остается
PlayerTextDrawLetterSize(playerid,Textdraw13_17[playerid][4], 0.500000, 1.000000);
for(new twix; twix < 0; twix++)
{
PlayerTextDrawAlignment(playerid,Textdraw13_17[playerid][twix], 0);
PlayerTextDrawColor(playerid,Textdraw13_17[playerid][twix], -6749953);
PlayerTextDrawSetShadow(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetOutline(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawBackgroundColor(playerid,Textdraw13_17[playerid][twix], 255);
PlayerTextDrawFont(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetProportional(playerid,Textdraw13_17[playerid][twix], 1);
}
/* ÑÒÀÒÈÑÒÈÊÀ */
Textdraw18 = TextDrawCreate(27.000000, 174.000000, "MY STATS");// Пропадает этот
TextDrawLetterSize(Textdraw18, 0.433133, 1.611666);
TextDrawAlignment(Textdraw18, 1);
TextDrawColor(Textdraw18, -748417793);
TextDrawSetShadow(Textdraw18, 1);
TextDrawSetOutline(Textdraw18, 1);
TextDrawBackgroundColor(Textdraw18, 255);
TextDrawFont(Textdraw18, 1);
TextDrawSetProportional(Textdraw18, 1);

Textdraw19 = TextDrawCreate(27.000000, 186.000000, "Kills"); // Пропадает этот
TextDrawLetterSize(Textdraw19, 0.433133, 1.611666);
TextDrawAlignment(Textdraw19, 1);
TextDrawColor(Textdraw19, -1718252289);
TextDrawSetShadow(Textdraw19, 1);
TextDrawSetOutline(Textdraw19, 1);
TextDrawBackgroundColor(Textdraw19, 255);
TextDrawFont(Textdraw19, 1);
TextDrawSetProportional(Textdraw19, 1);

Textdraw20 = TextDrawCreate(27.000000, 198.000000, "Deaths"); // Пропадает этот
TextDrawLetterSize(Textdraw20, 0.433133, 1.611666);
TextDrawAlignment(Textdraw20, 1);
TextDrawColor(Textdraw20, -1718252289);
TextDrawSetShadow(Textdraw20, 1);
TextDrawSetOutline(Textdraw20, 1);
TextDrawBackgroundColor(Textdraw20, 255);
TextDrawFont(Textdraw20, 1);
TextDrawSetProportional(Textdraw20, 1);


- - - Добавлено - - -

Может проблема в OnPlayerDisconnect?


TextDrawDestroy

L0ndl3m
23.07.2014, 15:01
Не понял смысла куска вашего кода:


for(new twix; twix < 0; twix++)
{
PlayerTextDrawAlignment(playerid,Textdraw13_17[playerid][twix], 0);
PlayerTextDrawColor(playerid,Textdraw13_17[playerid][twix], -6749953);
PlayerTextDrawSetShadow(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetOutline(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawBackgroundColor(playerid,Textdraw13_17[playerid][twix], 255);
PlayerTextDrawFont(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetProportional(playerid,Textdraw13_17[playerid][twix], 1);
}


Здесь будет выполняться цикл 1 раз, нет смысла от него:


PlayerTextDrawAlignment(playerid, Textdraw13_17[playerid][0], 0);
PlayerTextDrawColor(playerid, Textdraw13_17[playerid][0], -6749953);
PlayerTextDrawSetShadow(playerid, Textdraw13_17[playerid][0], 1);
PlayerTextDrawSetOutline(playerid, Textdraw13_17[playerid][0], 1);
PlayerTextDrawBackgroundColor(playerid, Textdraw13_17[playerid][0], 255);
PlayerTextDrawFont(playerid, Textdraw13_17[playerid][0], 1);
PlayerTextDrawSetProportional(playerid, Textdraw13_17[playerid][0], 1);


А вы разве удаляете PlayerTextDraw с помощью функции TextDrawDestroy? Покажите паблик OnPlayerDisconnect.

lonin
23.07.2014, 15:04
Не понял смысла куска вашего кода:


for(new twix; twix < 0; twix++)
{
PlayerTextDrawAlignment(playerid,Textdraw13_17[playerid][twix], 0);
PlayerTextDrawColor(playerid,Textdraw13_17[playerid][twix], -6749953);
PlayerTextDrawSetShadow(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetOutline(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawBackgroundColor(playerid,Textdraw13_17[playerid][twix], 255);
PlayerTextDrawFont(playerid,Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetProportional(playerid,Textdraw13_17[playerid][twix], 1);
}


Здесь будет выполняться цикл 1 раз, смысла от него.


PlayerTextDrawAlignment(playerid, Textdraw13_17[playerid][0], 0);
PlayerTextDrawColor(playerid, Textdraw13_17[playerid][0], -6749953);
PlayerTextDrawSetShadow(playerid, Textdraw13_17[playerid][0], 1);
PlayerTextDrawSetOutline(playerid, Textdraw13_17[playerid][0], 1);
PlayerTextDrawBackgroundColor(playerid, Textdraw13_17[playerid][0], 255);
PlayerTextDrawFont(playerid, Textdraw13_17[playerid][0], 1);
PlayerTextDrawSetProportional(playerid, Textdraw13_17[playerid][0], 1);


А вы разве удаляете PlayerTextDraw с помощью функции TextDrawDestroy? Покажи паблик OnPlayerDisconnect.

Конечно нет! Дело в том что текстдравы созданы PlayerTextDraw остаются, остальные пропадают...



public OnPlayerDisconnect(playerid, reason)
{
ResetCarInfo(playerid);
Save_Player(playerid);
GUNVIRT[playerid] = 0;
GUNINIT[playerid] = 0;
KillTimer(count1[playerid]);
Hentum1[playerid] = 0;
if(pStats[playerid][pMember] == 1)
{
GroovePl -=1;
}
if(pStats[playerid][pMember] == 2)
{
VagosPl -=1;
}
if(pStats[playerid][pMember] == 3)
{
BallasPl -=1;
}
if(pStats[playerid][pMember] == 4)
{
AztecasPl -=1;
}
if(pStats[playerid][pMember] == 5)
{
RifaPl -=1;
}
/*Online áàíä*/
switch(gangnumber)
{
case 1: band_online[GANG_GROVE]--;
case 2: band_online[GANG_VAGOS]--;
case 3: band_online[GANG_BALLAS]--;
case 4: band_online[GANG_AZTECAS]--;
case 5: band_online[GANG_RIFA]--;
}
/*Online áàíä*/
IsConnected{playerid} = 0;

if(BattleZone == 1)
{
TextDrawDestroy(BandaCapt1a[playerid]);
TextDrawDestroy(BandaCapt2a[playerid]);
TextDrawDestroy(ScoreCapt1a[playerid]);
TextDrawDestroy(ScoreCapt2a[playerid]);
TextDrawDestroy(CaptTime[playerid]);
TextDrawDestroy(Textdraw0[playerid]);
TextDrawDestroy(Textdraw4[playerid]);
}

TextDrawDestroy(Textdraw5);
TextDrawDestroy(Textdraw6);
TextDrawDestroy(Textdraw7);
TextDrawDestroy(Textdraw8);//Grove online
TextDrawDestroy(Textdraw9);//Vagos online
TextDrawDestroy(Textdraw10);//Ballas online
TextDrawDestroy(Textdraw11);//Aztecas online
TextDrawDestroy(Textdraw12);//Rifa online
TextDrawDestroy(Textdraw18);//Stat
TextDrawDestroy(Textdraw19);//Kills
TextDrawDestroy(Textdraw20);//Deaths

gPlayerLogged[playerid] = 0;
pStats[playerid][pLoginTime] = 0;
new string[256];
gActivePlayers[playerid]--;
numplayers--;
SaveGZ();
SendDeathMessage(INVALID_PLAYER_ID,playerid,201);
if(GetPVarInt(playerid, "Kick") != 0) KillTimer(GetPVarInt(playerid, "Kick"));
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(GetPlayerState(i) == PLAYER_STATE_SPECTATING && Spectate[i] == playerid)
{
StopSpectate(i);
format(string, sizeof(string), "~r~PLAYER DISCONNECT");
GameTextForPlayer(i, string, 5000, 3);
TeleportTimer(playerid);
}
}
return true;
}

L0ndl3m
23.07.2014, 15:16
Что-то я не увидел удаления текстдравов при выходе игрока ( удалять надо, потому что в OnPlayerConnect заново создаются ):


PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][0]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][1]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][2]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][3]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][4]);


Кстати цикл в том случае нужен был, но там всего лишь для 1 текстдрава выполнялось. Замените:


for(new twix; twix < 5; twix++)
{
PlayerTextDrawAlignment(playerid, Textdraw13_17[playerid][twix], 0);
PlayerTextDrawColor(playerid, Textdraw13_17[playerid][twix], -6749953);
PlayerTextDrawSetShadow(playerid, Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetOutline(playerid, Textdraw13_17[playerid][twix], 1);
PlayerTextDrawBackgroundColor(playerid, Textdraw13_17[playerid][twix], 255);
PlayerTextDrawFont(playerid, Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetProportional(playerid, Textdraw13_17[playerid][twix], 1);
}

lonin
23.07.2014, 15:26
Что-то я не увидел удаления текстдравов при выходе игрока ( удалять надо, потому что в OnPlayerConnect заново создаются ):


PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][0]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][1]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][2]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][3]);
PlayerTextDrawDestroy(playerid, Textdraw13_17[playerid][4]);


Кстати цикл в том случае нужен был, но там всего лишь для 1 текстдрава выполнялось. Замените:


for(new twix; twix < 5; twix++)
{
PlayerTextDrawAlignment(playerid, Textdraw13_17[playerid][twix], 0);
PlayerTextDrawColor(playerid, Textdraw13_17[playerid][twix], -6749953);
PlayerTextDrawSetShadow(playerid, Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetOutline(playerid, Textdraw13_17[playerid][twix], 1);
PlayerTextDrawBackgroundColor(playerid, Textdraw13_17[playerid][twix], 255);
PlayerTextDrawFont(playerid, Textdraw13_17[playerid][twix], 1);
PlayerTextDrawSetProportional(playerid, Textdraw13_17[playerid][twix], 1);
}


Хорошо, это понятно, но как это влияет на другие текстдравы не PlayerTextdraw? Почему они пропадают?

L0ndl3m
23.07.2014, 15:34
Вы пробовали всё это же проделать с новым кодом?

lonin
23.07.2014, 15:42
Вы пробовали всё это же проделать с новым кодом?

Новый код поставил, сейчас попробуем.

lonin
23.07.2014, 16:38
Все равно слетают текста все кроме PlayerTextDraw :spiteful:

L0ndl3m
23.07.2014, 16:48
Все текстдравы, которые созданы с помощью функции TextDrawCreate и расположенные в паблике OnPlayerConnect засуньте в паблик OnGameModeInit. И никогда их не уничтожайте с помощью функции TextDrawDestroy. В паблике OnPlayerConnect используйте функцию TextDrawShowForPlayer для показа текстдрава, а в OnPlayerDisconnect используйте функцию TextDrawHideForPlayer для скрытия текстдрава для игрока.

lonin
23.07.2014, 19:35
Всем спасибо, проблемы решены! Можно закрывать!