Просмотр полной версии : [Мануал] Anti GM (GodMode)
Доброго времени суток, форумчане.
Вот предоставлю античит на GodMod.
К инклудам:
#include <YSF>
Ко всем переменным, добавим:
new
ShotsTotal[MAX_PLAYERS],
ShotsDoneEffect[MAX_PLAYERS]
;
Далее в каблек public OnPlayerTakeDamage, добавим:
if(!IsPlayerPaused(playerid)) ShotsDoneEffect[playerid]++;
else { ShotsTotal[playerid] = 0; ShotsDoneEffect[playerid] = 0; }
Далее в калбек public OnPlayerWeaponShot, добавим:
if(hittype == BULLET_HIT_TYPE_PLAYER)
{
if(!IsPlayerPaused(hitid))
{
ShotsTotal[hitid]++;
if(ShotsTotal[hitid] - ShotsDoneEffect[hitid] > 1)
{
Kick(hitid); //cheater
}
}
}
Ну и последнее, в калбек public OnPlayerDisconnect, добавим 2 строчки:
ShotsTotal[playerid] = 0;
ShotsDoneEffect[playerid] = 0;
И вот на этом всё! Античит готов. Пользуйтесь.
Материал скопирован с forum.sa-mp.com
Источник - http://forum.sa-mp.com/showthread.php?t=553615
gangzone.ini
03.01.2015, 13:23
IsPlayerPaused ?
IsPlayerPaused ?
Проверка на паузу, использует ли ESC
Проверка на паузу, использует ли ESC
И что с этого? Это не стандартная функция.
Материал скопирован с forum.sa-mp.com
Сама тема - http://forum.sa-mp.com/showthread.php?t=553615
Кипоп мафака - https://github.com/Anuris/-SA-MP-Anti-GodMode/blob/master/AntiGM.pwn
Maranzalla
03.01.2015, 16:23
видимо IsPlayerPaused где-то в #include <YSF>, который автор кстати забыл указать
Всё подправил тему. Источника указал.
Я же не писал, что я автор)
ТС, придумайте что-нибудь на счёт функции / макроса IsPlayerPaused. Из-за небольшой системы загружать всю библиотеку очень не логично.
Хорошо. На примере покажу как можно это реализовать.
В OnPlayerUpdate устанавливаем значение переменной игрока в тиках:
SetPVarInt(playerid, "player_afk_time", GetTickCount());
Данный паблик вызывается только тогда, когда игрок не находится в AFK. То есть, если игрок ушёл в AFK, мы замерили то время, когда он в последний раз был AFK.
Далее просто проверяем проверкой, сколько времени прошло с начала AFK игрока данным способом:
if(GetTickCount() - GetPVarInt(playerid, "player_afk_time") > 3000) {
// игрок находится в AFK
}
Почему проверка на больше чем 3000 милисекунд ( а это 3 секунды )? Дело в том, что при стате игрока: PLAYER_STATE_WASTED сервер считает, игрок в AFK, из-за того что он не заспавнился.
Далее, если не особо хочется писать длинный код на проверку, показанную выше можно сделать полезный макрос ( в данном случае назовём его также, как в Вашем мануале ), который мы добавим в начало скрипта:
#define IsPlayerPaused(%0) \
GetTickCount() - GetPVarInt(%0, "player_afk_time") > 3000
И используем в данном случае также как и в Вашем мануале:
if (IsPlayerPaused(playerid))
// игрок находится в AFK
Вот мы и избавились от подключения лишней библиотеки. :mosking:
ТС, придумайте что-нибудь на счёт функции / макроса IsPlayerPaused. Из-за небольшой системы загружать всю библиотеку очень не логично.
Хорошо. На примере покажу как можно это реализовать.
В OnPlayerUpdate устанавливаем значение переменной игрока в тиках:
SetPVarInt(playerid, "player_afk_time", GetTickCount());
Данный паблик вызывается только тогда, когда игрок не находится в AFK. То есть, если игрок ушёл в AFK, мы замерили то время, когда он в последний раз был AFK.
Далее просто проверяем проверкой, сколько времени прошло с начала AFK игрока данным способом:
if(GetTickCount() - GetPVarInt(playerid, "player_afk_time") > 3000) {
// игрок находится в AFK
}
Почему проверка на больше чем 3000 милисекунд ( а это 3 секунды )? Дело в том, что при стате игрока: PLAYER_STATE_WASTED сервер считает, игрок в AFK, из-за того что он не заспавнился.
Далее, если не особо хочется писать длинный код на проверку, показанную выше можно сделать полезный макрос ( в данном случае назовём его также, как в Вашем мануале ), который мы добавим в начало скрипта:
#define IsPlayerPaused(%0) \
GetTickCount() - GetPVarInt(%0, "player_afk_time") > 3000
И используем в данном случае также как и в Вашем мануале:
if (IsPlayerPaused(playerid))
// игрок находится в AFK
Вот мы и избавились от подключения лишней библиотеки. :mosking:
Отлично)
Мануал-то исправлять будете?
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{
new Float: vida, Float: armadura, Float: dmg;
GetPlayerArmour(damagedid, armadura);
GetPlayerHealth(damagedid, vida);
if(armadura > 0)
{
if(amount > armadura)
{
dmg = amount - armadura;
vida = vida - dmg;
SetPlayerArmour(damagedid, 0.0);
SetPlayerHealth(damagedid, vida);
return 1;
}
armadura = armadura - amount;
SetPlayerArmour(damagedid, armadura);
}
if(armadura < 1)
{
vida = vida - amount;
SetPlayerHealth(damagedid, vida);
}
return true;
}
разве так не легче?
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid)
{
new Float: vida, Float: armadura, Float: dmg;
GetPlayerArmour(damagedid, armadura);
GetPlayerHealth(damagedid, vida);
if(armadura > 0)
{
if(amount > armadura)
{
dmg = amount - armadura;
vida = vida - dmg;
SetPlayerArmour(damagedid, 0.0);
SetPlayerHealth(damagedid, vida);
return 1;
}
armadura = armadura - amount;
SetPlayerArmour(damagedid, armadura);
}
if(armadura < 1)
{
vida = vida - amount;
SetPlayerHealth(damagedid, vida);
}
return true;
}
разве так не легче?
На сколько знаю, есть чит, который будет бесконечно убивать всех на сервере.
+ при использовании некоторых ГМ(ов) OnPlayerGiveDamage не вызывается.
Maranzalla
14.01.2015, 03:29
На сколько знаю, есть чит, который будет бесконечно убивать всех на сервере.
+ при использовании некоторых ГМ(ов) OnPlayerGiveDamage не вызывается.
да есть такой чит
- - - Добавлено - - -
ТС, придумайте что-нибудь на счёт функции / макроса IsPlayerPaused. Из-за небольшой системы загружать всю библиотеку очень не логично.
Хорошо. На примере покажу как можно это реализовать.
В OnPlayerUpdate устанавливаем значение переменной игрока в тиках:
SetPVarInt(playerid, "player_afk_time", GetTickCount());
Данный паблик вызывается только тогда, когда игрок не находится в AFK. То есть, если игрок ушёл в AFK, мы замерили то время, когда он в последний раз был AFK.
Далее просто проверяем проверкой, сколько времени прошло с начала AFK игрока данным способом:
if(GetTickCount() - GetPVarInt(playerid, "player_afk_time") > 3000) {
// игрок находится в AFK
}
Почему проверка на больше чем 3000 милисекунд ( а это 3 секунды )? Дело в том, что при стате игрока: PLAYER_STATE_WASTED сервер считает, игрок в AFK, из-за того что он не заспавнился.
Далее, если не особо хочется писать длинный код на проверку, показанную выше можно сделать полезный макрос ( в данном случае назовём его также, как в Вашем мануале ), который мы добавим в начало скрипта:
#define IsPlayerPaused(%0) \
GetTickCount() - GetPVarInt(%0, "player_afk_time") > 3000
И используем в данном случае также как и в Вашем мануале:
if (IsPlayerPaused(playerid))
// игрок находится в AFK
Вот мы и избавились от подключения лишней библиотеки. :mosking:
почему именно 3000?
Читать внимательнее надо было, я писал почему.
Maranzalla
17.01.2015, 02:29
кароче чушь с ложными срабатываниями - х3 почему но на практике убедился в этом
- - - Добавлено - - -
Читать внимательнее надо было, я писал почему.
Почему проверка на больше чем 3000 милисекунд ( а это 3 секунды )? Дело в том, что при стате игрока: PLAYER_STATE_WASTED сервер считает, игрок в AFK, из-за того что он не заспавнился.
вообщето я не спрашиваю почему больше 3 секунд я спрашиваю почему не меньше 3сек почему не 1200 миллисекунд или 500?читай внимательно вначале сам!
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot