258 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			SourcePawn
		
	
	
	
	
	
| #pragma semicolon 1
 | |
| 
 | |
| #define DEBUG
 | |
| 
 | |
| #define PLUGIN_AUTHOR "jenz"
 | |
| #define PLUGIN_VERSION "1.01"
 | |
| 
 | |
| #include <sourcemod>
 | |
| #include <sdkhooks>
 | |
| #include <sdktools>
 | |
| #include <smlib>
 | |
| #include <zr/infect.zr>
 | |
| #include <cstrike>
 | |
| 
 | |
| 
 | |
| //global
 | |
| float g_IAdminspin;
 | |
| float g_iBotairjump;
 | |
| int g_iDelay;
 | |
| bool g_bRoundStart;
 | |
| 
 | |
| public Plugin myinfo = 
 | |
| {
 | |
| 	name = "autism bot",
 | |
| 	author = PLUGIN_AUTHOR,
 | |
| 	description = "spawns the bot on a team",
 | |
| 	version = PLUGIN_VERSION,
 | |
| 	url = "www.unloze.com"
 | |
| };
 | |
| 
 | |
| public void OnMapStart()
 | |
| {
 | |
| 	g_IAdminspin = 0.0;
 | |
| 	g_iBotairjump = 1.0;
 | |
| 	g_iDelay = 0;
 | |
| }
 | |
| 
 | |
| public void OnPluginStart()
 | |
| {
 | |
| 	RegAdminCmd("sm_botspin", Cmd_botSpin, ADMFLAG_GENERIC);
 | |
| 	RegAdminCmd("sm_botjump", Cmd_botJump, ADMFLAG_GENERIC);
 | |
| 	
 | |
| 	//hook
 | |
| 	HookEvent("player_death", PlayerDeath);
 | |
| 	HookEvent("round_start", Event_roundStart, EventHookMode_Post);
 | |
| }
 | |
| 
 | |
| public void OnClientPostAdminCheck(int client)
 | |
| {
 | |
| 	if (IsFakeClient(client))
 | |
| 	{
 | |
| 		SDKHook(client, SDKHook_OnTakeDamagePost, OnTakeDamagePost);
 | |
| 		ChangeClientTeam(client, CS_TEAM_CT);
 | |
| 	}
 | |
| }
 | |
| public void Event_roundStart(Handle event, const char[] name, bool dontBroadcast)
 | |
