PDA

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



codeo
02.07.2014, 20:15
Что то у меня не получается сделать проверку(GetPlayerTeam), нужно: если игрок стреляет в игрока из свой команды, то код не должен выполняться, а если он стреляет в игрока без команды или в игрока с другой команды, то должен работать


Делаю так:

public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
if(damagedid != INVALID_PLAYER_ID && Chck[damagedid] == 0 && GetPlayerTeam(playerid) != GetPlayerTeam(damagedid))
{
//Код
}
return true;
}

Edwin
02.07.2014, 20:18
Ну сделай так:

GetPlayerTeam(playerid) == GetPlayerTeam(damagedid) return 1;

Flime
02.07.2014, 20:27
Ну вот так :)

public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
if(damagedid != INVALID_PLAYER_ID && Chck[damagedid] == 0)
{
if(GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
//Код
}
return 1;
}

DeimoS
02.07.2014, 20:34
Не факт, что код вообще будет работать. Ибо в SA-MP вшита проверка на команды и если игроки в одной команде, отличной от нуля, они не могут нанести друг другу урон. Ну так на wiki.sa-mp написано, по крайней мере :)

codeo
02.07.2014, 20:58
Ну сделай так:

GetPlayerTeam(playerid) == GetPlayerTeam(damagedid) return 1;

Работает только тогда когда игроки из противоположных команд (как и должно быть)
Но когда игроки не на дм, код не робит

Так же пытался так:
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
if(damagedid != INVALID_PLAYER_ID && ChckGM[damagedid] == 0)
{
if(cs1[playerid] == cs1[damagedid]) return 1;
{
....Код
}
}
return true;
} но результат тот же

DeimoS
02.07.2014, 21:36
Что вам именно надо? Всю задумку опишите

OKStyle
02.07.2014, 22:18
в SA-MP вшита проверка на команды и если игроки в одной команде, отличной от нуля, они не могут нанести друг другу урон. Ну так на wiki.sa-mp написано, по крайней мере :)
Точно. Но с помощью пабликов урон наносят с серверной стороны. Так античит на ГМ делают :spiteful:

codeo
02.07.2014, 22:20
Что вам именно надо? Всю задумку опишите

Ну я сделал анти-гм через таймер(проверяет хп/броню)
Если игрок будет стрелять в игрока из свой команды, то анти чит сработает,потому что хп не отнимет, вот я и поставил проверку, но теперь анти-гм не срабатывает если игрок вне дм (то есть работает только на дм зоне когда игрок из команды 1 стреляет в игрока из команды 2)

DeimoS
02.07.2014, 22:26
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
При выходе с DM зоны, надеюсь, не забываете устанавливать нулевую команду?

codeo
02.07.2014, 22:35
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
При выходе с DM зоны, надеюсь, не забываете устанавливать нулевую команду?

Спасибо, нет

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

Че то не помогло, все так же

DeimoS
02.07.2014, 22:37
Покажите полный код коллбэка

