#pragma semicolon 1 /****** I N C L U D E S *****/ #include #include #include #include #include #undef REQUIRE_PLUGIN #include #include #include #include "rtd/#perks.sp" /******* D E F I N E S ******/ #define PLUGIN_VERSION "1.02" #define CHAT_PREFIX "\x07FFD700[RTD]\x01" #define CONS_PREFIX "[RTD]" #define PERK_MAX_COUNT 64 #define PERK_MAX_LOW 32 #define PERK_MAX_HIGH 64 #define PERK_MAX_VERYH 128 #define CHAT_AD 1 #define CHAT_APPROLLER 2 #define CHAT_APPOTHER 4 #define CHAT_REMROLLER 8 #define CHAT_REMOTHER 16 #define CHAT_REASONS 32 #define PERK_COLOR_GOOD "\x0732CD32" #define PERK_COLOR_BAD "\x078650AC" #define FLAG_FEIGNDEATH (1 << 5) #define FLAGS_CVARS FCVAR_PLUGIN|FCVAR_NOTIFY #define LASERBEAM "sprites/laserbeam.vmt" #define UPDATE_URL "https://bitbucket.org/Phil25/rtd/raw/default/update.txt" /********* E N U M S ********/ enum Perks{ String:sName[PERK_MAX_LOW], bool:bGood, String:sSound[PERK_MAX_HIGH], String:sToken[PERK_MAX_LOW], iTime, iClasses, Handle:hWeaponClasses, String:sPref[PERK_MAX_HIGH], Handle:hTags, bool:bIsDisabled, bool:bIsExternal, Function:funcCallback, Handle:plParent }; int ePerks[PERK_MAX_COUNT][Perks]; enum ClientInfo{ bool:bRolling, iLastRoll, iLastPerk, iGreatLastPerk, iCurPerk, iPerkEnd, Handle:hPerkTimer, Handle:hHudSync, iGroupRollId }; int eClients[MAXPLAYERS+1][ClientInfo]; enum GroupRolls{ bool:bActive, iGroupPerkId, Handle:hClientArray, iClientCount } int eGroup[MAXPLAYERS+1][GroupRolls]; /********* M A N A G E R ********/ #include "rtd/#manager.sp" //For info, go to the script itself /***** V A R I A B L E S ****/ char g_sTeamColors[][] = {"\x07B2B2B2", "\x07B2B2B2", "\x07FF4040", "\x0799CCFF"}; int g_iPerkCount = 0; int g_iCorePerkCount = 0; bool g_bTempPrint = false; bool g_bPluginUpdater = false; bool g_bPluginFriendly = false; bool g_bPluginFriendlySimple = false; bool g_bIsRegisteringOpen = false; bool g_bIsUpdateForced = false; Handle g_hDescriptionMenu = INVALID_HANDLE; bool g_bIsGameArena = false; /***** C O N V A R S ****/ Handle g_hCvarPluginEnabled; bool g_bCvarPluginEnabled = true; #define DESC_PLUGIN_ENABLED "0/1 - Enable or disable the plugin." Handle g_hCvarAutoUpdate; bool g_bCvarAutoUpdate = true; #define DESC_AUTO_UPDATE "0/1 - Enable or disable automatic updating of the plugin when Updater is installed." Handle g_hCvarReloadUpdate; bool g_bCvarReloadUpdate = true; #define DESC_RELOAD_UPDATE "0/1 - Enable or disable automatic plugin reloading when a new version has been downloaded." Handle g_hCvarLog; bool g_bCvarLog = false; #define DESC_LOG "0/1 - Log RTD actions to SourceMod logs?" Handle g_hCvarChat; int g_iCvarChat = 63; #define DESC_CHAT "Add/substract these values to control messages:\n1 - RTD ad (round start)\n2 - Perk applic. for rollers\n4 - P. applic. for others\n8 - P. removal for rollers\n16 - P. removal for others\n32 - Can't-roll reasons\nEXAMPLE: \"6\" - show applications only (2 + 4)" Handle g_hCvarPerkDuration; int g_iCvarPerkDuration = 25; #define DESC_PERK_DURATION "Default time for the perk to last. This value can be overridden for any perk in rtd2_perks.cfg" Handle g_hCvarRollInterval; int g_iCvarRollInterval = 60; #define DESC_ROLL_INTERVAL "Time in seconds a client has to wait to roll again after a perk has finished." Handle g_hCvarDisabledPerks; #define DESC_DISABLED_PERKS "Enter the effects you'd like to disable, seperated by commas. You can use IDs, tokens or tags which occur in a single perk. ('0, toxic, sandvich' disables first 3)" Handle g_hCvarAllowed; int g_iCvarAllowed = 0; #define DESC_ALLOWED "Admin flags which are required to use RTD. If blank, all is assumed." Handle g_hCvarInSetup; bool g_bCvarInSetup = true; #define DESC_IN_SETUP "0/1 - Can RTD be used during Setup?" Handle g_hCvarTriggers; Handle g_arrCvarTriggers = INVALID_HANDLE; int g_iCvarTriggers = 2; #define DESC_TRIGGERS "Chat triggers which will initiate rolls, seperated by comma." Handle g_hCvarShowTriggers; bool g_bCvarShowTriggers = false; #define DESC_SHOW_TRIGGERS "0/1 - Should the chat triggers be shown once they're typed?" Handle g_hCvarShowTime; bool g_bCvarShowTime = false; #define DESC_SHOW_TIME "0/1 - Should time the perk was applied for be displayed?" Handle g_hCvarRtdTeam; int g_iCvarRtdTeam = 0; #define DESC_RTD_TEAM "0 - both teams can roll, 1 - only RED team can roll, 2 - only BLU team can roll." Handle g_hCvarRtdMode; int g_iCvarRtdMode = 0; #define DESC_RTD_MODE "0 - No restrain except the interval, 1 - Limit by rollers, 2 - Limit by rollers in team." Handle g_hCvarClientLimit; int g_iCvarClientLimit = 2; #define DESC_CLIENT_LIMIT "How many players could use RTD at once. Active only when RTD Mode is 1" Handle g_hCvarTeamLimit; int g_iCvarTeamLimit = 2; #define DESC_TEAM_LIMIT "How many players in each team could use RTD at once. Active only when RTD Mode is 2" Handle g_hCvarRespawnStuck; bool g_bCvarRespawnStuck = true; #define DESC_RESPAWN_STUCK "0/1 - Should a player be forcibly respawned when a perk has ended and he's detected stuck?" Handle g_hCvarCanRepeatPerk; bool g_bCvarCanRepeatPerk = false; #define DESC_CAN_REPEAT_PERK "0/1 - Can a perk can be allowed to be rolled twice in a row." Handle g_hCvarCanRepeatGreatPerk; bool g_bCvarCanRepeatGreatPerk = false; #define DESC_CAN_REPEAT_GREAT_PERK "0/1 - Can a perk can be allowed to be rolled the second time in 3 rolls." Handle g_hCvarGoodChance; float g_fCvarGoodChance = 0.5; #define DESC_GOOD_CHANCE "0.0-1.0 - Chance of rolling a good perk. If there are no good perks available, a bad one will be tried to be rolled instead." Handle g_hCvarGoodDonatorChance; float g_fCvarGoodDonatorChance = 0.5; #define DESC_GOOD_DONATOR_CHANCE "0.0-1.0 - Chance of rolling a good perk if roller is a donator. If there are no good perks available, a bad one will be tried to roll instead." Handle g_hCvarDonatorFlag; int g_iCvarDonatorFlag = 0; #define DESC_DONATOR_FLAG "Admin flag required for donators." Handle g_hCvarTimerPosX; float g_fCvarTimerPosX = -1.0; #define DESC_TIMER_POS_X "0.0-1.0 - The X position of the perk HUD timer display. -1.0 to center." Handle g_hCvarTimerPosY; float g_fCvarTimerPosY = 0.55; #define DESC_TIMER_POS_Y "0.0-1.0 - The Y position of the perk HUD timer display. -1.0 to center." /***** F O R W A R D S ****/ Handle g_hFwdCanRoll; Handle g_hFwdCanForce; Handle g_hFwdCanRemove; Handle g_hFwdRolled; Handle g_hFwdRemoved; Handle g_hFwdOnRegOpen; /********** I N F O *********/ public Plugin myinfo = { name = "Roll The Dice (Revamped)", author = "Phil25", description = "Lets players roll for temporary benefits.", version = PLUGIN_VERSION, url = "https://forums.alliedmods.net/showthread.php?t=278579" }; //*************************// //---- G E N E R A L ----// //*************************// public APLRes AskPluginLoad2 (Handle hMyself, bool bLate, char[] sError, int iErrorSize){ char sGame[32]; sGame[0] = '\0'; GetGameFolderName(sGame, sizeof(sGame)); if(!StrEqual(sGame, "tf")){ Format(sError, iErrorSize, "%s This plugin only works for Team Fortress 2.", CONS_PREFIX); return APLRes_Failure; } CreateNative("RTD2_GetClientPerkId", Native_GetClientPerkId); CreateNative("RTD2_GetClientPerkTime", Native_GetClientPerkTime); CreateNative("RTD2_ForcePerk", Native_ForcePerk); CreateNative("RTD2_RollPerk", Native_RollPerk); CreateNative("RTD2_RemovePerk", Native_RemovePerk); CreateNative("RTD2_GetPerkOfString", Native_GetPerkOfString); CreateNative("RTD2_RegisterPerk", Native_RegisterPerk); CreateNative("RTD2_IsRegOpen", Native_IsRegisteringOpen); CreateNative("RTD2_SetPerkByToken", Native_SetPerkByToken); CreateNative("RTD2_SetPerkById", Native_SetPerkById); CreateNative("RTD2_DefaultCorePerk", Native_DefaultCorePerk); CreateNative("RTD2_CanPlayerBeHurt", Native_CanPlayerBeHurt); RegPluginLibrary("RollTheDice2"); return APLRes_Success; } public void OnPluginStart (){ LoadTranslations("rtd2.phrases.txt"); LoadTranslations("rtd2_perks.phrases.txt"); LoadTranslations("common.phrases.txt"); if(!ParseEffects()) return; ParseCustomEffects(); //-----[ ConVars ]-----// CreateConVar("sm_rtd2_version", PLUGIN_VERSION, "Current RTD2 Version", FLAGS_CVARS|FCVAR_DONTRECORD|FCVAR_SPONLY); g_hCvarPluginEnabled = CreateConVar("sm_rtd2_enabled", "1", DESC_PLUGIN_ENABLED, FLAGS_CVARS); g_hCvarAutoUpdate = CreateConVar("sm_rtd2_autoupdate", "1", DESC_AUTO_UPDATE, FLAGS_CVARS); g_hCvarReloadUpdate = CreateConVar("sm_rtd2_reloadupdate", "1", DESC_RELOAD_UPDATE, FLAGS_CVARS); g_hCvarLog = CreateConVar("sm_rtd2_log", "0", DESC_LOG, FLAGS_CVARS); g_hCvarChat = CreateConVar("sm_rtd2_chat", "63", DESC_CHAT, FLAGS_CVARS); g_hCvarPerkDuration = CreateConVar("sm_rtd2_duration", "25", DESC_PERK_DURATION, FLAGS_CVARS); g_hCvarRollInterval = CreateConVar("sm_rtd2_interval", "60", DESC_ROLL_INTERVAL, FLAGS_CVARS); g_hCvarDisabledPerks = CreateConVar("sm_rtd2_disabled", "", DESC_DISABLED_PERKS, FLAGS_CVARS); g_hCvarAllowed = CreateConVar("sm_rtd2_accessflags", "", DESC_ALLOWED, FLAGS_CVARS); g_hCvarInSetup = CreateConVar("sm_rtd2_insetup", "0", DESC_IN_SETUP, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarTriggers = CreateConVar("sm_rtd2_triggers", "rtd,roll", DESC_TRIGGERS, FLAGS_CVARS); g_hCvarShowTriggers = CreateConVar("sm_rtd2_showtriggers", "0", DESC_SHOW_TRIGGERS, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarShowTime = CreateConVar("sm_rtd2_showtime", "0", DESC_SHOW_TIME, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarRtdTeam = CreateConVar("sm_rtd2_team", "0", DESC_RTD_TEAM, FLAGS_CVARS, true, 0.0, true, 2.0); g_hCvarRtdMode = CreateConVar("sm_rtd2_mode", "0", DESC_RTD_MODE, FLAGS_CVARS, true, 0.0, true, 2.0); g_hCvarClientLimit = CreateConVar("sm_rtd2_playerlimit", "2", DESC_CLIENT_LIMIT, FLAGS_CVARS, true, 0.0); g_hCvarTeamLimit = CreateConVar("sm_rtd2_teamlimit", "2", DESC_TEAM_LIMIT, FLAGS_CVARS, true, 0.0); g_hCvarRespawnStuck = CreateConVar("sm_rtd2_respawnstuck", "1", DESC_RESPAWN_STUCK, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarCanRepeatPerk = CreateConVar("sm_rtd2_repeat", "0", DESC_CAN_REPEAT_PERK, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarCanRepeatGreatPerk = CreateConVar("sm_rtd2_repeatgreat", "0", DESC_CAN_REPEAT_GREAT_PERK, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarGoodChance = CreateConVar("sm_rtd2_chance", "0.5", DESC_GOOD_CHANCE, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarGoodDonatorChance = CreateConVar("sm_rtd2_dchance", "0.75", DESC_GOOD_DONATOR_CHANCE, FLAGS_CVARS, true, 0.0, true, 1.0); g_hCvarDonatorFlag = CreateConVar("sm_rtd2_donatorflag", "", DESC_DONATOR_FLAG, FLAGS_CVARS); g_hCvarTimerPosX = CreateConVar("sm_rtd2_timerpos_x", "-1.0", DESC_TIMER_POS_X, FLAGS_CVARS); g_hCvarTimerPosY = CreateConVar("sm_rtd2_timerpos_y", "0.55", DESC_TIMER_POS_Y, FLAGS_CVARS); //-----[ ConVars Hooking & Setting ]-----// HookConVarChange(g_hCvarPluginEnabled, ConVarChange_Plugin ); g_bCvarPluginEnabled = GetConVarInt(g_hCvarPluginEnabled) > 0 ? true : false; HookConVarChange(g_hCvarAutoUpdate, ConVarChange_Plugin ); g_bCvarAutoUpdate = GetConVarInt(g_hCvarAutoUpdate) > 0 ? true : false; HookConVarChange(g_hCvarReloadUpdate, ConVarChange_Plugin ); g_bCvarReloadUpdate = GetConVarInt(g_hCvarReloadUpdate) > 0 ? true : false; HookConVarChange(g_hCvarLog, ConVarChange_Plugin ); g_bCvarLog = GetConVarInt(g_hCvarLog) > 0 ? true : false; HookConVarChange(g_hCvarChat, ConVarChange_Plugin ); g_iCvarChat = GetConVarInt(g_hCvarChat); HookConVarChange(g_hCvarPerkDuration, ConVarChange_Perks ); g_iCvarPerkDuration = GetConVarInt(g_hCvarPerkDuration); HookConVarChange(g_hCvarRollInterval, ConVarChange_Perks ); g_iCvarRollInterval = GetConVarInt(g_hCvarRollInterval); HookConVarChange(g_hCvarDisabledPerks, ConVarChange_Perks ); HookConVarChange(g_hCvarAllowed, ConVarChange_Usage ); g_iCvarAllowed = ReadFlagFromConVar(g_hCvarAllowed); HookConVarChange(g_hCvarInSetup, ConVarChange_Usage ); g_bCvarInSetup = GetConVarInt(g_hCvarInSetup) > 0 ? true : false; HookConVarChange(g_hCvarTriggers, ConVarChange_Usage ); ParseTriggers(); HookConVarChange(g_hCvarShowTriggers, ConVarChange_Usage ); g_bCvarShowTriggers = GetConVarInt(g_hCvarShowTriggers) > 0 ? true : false; HookConVarChange(g_hCvarShowTime, ConVarChange_Usage ); g_bCvarShowTime = GetConVarInt(g_hCvarShowTime) > 0 ? true : false; HookConVarChange(g_hCvarRtdTeam, ConVarChange_Rtd ); g_iCvarRtdTeam = GetConVarInt(g_hCvarRtdTeam); HookConVarChange(g_hCvarRtdMode, ConVarChange_Rtd ); g_iCvarRtdMode = GetConVarInt(g_hCvarRtdMode); HookConVarChange(g_hCvarClientLimit, ConVarChange_Rtd ); g_iCvarClientLimit = GetConVarInt(g_hCvarClientLimit); HookConVarChange(g_hCvarTeamLimit, ConVarChange_Rtd ); g_iCvarTeamLimit = GetConVarInt(g_hCvarTeamLimit); HookConVarChange(g_hCvarRespawnStuck, ConVarChange_Rtd ); g_bCvarRespawnStuck = GetConVarInt(g_hCvarRespawnStuck) > 0 ? true : false; HookConVarChange(g_hCvarCanRepeatPerk, ConVarChange_Repeat ); g_bCvarCanRepeatPerk = GetConVarInt(g_hCvarCanRepeatPerk) > 0 ? true : false; HookConVarChange(g_hCvarCanRepeatGreatPerk, ConVarChange_Repeat ); g_bCvarCanRepeatGreatPerk = GetConVarInt(g_hCvarCanRepeatGreatPerk) > 0 ? true : false; HookConVarChange(g_hCvarGoodChance, ConVarChange_Good ); g_fCvarGoodChance = GetConVarFloat(g_hCvarGoodChance); HookConVarChange(g_hCvarGoodDonatorChance, ConVarChange_Good ); g_fCvarGoodDonatorChance = GetConVarFloat(g_hCvarGoodDonatorChance); HookConVarChange(g_hCvarDonatorFlag, ConVarChange_Good ); g_iCvarDonatorFlag = ReadFlagFromConVar(g_hCvarDonatorFlag); HookConVarChange(g_hCvarTimerPosX, ConVarChange_Timer ); g_fCvarTimerPosX = GetConVarFloat(g_hCvarTimerPosX); HookConVarChange(g_hCvarTimerPosY, ConVarChange_Timer ); g_fCvarTimerPosY = GetConVarFloat(g_hCvarTimerPosY); AutoExecConfig(true); //-----[ Forwards ]-----// g_hFwdCanRoll = CreateGlobalForward("RTD2_CanRollDice", ET_Event, Param_Cell ); g_hFwdCanForce = CreateGlobalForward("RTD2_CanForcePerk", ET_Event, Param_Cell, Param_Cell, Param_Cell); g_hFwdCanRemove = CreateGlobalForward("RTD2_CanRemovePerk", ET_Event, Param_Cell, Param_Cell, Param_Cell); g_hFwdRolled = CreateGlobalForward("RTD2_Rolled", ET_Event, Param_Cell, Param_Cell, Param_Cell); g_hFwdRemoved = CreateGlobalForward("RTD2_Removed", ET_Event, Param_Cell, Param_Cell, Param_Cell); g_hFwdOnRegOpen = CreateGlobalForward("RTD2_OnRegOpen", ET_Ignore ); //-----[ Commands ]-----// RegAdminCmd("sm_rtd", Command_RTD, 0, "Roll a perk."); RegAdminCmd("sm_perks", Command_DescMenu, 0, "Display a description menu of RTD perks."); RegAdminCmd("sm_forcertd", Command_ForceRTD, ADMFLAG_SLAY, "Applies perk to selected player(s)."); RegAdminCmd("sm_removertd", Command_RemoveRTD, ADMFLAG_SLAY, "Removes perk from selected player(s)."); RegAdminCmd("sm_rtds", Command_PerkSearchup, ADMFLAG_SLAY, "Displays customized perk list."); RegAdminCmd("sm_rtdsearch", Command_PerkSearchup, ADMFLAG_SLAY, "Displays customized perk list."); RegAdminCmd("sm_reloadrtd", Command_Reload, ADMFLAG_CONFIG, "Reloads the config files."); RegAdminCmd("sm_updatertd", Command_Update, ADMFLAG_ROOT, "Force an update check. Does nothing if Updater is not installed."); //-----[ Listeners ]-----// AddCommandListener(Listener_Say, "say"); AddCommandListener(Listener_Say, "say_team"); AddCommandListener(Listener_Voice, "voicemenu"); for(int i = 1; i <= MaxClients; i++) if(IsValidClient(i)) OnClientPutInServer(i); } public void OnConfigsExecuted (){ g_hDescriptionMenu = BuildDesc(); g_bIsRegisteringOpen = true; Forward_OnRegOpen(); ParseDisabledPerks(); } public void OnPluginEnd (){ for(int i = 1; i <= MaxClients; i++){ Forward_OnRemovePerkPre(i); if(eClients[i][bRolling]) ForceRemovePerk(i, 0); eClients[i][bRolling] = false; eClients[i][iLastRoll] = 0; eClients[i][iCurPerk] = -1; } } public void OnMapStart (){ HookEvent("player_death", Event_PlayerDeath); HookEvent("player_changeclass", Event_ClassChange); HookEvent("teamplay_round_active", Event_RoundActive); PrecacheModel(LASERBEAM); Forward_OnMapStart(); PrecachePerkSounds(); g_bIsGameArena = (FindEntityByClassname(MaxClients +1, "tf_logic_arena") > MaxClients); } public void OnMapEnd (){ UnhookEvent("player_death", Event_PlayerDeath); UnhookEvent("player_changeclass", Event_ClassChange); UnhookEvent("teamplay_round_active", Event_RoundActive); } public void OnClientPutInServer (int client){ eClients[client][bRolling] = false; eClients[client][iLastRoll] = 0; eClients[client][iCurPerk] = -1; eClients[client][hHudSync] = CreateHudSynchronizer(); Forward_OnClientPutInServer(client); } public void OnClientDisconnect (int client){ Forward_OnRemovePerkPre(client); if(eClients[client][bRolling]) ForceRemovePerk(client, 4); eClients[client][bRolling] = false; eClients[client][iLastRoll] = 0; eClients[client][iCurPerk] = -1; } public void OnAllPluginsLoaded (){ g_bPluginUpdater = LibraryExists("updater"); g_bPluginFriendly = LibraryExists("[TF2] Friendly Mode"); g_bPluginFriendlySimple = LibraryExists("Friendly Simple"); if(g_bPluginUpdater) Updater_AddPlugin(UPDATE_URL); } public void OnLibraryAdded (const char[] sLibName){ if(StrEqual(sLibName, "updater")) g_bPluginUpdater = true; if(StrEqual(sLibName, "[TF2] Friendly Mode")) g_bPluginFriendly = true; if(StrEqual(sLibName, "Friendly Simple")) g_bPluginFriendlySimple = true; if(g_bPluginUpdater) Updater_AddPlugin(UPDATE_URL); } public void OnLibraryRemoved (const char[] sLibName){ if(StrEqual(sLibName, "updater")) g_bPluginUpdater = false; if(StrEqual(sLibName, "[TF2] Friendly Mode")) g_bPluginFriendly = false; if(StrEqual(sLibName, "Friendly Simple")) g_bPluginFriendlySimple = false; } //*************************// //---- U P D A T E R ----// //*************************// public Action Updater_OnPluginChecking (){ if(!g_bCvarAutoUpdate && !g_bIsUpdateForced) return Plugin_Handled; g_bIsUpdateForced = false; return Plugin_Continue; } public int Updater_OnPluginUpdated (){ if(g_bCvarReloadUpdate) ReloadPlugin(); } //***************************// //---- C O M M A N D S ----// //***************************// public Action Command_RTD (int client, int args){ if(IsValidClient(client)) RollPerkForClient(client); return Plugin_Handled; } public Action Command_DescMenu (int client, int args){ if(IsValidClient(client)) ShowDesc(client); return Plugin_Handled; } public Action Command_ForceRTD (int client, int args){ if(args < 1){ ReplyToCommand(client, "[SM] Usage: sm_forcertd *