| {
 | |
| 	g_bRoundStart = true;
 | |
| 	for (int i = 1; i < MaxClients; i++)
 | |
| 	{
 | |
| 		if (IsClientConnected(i) && IsClientInGame(i) && IsClientSourceTV(i) && IsPlayerAlive(i))
 | |
| 		{
 | |
| 			ForcePlayerSuicide(i);
 | |
| 			CreateTimer(0.5, safeSpec, i);
 | |
| 			break;
 | |
| 		}	
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public Action PlayerDeath(Handle event, const char[] name, bool dontBroadcast)
 | |
| {
 | |
| 	int client = GetClientOfUserId(GetEventInt(event, "userid"));
 | |
| 	if (IsClientSourceTV(client) && !g_bRoundStart)
 | |
| 	{
 | |
| 		CreateTimer(0.5, safeSpec, client);
 | |
| 		CreateTimer(9.0, respawn_func, client);
 | |
| 	}
 | |
| }
 | |
| public Action safeSpec(Handle timer, int client)
 | |
| {  
 | |
| 	ChangeClientTeam(client, CS_TEAM_SPECTATOR);
 | |
| }
 | |
| 
 | |
| public Action respawn_func(Handle timer, int client)
 | |
| {
 | |
| 	if (!g_bRoundStart)
 | |
| 	{
 | |
| 		ChangeClientTeam(client, CS_TEAM_CT);
 | |
| 		ServerCommand("sm_fakecommand %N say /zspawn", client);
 | |
| 		//ZR_InfectClient(client);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public Action Cmd_botSpin(int client, int args)
 | |
| {
 | |
| 	char inputArgs[250];
 | |
| 	float input;
 | |
| 	GetCmdArgString(inputArgs, sizeof(inputArgs));
 | |
| 	
 | |
| 	input = StringToFloat(inputArgs);
 | |
| 	PrintToChat(client, "spin value: %f", input);
 | |
| 	if (input == 0.0)
 | |
| 	{
 | |
| 		PrintToChat(client, "input failed");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	else if (input >= 360.0 || input <= -360.0)
 | |
| 	{
 | |
| 		PrintToChat(client, "Input Range: -360 to 360");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	g_IAdminspin = input;
 | |
| 	
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action Cmd_botJump(int client, int args)
 | |
| {
 | |
| 	char inputArgs[250];
 | |
| 	float input;
 | |
| 	GetCmdArgString(inputArgs, sizeof(inputArgs));
 | |
| 	
 | |
| 	input = StringToFloat(inputArgs);
 | |
| 	PrintToChat(client, "jump value: %f", input);
 | |
| 	if (input == 0.0)
 | |
| 	{
 | |
| 		PrintToChat(client, "input failed");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	else if (input >= 10.0 || input <= -10.0)
 | |
| 	{
 | |
| 		PrintToChat(client, "Input Range: -10 to 10");
 | |
| 		return Plugin_Handled;
 | |
| 	}
 | |
| 	g_iBotairjump = input;
 | |
| 	
 | |
| 	return Plugin_Handled;
 | |
| }
 | |
| 
 | |
| public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float move[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
 | |
| {
 | |
| 	if (IsFakeClient(client))
 | |
| 	{	
 | |
| 		if (g_IAdminspin == 0.0)
 | |
| 		{
 | |
| 			angles[1] += 30.0;
 | |
| 			if (angles[1] >= 360.0)
 | |
| 			{
 | |
| 				angles[1] = 0.0;
 | |
| 			}
 | |
| 			TeleportEntity(client, NULL_VECTOR, angles, NULL_VECTOR);
 | |
| 			++g_iDelay;
 | |
| 			if (g_iDelay >= 10)
 | |
| 			{
 | |
| 				buttons |= IN_ATTACK;
 | |
| 				g_iDelay = 0;
 | |
| 				buttons |= IN_DUCK;
 | |
| 				Client_Push(client);
 | |
| 			}
 | |
| 			return Plugin_Changed;
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 			angles[1] += g_IAdminspin;
 | |
| 			if (angles[1] >= 360.0)
 | |
| 			{
 | |
| 				angles[1] = 0.0;
 | |
| 			}
 | |
| 			TeleportEntity(client, NULL_VECTOR, angles, NULL_VECTOR);
 | |
| 			++g_iDelay;
 | |
| 			if (g_iDelay >= 10)
 | |
| 			{
 | |
| 				buttons |= IN_ATTACK;
 | |
| 				buttons |= IN_DUCK;
 | |
| 				g_iDelay = 0;
 | |
| 				Client_Push(client);
 | |
| 			}
 | |
| 			return Plugin_Changed;
 | |
| 		}
 | |
| 	}
 | |
| 	return Plugin_Continue;
 | |
| }
 | |
| 
 | |
| public void Client_Push (int client)
 | |
| {
 | |
| 	float newVel[3];
 | |
| 	int GroundEnt = GetEntPropEnt(client, Prop_Send, "m_hGroundEntity"); 
 | |
| 	if (GroundEnt == -1)
 | |
| 	{
 | |
| 		//PrintToChatAll("Bot %N is not on ground", client);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		int i_nr = GetRandomInt(1, 4);
 | |
| 		if (i_nr == 1)
 | |
| 		{
 | |
| 			newVel[1] += GetRandomInt(50, 350);
 | |
| 		}
 | |
| 		else if (i_nr == 2)
 | |
| 		{
 | |
| 			newVel[0] += GetRandomInt(50, 350);
 | |
| 		}
 | |
| 		else if (i_nr == 3)
 | |
| 		{
 | |
| 			newVel[0] -= GetRandomInt(50, 350);
 | |
| 		}
 | |
| 		else if (i_nr == 4)
 | |
| 		{
 | |
| 			newVel[1] -= GetRandomInt(50, 350);
 | |
| 		}
 | |
| 		newVel[2] += GetRandomInt(50, 350) * g_iBotairjump;
 | |
| 		//newVel[1] += GetRandomFloat(0.10, 270.10);
 | |
| 		Entity_SetAbsVelocity(client, newVel);
 | |
| 		//PrintToChatAll("Bot %N is on ground", client);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| public void ZR_OnClientInfected(int client, int attacker, bool motherInfect, bool respawnOverride, bool respawn)
 | |
| {
 | |
| 	if (!motherInfect)
 | |
| 	return;
 | |
| 	for (int i = 1; i <= MaxClients; i++)
 | |
| 	{
 | |
| 		if (IsClientConnected(i) && IsClientInGame(i) && IsClientSourceTV(i))
 | |
| 		{
 | |
| 			g_bRoundStart = false;
 | |
| 			CreateTimer(1.0, respawn_func, i);	
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| // Purpose: damageHook
 | |
| //----------------------------------------------------------------------------------------------------
 | |
| 
 | |
| public Action OnTakeDamagePost(victim, &attacker, &inflictor, &Float:damage, &damagetype)
 | |
| {
 | |
| 	// Don't pass alive players
 | |
|     if (IsPlayerAlive(victim))
 | |
|     {
 | |
|     	return Plugin_Handled;
 | |
|     }
 | |
|     if (attacker == 0)
 | |
|     {
 | |
|         // World
 | |
|          ServerCommand("sm_fakecommand #%i say \"fuck u world!\"", GetClientUserId(victim), attacker);
 | |
|     }
 | |
|     else if (victim == attacker)
 | |
|     {
 | |
|         // Suicide
 | |
|          ServerCommand("sm_fakecommand #%i say \"fuck ur admin abuse!\"", GetClientUserId(victim), attacker);
 | |
|     }
 | |
|     else if (1 <= attacker <= MaxClients)
 | |
|     {
 | |
|    		ServerCommand("sm_fakecommand #%i say \"%N fuck u m8!\"", GetClientUserId(victim), attacker);
 | |
|     }
 | |
|     return Plugin_Handled;
 | |
| } |