codeo
02.07.2014, 22:39
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
if(damagedid != INVALID_PLAYER_ID && ChckGM[damagedid] == 0)
{
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
{
GetPlayerArmour(damagedid, arma);
if(amount != 0 && arma > 0)
{
ChckGM[damagedid] = 1;
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
else if(amount != 0 && arma == 0)
{
ChckGM[damagedid] = 1;
GetPlayerHealth(damagedid, vida);
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
}
}
return true;
}

DeimoS
02.07.2014, 22:41
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
if(damagedid != INVALID_PLAYER_ID && ChckGM[damagedid] == 0)
{
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
GetPlayerArmour(damagedid, arma);
if(amount != 0 && arma > 0)
{
ChckGM[damagedid] = 1;
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
else if(amount != 0 && arma == 0)
{
ChckGM[damagedid] = 1;
GetPlayerHealth(damagedid, vida);
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
}
return true;
}

codeo
02.07.2014, 22:47
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
if(damagedid != INVALID_PLAYER_ID && ChckGM[damagedid] == 0)
{
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
GetPlayerArmour(damagedid, arma);
if(amount != 0 && arma > 0)
{
ChckGM[damagedid] = 1;
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
else if(amount != 0 && arma == 0)
{
ChckGM[damagedid] = 1;
GetPlayerHealth(damagedid, vida);
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
}
return true;
}



Все так же(

DeimoS
02.07.2014, 22:55
Ну тогда давайте по стариночке, с логами
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
printf("playerid = %d", playerid);
printf("damagedid = %d", damagedid);
printf("ChckGM[damagedid] = %d", ChckGM[damagedid]);
printf("GetPlayerTeam(playerid) = %d", GetPlayerTeam(playerid));
printf("GetPlayerTeam(damagedid) = %d", GetPlayerTeam(damagedid));
if(damagedid != INVALID_PLAYER_ID && ChckGM[damagedid] == 0)
{
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
GetPlayerArmour(damagedid, arma);
if(amount != 0 && arma > 0)
{
ChckGM[damagedid] = 1;
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
else if(amount != 0 && arma == 0)
{
ChckGM[damagedid] = 1;
GetPlayerHealth(damagedid, vida);
SetTimerEx("CheckGm", 2000, false, "i", damagedid);
}
}
return true;
}

codeo
02.07.2014, 23:02
Стрельнул вне дм (сразу после захода на серв)

[23:58:57] playerid = 1
[23:58:57] damagedid = 0
[23:58:57] ChckGM[damagedid] = 0
[23:58:57] GetPlayerTeam(playerid) = 255
[23:58:57] GetPlayerTeam(damagedid) = 255

Стрельнул когда игроки в одной команде

[00:00:42] playerid = 1
[00:00:42] damagedid = 0
[00:00:42] ChckGM[damagedid] = 0
[00:00:42] GetPlayerTeam(playerid) = 1
[00:00:42] GetPlayerTeam(damagedid) = 1

Стрельнул когда игроки в разных командах

[00:03:39] playerid = 0
[00:03:39] damagedid = 1
[00:03:39] ChckGM[damagedid] = 0
[00:03:39] GetPlayerTeam(playerid) = 2
[00:03:39] GetPlayerTeam(damagedid) = 1

[00:03:40] playerid = 0 // второй выстрел
[00:03:40] damagedid = 1
[00:03:40] ChckGM[damagedid] = 1
[00:03:40] GetPlayerTeam(playerid) = 2
[00:03:40] GetPlayerTeam(damagedid) = 1

DeimoS
02.07.2014, 23:08
if(GetPlayerTeam(playerid) != 255 && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
и при выходе с DM зон устанавливайте игрокам команду под номером 255

codeo
02.07.2014, 23:31
if(GetPlayerTeam(playerid) != 255 && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
и при выходе с DM зон устанавливайте игрокам команду под номером 255

Вроде работает)

И так устанавливаю 255 ведь это обнуление команды игрока

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


А еще вопрос, на спавне игрока замораживает на несколько сек TogglePlayerControllable можно ли как нибудь проверить заморожен ли игрок
типо if(TogglePlayerControllable(playerid,1)) ? или только с помощью переменных?

underwoker
03.07.2014, 05:15
только с помощью переменных
Угу

DeimoS
03.07.2014, 11:28
Смотри как сделано тут и делай по примеру
http://pro-pawn.ru/showthread.php?6278-dc_spp-%28%D1%82%D0%B5%D0%BB%D0%B5%D0%BF%D0%BE%D1%80%D1%82%D0%B0%D1%86%D0%B8%D1%8F-%D0%B2-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%8C%D0%B5%D1%80%D1%8B-%D1%81-0%29

codeo
03.07.2014, 11:53
Сделал так:


TogglePlayerControllableEx(playerid,var)
{
if(var == 1)
{
FreezTest[playerid] = 1;
TogglePlayerControllable(playerid,1);
}
else
{
FreezTest[playerid] = 0;
TogglePlayerControllable(playerid,0);
}
}

Вроде работает

DeimoS
03.07.2014, 12:09
Эмм...

TogglePlayerControllableEx(playerid, var)
{
FreezTest[playerid] = var;
TogglePlayerControllable(playerid, var);
}

А лучше так

TogglePlayerControllableEx(playerid, var)
{
if(var != (0|1)) return printf("Error: В функцию \"TogglePlayerControllableEx\" попало неверное значение (%d)", var);
FreezTest[playerid] = var;
TogglePlayerControllable(playerid, var);
return 1;
}

L0ndl3m
03.07.2014, 12:19
Или допустим даже так:


TogglePlayerControllableEx(const playerid, const freeze)
return TogglePlayerControllable(playerid, FreezTest[playerid] = !!freeze);



Или так:


#define TogglePlayerControllableEx(%0,%1) \
TogglePlayerControllable(%0, FreezTest[%0] = !!%1);

:grin: