Автор: Kamox
FS содержащит в себе фиксы для самых распространенных SA-MP багов, таких как:
Банни хоп
- При помощи прыжков во время быстрого бега можно добиться ещё большей скорости. Данный фикс очищает анимацию нарушителя и замораживает его на 3 секунды.
+С
- Нажимая клавишу "C" (По стандарту) игрок прерывает анимацию стрельбы, тем самым ускоряя её. Данный фикс переключает оружие нарушителя на кулаки/кастет и замораживает его на 3 секунды.
Slide
- При помощи данного бага игроки быстро передвигаются (На роликах ещё быстрее). При этом они могут стрелять. Данный фикс переключает оружие нарушителя на кулаки/кастет и замораживает его на 3 секунды.
Dialog Crush
- При вводе в диалоговое окно символа "%" сервер падает (Распространенный, но легко исправляемый баг). Данный фикс заменяет все символы "%" на "#" (Как в SendClientMessage).
Dialog colors
- Это не совсем баг, но если по мимо текста ввести ещё и цвет (Например: {33AA33} - Зеленый) исходный текст получится зеленого цвета. Данный фикс удаляет все HEX коды, заключенные в фигурные скобки ( "{" и "}" ).
Spawn money
- После "нормальной" смерти (Если после смерти игрок лежит на земле 2+ секунды, а не сразу спавнится) с игрока снимается $100, при этом GetPlayerMoney некоторое время показывает прежнюю сумму. Данный фикс отдает игроку $100 .При использовании данного фикса желательно убрать кик/бан за читерство денег. Оставить только их снятие.
Sprint
- Не баг, но всё же ... Многократно нажимая клавишу быстрого бега (По стандарту пробел) можно добиться ещё большей скорости быстрого бега. Данный фикс замораживает нарушителя на 3 секунды.
Knife bug
- Из-за плохой синхронизации SA-MP бывают такие моменты, что при "зарезании" игрока он остается жив. У нападающего он лежит и двигается в таком же положении, а у жертвы "зарезания" даже не происходило. Данный фикс очищает анимация "жертвы" если она избежала "зарезания", а на экране нападающего нет.
Knife kill
- Используя этот баг можно убить игрока "зарезанием" прямо на ходу. Данный фикс очищает анимацию нарушителя и "жертвы".
Scroll
- Данным багом пользуются для более быстрой перезарядки переключая оружие "туда-сюда". Данный фикс забирает оружие при использовании этого бага.
Любой из фиксов можно отключить по желанию. Для этого в FS есть
Code: Select all
new FixInfo[fixInfo]
- Код
Code: Select all
/*
Данный FS исправляет/запрещает использовать баги SA-MP:
Данная версия скрипта включает в себя:
BannyHop fix
SpawnMoney fix
DialogCrush fix
DialogColor fix
+C fix
Slide fix
Sprint fix
Knife Bug fix
Knife Kill fix
Автор FS: Kamox
Skype: k.amox
Mail: k.amox@mail.ru
Дата: 17.07.2012г
*/
#include <a_samp>
#define FREEZE_TIME 3000
enum fixInfo
{
bool:fixBannyHop,
bool:fixSpawnMoney,
bool:fixDialogCrush,
bool:fixDialogColor,
bool:fixCBug,
bool:fixSlideBug,
bool:fixSprintBug,
bool:fixKnifeBug,
bool:fixKnifeKill
}
new FixInfo[fixInfo] =
{
true, //BannyHop fix (Бег с прыжками)
true, //SpawnMoney fix (При спавне снимает $100)
true, //DialogCrush fix (Можно положить сервер вводя в диалоговое окно символ '%')
true, //DialogColor fix (Можно менять цвет текста встявляя коды цветов "{33CCFF}")
true, //C Bug fix (Баг со стрельбой с дигла)
true, //Slide fix (Езда с диглом)
true, //Sprint Bug fix (Быстрый бег многократным нажатием пробела)
true, //KnifeBug fix (Баг с ножом, когда у одного игрока видно, что другой игрок лежит)
true //KnifeKill fix (Этим багом можно убить игрока ножом на ходу
};
public OnFilterScriptInit()
{
print("\n--------------------------------------");
print(" Fix script by Kamox");
print("--------------------------------------\n");
return 1;
}
public OnPlayerConnect(playerid)
{
SetPVarInt(playerid, "BHTime", -1);
SetPVarInt(playerid, "MoneyTime", -1);
SetPVarInt(playerid, "CBugTime", -1);
SetPVarInt(playerid, "UnfreezeTime", -1);
SetPVarInt(playerid, "SlideTime", -1);
SetPVarInt(playerid, "SprintCount", -1);
SetPVarInt(playerid, "SprintTime", -1);
SetPVarInt(playerid, "KnifeTime", -1);
SetPVarInt(playerid, "KnifePlayer", INVALID_PLAYER_ID);
return 1;
}
public OnPlayerSpawn(playerid)
{
if(FixInfo[fixSpawnMoney] && GetPVarInt(playerid, "MoneyTime") != -1)
{
if(GetTickCount() > GetPVarInt(playerid, "MoneyTime"))
{
GivePlayerMoney(playerid, 100);
}
}
SetPVarInt(playerid, "MoneyTime", -1);
return 1;
}
public OnPlayerDeath(playerid, killerid, reason)
{
if(FixInfo[fixSpawnMoney])
{
SetPVarInt(playerid, "MoneyTime", GetTickCount() + 2000);
}
return 1;
}
stock BugFreezePlayer(playerid, time)
{
SetPVarInt(playerid, "UnfreezeTime", time);
TogglePlayerControllable(playerid, 0);
return true;
}
stock GetPlayerSpeed(playerid)
{
new Float:X, Float:Y, Float:Z;
GetPlayerVelocity(playerid, X, Y, Z);
return floatround( floatsqroot( X * X + Y * Y + Z * Z ) * 170.0 );
}
stock CheckDialogColor(text[], first, end)
{
if(text[first] != '{' || text[end] != '}') return false;
for(new i = first; i <= end; i ++)
{
if(text[i] >= '0' && text[i] <= '9') continue;
if(text[i] >= 'a' && text[i] <= 'f') continue;
if(text[i] >= 'A' && text[i] <= 'F') continue;
return false;
}
strdel(text, first, end + 1);
return true;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(FixInfo[fixBannyHop])
{
new tick = GetTickCount();
if(oldkeys & KEY_SPRINT)
{
SetPVarInt(playerid, "BHTime", tick + 250);
}
if(newkeys & KEY_JUMP)
{
if(tick < GetPVarInt(playerid, "BHTime"))
{
ClearAnimations(playerid);
BugFreezePlayer(playerid, tick + FREEZE_TIME);
}
SetPVarInt(playerid, "BHTime", -1);
}
}
if(FixInfo[fixKnifeBug] || FixInfo[fixKnifeKill])
{
if(newkeys & KEY_FIRE && oldkeys & 128)
{
if(GetPlayerWeapon(playerid) == 4)
{
if(GetPlayerAnimationIndex(playerid) == 747)
{
new knifeid = GetPlayerTargetPlayer(playerid);
if(knifeid != INVALID_PLAYER_ID)
{
if(FixInfo[fixKnifeKill] && GetPlayerSpeed(playerid) > 10)
{
ClearAnimations(playerid);
ClearAnimations(knifeid);
}
else if(FixInfo[fixKnifeBug])
{
new time = GetPlayerPing(playerid) + GetPlayerPing(knifeid);
SetPVarInt(knifeid, "KnifePlayer", playerid);
SetPVarInt(knifeid, "KnifeTime", GetTickCount() + time);
}
}
}
}
}
}
if(FixInfo[fixSprintBug])
{
if(newkeys & KEY_SPRINT)
{
new tick = GetTickCount();
if(GetPVarInt(playerid, "SprintTime") == -1 || tick < GetPVarInt(playerid, "SprintTime"))
{
if(GetPlayerSpeed(playerid) > 15)
{
if(GetPVarInt(playerid, "SprintCount") >= 5)
{
SetPVarInt(playerid, "SprintCount", -1);
SetPVarInt(playerid, "SprintTime", -1);
BugFreezePlayer(playerid, tick + FREEZE_TIME);
}
else
{
SetPVarInt(playerid, "SprintCount", GetPVarInt(playerid, "SprintCount") + 1);
SetPVarInt(playerid, "SprintTime", tick + 200);
}
}
}
else if(tick - GetPVarInt(playerid, "SprintTime") > 1000)
{
SetPVarInt(playerid, "SprintCount", -1);
SetPVarInt(playerid, "SprintTime", -1);
}
}
}
if(FixInfo[fixCBug])
{
if(GetPlayerWeapon(playerid) > 21)
{
new tick = GetTickCount();
if(oldkeys & KEY_FIRE) SetPVarInt(playerid, "CBugTime", tick + 500);
if(newkeys & KEY_CROUCH)
{
if(tick < GetPVarInt(playerid, "CBugTime"))
{
SetPlayerArmedWeapon(playerid, 0);
BugFreezePlayer(playerid, tick + FREEZE_TIME);
}
SetPVarInt(playerid, "CBugTime", -1);
}
}
}
if(FixInfo[fixSlideBug])
{
new tick = GetTickCount();
new FIRE_WEAPON = GetPlayerWeapon(playerid) > 21;
if(oldkeys & KEY_SPRINT && FIRE_WEAPON)
{
new keys, ud, lr;
GetPlayerKeys(playerid, keys, ud, lr);
if(ud != 0 || lr != 0)
{
SetPVarInt(playerid, "SlideTime", tick + 500);
}
}
if( (newkeys & KEY_FIRE || newkeys & 128) && FIRE_WEAPON )
{
if(tick < GetPVarInt(playerid, "SlideTime"))
{
SetPlayerArmedWeapon(playerid, 0);
BugFreezePlayer(playerid, tick + FREEZE_TIME);
}
SetPVarInt(playerid, "SlideTime", -1);
}
}
return 1;
}
public OnPlayerUpdate(playerid)
{
if(GetPVarInt(playerid, "UnfreezeTime") != -1)
{
if(GetTickCount() > GetPVarInt(playerid, "UnfreezeTime"))
{
SetPVarInt(playerid, "UnfreezeTime", -1);
TogglePlayerControllable(playerid, 1);
}
}
if(GetPVarInt(playerid, "KnifeTime") != -1)
{
if(GetPlayerAnimationIndex(playerid) == 745)
{
SetPVarInt(playerid, "KnifeTime", -1);
SetPVarInt(playerid, "KnifePlayer", INVALID_PLAYER_ID);
}
else if(GetTickCount() > GetPVarInt(playerid, "KnifeTime"))
{
SetPVarInt(playerid, "KnifeTime", -1);
SetPVarInt(playerid, "KnifePlayer", INVALID_PLAYER_ID);
ClearAnimations(playerid);
}
}
return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
for(new i, s = strlen(inputtext); i < s; i ++)
{
if(FixInfo[fixDialogCrush] && inputtext[i] == '%') inputtext[i] = '#';
if(FixInfo[fixDialogColor] && inputtext[i] == '{') CheckDialogColor(inputtext, i, i + 7);
}
return 1;
}