[FilterScript] Samp Bugs Fix
#1

Hello, this is my first Filterscript, a Friend and i made this, it should fix some SAMP Things like Anti Bunnyhopping (usefull for some Servers, where Bunnyhopping is not allowed) or Anti Knifebugging (Killing a Guy from behind with a Knife). But we have it not tested yet. But whatever, here is it:

Код:
#include <a_samp>

#define FREEZE_TIME 3000


//This is a Filterscript, to fix some SA-MP Bugs, like the Knifebug or Anti Bunnyhopping.



//	Bunnyhop Fix
//	SpawnMoney Fix
//	DialogCrush Fix
//	DialogColor Fix
//	+C Fix
//	Slide Fix
//	Sprint Fix
//	Knifebugging Fix
//	KnifeKill Fix


enum fixInfo
{
	bool:fixBannyHop,
	bool:fixSpawnMoney,
	bool:fixDialogCrush,
	bool:fixDialogColor,
	bool:fixCBug,
	bool:fixSlideBug,
	bool:fixSprintBug,
	bool:fixKnifeBug,
	bool:fixKnifeKill
}

new FixInfo[fixInfo] =
{
	true, //BunnyHop fix
	true, //SpawnMoney fix
	true, //DialogCrush fix 
	true, //DialogColor fix 
	true, //C Bug fix 
	true, //Slide fix 
	true, //Sprint Bug fix 
	true, //KnifeBug fix 
	true  //KnifeKill fix
};


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] && 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;
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)