Просмотр полной версии : [Вопрос] Проверка
Что то у меня не получается сделать проверку(GetPlayerTeam), нужно: если игрок стреляет в игрока из свой команды, то код не должен выполняться, а если он стреляет в игрока без команды или в игрока с другой команды, то должен работать
Делаю так:
public OnPlayerGiveDamage(playerid, damagedid, Float: amount, weaponid, bodypart)
{
if(damagedid != INVALID_PLAYER_ID && Chck[damagedid] == 0 && GetPlayerTeam(playerid) != GetPlayerTeam(damagedid))
{
//Код
}
return true;
}
Ну сделай так:
GetPlayerTeam(playerid) == GetPlayerTeam(damagedid) return 1;
Ну вот так :)
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;
}
Не факт, что код вообще будет работать. Ибо в SA-MP вшита проверка на команды и если игроки в одной команде, отличной от нуля, они не могут нанести друг другу урон. Ну так на wiki.sa-mp написано, по крайней мере :)
Ну сделай так:
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;
} но результат тот же
Что вам именно надо? Всю задумку опишите
в SA-MP вшита проверка на команды и если игроки в одной команде, отличной от нуля, они не могут нанести друг другу урон. Ну так на wiki.sa-mp написано, по крайней мере :)
Точно. Но с помощью пабликов урон наносят с серверной стороны. Так античит на ГМ делают :spiteful:
Что вам именно надо? Всю задумку опишите
Ну я сделал анти-гм через таймер(проверяет хп/броню)
Если игрок будет стрелять в игрока из свой команды, то анти чит сработает,потому что хп не отнимет, вот я и поставил проверку, но теперь анти-гм не срабатывает если игрок вне дм (то есть работает только на дм зоне когда игрок из команды 1 стреляет в игрока из команды 2)
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
При выходе с DM зоны, надеюсь, не забываете устанавливать нулевую команду?
if(GetPlayerTeam(playerid) && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
При выходе с DM зоны, надеюсь, не забываете устанавливать нулевую команду?
Спасибо, нет
- - - Добавлено - - -
Че то не помогло, все так же
Покажите полный код коллбэка
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;
}
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;
}
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;
}
Все так же(
Ну тогда давайте по стариночке, с логами
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;
}
Стрельнул вне дм (сразу после захода на серв)
[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
if(GetPlayerTeam(playerid) != 255 && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
и при выходе с DM зон устанавливайте игрокам команду под номером 255
if(GetPlayerTeam(playerid) != 255 && GetPlayerTeam(playerid) == GetPlayerTeam(damagedid)) return 1;
и при выходе с DM зон устанавливайте игрокам команду под номером 255
Вроде работает)
И так устанавливаю 255 ведь это обнуление команды игрока
- - - Добавлено - - -
А еще вопрос, на спавне игрока замораживает на несколько сек TogglePlayerControllable можно ли как нибудь проверить заморожен ли игрок
типо if(TogglePlayerControllable(playerid,1)) ? или только с помощью переменных?
underwoker
03.07.2014, 05:15
только с помощью переменных
Угу
Смотри как сделано тут и делай по примеру
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
Сделал так:
TogglePlayerControllableEx(playerid,var)
{
if(var == 1)
{
FreezTest[playerid] = 1;
TogglePlayerControllable(playerid,1);
}
else
{
FreezTest[playerid] = 0;
TogglePlayerControllable(playerid,0);
}
}
Вроде работает
Эмм...
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;
}
Или допустим даже так:
TogglePlayerControllableEx(const playerid, const freeze)
return TogglePlayerControllable(playerid, FreezTest[playerid] = !!freeze);
Или так:
#define TogglePlayerControllableEx(%0,%1) \
TogglePlayerControllable(%0, FreezTest[%0] = !!%1);
:grin:
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot