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;
 | 
						|
} |