#pragma semicolon 1 // ====[ INCLUDES ]============================================================ #include // ====[ DEFINES ]============================================================= #define PLUGIN_NAME "Server Hud Logo" #define PLUGIN_VERSION "2.2" #define MAX_CHANNELS 12 // ====[ HANDLES | CVARS ]===================================================== new Handle:g_hCvarEnabled; new Handle:g_hHudSync[MAX_CHANNELS]; // ====[ VARIABLES ]=========================================================== new bool:g_bCvarEnabled; new String:g_strConfigFile[255]; new g_iRedValue[MAX_CHANNELS]; new g_iGreenValue[MAX_CHANNELS]; new g_iBlueValue[MAX_CHANNELS]; new g_iAlphaValue[MAX_CHANNELS]; new g_iEffectValue[MAX_CHANNELS]; new bool:g_bChannelEnabled[MAX_CHANNELS]; new bool:g_bTeamColor[MAX_CHANNELS]; new Float:g_flHoldTime[MAX_CHANNELS]; new Float:g_flXPosition[MAX_CHANNELS]; new Float:g_flYPosition[MAX_CHANNELS]; new Float:g_flStartTime[MAX_CHANNELS]; new String:g_strMessage[MAX_CHANNELS][255]; // ====[ PLUGIN ]============================================================== public Plugin:myinfo = { name = PLUGIN_NAME, author = "ReFlex", description = "Add a custom hud logo for everyone to see", version = PLUGIN_VERSION, url = "http://forums.alliedmods.net/showthread.php?p=1664292" } // ====[ EVENTS ]============================================================== public OnPluginStart() { CreateConVar("sm_logo_version", PLUGIN_VERSION, PLUGIN_NAME, FCVAR_PLUGIN | FCVAR_SPONLY | FCVAR_DONTRECORD | FCVAR_NOTIFY); g_hCvarEnabled = CreateConVar("sm_logo_enabled", "1", "Enable Server Hud Logo\n0 = Disabled\n1 = Enabled", FCVAR_PLUGIN, true, 0.0, true, 1.0); g_bCvarEnabled = GetConVarBool(g_hCvarEnabled); HookConVarChange(g_hCvarEnabled, ConVarChange); HookEvent("player_spawn", Event_PlayerSpawn); HookEvent("player_death", Event_PlayerDeath); HookEvent("player_team", Event_PlayerChangeTeam); RegAdminCmd("sm_serverlogo_reload", Command_Reload, ADMFLAG_ROOT); for(new iChannel = 0; iChannel < MAX_CHANNELS; iChannel++) { g_hHudSync[iChannel] = CreateHudSynchronizer(); if(g_hHudSync[iChannel] == INVALID_HANDLE) SetFailState("HUD synchronisation is not supported by this mod"); } BuildPath(Path_SM, g_strConfigFile, sizeof(g_strConfigFile), "configs/serverhudlogo.cfg"); } public ConVarChange(Handle:hConvar, const String:strOldValue[], const String:strNewValue[]) { if(hConvar == g_hCvarEnabled) g_bCvarEnabled = GetConVarBool(g_hCvarEnabled); } public OnConfigsExecuted() { if(!FileExists(g_strConfigFile)) { SetFailState("Configuration file %s not found!", g_strConfigFile); return; } new Handle:hKeyValues = CreateKeyValues("Server Hud Logo"); if(!FileToKeyValues(hKeyValues, g_strConfigFile) || !KvGotoFirstSubKey(hKeyValues)) { SetFailState("Improper structure for configuration file %s!", g_strConfigFile); return; } for(new iChannel = 0; iChannel < MAX_CHANNELS; iChannel++) { g_bChannelEnabled[iChannel] = false; g_iRedValue[iChannel] = 0; g_iGreenValue[iChannel] = 0; g_iBlueValue[iChannel] = 0; g_iAlphaValue[iChannel] = 0; g_iEffectValue[iChannel] = 0; g_bTeamColor[iChannel] = false; g_flHoldTime[iChannel] = 0.0; g_flXPosition[iChannel] = -1.0; g_flYPosition[iChannel] = -1.0; g_flStartTime[iChannel] = -1.0; strcopy(g_strMessage[iChannel], sizeof(g_strMessage[]), ""); } new iChannel; do { g_bChannelEnabled[iChannel] = true; g_iRedValue[iChannel] = KvGetNum(hKeyValues, "red"); g_iGreenValue[iChannel] = KvGetNum(hKeyValues, "green"); g_iBlueValue[iChannel] = KvGetNum(hKeyValues, "blue"); g_iAlphaValue[iChannel] = KvGetNum(hKeyValues, "alpha"); g_iEffectValue[iChannel] = KvGetNum(hKeyValues, "effect"); g_bTeamColor[iChannel] = bool:KvGetNum(hKeyValues, "teamcolor"); g_flHoldTime[iChannel] = KvGetFloat(hKeyValues, "holdtime"); g_flXPosition[iChannel] = KvGetFloat(hKeyValues, "xposition"); g_flYPosition[iChannel] = KvGetFloat(hKeyValues, "yposition"); g_flStartTime[iChannel] = KvGetFloat(hKeyValues, "startime"); KvGetString(hKeyValues, "message", g_strMessage[iChannel], sizeof(g_strMessage[])); iChannel++; } while(KvGotoNextKey(hKeyValues, false)); CloseHandle(hKeyValues); } public Action:Event_PlayerSpawn(Handle:hEvent, const String:strName[], bool:bBroadcast) { if(!g_bCvarEnabled) return; new iClient = GetClientOfUserId(GetEventInt(hEvent, "userid")); if(!IsValidClient(iClient) || IsFakeClient(iClient)) return; for(new iChannel = 0; iChannel < MAX_CHANNELS; iChannel++) { if(g_bChannelEnabled[iChannel]) { new Handle:hDataPack; CreateDataTimer(g_flStartTime[iChannel], Timer_ServerHudLogo, hDataPack, TIMER_FLAG_NO_MAPCHANGE); WritePackCell(hDataPack, GetClientUserId(iClient)); WritePackCell(hDataPack, iChannel); } } } public Action:Event_PlayerDeath(Handle:hEvent, const String:strName[], bool:bBroadcast) { new iClient = GetClientOfUserId(GetEventInt(hEvent, "userid")); if(!IsValidClient(iClient)) return; for(new iChannel = 0; iChannel < MAX_CHANNELS; iChannel++) ClearSyncHud(iClient, g_hHudSync[iChannel]); } public Action:Event_PlayerChangeTeam(Handle:hEvent, const String:strName[], bool:bBroadcast) { if(!g_bCvarEnabled) return; new iClient = GetClientOfUserId(GetEventInt(hEvent, "userid")); if(!IsValidClient(iClient) || IsFakeClient(iClient) || GetEventInt(hEvent, "team") > 1) return; for(new iChannel = 0; iChannel < MAX_CHANNELS; iChannel++) { ClearSyncHud(iClient, g_hHudSync[iChannel]); if(g_bChannelEnabled[iChannel]) { new Handle:hDataPack; CreateDataTimer(0.2, Timer_ServerHudLogo, hDataPack, TIMER_FLAG_NO_MAPCHANGE); WritePackCell(hDataPack, GetClientUserId(iClient)); WritePackCell(hDataPack, iChannel); } } } // ====[ COMMANDS ]============================================================ public Action:Command_Reload(iClient, iArgs) { OnConfigsExecuted(); ReplyToCommand(iClient, "[SM] Server Hud Logo config (%s) reloaded.", g_strConfigFile); } // ====[ TIMERS ]============================================================== public Action:Timer_ServerHudLogo(Handle:hTimer, Handle:hDataPack) { if(!g_bCvarEnabled) return; ResetPack(hDataPack); new iUserId = ReadPackCell(hDataPack); new iClient = GetClientOfUserId(iUserId); if(!IsValidClient(iClient)) return; if(!IsPlayerAlive(iClient) && GetClientTeam(iClient) > 1) return; new iChannel = ReadPackCell(hDataPack); if(!g_bChannelEnabled[iChannel]) return; if(g_bTeamColor[iChannel]) { switch(GetClientTeam(iClient)) { case 2: { if(g_flHoldTime[iChannel] >= 0 && g_flHoldTime[iChannel] < 1) SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], 604800.0, 255, 77, 0, g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); else SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], g_flHoldTime[iChannel], 255, 77, 0, g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); } case 3: { if(g_flHoldTime[iChannel] >= 0 && g_flHoldTime[iChannel] < 1) SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], 604800.0, 185, 150, 255, g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); else SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], g_flHoldTime[iChannel], 185, 150, 255, g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); } default: { if(g_flHoldTime[iChannel] >= 0 && g_flHoldTime[iChannel] < 1) SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], 604800.0, 204, 204, 204, g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); else SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], g_flHoldTime[iChannel], 204, 204, 204, g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); } } } else { if(g_flHoldTime[iChannel] >= 0 && g_flHoldTime[iChannel] < 1) SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], 604800.0, g_iRedValue[iChannel], g_iGreenValue[iChannel], g_iBlueValue[iChannel], g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); else SetHudTextParams(g_flXPosition[iChannel], g_flYPosition[iChannel], g_flHoldTime[iChannel], g_iRedValue[iChannel], g_iGreenValue[iChannel], g_iBlueValue[iChannel], g_iAlphaValue[iChannel], g_iEffectValue[iChannel]); } ShowSyncHudText(iClient, g_hHudSync[iChannel], g_strMessage[iChannel]); } // ====[ STOCKS ]============================================================== stock bool:IsValidClient(iClient) { if(iClient <= 0 || iClient > MaxClients || !IsClientInGame(iClient)) return false; return true; }