dvander@1889: /**
dvander@1889: * vim: set ts=4 :
dvander@1889: * =============================================================================
dvander@1889: * SourceMod Basic Fun Commands Plugin
dvander@1889: * Implements basic punishment commands.
dvander@1889: *
ds@1947: * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
dvander@1889: * =============================================================================
dvander@1889: *
dvander@1889: * This program is free software; you can redistribute it and/or modify it under
dvander@1889: * the terms of the GNU General Public License, version 3.0, as published by the
dvander@1889: * Free Software Foundation.
dvander@1889: *
dvander@1889: * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@1889: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@1889: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
dvander@1889: * details.
dvander@1889: *
dvander@1889: * You should have received a copy of the GNU General Public License along with
dvander@1889: * this program. If not, see .
dvander@1889: *
dvander@1889: * As a special exception, AlliedModders LLC gives you permission to link the
dvander@1889: * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@1889: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@1889: * by the Valve Corporation. You must obey the GNU General Public License in
dvander@1889: * all respects for all other code used. Additionally, AlliedModders LLC grants
dvander@1889: * this exception to all derivative works. AlliedModders LLC defines further
dvander@1889: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@1889: * or .
dvander@1889: *
dvander@1889: * Version: $Id$
dvander@1889: */
dvander@1889:
dvander@1889: #pragma semicolon 1
dvander@1889:
dvander@1889: #include
dvander@1889: #include
dvander@1889: #undef REQUIRE_PLUGIN
dvander@1889: #include
dvander@1889:
dvander@1889: public Plugin:myinfo =
dvander@1889: {
dvander@1889: name = "Fun Commands",
dvander@1889: author = "AlliedModders LLC",
dvander@1889: description = "Fun Commands",
dvander@1889: version = SOURCEMOD_VERSION,
dvander@1889: url = "http://www.sourcemod.net/"
dvander@1889: };
dvander@1889:
rbutler14@2501: // Admin Menu
dvander@1889: new Handle:hTopMenu = INVALID_HANDLE;
dvander@1889:
dvander@1889: // Sounds
dvander@1889: #define SOUND_BLIP "buttons/blip1.wav"
dvander@1889: #define SOUND_BEEP "buttons/button17.wav"
dvander@1889: #define SOUND_FINAL "weapons/cguard/charging.wav"
dvander@1889: #define SOUND_BOOM "weapons/explode3.wav"
dvander@1889: #define SOUND_FREEZE "physics/glass/glass_impact_bullet4.wav"
dvander@1889:
dvander@1889: // Following are model indexes for temp entities
skamonkey@3094: new g_BeamSprite = -1;
skamonkey@3094: new g_BeamSprite2 = -1;
skamonkey@3094: new g_HaloSprite = -1;
skamonkey@3094: new g_GlowSprite = -1;
skamonkey@3094: new g_ExplosionSprite = -1;
dvander@1889:
dvander@1889: // Basic color arrays for temp entities
rbutler14@2501: new redColor[4] = {255, 75, 75, 255};
rbutler14@2501: new orangeColor[4] = {255, 128, 0, 255};
rbutler14@2501: new greenColor[4] = {75, 255, 75, 255};
rbutler14@2501: new blueColor[4] = {75, 75, 255, 255};
rbutler14@2501: new whiteColor[4] = {255, 255, 255, 255};
rbutler14@2501: new greyColor[4] = {128, 128, 128, 255};
dvander@1889:
dvander@1889: // UserMessageId for Fade.
dvander@1889: new UserMsg:g_FadeUserMsgId;
dvander@1889:
rbutler14@2501: // Serial Generator for Timer Safety
rbutler14@2501: new g_Serial_Gen = 0;
rbutler14@2501:
ds@2583: new g_GameEngine = SOURCE_SDK_UNKNOWN;
ds@2583:
rbutler14@2501: // Flags used in various timers
rbutler14@2501: #define DEFAULT_TIMER_FLAGS TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE
rbutler14@2501:
dvander@1889: // Include various commands and supporting functions
dvander@1889: #include "funcommands/beacon.sp"
dvander@1889: #include "funcommands/timebomb.sp"
dvander@1889: #include "funcommands/fire.sp"
dvander@1889: #include "funcommands/ice.sp"
dvander@1889: #include "funcommands/gravity.sp"
dvander@1889: #include "funcommands/blind.sp"
dvander@1889: #include "funcommands/noclip.sp"
dvander@1889: #include "funcommands/drug.sp"
dvander@1889:
dvander@1889: public OnPluginStart()
dvander@1889: {
dvander@1889: if (FindPluginByFile("basefuncommands.smx") != INVALID_HANDLE)
dvander@1889: {
dvander@1889: ThrowError("This plugin replaces basefuncommands. You cannot run both at once.");
dvander@1889: }
dvander@1889:
dvander@1889: LoadTranslations("common.phrases");
dvander@2020: LoadTranslations("funcommands.phrases");
ds@2583: g_GameEngine = GuessSDKVersion();
dvander@1889: g_FadeUserMsgId = GetUserMessageId("Fade");
dvander@1889:
rbutler14@2501: RegisterCvars( );
rbutler14@2501: RegisterCmds( );
rbutler14@2501: HookEvents( );
dvander@1889:
dvander@1889: /* Account for late loading */
dvander@1889: new Handle:topmenu;
dvander@1889: if (LibraryExists("adminmenu") && ((topmenu = GetAdminTopMenu()) != INVALID_HANDLE))
dvander@1889: {
dvander@1889: OnAdminMenuReady(topmenu);
dvander@1889: }
dvander@1889: }
dvander@1889:
rbutler14@2501: RegisterCvars( )
rbutler14@2501: {
rbutler14@2501: // beacon
rbutler14@2501: g_Cvar_BeaconRadius = CreateConVar("sm_beacon_radius", "375", "Sets the radius for beacon's light rings.", 0, true, 50.0, true, 1500.0);
rbutler14@2501:
rbutler14@2501: // timebomb
rbutler14@2501: g_Cvar_TimeBombTicks = CreateConVar("sm_timebomb_ticks", "10.0", "Sets how long the timebomb fuse is.", 0, true, 5.0, true, 120.0);
rbutler14@2501: g_Cvar_TimeBombRadius = CreateConVar("sm_timebomb_radius", "600", "Sets the bomb blast radius.", 0, true, 50.0, true, 3000.0);
rbutler14@2501: g_Cvar_TimeBombMode = CreateConVar("sm_timebomb_mode", "0", "Who is killed by the timebomb? 0 = Target only, 1 = Target's team, 2 = Everyone", 0, true, 0.0, true, 2.0);
rbutler14@2501:
rbutler14@2501: // fire
rbutler14@2501: g_Cvar_BurnDuration = CreateConVar("sm_burn_duration", "20.0", "Sets the default duration of sm_burn and firebomb victims.", 0, true, 0.5, true, 20.0);
rbutler14@2501: g_Cvar_FireBombTicks = CreateConVar("sm_firebomb_ticks", "10.0", "Sets how long the FireBomb fuse is.", 0, true, 5.0, true, 120.0);
rbutler14@2501: g_Cvar_FireBombRadius = CreateConVar("sm_firebomb_radius", "600", "Sets the bomb blast radius.", 0, true, 50.0, true, 3000.0);
rbutler14@2501: g_Cvar_FireBombMode = CreateConVar("sm_firebomb_mode", "0", "Who is targetted by the FireBomb? 0 = Target only, 1 = Target's team, 2 = Everyone", 0, true, 0.0, true, 2.0);
rbutler14@2501:
rbutler14@2501: // ice
rbutler14@2501: g_Cvar_FreezeDuration = CreateConVar("sm_freeze_duration", "10.0", "Sets the default duration for sm_freeze and freezebomb victims", 0, true, 1.0, true, 120.0);
rbutler14@2501: g_Cvar_FreezeBombTicks = CreateConVar("sm_freezebomb_ticks", "10.0", "Sets how long the freezebomb fuse is.", 0, true, 5.0, true, 120.0);
rbutler14@2501: g_Cvar_FreezeBombRadius = CreateConVar("sm_freezebomb_radius", "600", "Sets the freezebomb blast radius.", 0, true, 50.0, true, 3000.0);
rbutler14@2501: g_Cvar_FreezeBombMode = CreateConVar("sm_freezebomb_mode", "0", "Who is targetted by the freezebomb? 0 = Target only, 1 = Target's team, 2 = Everyone", 0, true, 0.0, true, 2.0);
rbutler14@2501:
rbutler14@2501: AutoExecConfig(true, "funcommands");
rbutler14@2501: }
rbutler14@2501:
rbutler14@2501: RegisterCmds( )
rbutler14@2501: {
rbutler14@2501: RegAdminCmd("sm_beacon", Command_Beacon, ADMFLAG_SLAY, "sm_beacon <#userid|name> [0/1]");
rbutler14@2501: RegAdminCmd("sm_timebomb", Command_TimeBomb, ADMFLAG_SLAY, "sm_timebomb <#userid|name> [0/1]");
rbutler14@2501: RegAdminCmd("sm_burn", Command_Burn, ADMFLAG_SLAY, "sm_burn <#userid|name> [time]");
rbutler14@2501: RegAdminCmd("sm_firebomb", Command_FireBomb, ADMFLAG_SLAY, "sm_firebomb <#userid|name> [0/1]");
rbutler14@2501: RegAdminCmd("sm_freeze", Command_Freeze, ADMFLAG_SLAY, "sm_freeze <#userid|name> [time]");
rbutler14@2501: RegAdminCmd("sm_freezebomb", Command_FreezeBomb, ADMFLAG_SLAY, "sm_freezebomb <#userid|name> [0/1]");
rbutler14@2501: RegAdminCmd("sm_gravity", Command_Gravity, ADMFLAG_SLAY, "sm_gravity <#userid|name> [amount] - Leave amount off to reset. Amount is 0.0 through 5.0");
rbutler14@2501: RegAdminCmd("sm_blind", Command_Blind, ADMFLAG_SLAY, "sm_blind <#userid|name> [amount] - Leave amount off to reset.");
rbutler14@2501: RegAdminCmd("sm_noclip", Command_NoClip, ADMFLAG_SLAY|ADMFLAG_CHEATS, "sm_noclip <#userid|name>");
rbutler14@2501: RegAdminCmd("sm_drug", Command_Drug, ADMFLAG_SLAY, "sm_drug <#userid|name> [0/1]");
rbutler14@2501: }
rbutler14@2501:
rbutler14@2501: HookEvents( )
rbutler14@2501: {
rbutler14@2501: HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
rbutler14@2501: }
rbutler14@2501:
dvander@1889: public OnMapStart()
dvander@1889: {
dvander@1889: PrecacheSound(SOUND_BLIP, true);
dvander@1889: PrecacheSound(SOUND_BEEP, true);
dvander@1889: PrecacheSound(SOUND_FINAL, true);
dvander@1889: PrecacheSound(SOUND_BOOM, true);
dvander@1889: PrecacheSound(SOUND_FREEZE, true);
dvander@1889:
skamonkey@3200: new sdkversion = GuessSDKVersion();
skamonkey@3200: if (sdkversion == SOURCE_SDK_LEFT4DEAD || sdkversion == SOURCE_SDK_LEFT4DEAD2)
skamonkey@3094: {
skamonkey@3094: g_BeamSprite = PrecacheModel("materials/sprites/laserbeam.vmt");
skamonkey@3094: g_HaloSprite = PrecacheModel("materials/sprites/glow01.vmt");
skamonkey@3094: }
skamonkey@3094: else
skamonkey@3094: {
skamonkey@3094: g_BeamSprite = PrecacheModel("materials/sprites/laser.vmt");
skamonkey@3094: g_HaloSprite = PrecacheModel("materials/sprites/halo01.vmt");
skamonkey@3094: g_BeamSprite2 = PrecacheModel("sprites/bluelight1.vmt");
skamonkey@3094: g_GlowSprite = PrecacheModel("sprites/blueglow2.vmt");
skamonkey@3094: g_ExplosionSprite = PrecacheModel("sprites/sprite_fire01.vmt");
skamonkey@3094: }
skamonkey@3094:
dvander@1889: }
dvander@1889:
dvander@1889: public OnMapEnd()
dvander@1889: {
rbutler14@2501: KillAllBeacons( );
dvander@1889: KillAllTimeBombs();
dvander@1889: KillAllFireBombs();
dvander@1889: KillAllFreezes();
dvander@1889: KillAllDrugs();
dvander@1889: }
dvander@1889:
dvander@1889: public Action:Event_RoundEnd(Handle:event,const String:name[],bool:dontBroadcast)
dvander@1889: {
rbutler14@2501: KillAllBeacons( );
dvander@1889: KillAllTimeBombs();
dvander@1889: KillAllFireBombs();
dvander@1889: KillAllFreezes();
dvander@1889: KillAllDrugs();
dvander@1889: }
dvander@1889:
dvander@1889: public OnAdminMenuReady(Handle:topmenu)
dvander@1889: {
dvander@1889: /* Block us from being called twice */
dvander@1889: if (topmenu == hTopMenu)
dvander@1889: {
dvander@1889: return;
dvander@1889: }
dvander@1889:
dvander@1889: /* Save the Handle */
dvander@1889: hTopMenu = topmenu;
dvander@1889:
dvander@1889: /* Find the "Player Commands" category */
dvander@1889: new TopMenuObject:player_commands = FindTopMenuCategory(hTopMenu, ADMINMENU_PLAYERCOMMANDS);
dvander@1889:
dvander@1889: if (player_commands != INVALID_TOPMENUOBJECT)
dvander@1889: {
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_beacon",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_Beacon,
dvander@1889: player_commands,
dvander@1889: "sm_beacon",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_timebomb",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_TimeBomb,
dvander@1889: player_commands,
dvander@1889: "sm_timebomb",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_burn",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_Burn,
dvander@1889: player_commands,
dvander@1889: "sm_burn",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_firebomb",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_FireBomb,
dvander@1889: player_commands,
dvander@1889: "sm_firebomb",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_freeze",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_Freeze,
dvander@1889: player_commands,
dvander@1889: "sm_freeze",
dvander@1889: ADMFLAG_SLAY);
dvander@1889:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_freezebomb",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_FreezeBomb,
dvander@1889: player_commands,
dvander@1889: "sm_freezebomb",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_gravity",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_Gravity,
dvander@1889: player_commands,
dvander@1889: "sm_gravity",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_blind",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_Blind,
dvander@1889: player_commands,
dvander@1889: "sm_blind",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_noclip",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_NoClip,
dvander@1889: player_commands,
dvander@1889: "sm_noclip",
dvander@1889: ADMFLAG_SLAY);
rbutler14@2501:
dvander@1889: AddToTopMenu(hTopMenu,
dvander@1889: "sm_drug",
dvander@1889: TopMenuObject_Item,
dvander@1889: AdminMenu_Drug,
dvander@1889: player_commands,
dvander@1889: "sm_drug",
dvander@1889: ADMFLAG_SLAY);
dvander@1889: }
dvander@1889: }
dvander@1889: