converted newlines to unix

This commit is contained in:
BotoX 2016-01-19 23:57:32 +01:00
parent a0186f4a49
commit 459815ce0e
49 changed files with 8030 additions and 8030 deletions

View File

@ -1,31 +1,31 @@
#pragma semicolon 1
#include <sourcemod>
#include <geoip>
#pragma newdecls required
public Plugin myinfo = {
name = "Connect Announce",
author = "BotoX",
description = "Simple connect announcer",
version = "1.0",
url = ""
}
public void OnClientPostAdminCheck(int client)
{
if(IsFakeClient(client))
return;
static char sAuth[32];
static char sIP[16];
static char sCountry[32];
GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
if(GetClientIP(client, sIP, sizeof(sIP)) && GeoipCountry(sIP, sCountry, sizeof(sCountry)))
PrintToChatAll("\x04%L [\x03%s\x04] connected from %s", client, sAuth, sCountry);
else
PrintToChatAll("\x04%L [\x03%s\x04] connected", client, sAuth);
}
#pragma semicolon 1
#include <sourcemod>
#include <geoip>
#pragma newdecls required
public Plugin myinfo = {
name = "Connect Announce",
author = "BotoX",
description = "Simple connect announcer",
version = "1.0",
url = ""
}
public void OnClientPostAdminCheck(int client)
{
if(IsFakeClient(client))
return;
static char sAuth[32];
static char sIP[16];
static char sCountry[32];
GetClientAuthId(client, AuthId_Steam2, sAuth, sizeof(sAuth));
if(GetClientIP(client, sIP, sizeof(sIP)) && GeoipCountry(sIP, sCountry, sizeof(sCountry)))
PrintToChatAll("\x04%L [\x03%s\x04] connected from %s", client, sAuth, sCountry);
else
PrintToChatAll("\x04%L [\x03%s\x04] connected", client, sAuth);
}

View File

@ -1,118 +1,118 @@
#pragma semicolon 1
#include <sourcemod>
#include <dhooks>
#undef REQUIRE_PLUGIN
#include <updater>
#define PLUGIN_NAME "Napalm Lag Fix"
#define PLUGIN_VERSION "1.0.3"
#define UPDATE_URL "http://godtony.mooo.com/napalmlagfix/napalmlagfix.txt"
#define DMG_BURN (1 << 3)
new Handle:g_hRadiusDamage = INVALID_HANDLE;
new bool:g_bCheckNullPtr = false;
public Plugin:myinfo =
{
name = PLUGIN_NAME,
author = "GoD-Tony + BotoX",
description = "Prevents lag when napalm is used on players",
version = PLUGIN_VERSION,
url = "https://forums.alliedmods.net/showthread.php?t=188093" // Demo: http://youtu.be/YdhAu5IEVVM
};
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
MarkNativeAsOptional("DHookIsNullParam");
return APLRes_Success;
}
public OnPluginStart()
{
// Convars.
new Handle:hCvar = CreateConVar("sm_napalmlagfix_version", PLUGIN_VERSION, PLUGIN_NAME, FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_DONTRECORD);
SetConVarString(hCvar, PLUGIN_VERSION);
// Gamedata.
new Handle:hConfig = LoadGameConfigFile("napalmlagfix.games");
if (hConfig == INVALID_HANDLE)
{
SetFailState("Could not find gamedata file: napalmlagfix.games.txt");
}
new offset = GameConfGetOffset(hConfig, "RadiusDamage");
if (offset == -1)
{
SetFailState("Failed to find RadiusDamage offset");
}
CloseHandle(hConfig);
// DHooks.
g_bCheckNullPtr = (GetFeatureStatus(FeatureType_Native, "DHookIsNullParam") == FeatureStatus_Available);
g_hRadiusDamage = DHookCreate(offset, HookType_GameRules, ReturnType_Void, ThisPointer_Ignore, Hook_RadiusDamage);
DHookAddParam(g_hRadiusDamage, HookParamType_ObjectPtr); // 1 - CTakeDamageInfo &info
DHookAddParam(g_hRadiusDamage, HookParamType_VectorPtr); // 2 - Vector &vecSrc
DHookAddParam(g_hRadiusDamage, HookParamType_Float); // 3 - float flRadius
DHookAddParam(g_hRadiusDamage, HookParamType_Int); // 4 - int iClassIgnore
DHookAddParam(g_hRadiusDamage, HookParamType_CBaseEntity); // 5 - CBaseEntity *pEntityIgnore
// Updater.
if (LibraryExists("updater"))
{
Updater_AddPlugin(UPDATE_URL);
}
}
public OnLibraryAdded(const String:name[])
{
if (StrEqual(name, "updater"))
{
Updater_AddPlugin(UPDATE_URL);
}
}
public Updater_OnPluginUpdated()
{
// There could be new gamedata in this update.
ReloadPlugin();
}
public OnMapStart()
{
DHookGamerules(g_hRadiusDamage, false);
}
public MRESReturn:Hook_RadiusDamage(Handle:hParams)
{
// As of DHooks 1.0.12 we must check for a null param.
if (g_bCheckNullPtr && DHookIsNullParam(hParams, 5))
return MRES_Ignored;
new iDmgBits = DHookGetParamObjectPtrVar(hParams, 1, 60, ObjectValueType_Int);
new iEntIgnore = DHookGetParam(hParams, 5);
if(!(iDmgBits & DMG_BURN))
return MRES_Ignored;
// Block napalm damage if it's coming from another client.
if (1 <= iEntIgnore <= MaxClients)
return MRES_Supercede;
// Block napalm that comes from grenades
new String:sEntClassName[64];
if(GetEntityClassname(iEntIgnore, sEntClassName, sizeof(sEntClassName)))
{
if(!strcmp(sEntClassName, "hegrenade_projectile"))
return MRES_Supercede;
}
return MRES_Ignored;
}
#pragma semicolon 1
#include <sourcemod>
#include <dhooks>
#undef REQUIRE_PLUGIN
#include <updater>
#define PLUGIN_NAME "Napalm Lag Fix"
#define PLUGIN_VERSION "1.0.3"
#define UPDATE_URL "http://godtony.mooo.com/napalmlagfix/napalmlagfix.txt"
#define DMG_BURN (1 << 3)
new Handle:g_hRadiusDamage = INVALID_HANDLE;
new bool:g_bCheckNullPtr = false;
public Plugin:myinfo =
{
name = PLUGIN_NAME,
author = "GoD-Tony + BotoX",
description = "Prevents lag when napalm is used on players",
version = PLUGIN_VERSION,
url = "https://forums.alliedmods.net/showthread.php?t=188093" // Demo: http://youtu.be/YdhAu5IEVVM
};
public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
{
MarkNativeAsOptional("DHookIsNullParam");
return APLRes_Success;
}
public OnPluginStart()
{
// Convars.
new Handle:hCvar = CreateConVar("sm_napalmlagfix_version", PLUGIN_VERSION, PLUGIN_NAME, FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_DONTRECORD);
SetConVarString(hCvar, PLUGIN_VERSION);
// Gamedata.
new Handle:hConfig = LoadGameConfigFile("napalmlagfix.games");
if (hConfig == INVALID_HANDLE)
{
SetFailState("Could not find gamedata file: napalmlagfix.games.txt");
}
new offset = GameConfGetOffset(hConfig, "RadiusDamage");
if (offset == -1)
{
SetFailState("Failed to find RadiusDamage offset");
}
CloseHandle(hConfig);
// DHooks.
g_bCheckNullPtr = (GetFeatureStatus(FeatureType_Native, "DHookIsNullParam") == FeatureStatus_Available);
g_hRadiusDamage = DHookCreate(offset, HookType_GameRules, ReturnType_Void, ThisPointer_Ignore, Hook_RadiusDamage);
DHookAddParam(g_hRadiusDamage, HookParamType_ObjectPtr); // 1 - CTakeDamageInfo &info
DHookAddParam(g_hRadiusDamage, HookParamType_VectorPtr); // 2 - Vector &vecSrc
DHookAddParam(g_hRadiusDamage, HookParamType_Float); // 3 - float flRadius
DHookAddParam(g_hRadiusDamage, HookParamType_Int); // 4 - int iClassIgnore
DHookAddParam(g_hRadiusDamage, HookParamType_CBaseEntity); // 5 - CBaseEntity *pEntityIgnore
// Updater.
if (LibraryExists("updater"))
{
Updater_AddPlugin(UPDATE_URL);
}
}
public OnLibraryAdded(const String:name[])
{
if (StrEqual(name, "updater"))
{
Updater_AddPlugin(UPDATE_URL);
}
}
public Updater_OnPluginUpdated()
{
// There could be new gamedata in this update.
ReloadPlugin();
}
public OnMapStart()
{
DHookGamerules(g_hRadiusDamage, false);
}
public MRESReturn:Hook_RadiusDamage(Handle:hParams)
{
// As of DHooks 1.0.12 we must check for a null param.
if (g_bCheckNullPtr && DHookIsNullParam(hParams, 5))
return MRES_Ignored;
new iDmgBits = DHookGetParamObjectPtrVar(hParams, 1, 60, ObjectValueType_Int);
new iEntIgnore = DHookGetParam(hParams, 5);
if(!(iDmgBits & DMG_BURN))
return MRES_Ignored;
// Block napalm damage if it's coming from another client.
if (1 <= iEntIgnore <= MaxClients)
return MRES_Supercede;
// Block napalm that comes from grenades
new String:sEntClassName[64];
if(GetEntityClassname(iEntIgnore, sEntClassName, sizeof(sEntClassName)))
{
if(!strcmp(sEntClassName, "hegrenade_projectile"))
return MRES_Supercede;
}
return MRES_Ignored;
}

View File

@ -1,42 +1,42 @@
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <dhooks>
//int CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo const&)
Handle g_hDamagedByExplosion;
public Plugin myinfo =
{
name = "NoGrenadeRinging",
author = "BotoX",
description = "Block the annoying ringing noise when a grenade explodes next to you",
version = "1.0",
url = ""
};
public void OnPluginStart()
{
Handle hTemp = LoadGameConfigFile("NoGrenadeRinging.games");
if(hTemp == INVALID_HANDLE)
SetFailState("Why you no has gamedata?");
int Offset = GameConfGetOffset(hTemp, "OnDamagedByExplosion");
g_hDamagedByExplosion = DHookCreate(Offset, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnDamagedByExplosion);
DHookAddParam(g_hDamagedByExplosion, HookParamType_ObjectPtr);
CloseHandle(hTemp);
}
public void OnClientPutInServer(int client)
{
//Dont add removal callback for this one
DHookEntity(g_hDamagedByExplosion, false, client);
}
//int CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo const&)
public MRESReturn:OnDamagedByExplosion(int pThis, Handle hReturn, Handle hParams)
{
// Block call
return MRES_Supercede;
}
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <dhooks>
//int CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo const&)
Handle g_hDamagedByExplosion;
public Plugin myinfo =
{
name = "NoGrenadeRinging",
author = "BotoX",
description = "Block the annoying ringing noise when a grenade explodes next to you",
version = "1.0",
url = ""
};
public void OnPluginStart()
{
Handle hTemp = LoadGameConfigFile("NoGrenadeRinging.games");
if(hTemp == INVALID_HANDLE)
SetFailState("Why you no has gamedata?");
int Offset = GameConfGetOffset(hTemp, "OnDamagedByExplosion");
g_hDamagedByExplosion = DHookCreate(Offset, HookType_Entity, ReturnType_Int, ThisPointer_CBaseEntity, OnDamagedByExplosion);
DHookAddParam(g_hDamagedByExplosion, HookParamType_ObjectPtr);
CloseHandle(hTemp);
}
public void OnClientPutInServer(int client)
{
//Dont add removal callback for this one
DHookEntity(g_hDamagedByExplosion, false, client);
}
//int CCSPlayer::OnDamagedByExplosion(CTakeDamageInfo const&)
public MRESReturn:OnDamagedByExplosion(int pThis, Handle hReturn, Handle hParams)
{
// Block call
return MRES_Supercede;
}

View File

@ -1,333 +1,333 @@
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <morecolors>
#define PLUGIN_NAME "Toggle Weapon Sounds"
#define PLUGIN_VERSION "1.2.0"
#define UPDATE_URL "http://godtony.mooo.com/stopsound/stopsound.txt"
new bool:g_bStopSound[MAXPLAYERS+1], bool:g_bHooked;
static String:g_sKVPATH[PLATFORM_MAX_PATH];
new Handle:g_hWepSounds;
public Plugin:myinfo =
{
name = PLUGIN_NAME,
author = "GoD-Tony, edit by id/Obus",
description = "Allows clients to stop hearing weapon sounds",
version = PLUGIN_VERSION,
url = "http://www.sourcemod.net/"
};
public OnPluginStart()
{
// Detect game and hook appropriate tempent.
decl String:sGame[32];
GetGameFolderName(sGame, sizeof(sGame));
if (StrEqual(sGame, "cstrike"))
{
AddTempEntHook("Shotgun Shot", CSS_Hook_ShotgunShot);
}
else if (StrEqual(sGame, "dod"))
{
AddTempEntHook("FireBullets", DODS_Hook_FireBullets);
}
// TF2/HL2:DM and misc weapon sounds will be caught here.
AddNormalSoundHook(Hook_NormalSound);
CreateConVar("sm_stopsound_version", PLUGIN_VERSION, "Toggle Weapon Sounds", FCVAR_NOTIFY|FCVAR_DONTRECORD|FCVAR_REPLICATED);
RegConsoleCmd("sm_stopsound", Command_StopSound, "Toggle hearing weapon sounds");
if (g_hWepSounds != INVALID_HANDLE)
{
CloseHandle(g_hWepSounds);
}
g_hWepSounds = CreateKeyValues("WeaponSounds");
BuildPath(Path_SM, g_sKVPATH, sizeof(g_sKVPATH), "data/playerprefs.WepSounds.txt");
FileToKeyValues(g_hWepSounds, g_sKVPATH);
// Updater.
//if (LibraryExists("updater"))
//{
// Updater_AddPlugin(UPDATE_URL);
//}
}
/*public OnLibraryAdded(const String:name[])
{
if (StrEqual(name, "updater"))
{
Updater_AddPlugin(UPDATE_URL);
}
}*/
public Action:Command_StopSound(client, args)
{
if (client == 0)
{
PrintToServer("[SM] Cannot use command from server console.");
return Plugin_Handled;
}
if (args > 0)
{
decl String:Arguments[32];
GetCmdArg(1, Arguments, sizeof(Arguments));
if (StrEqual(Arguments, "save"))
{
KvRewind(g_hWepSounds);
decl String:SID[32];
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
if (KvJumpToKey(g_hWepSounds, SID, true))
{
new disabled;
disabled = KvGetNum(g_hWepSounds, "disabled", 0);
if (!disabled)
{
//CPrintToChat(client, "[StopSound] Saved entry for STEAMID({green}%s{default}) {green}successfully{default}.", SID);
KvSetNum(g_hWepSounds, "disabled", 1);
KvRewind(g_hWepSounds);
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
g_bStopSound[client] = true;
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {red}disabled{default} - {green}entry saved{default}.");
CheckHooks();
return Plugin_Handled;
}
else
{
//CPrintToChat(client, "[StopSound] Entry for STEAMID({green}%s{default}) {green}successfully deleted{default}.", SID);
KvDeleteThis(g_hWepSounds);
KvRewind(g_hWepSounds);
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
g_bStopSound[client] = false;
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
CheckHooks();
return Plugin_Handled;
}
}
KvRewind(g_hWepSounds);
}
else if (StrEqual(Arguments, "delete"))
{
KvRewind(g_hWepSounds);
decl String:SID[32];
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
if (KvJumpToKey(g_hWepSounds, SID, false))
{
g_bStopSound[client] = false;
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
CheckHooks();
KvDeleteThis(g_hWepSounds);
KvRewind(g_hWepSounds);
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
return Plugin_Handled;
}
else
{
CPrintToChat(client, "{green}[StopSound]{default} Entry {red}not found{default}.");
return Plugin_Handled;
}
}
else
{
PrintToChat(client, "[SM] Usage sm_stopsound <save|delete>");
return Plugin_Handled;
}
}
g_bStopSound[client] = !g_bStopSound[client];
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds %s.", g_bStopSound[client] ? "{red}disabled{default}" : "{green}enabled{default}");
CheckHooks();
return Plugin_Handled;
}
public OnClientPutInServer(client)
{
KvRewind(g_hWepSounds);
decl String:SID[32];
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
if (KvJumpToKey(g_hWepSounds, SID, false))
{
new disabled;
disabled = KvGetNum(g_hWepSounds, "disabled", 0);
if (disabled)
{
g_bStopSound[client] = true;
}
}
CheckHooks();
KvRewind(g_hWepSounds);
}
public OnClientDisconnect_Post(client)
{
g_bStopSound[client] = false;
CheckHooks();
}
CheckHooks()
{
new bool:bShouldHook = false;
for (new i = 1; i <= MaxClients; i++)
{
if (g_bStopSound[i])
{
bShouldHook = true;
break;
}
}
// Fake (un)hook because toggling actual hooks will cause server instability.
g_bHooked = bShouldHook;
}
public Action:Hook_NormalSound(clients[64], &numClients, String:sample[PLATFORM_MAX_PATH], &entity, &channel, &Float:volume, &level, &pitch, &flags)
{
// Ignore non-weapon sounds.
if (!g_bHooked || !(strncmp(sample, "weapons", 7) == 0 || strncmp(sample[1], "weapons", 7) == 0))
{
return Plugin_Continue;
}
decl i, j;
for (i = 0; i < numClients; i++)
{
if (g_bStopSound[clients[i]])
{
// Remove the client from the array.
for (j = i; j < numClients - 1; j++)
{
clients[j] = clients[j + 1];
}
numClients--;
i--;
}
}
return (numClients > 0) ? Plugin_Changed : Plugin_Stop;
}
public Action:CSS_Hook_ShotgunShot(const String:te_name[], const Players[], numClients, Float:delay)
{
if (!g_bHooked)
{
return Plugin_Continue;
}
// Check which clients need to be excluded.
decl newClients[MaxClients], client, i;
new newTotal = 0;
for (i = 0; i < numClients; i++)
{
client = Players[i];
if (!g_bStopSound[client])
{
newClients[newTotal++] = client;
}
}
// No clients were excluded.
if (newTotal == numClients)
{
return Plugin_Continue;
}
else if (newTotal == 0) // All clients were excluded and there is no need to broadcast.
{
return Plugin_Stop;
}
// Re-broadcast to clients that still need it.
decl Float:vTemp[3];
TE_Start("Shotgun Shot");
TE_ReadVector("m_vecOrigin", vTemp);
TE_WriteVector("m_vecOrigin", vTemp);
TE_WriteFloat("m_vecAngles[0]", TE_ReadFloat("m_vecAngles[0]"));
TE_WriteFloat("m_vecAngles[1]", TE_ReadFloat("m_vecAngles[1]"));
TE_WriteNum("m_iWeaponID", TE_ReadNum("m_iWeaponID"));
TE_WriteNum("m_iMode", TE_ReadNum("m_iMode"));
TE_WriteNum("m_iSeed", TE_ReadNum("m_iSeed"));
TE_WriteNum("m_iPlayer", TE_ReadNum("m_iPlayer"));
TE_WriteFloat("m_fInaccuracy", TE_ReadFloat("m_fInaccuracy"));
TE_WriteFloat("m_fSpread", TE_ReadFloat("m_fSpread"));
TE_Send(newClients, newTotal, delay);
return Plugin_Stop;
}
public Action:DODS_Hook_FireBullets(const String:te_name[], const Players[], numClients, Float:delay)
{
if (!g_bHooked)
{
return Plugin_Continue;
}
// Check which clients need to be excluded.
decl newClients[MaxClients], client, i;
new newTotal = 0;
for (i = 0; i < numClients; i++)
{
client = Players[i];
if (!g_bStopSound[client])
{
newClients[newTotal++] = client;
}
}
// No clients were excluded.
if (newTotal == numClients)
{
return Plugin_Continue;
}
else if (newTotal == 0)// All clients were excluded and there is no need to broadcast.
{
return Plugin_Stop;
}
// Re-broadcast to clients that still need it.
decl Float:vTemp[3];
TE_Start("FireBullets");
TE_ReadVector("m_vecOrigin", vTemp);
TE_WriteVector("m_vecOrigin", vTemp);
TE_WriteFloat("m_vecAngles[0]", TE_ReadFloat("m_vecAngles[0]"));
TE_WriteFloat("m_vecAngles[1]", TE_ReadFloat("m_vecAngles[1]"));
TE_WriteNum("m_iWeaponID", TE_ReadNum("m_iWeaponID"));
TE_WriteNum("m_iMode", TE_ReadNum("m_iMode"));
TE_WriteNum("m_iSeed", TE_ReadNum("m_iSeed"));
TE_WriteNum("m_iPlayer", TE_ReadNum("m_iPlayer"));
TE_WriteFloat("m_flSpread", TE_ReadFloat("m_flSpread"));
TE_Send(newClients, newTotal, delay);
return Plugin_Stop;
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <morecolors>
#define PLUGIN_NAME "Toggle Weapon Sounds"
#define PLUGIN_VERSION "1.2.0"
#define UPDATE_URL "http://godtony.mooo.com/stopsound/stopsound.txt"
new bool:g_bStopSound[MAXPLAYERS+1], bool:g_bHooked;
static String:g_sKVPATH[PLATFORM_MAX_PATH];
new Handle:g_hWepSounds;
public Plugin:myinfo =
{
name = PLUGIN_NAME,
author = "GoD-Tony, edit by id/Obus",
description = "Allows clients to stop hearing weapon sounds",
version = PLUGIN_VERSION,
url = "http://www.sourcemod.net/"
};
public OnPluginStart()
{
// Detect game and hook appropriate tempent.
decl String:sGame[32];
GetGameFolderName(sGame, sizeof(sGame));
if (StrEqual(sGame, "cstrike"))
{
AddTempEntHook("Shotgun Shot", CSS_Hook_ShotgunShot);
}
else if (StrEqual(sGame, "dod"))
{
AddTempEntHook("FireBullets", DODS_Hook_FireBullets);
}
// TF2/HL2:DM and misc weapon sounds will be caught here.
AddNormalSoundHook(Hook_NormalSound);
CreateConVar("sm_stopsound_version", PLUGIN_VERSION, "Toggle Weapon Sounds", FCVAR_NOTIFY|FCVAR_DONTRECORD|FCVAR_REPLICATED);
RegConsoleCmd("sm_stopsound", Command_StopSound, "Toggle hearing weapon sounds");
if (g_hWepSounds != INVALID_HANDLE)
{
CloseHandle(g_hWepSounds);
}
g_hWepSounds = CreateKeyValues("WeaponSounds");
BuildPath(Path_SM, g_sKVPATH, sizeof(g_sKVPATH), "data/playerprefs.WepSounds.txt");
FileToKeyValues(g_hWepSounds, g_sKVPATH);
// Updater.
//if (LibraryExists("updater"))
//{
// Updater_AddPlugin(UPDATE_URL);
//}
}
/*public OnLibraryAdded(const String:name[])
{
if (StrEqual(name, "updater"))
{
Updater_AddPlugin(UPDATE_URL);
}
}*/
public Action:Command_StopSound(client, args)
{
if (client == 0)
{
PrintToServer("[SM] Cannot use command from server console.");
return Plugin_Handled;
}
if (args > 0)
{
decl String:Arguments[32];
GetCmdArg(1, Arguments, sizeof(Arguments));
if (StrEqual(Arguments, "save"))
{
KvRewind(g_hWepSounds);
decl String:SID[32];
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
if (KvJumpToKey(g_hWepSounds, SID, true))
{
new disabled;
disabled = KvGetNum(g_hWepSounds, "disabled", 0);
if (!disabled)
{
//CPrintToChat(client, "[StopSound] Saved entry for STEAMID({green}%s{default}) {green}successfully{default}.", SID);
KvSetNum(g_hWepSounds, "disabled", 1);
KvRewind(g_hWepSounds);
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
g_bStopSound[client] = true;
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {red}disabled{default} - {green}entry saved{default}.");
CheckHooks();
return Plugin_Handled;
}
else
{
//CPrintToChat(client, "[StopSound] Entry for STEAMID({green}%s{default}) {green}successfully deleted{default}.", SID);
KvDeleteThis(g_hWepSounds);
KvRewind(g_hWepSounds);
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
g_bStopSound[client] = false;
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
CheckHooks();
return Plugin_Handled;
}
}
KvRewind(g_hWepSounds);
}
else if (StrEqual(Arguments, "delete"))
{
KvRewind(g_hWepSounds);
decl String:SID[32];
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
if (KvJumpToKey(g_hWepSounds, SID, false))
{
g_bStopSound[client] = false;
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds {green}enabled{default} - {red}entry deleted{default}.");
CheckHooks();
KvDeleteThis(g_hWepSounds);
KvRewind(g_hWepSounds);
KeyValuesToFile(g_hWepSounds, g_sKVPATH);
return Plugin_Handled;
}
else
{
CPrintToChat(client, "{green}[StopSound]{default} Entry {red}not found{default}.");
return Plugin_Handled;
}
}
else
{
PrintToChat(client, "[SM] Usage sm_stopsound <save|delete>");
return Plugin_Handled;
}
}
g_bStopSound[client] = !g_bStopSound[client];
CReplyToCommand(client, "{green}[StopSound]{default} Weapon sounds %s.", g_bStopSound[client] ? "{red}disabled{default}" : "{green}enabled{default}");
CheckHooks();
return Plugin_Handled;
}
public OnClientPutInServer(client)
{
KvRewind(g_hWepSounds);
decl String:SID[32];
GetClientAuthId(client, AuthId_Steam2, SID, sizeof(SID));
if (KvJumpToKey(g_hWepSounds, SID, false))
{
new disabled;
disabled = KvGetNum(g_hWepSounds, "disabled", 0);
if (disabled)
{
g_bStopSound[client] = true;
}
}
CheckHooks();
KvRewind(g_hWepSounds);
}
public OnClientDisconnect_Post(client)
{
g_bStopSound[client] = false;
CheckHooks();
}
CheckHooks()
{
new bool:bShouldHook = false;
for (new i = 1; i <= MaxClients; i++)
{
if (g_bStopSound[i])
{
bShouldHook = true;
break;
}
}
// Fake (un)hook because toggling actual hooks will cause server instability.
g_bHooked = bShouldHook;
}
public Action:Hook_NormalSound(clients[64], &numClients, String:sample[PLATFORM_MAX_PATH], &entity, &channel, &Float:volume, &level, &pitch, &flags)
{
// Ignore non-weapon sounds.
if (!g_bHooked || !(strncmp(sample, "weapons", 7) == 0 || strncmp(sample[1], "weapons", 7) == 0))
{
return Plugin_Continue;
}
decl i, j;
for (i = 0; i < numClients; i++)
{
if (g_bStopSound[clients[i]])
{
// Remove the client from the array.
for (j = i; j < numClients - 1; j++)
{
clients[j] = clients[j + 1];
}
numClients--;
i--;
}
}
return (numClients > 0) ? Plugin_Changed : Plugin_Stop;
}
public Action:CSS_Hook_ShotgunShot(const String:te_name[], const Players[], numClients, Float:delay)
{
if (!g_bHooked)
{
return Plugin_Continue;
}
// Check which clients need to be excluded.
decl newClients[MaxClients], client, i;
new newTotal = 0;
for (i = 0; i < numClients; i++)
{
client = Players[i];
if (!g_bStopSound[client])
{
newClients[newTotal++] = client;
}
}
// No clients were excluded.
if (newTotal == numClients)
{
return Plugin_Continue;
}
else if (newTotal == 0) // All clients were excluded and there is no need to broadcast.
{
return Plugin_Stop;
}
// Re-broadcast to clients that still need it.
decl Float:vTemp[3];
TE_Start("Shotgun Shot");
TE_ReadVector("m_vecOrigin", vTemp);
TE_WriteVector("m_vecOrigin", vTemp);
TE_WriteFloat("m_vecAngles[0]", TE_ReadFloat("m_vecAngles[0]"));
TE_WriteFloat("m_vecAngles[1]", TE_ReadFloat("m_vecAngles[1]"));
TE_WriteNum("m_iWeaponID", TE_ReadNum("m_iWeaponID"));
TE_WriteNum("m_iMode", TE_ReadNum("m_iMode"));
TE_WriteNum("m_iSeed", TE_ReadNum("m_iSeed"));
TE_WriteNum("m_iPlayer", TE_ReadNum("m_iPlayer"));
TE_WriteFloat("m_fInaccuracy", TE_ReadFloat("m_fInaccuracy"));
TE_WriteFloat("m_fSpread", TE_ReadFloat("m_fSpread"));
TE_Send(newClients, newTotal, delay);
return Plugin_Stop;
}
public Action:DODS_Hook_FireBullets(const String:te_name[], const Players[], numClients, Float:delay)
{
if (!g_bHooked)
{
return Plugin_Continue;
}
// Check which clients need to be excluded.
decl newClients[MaxClients], client, i;
new newTotal = 0;
for (i = 0; i < numClients; i++)
{
client = Players[i];
if (!g_bStopSound[client])
{
newClients[newTotal++] = client;
}
}
// No clients were excluded.
if (newTotal == numClients)
{
return Plugin_Continue;
}
else if (newTotal == 0)// All clients were excluded and there is no need to broadcast.
{
return Plugin_Stop;
}
// Re-broadcast to clients that still need it.
decl Float:vTemp[3];
TE_Start("FireBullets");
TE_ReadVector("m_vecOrigin", vTemp);
TE_WriteVector("m_vecOrigin", vTemp);
TE_WriteFloat("m_vecAngles[0]", TE_ReadFloat("m_vecAngles[0]"));
TE_WriteFloat("m_vecAngles[1]", TE_ReadFloat("m_vecAngles[1]"));
TE_WriteNum("m_iWeaponID", TE_ReadNum("m_iWeaponID"));
TE_WriteNum("m_iMode", TE_ReadNum("m_iMode"));
TE_WriteNum("m_iSeed", TE_ReadNum("m_iSeed"));
TE_WriteNum("m_iPlayer", TE_ReadNum("m_iPlayer"));
TE_WriteFloat("m_flSpread", TE_ReadFloat("m_flSpread"));
TE_Send(newClients, newTotal, delay);
return Plugin_Stop;
}

View File

@ -1,274 +1,274 @@
#pragma semicolon 1
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#define TIMER_INTERVAL 1.0
Handle g_hTimer = INVALID_HANDLE;
ConVar g_CVar_MaxWeapons;
ConVar g_CVar_WeaponLifetime;
new g_RealRoundStartedTime;
new g_MaxWeapons;
new g_MaxWeaponLifetime;
#define MAX_WEAPONS MAXPLAYERS
new G_WeaponArray[MAX_WEAPONS][2];
public Plugin myinfo =
{
name = "WeaponCleaner",
author = "BotoX",
description = "Clean unneeded weapons",
version = "2.0",
url = ""
};
public void OnPluginStart()
{
RegAdminCmd("sm_sweep", Command_CleanupWeapons, ADMFLAG_GENERIC, "Cleans up all the weapons on the map unless they have a HammerID attached to them.");
g_CVar_MaxWeapons = CreateConVar("sm_weaponcleaner_max", "5", "The maximum amount of weapons allowed in the game.", 0, true, 0.0, true, MAX_WEAPONS - 1.0);
g_MaxWeapons = g_CVar_MaxWeapons.IntValue;
g_CVar_MaxWeapons.AddChangeHook(OnConVarChanged);
g_CVar_WeaponLifetime = CreateConVar("sm_weaponcleaner_lifetime", "15", "The maximum amount of time in seconds a weapon is allowed in the game.", 0, true, 0.0);
g_MaxWeaponLifetime = g_CVar_WeaponLifetime.IntValue;
g_CVar_WeaponLifetime.AddChangeHook(OnConVarChanged);
HookEvent("round_start", Event_RoundStart);
AutoExecConfig(true, "plugin.WeaponCleaner");
}
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
{
if(convar == g_CVar_MaxWeapons)
{
if(StringToInt(newValue) < StringToInt(oldValue))
{
// Need to shrink list and kill items
new d = StringToInt(oldValue) - StringToInt(newValue);
// Kill items that don't have space anymore
for(new i = 0; d && i < g_MaxWeapons; i++)
{
if(!G_WeaponArray[i][0])
continue;
// Kill it
AcceptEntityInput(G_WeaponArray[0][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Move index backwards (since the list was modified by removing it)
i--;
d--;
}
}
g_MaxWeapons = StringToInt(newValue);
}
else if(convar == g_CVar_WeaponLifetime)
{
g_MaxWeaponLifetime = StringToInt(newValue);
CheckWeapons();
}
}
public void OnMapStart()
{
if(g_hTimer != INVALID_HANDLE && CloseHandle(g_hTimer))
g_hTimer = INVALID_HANDLE;
g_hTimer = CreateTimer(TIMER_INTERVAL, Timer_CleanupWeapons, INVALID_HANDLE, TIMER_REPEAT);
}
public void OnMapEnd()
{
if(g_hTimer != INVALID_HANDLE && CloseHandle(g_hTimer))
g_hTimer = INVALID_HANDLE;
}
public void OnClientPutInServer(int client)
{
SDKHook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
SDKHook(client, SDKHook_WeaponEquipPost, OnWeaponEquip);
}
public void OnClientDisconnect(int client)
{
SDKUnhook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
SDKUnhook(client, SDKHook_WeaponEquipPost, OnWeaponEquip);
}
public void OnEntityCreated(int entity, const char[] classname)
{
if(IsValidEntity(entity) && strncmp(classname, "weapon_", 7) == 0)
{
SDKHook(entity, SDKHook_Spawn, OnWeaponSpawned);
}
}
public void OnEntityDestroyed(int entity)
{
RemoveWeapon(entity);
}
public void OnWeaponSpawned(int entity)
{
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
// Should not be cleaned since it's a map spawned weapon
if(HammerID)
return;
// Weapon doesn't belong to any player
if(GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity") == -1)
InsertWeapon(entity);
}
public Action OnWeaponEquip(int client, int entity)
{
if(!IsValidEntity(entity))
return;
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
// Should not be cleaned since it's a map spawned weapon
if(HammerID)
return;
// Weapon should not be cleaned anymore
RemoveWeapon(entity);
}
public Action OnWeaponDrop(int client, int entity)
{
if(!IsValidEntity(entity))
return;
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
// Should not be cleaned since it's a map spawned weapon
if(HammerID)
return;
// Kill all dropped weapons during mp_freezetime
if(GetTime() < g_RealRoundStartedTime)
{
// Kill it
AcceptEntityInput(entity, "Kill");
return;
}
// Weapon should be cleaned again
InsertWeapon(entity);
}
bool InsertWeapon(int entity)
{
// Try to find a free slot
for(new i = 0; i < g_MaxWeapons; i++)
{
if(G_WeaponArray[i][0])
continue;
// Found a free slot, add it here
G_WeaponArray[i][0] = entity;
G_WeaponArray[i][1] = GetTime();
return true;
}
// No free slot found
// Kill the first (oldest) item in the list
AcceptEntityInput(G_WeaponArray[0][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Add new weapon to the end of the list
G_WeaponArray[g_MaxWeapons - 1][0] = entity;
G_WeaponArray[g_MaxWeapons - 1][1] = GetTime();
return true;
}
bool RemoveWeapon(int entity)
{
// Find the Weapon
for(new i = 0; i < g_MaxWeapons; i++)
{
if(G_WeaponArray[i][0] == entity)
{
G_WeaponArray[i][0] = 0; G_WeaponArray[i][1] = 0;
// Move list items in front of this index back by one
for(new j = i + 1; j < g_MaxWeapons; j++)
{
G_WeaponArray[j - 1][0] = G_WeaponArray[j][0];
G_WeaponArray[j - 1][1] = G_WeaponArray[j][1];
}
// Reset last list item
G_WeaponArray[g_MaxWeapons - 1][0] = 0;
G_WeaponArray[g_MaxWeapons - 1][1] = 0;
return true;
}
}
return false;
}
bool CheckWeapons()
{
for(new i = 0; i < g_MaxWeapons; i++)
{
if(!G_WeaponArray[i][0])
continue;
if(GetTime() - G_WeaponArray[i][1] >= g_MaxWeaponLifetime)
{
// Kill it
AcceptEntityInput(G_WeaponArray[i][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Move index backwards (since the list was modified by removing it)
i--;
}
}
return true;
}
void CleanupWeapons()
{
for(new i = 0; i < g_MaxWeapons; i++)
{
if(!G_WeaponArray[i][0])
continue;
// Kill it
AcceptEntityInput(G_WeaponArray[i][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Move index backwards (since the list was modified by removing it)
i--;
}
}
public Action Event_RoundStart(Handle:event, const char[] name, bool:dontBroadcast)
{
for(new i = 0; i < MAX_WEAPONS; i++)
{
G_WeaponArray[i][0] = 0; G_WeaponArray[i][1] = 0;
}
g_RealRoundStartedTime = GetTime() + GetConVarInt(FindConVar("mp_freezetime"));
}
public Action Timer_CleanupWeapons(Handle:timer)
{
CheckWeapons();
}
public Action Command_CleanupWeapons(client, args)
{
CleanupWeapons();
LogAction(client, -1, "%L performed a weapons cleanup", client);
PrintToChat(client, "[SM] Weapons cleaned successfully!");
}
#pragma semicolon 1
#include <sourcemod>
#include <sdkhooks>
#include <sdktools>
#define TIMER_INTERVAL 1.0
Handle g_hTimer = INVALID_HANDLE;
ConVar g_CVar_MaxWeapons;
ConVar g_CVar_WeaponLifetime;
new g_RealRoundStartedTime;
new g_MaxWeapons;
new g_MaxWeaponLifetime;
#define MAX_WEAPONS MAXPLAYERS
new G_WeaponArray[MAX_WEAPONS][2];
public Plugin myinfo =
{
name = "WeaponCleaner",
author = "BotoX",
description = "Clean unneeded weapons",
version = "2.0",
url = ""
};
public void OnPluginStart()
{
RegAdminCmd("sm_sweep", Command_CleanupWeapons, ADMFLAG_GENERIC, "Cleans up all the weapons on the map unless they have a HammerID attached to them.");
g_CVar_MaxWeapons = CreateConVar("sm_weaponcleaner_max", "5", "The maximum amount of weapons allowed in the game.", 0, true, 0.0, true, MAX_WEAPONS - 1.0);
g_MaxWeapons = g_CVar_MaxWeapons.IntValue;
g_CVar_MaxWeapons.AddChangeHook(OnConVarChanged);
g_CVar_WeaponLifetime = CreateConVar("sm_weaponcleaner_lifetime", "15", "The maximum amount of time in seconds a weapon is allowed in the game.", 0, true, 0.0);
g_MaxWeaponLifetime = g_CVar_WeaponLifetime.IntValue;
g_CVar_WeaponLifetime.AddChangeHook(OnConVarChanged);
HookEvent("round_start", Event_RoundStart);
AutoExecConfig(true, "plugin.WeaponCleaner");
}
public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] newValue)
{
if(convar == g_CVar_MaxWeapons)
{
if(StringToInt(newValue) < StringToInt(oldValue))
{
// Need to shrink list and kill items
new d = StringToInt(oldValue) - StringToInt(newValue);
// Kill items that don't have space anymore
for(new i = 0; d && i < g_MaxWeapons; i++)
{
if(!G_WeaponArray[i][0])
continue;
// Kill it
AcceptEntityInput(G_WeaponArray[0][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Move index backwards (since the list was modified by removing it)
i--;
d--;
}
}
g_MaxWeapons = StringToInt(newValue);
}
else if(convar == g_CVar_WeaponLifetime)
{
g_MaxWeaponLifetime = StringToInt(newValue);
CheckWeapons();
}
}
public void OnMapStart()
{
if(g_hTimer != INVALID_HANDLE && CloseHandle(g_hTimer))
g_hTimer = INVALID_HANDLE;
g_hTimer = CreateTimer(TIMER_INTERVAL, Timer_CleanupWeapons, INVALID_HANDLE, TIMER_REPEAT);
}
public void OnMapEnd()
{
if(g_hTimer != INVALID_HANDLE && CloseHandle(g_hTimer))
g_hTimer = INVALID_HANDLE;
}
public void OnClientPutInServer(int client)
{
SDKHook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
SDKHook(client, SDKHook_WeaponEquipPost, OnWeaponEquip);
}
public void OnClientDisconnect(int client)
{
SDKUnhook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
SDKUnhook(client, SDKHook_WeaponEquipPost, OnWeaponEquip);
}
public void OnEntityCreated(int entity, const char[] classname)
{
if(IsValidEntity(entity) && strncmp(classname, "weapon_", 7) == 0)
{
SDKHook(entity, SDKHook_Spawn, OnWeaponSpawned);
}
}
public void OnEntityDestroyed(int entity)
{
RemoveWeapon(entity);
}
public void OnWeaponSpawned(int entity)
{
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
// Should not be cleaned since it's a map spawned weapon
if(HammerID)
return;
// Weapon doesn't belong to any player
if(GetEntPropEnt(entity, Prop_Data, "m_hOwnerEntity") == -1)
InsertWeapon(entity);
}
public Action OnWeaponEquip(int client, int entity)
{
if(!IsValidEntity(entity))
return;
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
// Should not be cleaned since it's a map spawned weapon
if(HammerID)
return;
// Weapon should not be cleaned anymore
RemoveWeapon(entity);
}
public Action OnWeaponDrop(int client, int entity)
{
if(!IsValidEntity(entity))
return;
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
// Should not be cleaned since it's a map spawned weapon
if(HammerID)
return;
// Kill all dropped weapons during mp_freezetime
if(GetTime() < g_RealRoundStartedTime)
{
// Kill it
AcceptEntityInput(entity, "Kill");
return;
}
// Weapon should be cleaned again
InsertWeapon(entity);
}
bool InsertWeapon(int entity)
{
// Try to find a free slot
for(new i = 0; i < g_MaxWeapons; i++)
{
if(G_WeaponArray[i][0])
continue;
// Found a free slot, add it here
G_WeaponArray[i][0] = entity;
G_WeaponArray[i][1] = GetTime();
return true;
}
// No free slot found
// Kill the first (oldest) item in the list
AcceptEntityInput(G_WeaponArray[0][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Add new weapon to the end of the list
G_WeaponArray[g_MaxWeapons - 1][0] = entity;
G_WeaponArray[g_MaxWeapons - 1][1] = GetTime();
return true;
}
bool RemoveWeapon(int entity)
{
// Find the Weapon
for(new i = 0; i < g_MaxWeapons; i++)
{
if(G_WeaponArray[i][0] == entity)
{
G_WeaponArray[i][0] = 0; G_WeaponArray[i][1] = 0;
// Move list items in front of this index back by one
for(new j = i + 1; j < g_MaxWeapons; j++)
{
G_WeaponArray[j - 1][0] = G_WeaponArray[j][0];
G_WeaponArray[j - 1][1] = G_WeaponArray[j][1];
}
// Reset last list item
G_WeaponArray[g_MaxWeapons - 1][0] = 0;
G_WeaponArray[g_MaxWeapons - 1][1] = 0;
return true;
}
}
return false;
}
bool CheckWeapons()
{
for(new i = 0; i < g_MaxWeapons; i++)
{
if(!G_WeaponArray[i][0])
continue;
if(GetTime() - G_WeaponArray[i][1] >= g_MaxWeaponLifetime)
{
// Kill it
AcceptEntityInput(G_WeaponArray[i][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Move index backwards (since the list was modified by removing it)
i--;
}
}
return true;
}
void CleanupWeapons()
{
for(new i = 0; i < g_MaxWeapons; i++)
{
if(!G_WeaponArray[i][0])
continue;
// Kill it
AcceptEntityInput(G_WeaponArray[i][0], "Kill");
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
// Move index backwards (since the list was modified by removing it)
i--;
}
}
public Action Event_RoundStart(Handle:event, const char[] name, bool:dontBroadcast)
{
for(new i = 0; i < MAX_WEAPONS; i++)
{
G_WeaponArray[i][0] = 0; G_WeaponArray[i][1] = 0;
}
g_RealRoundStartedTime = GetTime() + GetConVarInt(FindConVar("mp_freezetime"));
}
public Action Timer_CleanupWeapons(Handle:timer)
{
CheckWeapons();
}
public Action Command_CleanupWeapons(client, args)
{
CleanupWeapons();
LogAction(client, -1, "%L performed a weapons cleanup", client);
PrintToChat(client, "[SM] Weapons cleaned successfully!");
}

View File

@ -1,190 +1,190 @@
/**
* This is the include file for Custom Chat Colors
* https://forums.alliedmods.net/showthread.php?t=186695
* To check that Custom Chat Colors is installed and running, verify that the "ccc" library exists
*/
#if defined _ccc_included
#endinput
#endif
#define _ccc_included
enum CCC_ColorType {
CCC_TagColor,
CCC_NameColor,
CCC_ChatColor
};
#define COLOR_NULL -1
#define COLOR_NONE -2
#define COLOR_CGREEN -3 //0x40FF40
#define COLOR_OLIVE -4 //0x99FF99
#define COLOR_TEAM -5
/**
* Gets a client's color as a hexadecimal integer.
*
* @param client Client index
* @param type Color type to retreive
* @param alpha Pass a boolean variable by reference here and it will be true if the color has alpha specified or false if it doesn't (or is a stock color)
* @return Color as a hexadecimal integer (use %X in formatting to get a hexadecimal string)
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_GetColor(client, CCC_ColorType:type, &bool:alpha = false);
/**
* Sets a client's color as a hexadecimal integer.
*
* @param client Client index
* @param type Color type to set
* @param color Integer representation of the color (use StringToInt(input, 16) to convert a hexadecimal string) or one of the color defines
* @param alpha Are you specifying a color with alpha?
* @return True if the color is updated successfully, false otherwise
*
* On error/errors: Invalid client index or client is not in game
*/
native bool:CCC_SetColor(client, CCC_ColorType:type, color, bool:alpha);
/**
* Gets a client's tag
*
* @param client Client index
* @param buffer Buffer to store the tag in
* @param maxlen Maximum buffer length
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_GetTag(client, String:buffer[], maxlen);
/**
* Sets a client's tag
*
* @param client Client index
* @param tag String containing the new tag
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_SetTag(client, const String:tag[]);
/**
* Resets a client's color to the value in the config file.
*
* @param client Client index
* @param type Color type to restore
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_ResetColor(client, CCC_ColorType:type);
/**
* Resets a client's tag to the value in the config file.
*
* @param client Client index
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_ResetTag(client);
/**
* Called when a cilent's name is about to be colored
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
*/
#pragma deprecated Use CCC_OnColor instead
forward Action:CCC_OnNameColor(client);
/**
* Called when a client's chat is about to be colored
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
*/
#pragma deprecated Use CCC_OnColor instead
forward Action:CCC_OnChatColor(client);
/**
* Called when a client's name is about to be tagged
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @return Plugin_Handled to prevent tagging, Plugin_Continue to allow tagging
*/
#pragma deprecated Use CCC_OnColor instead
forward Action:CCC_OnTagApplied(client);
/**
* Called when a client's name is about to be tagged
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @param message Chat message that will be printed
* @param type What type of color will be applied. If this is CCC_TagColor, it controls whether the tag will be applied at all, not whether the tag will be colored.
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
*/
forward Action:CCC_OnColor(client, const String:message[], CCC_ColorType:type);
/**
* Called when a message has been fully colored and will be sent, unless further plugins modify it through Simple Chat Processor
*
* @param author Author client index
* @param message Message
* @param maxlen Maximum length of message buffer
* @noreturn
*/
forward CCC_OnChatMessage(author, String:message[], maxlen);
/**
* Called when a client's colors and tag are about to be loaded from the config file
* At this point, the client has NO COLORS
*
* @param client Client index
* @return Plugin_Handled or Plugin_Stop to prevent loading, Plugin_Continue or Plugin_Changed to allow
*/
forward Action:CCC_OnUserConfigPreLoaded(client);
/**
* Called when a client's colors and tag have been loaded from the config file
*
* @param client Client index
* @noreturn
*/
forward CCC_OnUserConfigLoaded(client);
/**
* Called when the configuration file is reloaded with the sm_reloadccc command
*
* @noreturn
*/
forward CCC_OnConfigReloaded();
native void CCC_UpdateIgnoredArray(bool IgnoredArray[(MAXPLAYERS + 1) * (MAXPLAYERS + 1)]);
public SharedPlugin:__pl_ccc = {
name = "ccc",
file = "custom-chatcolors.smx",
#if defined REQUIRE_PLUGIN
required = 1
#else
required = 0
#endif
};
#if !defined REQUIRE_PLUGIN
public __pl_ccc_SetNTVOptional() {
MarkNativeAsOptional("CCC_GetColor");
MarkNativeAsOptional("CCC_SetColor");
MarkNativeAsOptional("CCC_GetTag");
MarkNativeAsOptional("CCC_ResetTag");
MarkNativeAsOptional("CCC_ResetColor");
MarkNativeAsOptional("CCC_ResetTag");
MarkNativeAsOptional("CCC_UpdateIgnoredArray");
}
/**
* This is the include file for Custom Chat Colors
* https://forums.alliedmods.net/showthread.php?t=186695
* To check that Custom Chat Colors is installed and running, verify that the "ccc" library exists
*/
#if defined _ccc_included
#endinput
#endif
#define _ccc_included
enum CCC_ColorType {
CCC_TagColor,
CCC_NameColor,
CCC_ChatColor
};
#define COLOR_NULL -1
#define COLOR_NONE -2
#define COLOR_CGREEN -3 //0x40FF40
#define COLOR_OLIVE -4 //0x99FF99
#define COLOR_TEAM -5
/**
* Gets a client's color as a hexadecimal integer.
*
* @param client Client index
* @param type Color type to retreive
* @param alpha Pass a boolean variable by reference here and it will be true if the color has alpha specified or false if it doesn't (or is a stock color)
* @return Color as a hexadecimal integer (use %X in formatting to get a hexadecimal string)
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_GetColor(client, CCC_ColorType:type, &bool:alpha = false);
/**
* Sets a client's color as a hexadecimal integer.
*
* @param client Client index
* @param type Color type to set
* @param color Integer representation of the color (use StringToInt(input, 16) to convert a hexadecimal string) or one of the color defines
* @param alpha Are you specifying a color with alpha?
* @return True if the color is updated successfully, false otherwise
*
* On error/errors: Invalid client index or client is not in game
*/
native bool:CCC_SetColor(client, CCC_ColorType:type, color, bool:alpha);
/**
* Gets a client's tag
*
* @param client Client index
* @param buffer Buffer to store the tag in
* @param maxlen Maximum buffer length
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_GetTag(client, String:buffer[], maxlen);
/**
* Sets a client's tag
*
* @param client Client index
* @param tag String containing the new tag
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_SetTag(client, const String:tag[]);
/**
* Resets a client's color to the value in the config file.
*
* @param client Client index
* @param type Color type to restore
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_ResetColor(client, CCC_ColorType:type);
/**
* Resets a client's tag to the value in the config file.
*
* @param client Client index
* @noreturn
*
* On error/errors: Invalid client index or client is not in game
*/
native CCC_ResetTag(client);
/**
* Called when a cilent's name is about to be colored
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
*/
#pragma deprecated Use CCC_OnColor instead
forward Action:CCC_OnNameColor(client);
/**
* Called when a client's chat is about to be colored
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
*/
#pragma deprecated Use CCC_OnColor instead
forward Action:CCC_OnChatColor(client);
/**
* Called when a client's name is about to be tagged
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @return Plugin_Handled to prevent tagging, Plugin_Continue to allow tagging
*/
#pragma deprecated Use CCC_OnColor instead
forward Action:CCC_OnTagApplied(client);
/**
* Called when a client's name is about to be tagged
* DO NOT START A NEW USERMESSAGE (i.e. PrintToChat, PrintToChatAll) WITHIN THIS FORWARD
*
* @param client Client index
* @param message Chat message that will be printed
* @param type What type of color will be applied. If this is CCC_TagColor, it controls whether the tag will be applied at all, not whether the tag will be colored.
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
*/
forward Action:CCC_OnColor(client, const String:message[], CCC_ColorType:type);
/**
* Called when a message has been fully colored and will be sent, unless further plugins modify it through Simple Chat Processor
*
* @param author Author client index
* @param message Message
* @param maxlen Maximum length of message buffer
* @noreturn
*/
forward CCC_OnChatMessage(author, String:message[], maxlen);
/**
* Called when a client's colors and tag are about to be loaded from the config file
* At this point, the client has NO COLORS
*
* @param client Client index
* @return Plugin_Handled or Plugin_Stop to prevent loading, Plugin_Continue or Plugin_Changed to allow
*/
forward Action:CCC_OnUserConfigPreLoaded(client);
/**
* Called when a client's colors and tag have been loaded from the config file
*
* @param client Client index
* @noreturn
*/
forward CCC_OnUserConfigLoaded(client);
/**
* Called when the configuration file is reloaded with the sm_reloadccc command
*
* @noreturn
*/
forward CCC_OnConfigReloaded();
native void CCC_UpdateIgnoredArray(bool IgnoredArray[(MAXPLAYERS + 1) * (MAXPLAYERS + 1)]);
public SharedPlugin:__pl_ccc = {
name = "ccc",
file = "custom-chatcolors.smx",
#if defined REQUIRE_PLUGIN
required = 1
#else
required = 0
#endif
};
#if !defined REQUIRE_PLUGIN
public __pl_ccc_SetNTVOptional() {
MarkNativeAsOptional("CCC_GetColor");
MarkNativeAsOptional("CCC_SetColor");
MarkNativeAsOptional("CCC_GetTag");
MarkNativeAsOptional("CCC_ResetTag");
MarkNativeAsOptional("CCC_ResetColor");
MarkNativeAsOptional("CCC_ResetTag");
MarkNativeAsOptional("CCC_UpdateIgnoredArray");
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,482 +1,482 @@
#if defined _dhooks_included
#endinput
#endif
#define _dhooks_included
enum ObjectValueType
{
ObjectValueType_Int = 0,
ObjectValueType_Bool,
ObjectValueType_Ehandle,
ObjectValueType_Float,
ObjectValueType_CBaseEntityPtr,
ObjectValueType_IntPtr,
ObjectValueType_BoolPtr,
ObjectValueType_EhandlePtr,
ObjectValueType_FloatPtr,
ObjectValueType_Vector,
ObjectValueType_VectorPtr,
ObjectValueType_CharPtr,
ObjectValueType_String
};
enum ListenType
{
ListenType_Created,
ListenType_Deleted
};
enum ReturnType
{
ReturnType_Unknown,
ReturnType_Void,
ReturnType_Int,
ReturnType_Bool,
ReturnType_Float,
ReturnType_String, //Note this is a string_t
ReturnType_StringPtr, //Note this is a string_t *
ReturnType_CharPtr,
ReturnType_Vector,
ReturnType_VectorPtr,
ReturnType_CBaseEntity,
ReturnType_Edict
};
enum HookParamType
{
HookParamType_Unknown,
HookParamType_Int,
HookParamType_Bool,
HookParamType_Float,
HookParamType_String, //Note this is a string_t
HookParamType_StringPtr, //Note this is a string_t *
HookParamType_CharPtr,
HookParamType_VectorPtr,
HookParamType_CBaseEntity,
HookParamType_ObjectPtr,
HookParamType_Edict,
HookParamType_Object
};
enum ThisPointerType
{
ThisPointer_Ignore,
ThisPointer_CBaseEntity,
ThisPointer_Address
};
enum HookType
{
HookType_Entity,
HookType_GameRules,
HookType_Raw
};
enum MRESReturn
{
MRES_ChangedHandled = -2, // Use changed values and return MRES_Handled
MRES_ChangedOverride, // Use changed values and return MRES_Override
MRES_Ignored, // plugin didn't take any action
MRES_Handled, // plugin did something, but real function should still be called
MRES_Override, // call real function, but use my return value
MRES_Supercede // skip real function; use my return value
};
enum DHookPassFlag
{
DHookPass_ByVal = (1<<0),
DHookPass_ByRef = (1<<1)
};
typeset ListenCB
{
//Deleted
function void (int entity);
//Created
function void (int entity, const char[] classname);
};
typeset DHookRemovalCB
{
function void (int hookid);
};
typeset DHookCallback
{
//Function Example: void Ham::Test() with this pointer ignore
function MRESReturn ();
//Function Example: void Ham::Test() with this pointer passed
function MRESReturn (int pThis);
//Function Example: void Ham::Test(int cake) with this pointer ignore
function MRESReturn (Handle hParams);
//Function Example: void Ham::Test(int cake) with this pointer passed
function MRESReturn (int pThis, Handle hParams);
//Function Example: int Ham::Test() with this pointer ignore
function MRESReturn (Handle hReturn);
//Function Example: int Ham::Test() with this pointer passed
function MRESReturn (int pThis, Handle hReturn);
//Function Example: int Ham::Test(int cake) with this pointer ignore
function MRESReturn (Handle hReturn, Handle hParams);
//Function Example: int Ham::Test(int cake) with this pointer passed
function MRESReturn (int pThis, Handle hReturn, Handle hParams);
//Address NOW
//Function Example: void Ham::Test() with this pointer passed
function MRESReturn (Address pThis);
//Function Example: void Ham::Test(int cake) with this pointer passed
function MRESReturn (Address pThis, Handle hParams);
//Function Example: int Ham::Test() with this pointer passed
function MRESReturn (Address pThis, Handle hReturn);
//Function Example: int Ham::Test(int cake) with this pointer passed
function MRESReturn (Address pThis, Handle hReturn, Handle hParams);
};
/* Adds an entity listener hook
*
* @param type Type of listener to add
* @param callback Callback to use
*
* @noreturn
*/
native void DHookAddEntityListener(ListenType type, ListenCB callback);
/* Removes an entity listener hook
*
* @param type Type of listener to remove
* @param callback Callback this listener was using
*
* @return True if one was removed false otherwise.
*/
native bool DHookRemoveEntityListener(ListenType type, ListenCB callback);
/* Creates a hook
*
* @param offset vtable offset for function to hook
* @param hooktype Type of hook
* @param returntype Type type of return
* @param thistype Type of this pointer or ignore (ignore can be used if not needed)
* @param callback Callback function
*
* @return Returns setup handle for the hook or INVALID_HANDLE.
*/
native Handle DHookCreate(int offset, HookType hooktype, ReturnType returntype, ThisPointerType thistype, DHookCallback callback);
/* Adds param to a hook setup
*
* @param setup Setup handle to add the param to.
* @param type Param type
* @param size Used for Objects (not Object ptr) to define the size of the object.
* @param flag Used to change the pass type.
*
* @error Invalid setup handle or too many params added (request upping the max in thread)
* @noreturn
*/
native void DHookAddParam(Handle setup, HookParamType type, int size=-1, DHookPassFlag flag=DHookPass_ByVal);
//native DHookAddParam(Handle:setup, HookParamType:type);
/* Hook entity
*
* @param setup Setup handle to use to add the hook.
* @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!)
* @param entity Entity index to hook on.
* @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and will call this callback)
*
* @error Invalid setup handle, invalid entity or invalid hook type.
* @return -1 on fail a hookid on success
*/
native int DHookEntity(Handle setup, bool post, int entity, DHookRemovalCB removalcb=INVALID_FUNCTION);
/* Hook gamerules
*
* @param setup Setup handle to use to add the hook.
* @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!)
* @param removalcb Callback for when the hook is removed (Game rules hooks are auto-removed on map end and will call this callback)
*
* @error Invalid setup handle, failing to get gamerules pointer or invalid hook type.
* @return -1 on fail a hookid on success
*/
native int DHookGamerules(Handle setup, bool post, DHookRemovalCB removalcb=INVALID_FUNCTION);
/* Hook a raw pointer
*
* @param setup Setup handle to use to add the hook.
* @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!)
* @param addr This pointer address.
* @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and will call this callback)
*
* @error Invalid setup handle, invalid address or invalid hook type.
* @return -1 on fail a hookid on success
*/
native int DHookRaw(Handle setup, bool post, Address addr, DHookRemovalCB removalcb=INVALID_FUNCTION);
/* Remove hook by hook id
*
* @param hookid Hook id to remove
*
* @return true on success false otherwise
* @note This will not fire the removal callback!
*/
native bool DHookRemoveHookID(int hookid);
/* Get param value (Only use for: int, entity, bool or float param types)
*
* @param hParams Handle to params structure
* @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1. 0 Will return the number of params stored)
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @return value if num greater than 0. If 0 returns paramcount.
*/
native any DHookGetParam(Handle hParams, int num);
/* Get vector param value
*
* @param hParams Handle to params structure
* @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1.)
* @param vec Vector buffer to store result.
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookGetParamVector(Handle hParams, int num, float vec[3]);
/* Get string param value
*
* @param hParams Handle to params structure
* @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1.)
* @param buffer String buffer to store result
* @param size Buffer size
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookGetParamString(Handle hParams, int num, char[] buffer, int size);
/* Set param value (Only use for: int, entity, bool or float param types)
*
* @param hParams Handle to params structure
* @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.)
* @param value Value to set it as (only pass int, bool, float or entity index)
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookSetParam(Handle hParams, int num, any value);
/* Set vector param value
*
* @param hParams Handle to params structure
* @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.)
* @param vec Value to set vector as.
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookSetParamVector(Handle hParams, int num, float vec[3]);
/* Set string param value
*
* @param hParams Handle to params structure
* @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.)
* @param value Value to set string as.
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookSetParamString(Handle hParams, int num, char[] value);
/* Get return value (Only use for: int, entity, bool or float return types)
*
* @param hReturn Handle to return structure
*
* @error Invalid Handle, invalid type.
* @return Returns default value if prehook returns actual value if post hook.
*/
native any DHookGetReturn(Handle hReturn);
/* Get return vector value
*
* @param hReturn Handle to return structure
* @param vec Vector buffer to store result in. (In pre hooks will be default value (0.0,0.0,0.0))
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookGetReturnVector(Handle hReturn, float vec[3]);
/* Get return string value
*
* @param hReturn Handle to return structure
* @param buffer String buffer to store result in. (In pre hooks will be default value "")
* @param size String buffer size
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookGetReturnString(Handle hReturn, char[] buffer, int size);
/* Set return value (Only use for: int, entity, bool or float return types)
*
* @param hReturn Handle to return structure
* @param value Value to set return as
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookSetReturn(Handle hReturn, any value);
/* Set return vector value
*
* @param hReturn Handle to return structure
* @param vec Value to set return vector as
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookSetReturnVector(Handle hReturn, float vec[3]);
/* Set return string value
*
* @param hReturn Handle to return structure
* @param value Value to set return string as
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookSetReturnString(Handle hReturn, char[] value);
//WE SHOULD WRAP THESE AROUND STOCKS FOR NON PTR AS WE SUPPORT BOTH WITH THESE NATIVE'S
/* Gets an objects variable value
*
* @param hParams Handle to params structure
* @param num Param number to get.
* @param offset Offset within the object to the var to get.
* @param type Type of var it is
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @return Value of the objects var. If EHANDLE type or entity returns entity index.
*/
native any DHookGetParamObjectPtrVar(Handle hParams, int num, int offset, ObjectValueType type);
/* Sets an objects variable value
*
* @param hParams Handle to params structure
* @param num Param number to set.
* @param offset Offset within the object to the var to set.
* @param type Type of var it is
* @param value The value to set the var to.
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookSetParamObjectPtrVar(Handle hParams, int num, int offset, ObjectValueType type, any value);
/* Gets an objects vector variable value
*
* @param hParams Handle to params structure
* @param num Param number to get.
* @param offset Offset within the object to the var to get.
* @param type Type of var it is
* @param buffer Buffer to store the result vector
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookGetParamObjectPtrVarVector(Handle hParams, int num, int offset, ObjectValueType type, float buffer[3]);
/* Sets an objects vector variable value
*
* @param hParams Handle to params structure
* @param num Param number to set.
* @param offset Offset within the object to the var to set.
* @param type Type of var it is
* @param value The value to set the vector var to.
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookSetParamObjectPtrVarVector(Handle hParams, int num, int offset, ObjectValueType type, float value[3]);
/* Gets an objects string variable value
*
* @param hParams Handle to params structure
* @param num Param number to get.
* @param offset Offset within the object to the var to get.
* @param type Type of var it is
* @param buffer Buffer to store the result vector
* @param size Size of the buffer
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookGetParamObjectPtrString(Handle hParams, int num, int offset, ObjectValueType type, char[] buffer, int size);
/* Checks if a pointer param is null
*
* @param hParams Handle to params structure
* @param num Param number to check.
*
* @error Non pointer param
* @return True if null false otherwise.
*/
native bool DHookIsNullParam(Handle hParams, int num);
public Extension __ext_dhooks =
{
name = "dhooks",
file = "dhooks.ext",
#if defined AUTOLOAD_EXTENSIONS
autoload = 1,
#else
autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
required = 1,
#else
required = 0,
#endif
};
#if !defined REQUIRE_EXTENSIONS
public __ext_dhooks_SetNTVOptional()
{
MarkNativeAsOptional("DHookAddEntityListener");
MarkNativeAsOptional("DHookRemoveEntityListener");
MarkNativeAsOptional("DHookCreate");
MarkNativeAsOptional("DHookAddParam");
MarkNativeAsOptional("DHookEntity");
MarkNativeAsOptional("DHookGamerules");
MarkNativeAsOptional("DHookRaw");
MarkNativeAsOptional("DHookRemoveHookID");
MarkNativeAsOptional("DHookGetParam");
MarkNativeAsOptional("DHookGetParamVector");
MarkNativeAsOptional("DHookGetParamString");
MarkNativeAsOptional("DHookSetParam");
MarkNativeAsOptional("DHookSetParamVector");
MarkNativeAsOptional("DHookSetParamString");
MarkNativeAsOptional("DHookGetReturn");
MarkNativeAsOptional("DHookGetReturnVector");
MarkNativeAsOptional("DHookGetReturnString");
MarkNativeAsOptional("DHookSetReturn");
MarkNativeAsOptional("DHookSetReturnVector");
MarkNativeAsOptional("DHookSetReturnString");
MarkNativeAsOptional("DHookGetParamObjectPtrVar");
MarkNativeAsOptional("DHookSetParamObjectPtrVar");
MarkNativeAsOptional("DHookGetParamObjectPtrVarVector");
MarkNativeAsOptional("DHookSetParamObjectPtrVarVector");
MarkNativeAsOptional("DHookIsNullParam");
MarkNativeAsOptional("DHookGetParamObjectPtrString");
}
#if defined _dhooks_included
#endinput
#endif
#define _dhooks_included
enum ObjectValueType
{
ObjectValueType_Int = 0,
ObjectValueType_Bool,
ObjectValueType_Ehandle,
ObjectValueType_Float,
ObjectValueType_CBaseEntityPtr,
ObjectValueType_IntPtr,
ObjectValueType_BoolPtr,
ObjectValueType_EhandlePtr,
ObjectValueType_FloatPtr,
ObjectValueType_Vector,
ObjectValueType_VectorPtr,
ObjectValueType_CharPtr,
ObjectValueType_String
};
enum ListenType
{
ListenType_Created,
ListenType_Deleted
};
enum ReturnType
{
ReturnType_Unknown,
ReturnType_Void,
ReturnType_Int,
ReturnType_Bool,
ReturnType_Float,
ReturnType_String, //Note this is a string_t
ReturnType_StringPtr, //Note this is a string_t *
ReturnType_CharPtr,
ReturnType_Vector,
ReturnType_VectorPtr,
ReturnType_CBaseEntity,
ReturnType_Edict
};
enum HookParamType
{
HookParamType_Unknown,
HookParamType_Int,
HookParamType_Bool,
HookParamType_Float,
HookParamType_String, //Note this is a string_t
HookParamType_StringPtr, //Note this is a string_t *
HookParamType_CharPtr,
HookParamType_VectorPtr,
HookParamType_CBaseEntity,
HookParamType_ObjectPtr,
HookParamType_Edict,
HookParamType_Object
};
enum ThisPointerType
{
ThisPointer_Ignore,
ThisPointer_CBaseEntity,
ThisPointer_Address
};
enum HookType
{
HookType_Entity,
HookType_GameRules,
HookType_Raw
};
enum MRESReturn
{
MRES_ChangedHandled = -2, // Use changed values and return MRES_Handled
MRES_ChangedOverride, // Use changed values and return MRES_Override
MRES_Ignored, // plugin didn't take any action
MRES_Handled, // plugin did something, but real function should still be called
MRES_Override, // call real function, but use my return value
MRES_Supercede // skip real function; use my return value
};
enum DHookPassFlag
{
DHookPass_ByVal = (1<<0),
DHookPass_ByRef = (1<<1)
};
typeset ListenCB
{
//Deleted
function void (int entity);
//Created
function void (int entity, const char[] classname);
};
typeset DHookRemovalCB
{
function void (int hookid);
};
typeset DHookCallback
{
//Function Example: void Ham::Test() with this pointer ignore
function MRESReturn ();
//Function Example: void Ham::Test() with this pointer passed
function MRESReturn (int pThis);
//Function Example: void Ham::Test(int cake) with this pointer ignore
function MRESReturn (Handle hParams);
//Function Example: void Ham::Test(int cake) with this pointer passed
function MRESReturn (int pThis, Handle hParams);
//Function Example: int Ham::Test() with this pointer ignore
function MRESReturn (Handle hReturn);
//Function Example: int Ham::Test() with this pointer passed
function MRESReturn (int pThis, Handle hReturn);
//Function Example: int Ham::Test(int cake) with this pointer ignore
function MRESReturn (Handle hReturn, Handle hParams);
//Function Example: int Ham::Test(int cake) with this pointer passed
function MRESReturn (int pThis, Handle hReturn, Handle hParams);
//Address NOW
//Function Example: void Ham::Test() with this pointer passed
function MRESReturn (Address pThis);
//Function Example: void Ham::Test(int cake) with this pointer passed
function MRESReturn (Address pThis, Handle hParams);
//Function Example: int Ham::Test() with this pointer passed
function MRESReturn (Address pThis, Handle hReturn);
//Function Example: int Ham::Test(int cake) with this pointer passed
function MRESReturn (Address pThis, Handle hReturn, Handle hParams);
};
/* Adds an entity listener hook
*
* @param type Type of listener to add
* @param callback Callback to use
*
* @noreturn
*/
native void DHookAddEntityListener(ListenType type, ListenCB callback);
/* Removes an entity listener hook
*
* @param type Type of listener to remove
* @param callback Callback this listener was using
*
* @return True if one was removed false otherwise.
*/
native bool DHookRemoveEntityListener(ListenType type, ListenCB callback);
/* Creates a hook
*
* @param offset vtable offset for function to hook
* @param hooktype Type of hook
* @param returntype Type type of return
* @param thistype Type of this pointer or ignore (ignore can be used if not needed)
* @param callback Callback function
*
* @return Returns setup handle for the hook or INVALID_HANDLE.
*/
native Handle DHookCreate(int offset, HookType hooktype, ReturnType returntype, ThisPointerType thistype, DHookCallback callback);
/* Adds param to a hook setup
*
* @param setup Setup handle to add the param to.
* @param type Param type
* @param size Used for Objects (not Object ptr) to define the size of the object.
* @param flag Used to change the pass type.
*
* @error Invalid setup handle or too many params added (request upping the max in thread)
* @noreturn
*/
native void DHookAddParam(Handle setup, HookParamType type, int size=-1, DHookPassFlag flag=DHookPass_ByVal);
//native DHookAddParam(Handle:setup, HookParamType:type);
/* Hook entity
*
* @param setup Setup handle to use to add the hook.
* @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!)
* @param entity Entity index to hook on.
* @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and will call this callback)
*
* @error Invalid setup handle, invalid entity or invalid hook type.
* @return -1 on fail a hookid on success
*/
native int DHookEntity(Handle setup, bool post, int entity, DHookRemovalCB removalcb=INVALID_FUNCTION);
/* Hook gamerules
*
* @param setup Setup handle to use to add the hook.
* @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!)
* @param removalcb Callback for when the hook is removed (Game rules hooks are auto-removed on map end and will call this callback)
*
* @error Invalid setup handle, failing to get gamerules pointer or invalid hook type.
* @return -1 on fail a hookid on success
*/
native int DHookGamerules(Handle setup, bool post, DHookRemovalCB removalcb=INVALID_FUNCTION);
/* Hook a raw pointer
*
* @param setup Setup handle to use to add the hook.
* @param post True to make the hook a post hook. (If you need to change the retunr value or need the return value use a post hook! If you need to change params and return use a pre and post hook!)
* @param addr This pointer address.
* @param removalcb Callback for when the hook is removed (Entity hooks are auto-removed on entity destroyed and will call this callback)
*
* @error Invalid setup handle, invalid address or invalid hook type.
* @return -1 on fail a hookid on success
*/
native int DHookRaw(Handle setup, bool post, Address addr, DHookRemovalCB removalcb=INVALID_FUNCTION);
/* Remove hook by hook id
*
* @param hookid Hook id to remove
*
* @return true on success false otherwise
* @note This will not fire the removal callback!
*/
native bool DHookRemoveHookID(int hookid);
/* Get param value (Only use for: int, entity, bool or float param types)
*
* @param hParams Handle to params structure
* @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1. 0 Will return the number of params stored)
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @return value if num greater than 0. If 0 returns paramcount.
*/
native any DHookGetParam(Handle hParams, int num);
/* Get vector param value
*
* @param hParams Handle to params structure
* @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1.)
* @param vec Vector buffer to store result.
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookGetParamVector(Handle hParams, int num, float vec[3]);
/* Get string param value
*
* @param hParams Handle to params structure
* @param num Param number to get. (Example if the function has 2 params and you need the value of the first param num would be 1.)
* @param buffer String buffer to store result
* @param size Buffer size
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookGetParamString(Handle hParams, int num, char[] buffer, int size);
/* Set param value (Only use for: int, entity, bool or float param types)
*
* @param hParams Handle to params structure
* @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.)
* @param value Value to set it as (only pass int, bool, float or entity index)
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookSetParam(Handle hParams, int num, any value);
/* Set vector param value
*
* @param hParams Handle to params structure
* @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.)
* @param vec Value to set vector as.
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookSetParamVector(Handle hParams, int num, float vec[3]);
/* Set string param value
*
* @param hParams Handle to params structure
* @params num Param number to set (Example if the function has 2 params and you need to set the value of the first param num would be 1.)
* @param value Value to set string as.
*
* @error Invalid handle. Invalid param number. Invalid param type.
* @noreturn
*/
native void DHookSetParamString(Handle hParams, int num, char[] value);
/* Get return value (Only use for: int, entity, bool or float return types)
*
* @param hReturn Handle to return structure
*
* @error Invalid Handle, invalid type.
* @return Returns default value if prehook returns actual value if post hook.
*/
native any DHookGetReturn(Handle hReturn);
/* Get return vector value
*
* @param hReturn Handle to return structure
* @param vec Vector buffer to store result in. (In pre hooks will be default value (0.0,0.0,0.0))
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookGetReturnVector(Handle hReturn, float vec[3]);
/* Get return string value
*
* @param hReturn Handle to return structure
* @param buffer String buffer to store result in. (In pre hooks will be default value "")
* @param size String buffer size
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookGetReturnString(Handle hReturn, char[] buffer, int size);
/* Set return value (Only use for: int, entity, bool or float return types)
*
* @param hReturn Handle to return structure
* @param value Value to set return as
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookSetReturn(Handle hReturn, any value);
/* Set return vector value
*
* @param hReturn Handle to return structure
* @param vec Value to set return vector as
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookSetReturnVector(Handle hReturn, float vec[3]);
/* Set return string value
*
* @param hReturn Handle to return structure
* @param value Value to set return string as
*
* @error Invalid Handle, invalid type.
* @noreturn
*/
native void DHookSetReturnString(Handle hReturn, char[] value);
//WE SHOULD WRAP THESE AROUND STOCKS FOR NON PTR AS WE SUPPORT BOTH WITH THESE NATIVE'S
/* Gets an objects variable value
*
* @param hParams Handle to params structure
* @param num Param number to get.
* @param offset Offset within the object to the var to get.
* @param type Type of var it is
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @return Value of the objects var. If EHANDLE type or entity returns entity index.
*/
native any DHookGetParamObjectPtrVar(Handle hParams, int num, int offset, ObjectValueType type);
/* Sets an objects variable value
*
* @param hParams Handle to params structure
* @param num Param number to set.
* @param offset Offset within the object to the var to set.
* @param type Type of var it is
* @param value The value to set the var to.
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookSetParamObjectPtrVar(Handle hParams, int num, int offset, ObjectValueType type, any value);
/* Gets an objects vector variable value
*
* @param hParams Handle to params structure
* @param num Param number to get.
* @param offset Offset within the object to the var to get.
* @param type Type of var it is
* @param buffer Buffer to store the result vector
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookGetParamObjectPtrVarVector(Handle hParams, int num, int offset, ObjectValueType type, float buffer[3]);
/* Sets an objects vector variable value
*
* @param hParams Handle to params structure
* @param num Param number to set.
* @param offset Offset within the object to the var to set.
* @param type Type of var it is
* @param value The value to set the vector var to.
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookSetParamObjectPtrVarVector(Handle hParams, int num, int offset, ObjectValueType type, float value[3]);
/* Gets an objects string variable value
*
* @param hParams Handle to params structure
* @param num Param number to get.
* @param offset Offset within the object to the var to get.
* @param type Type of var it is
* @param buffer Buffer to store the result vector
* @param size Size of the buffer
*
* @error Invalid handle. Invalid param number. Invalid param type. Invalid Object type.
* @noreturn
*/
native void DHookGetParamObjectPtrString(Handle hParams, int num, int offset, ObjectValueType type, char[] buffer, int size);
/* Checks if a pointer param is null
*
* @param hParams Handle to params structure
* @param num Param number to check.
*
* @error Non pointer param
* @return True if null false otherwise.
*/
native bool DHookIsNullParam(Handle hParams, int num);
public Extension __ext_dhooks =
{
name = "dhooks",
file = "dhooks.ext",
#if defined AUTOLOAD_EXTENSIONS
autoload = 1,
#else
autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
required = 1,
#else
required = 0,
#endif
};
#if !defined REQUIRE_EXTENSIONS
public __ext_dhooks_SetNTVOptional()
{
MarkNativeAsOptional("DHookAddEntityListener");
MarkNativeAsOptional("DHookRemoveEntityListener");
MarkNativeAsOptional("DHookCreate");
MarkNativeAsOptional("DHookAddParam");
MarkNativeAsOptional("DHookEntity");
MarkNativeAsOptional("DHookGamerules");
MarkNativeAsOptional("DHookRaw");
MarkNativeAsOptional("DHookRemoveHookID");
MarkNativeAsOptional("DHookGetParam");
MarkNativeAsOptional("DHookGetParamVector");
MarkNativeAsOptional("DHookGetParamString");
MarkNativeAsOptional("DHookSetParam");
MarkNativeAsOptional("DHookSetParamVector");
MarkNativeAsOptional("DHookSetParamString");
MarkNativeAsOptional("DHookGetReturn");
MarkNativeAsOptional("DHookGetReturnVector");
MarkNativeAsOptional("DHookGetReturnString");
MarkNativeAsOptional("DHookSetReturn");
MarkNativeAsOptional("DHookSetReturnVector");
MarkNativeAsOptional("DHookSetReturnString");
MarkNativeAsOptional("DHookGetParamObjectPtrVar");
MarkNativeAsOptional("DHookSetParamObjectPtrVar");
MarkNativeAsOptional("DHookGetParamObjectPtrVarVector");
MarkNativeAsOptional("DHookSetParamObjectPtrVarVector");
MarkNativeAsOptional("DHookIsNullParam");
MarkNativeAsOptional("DHookGetParamObjectPtrString");
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,21 +1,21 @@
ar_baggage
ar_monastery
ar_shoots
cs_assault
cs_italy
cs_militia
cs_office
de_aztec
de_bank
de_dust
de_dust2
de_inferno
de_lake
de_mirage
de_nuke
de_safehouse
de_shorttrain
de_stmarc
de_sugarcane
de_train
de_vertigo
ar_baggage
ar_monastery
ar_shoots
cs_assault
cs_italy
cs_militia
cs_office
de_aztec
de_bank
de_dust
de_dust2
de_inferno
de_lake
de_mirage
de_nuke
de_safehouse
de_shorttrain
de_stmarc
de_sugarcane
de_train
de_vertigo

View File

@ -1,28 +1,28 @@
as_oilrig
cs_747
cs_assault
cs_backalley
cs_compound
cs_estate
cs_havana
cs_italy
cs_militia
cs_office
cs_siege
de_airstrip
de_aztec
de_cbble
de_chateau
de_dust2
de_dust
de_inferno
de_nuke
de_piranesi
de_port
de_prodigy
de_storm
de_survivor
de_tides
de_torn
de_train
de_vertigo
as_oilrig
cs_747
cs_assault
cs_backalley
cs_compound
cs_estate
cs_havana
cs_italy
cs_militia
cs_office
cs_siege
de_airstrip
de_aztec
de_cbble
de_chateau
de_dust2
de_dust
de_inferno
de_nuke
de_piranesi
de_port
de_prodigy
de_storm
de_survivor
de_tides
de_torn
de_train
de_vertigo

View File

@ -1,9 +1,9 @@
dod_anzio
dod_argentan
dod_avalanche
dod_colmar
dod_donner
dod_flash
dod_jagd
dod_kalt
dod_palermo
dod_anzio
dod_argentan
dod_avalanche
dod_colmar
dod_donner
dod_flash
dod_jagd
dod_kalt
dod_palermo

View File

@ -1,7 +1,7 @@
dm_lockdown
dm_overwatch
dm_runoff
dm_steamlab
dm_underpass
dm_resistance
dm_powerhouse
dm_lockdown
dm_overwatch
dm_runoff
dm_steamlab
dm_underpass
dm_resistance
dm_powerhouse

View File

@ -1,65 +1,65 @@
tc_hydro
cp_well
cp_granary
cp_dustbowl
cp_gravelpit
ctf_2fort
ctf_well
cp_badlands
pl_goldrush
cp_fastlane
ctf_turbine
pl_badwater
cp_steel
arena_badlands
arena_granary
arena_lumberyard
arena_ravine
arena_well
cp_egypt_final
cp_junction_final
arena_watchtower
plr_pipeline
arena_sawmill
arena_nucleus
pl_hoodoo_final
koth_sawmill
koth_nucleus
koth_viaduct
ctf_sawmill
arena_offblast_final
cp_yukon_final
koth_harvest_final
koth_harvest_event
ctf_doublecross
cp_gorge
cp_freight_final1
pl_upward
plr_hightower
pl_thundermountain
cp_coldfront
cp_mountainlab
cp_manor_event
cp_degrootkeep
cp_5gorge
pl_frontier_final
plr_nightfall_final
koth_lakeside_final
koth_badlands
pl_barnblitz
cp_gullywash_final1
koth_viaduct_event
cp_foundry
sd_doomsday
koth_king
mvm_mannworks
mvm_coaltown
mvm_decoy
koth_lakeside_event
mvm_bigrock
cp_process_final
cp_standin_final
plr_hightower_event
cp_snakewater_final1
mvm_mannhattan
mvm_rottenburg
tc_hydro
cp_well
cp_granary
cp_dustbowl
cp_gravelpit
ctf_2fort
ctf_well
cp_badlands
pl_goldrush
cp_fastlane
ctf_turbine
pl_badwater
cp_steel
arena_badlands
arena_granary
arena_lumberyard
arena_ravine
arena_well
cp_egypt_final
cp_junction_final
arena_watchtower
plr_pipeline
arena_sawmill
arena_nucleus
pl_hoodoo_final
koth_sawmill
koth_nucleus
koth_viaduct
ctf_sawmill
arena_offblast_final
cp_yukon_final
koth_harvest_final
koth_harvest_event
ctf_doublecross
cp_gorge
cp_freight_final1
pl_upward
plr_hightower
pl_thundermountain
cp_coldfront
cp_mountainlab
cp_manor_event
cp_degrootkeep
cp_5gorge
pl_frontier_final
plr_nightfall_final
koth_lakeside_final
koth_badlands
pl_barnblitz
cp_gullywash_final1
koth_viaduct_event
cp_foundry
sd_doomsday
koth_king
mvm_mannworks
mvm_coaltown
mvm_decoy
koth_lakeside_event
mvm_bigrock
cp_process_final
cp_standin_final
plr_hightower_event
cp_snakewater_final1
mvm_mannhattan
mvm_rottenburg

View File

@ -1,77 +1,77 @@
"MapchooserSoundsList"
{
"tf"
{
"counter"
{
"1"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_1sec.mp3"
"builtin" "vo/announcer_begins_1sec.wav"
"event" "Announcer.RoundBegins1Seconds"
}
"2"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_2sec.mp3"
"builtin" "vo/announcer_begins_2sec.wav"
"event" "Announcer.RoundBegins2Seconds"
}
"3"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_3sec.mp3"
"builtin" "vo/announcer_begins_3sec.wav"
"event" "Announcer.RoundBegins3Seconds"
}
"4"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_4sec.mp3"
"builtin" "vo/announcer_begins_4sec.wav"
"event" "Announcer.RoundBegins4Seconds"
}
"5"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_5sec.mp3"
"builtin" "vo/announcer_begins_5sec.wav"
"event" "Announcer.RoundBegins5Seconds"
}
"10"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins10s01.mp3"
"builtin" "vo/announcer_dec_missionbegins10s01.wav"
}
"30"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins30s01.mp3"
"builtin" "vo/announcer_dec_missionbegins30s01.wav"
}
"60"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins60s06.mp3"
"builtin" "vo/announcer_dec_missionbegins60s06.wav"
}
}
"vote start"
{
"sound" "sourcemod/mapchooser/tf2/vote_started.mp3"
"event" "Vote.Created"
"builtin" "ui/vote_started.wav"
}
"vote end"
{
"sound" "sourcemod/mapchooser/tf2/vote_success.mp3"
"event" "Vote.Passed"
"builtin" "ui/vote_success.wav"
}
"vote warning"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins60s03.mp3"
"builtin" "vo/announcer_dec_missionbegins60s03.wav"
}
"runoff warning"
{
"sound" "sourcemod/mapchooser/tf2/vote_failure.mp3"
"event" "Vote.Failed"
"builtin" "ui/vote_failure.wav"
}
}
"MapchooserSoundsList"
{
"tf"
{
"counter"
{
"1"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_1sec.mp3"
"builtin" "vo/announcer_begins_1sec.wav"
"event" "Announcer.RoundBegins1Seconds"
}
"2"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_2sec.mp3"
"builtin" "vo/announcer_begins_2sec.wav"
"event" "Announcer.RoundBegins2Seconds"
}
"3"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_3sec.mp3"
"builtin" "vo/announcer_begins_3sec.wav"
"event" "Announcer.RoundBegins3Seconds"
}
"4"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_4sec.mp3"
"builtin" "vo/announcer_begins_4sec.wav"
"event" "Announcer.RoundBegins4Seconds"
}
"5"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_5sec.mp3"
"builtin" "vo/announcer_begins_5sec.wav"
"event" "Announcer.RoundBegins5Seconds"
}
"10"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins10s01.mp3"
"builtin" "vo/announcer_dec_missionbegins10s01.wav"
}
"30"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins30s01.mp3"
"builtin" "vo/announcer_dec_missionbegins30s01.wav"
}
"60"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins60s06.mp3"
"builtin" "vo/announcer_dec_missionbegins60s06.wav"
}
}
"vote start"
{
"sound" "sourcemod/mapchooser/tf2/vote_started.mp3"
"event" "Vote.Created"
"builtin" "ui/vote_started.wav"
}
"vote end"
{
"sound" "sourcemod/mapchooser/tf2/vote_success.mp3"
"event" "Vote.Passed"
"builtin" "ui/vote_success.wav"
}
"vote warning"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins60s03.mp3"
"builtin" "vo/announcer_dec_missionbegins60s03.wav"
}
"runoff warning"
{
"sound" "sourcemod/mapchooser/tf2/vote_failure.mp3"
"event" "Vote.Failed"
"builtin" "ui/vote_failure.wav"
}
}
}

View File

@ -1,108 +1,108 @@
/**
* vim: set ts=4 :
* =============================================================================
* MapChooser Extended
* Creates a map vote at appropriate times, setting sm_nextmap to the winning
* vote
*
* MapChooser Extended (C)2011-2013 Powerlord (Ross Bemrose)
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#if defined _mapchooser_extended_included_
#endinput
#endif
#define _mapchooser_extended_included_
#include <mapchooser>
// MCE 1.9 series
enum CanNominateResult
{
CanNominate_No_VoteFull, /** No, nominations list is full */
CanNominate_No_VoteInProgress, /** No, map vote is in progress */
CanNominate_No_VoteComplete, /** No, map vote is completed */
CanNominate_Yes, /** Yes, you can nominate */
};
/**
* Called whenever warning timer starts
*
*/
forward OnMapVoteWarningStart();
/**
* Called whenever runoff warning timer starts
*/
forward OnMapVoteRunnoffWarningStart();
/**
* Called whenever the timer ticks
*/
forward OnMapVoteWarningTick(time);
/**
* Called whenever vote starts
*
* @deprecated Will be removed in MapChooser 1.8. Use OnMapVoteStarted instead.
*/
forward OnMapVoteStart();
/**
* Called whenever vote ends
*/
forward OnMapVoteEnd(const String:map[]);
/**
* Is a map on the current game's official list?
* This should be treated as informative only.
*
* @param map Name of map to check
* @return true if it's on the list of official maps for this game
*/
native bool:IsMapOfficial(const String:map[]);
/**
* Is nominate allowed?
*
* @return A CanNominateResult corresponding to whether a vote is allowed or not
*/
native CanNominateResult:CanNominate();
native bool:ExcludeMap(const String:map[]);
public SharedPlugin:__pl_mapchooser_extended =
{
name = "mapchooser",
file = "mapchooser_extended.smx",
#if defined REQUIRE_PLUGIN
required = 1,
#else
required = 0,
#endif
};
/**
* vim: set ts=4 :
* =============================================================================
* MapChooser Extended
* Creates a map vote at appropriate times, setting sm_nextmap to the winning
* vote
*
* MapChooser Extended (C)2011-2013 Powerlord (Ross Bemrose)
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#if defined _mapchooser_extended_included_
#endinput
#endif
#define _mapchooser_extended_included_
#include <mapchooser>
// MCE 1.9 series
enum CanNominateResult
{
CanNominate_No_VoteFull, /** No, nominations list is full */
CanNominate_No_VoteInProgress, /** No, map vote is in progress */
CanNominate_No_VoteComplete, /** No, map vote is completed */
CanNominate_Yes, /** Yes, you can nominate */
};
/**
* Called whenever warning timer starts
*
*/
forward OnMapVoteWarningStart();
/**
* Called whenever runoff warning timer starts
*/
forward OnMapVoteRunnoffWarningStart();
/**
* Called whenever the timer ticks
*/
forward OnMapVoteWarningTick(time);
/**
* Called whenever vote starts
*
* @deprecated Will be removed in MapChooser 1.8. Use OnMapVoteStarted instead.
*/
forward OnMapVoteStart();
/**
* Called whenever vote ends
*/
forward OnMapVoteEnd(const String:map[]);
/**
* Is a map on the current game's official list?
* This should be treated as informative only.
*
* @param map Name of map to check
* @return true if it's on the list of official maps for this game
*/
native bool:IsMapOfficial(const String:map[]);
/**
* Is nominate allowed?
*
* @return A CanNominateResult corresponding to whether a vote is allowed or not
*/
native CanNominateResult:CanNominate();
native bool:ExcludeMap(const String:map[]);
public SharedPlugin:__pl_mapchooser_extended =
{
name = "mapchooser",
file = "mapchooser_extended.smx",
#if defined REQUIRE_PLUGIN
required = 1,
#else
required = 0,
#endif
};

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,378 +1,378 @@
/**
* vim: set ts=4 :
* =============================================================================
* Rock The Vote Extended
* Creates a map vote when the required number of players have requested one.
*
* Rock The Vote Extended (C)2012-2013 Powerlord (Ross Bemrose)
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <mapchooser>
#include "include/mapchooser_extended"
#include <nextmap>
#include <colors>
#pragma semicolon 1
#define MCE_VERSION "1.10.0"
public Plugin:myinfo =
{
name = "Rock The Vote Extended",
author = "Powerlord and AlliedModders LLC",
description = "Provides RTV Map Voting",
version = MCE_VERSION,
url = "https://forums.alliedmods.net/showthread.php?t=156974"
};
new Handle:g_Cvar_Needed = INVALID_HANDLE;
new Handle:g_Cvar_MinPlayers = INVALID_HANDLE;
new Handle:g_Cvar_InitialDelay = INVALID_HANDLE;
new Handle:g_Cvar_Interval = INVALID_HANDLE;
new Handle:g_Cvar_ChangeTime = INVALID_HANDLE;
new Handle:g_Cvar_RTVPostVoteAction = INVALID_HANDLE;
new bool:g_CanRTV = false; // True if RTV loaded maps and is active.
new bool:g_RTVAllowed = false; // True if RTV is available to players. Used to delay rtv votes.
new g_Voters = 0; // Total voters connected. Doesn't include fake clients.
new g_Votes = 0; // Total number of "say rtv" votes
new g_VotesNeeded = 0; // Necessary votes before map vote begins. (voters * percent_needed)
new bool:g_Voted[MAXPLAYERS+1] = {false, ...};
new bool:g_InChange = false;
public OnPluginStart()
{
LoadTranslations("common.phrases");
LoadTranslations("rockthevote.phrases");
LoadTranslations("basevotes.phrases");
g_Cvar_Needed = CreateConVar("sm_rtv_needed", "0.60", "Percentage of players needed to rockthevote (Def 60%)", 0, true, 0.05, true, 1.0);
g_Cvar_MinPlayers = CreateConVar("sm_rtv_minplayers", "0", "Number of players required before RTV will be enabled.", 0, true, 0.0, true, float(MAXPLAYERS));
g_Cvar_InitialDelay = CreateConVar("sm_rtv_initialdelay", "30.0", "Time (in seconds) before first RTV can be held", 0, true, 0.00);
g_Cvar_Interval = CreateConVar("sm_rtv_interval", "240.0", "Time (in seconds) after a failed RTV before another can be held", 0, true, 0.00);
g_Cvar_ChangeTime = CreateConVar("sm_rtv_changetime", "0", "When to change the map after a succesful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd", _, true, 0.0, true, 2.0);
g_Cvar_RTVPostVoteAction = CreateConVar("sm_rtv_postvoteaction", "0", "What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny", _, true, 0.0, true, 1.0);
HookEvent("player_team", OnPlayerChangedTeam);
RegConsoleCmd("say", Command_Say);
RegConsoleCmd("say_team", Command_Say);
RegConsoleCmd("sm_rtv", Command_RTV);
RegAdminCmd("sm_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote");
RegAdminCmd("mce_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote");
// Rock The Vote Extended cvars
CreateConVar("rtve_version", MCE_VERSION, "Rock The Vote Extended Version", FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);
AutoExecConfig(true, "rtv");
}
public OnMapStart()
{
g_Voters = 0;
g_Votes = 0;
g_VotesNeeded = 0;
g_InChange = false;
/* Handle late load */
for (new i=1; i<=MaxClients; i++)
{
if (IsClientConnected(i))
{
OnClientConnected(i);
}
}
}
public OnMapEnd()
{
g_CanRTV = false;
g_RTVAllowed = false;
}
public OnConfigsExecuted()
{
g_CanRTV = true;
g_RTVAllowed = false;
CreateTimer(GetConVarFloat(g_Cvar_InitialDelay), Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE);
}
public OnClientConnected(client)
{
if(IsFakeClient(client))
return;
g_Voted[client] = false;
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
return;
}
public OnClientDisconnect(client)
{
if(IsFakeClient(client))
return;
if(g_Voted[client])
{
g_Votes--;
}
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
if (!g_CanRTV)
{
return;
}
if (g_Votes &&
g_Voters &&
g_Votes >= g_VotesNeeded &&
g_RTVAllowed )
{
if (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished())
{
return;
}
StartRTV();
}
}
public OnPlayerChangedTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
new Client = GetClientOfUserId(GetEventInt(event, "userid"));
if(IsFakeClient(Client))
return;
if(Client == 0)
{
return;
}
if (IsClientInGame(Client) && IsClientConnected(Client))
{
if (GetClientTeam(Client) == 1)
{
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
if (g_Votes &&
g_Voters &&
g_Votes >= g_VotesNeeded &&
g_RTVAllowed )
{
if (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished())
{
return;
}
StartRTV();
}
}
}
}
public Action:Command_RTV(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Handled;
}
AttemptRTV(client);
return Plugin_Handled;
}
public Action:Command_Say(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Continue;
}
decl String:text[192];
if (!GetCmdArgString(text, sizeof(text)))
{
return Plugin_Continue;
}
new startidx = 0;
if(text[strlen(text)-1] == '"')
{
text[strlen(text)-1] = '\0';
startidx = 1;
}
new ReplySource:old = SetCmdReplySource(SM_REPLY_TO_CHAT);
if (strcmp(text[startidx], "rtv", false) == 0 || strcmp(text[startidx], "rockthevote", false) == 0)
{
AttemptRTV(client);
}
SetCmdReplySource(old);
return Plugin_Continue;
}
AttemptRTV(client)
{
if (!g_RTVAllowed || (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished()))
{
CReplyToCommand(client, "[SM] %t", "RTV Not Allowed");
return;
}
if (!CanMapChooserStartVote())
{
CReplyToCommand(client, "[SM] %t", "RTV Started");
return;
}
if (GetClientCount(true) < GetConVarInt(g_Cvar_MinPlayers))
{
CReplyToCommand(client, "[SM] %t", "Minimal Players Not Met");
return;
}
if (g_Voted[client])
{
CReplyToCommand(client, "[SM] %t", "Already Voted", g_Votes, g_VotesNeeded);
return;
}
new String:name[MAX_NAME_LENGTH];
GetClientName(client, name, sizeof(name));
g_Votes++;
g_Voted[client] = true;
CPrintToChatAll("[SM] %t", "RTV Requested", name, g_Votes, g_VotesNeeded);
if (g_Votes >= g_VotesNeeded)
{
StartRTV();
}
}
public Action:Timer_DelayRTV(Handle:timer)
{
g_RTVAllowed = true;
}
StartRTV()
{
if (g_InChange)
{
return;
}
if (EndOfMapVoteEnabled() && HasEndOfMapVoteFinished())
{
/* Change right now then */
new String:map[PLATFORM_MAX_PATH];
if (GetNextMap(map, sizeof(map)))
{
CPrintToChatAll("[SM] %t", "Changing Maps", map);
CreateTimer(5.0, Timer_ChangeMap, _, TIMER_FLAG_NO_MAPCHANGE);
g_InChange = true;
ResetRTV();
g_RTVAllowed = false;
}
return;
}
if (CanMapChooserStartVote())
{
new MapChange:when = MapChange:GetConVarInt(g_Cvar_ChangeTime);
InitiateMapChooserVote(when);
ResetRTV();
g_RTVAllowed = false;
CreateTimer(GetConVarFloat(g_Cvar_Interval), Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE);
}
}
ResetRTV()
{
g_Votes = 0;
for (new i=1; i<=MAXPLAYERS; i++)
{
g_Voted[i] = false;
}
}
public Action:Timer_ChangeMap(Handle:hTimer)
{
g_InChange = false;
LogMessage("RTV changing map manually");
new String:map[PLATFORM_MAX_PATH];
if (GetNextMap(map, sizeof(map)))
{
ForceChangeLevel(map, "RTV after mapvote");
}
return Plugin_Stop;
}
// Rock The Vote Extended functions
public Action:Command_ForceRTV(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Handled;
}
ShowActivity2(client, "[RTVE] ", "%t", "Initiated Vote Map");
StartRTV();
return Plugin_Handled;
}
/**
* vim: set ts=4 :
* =============================================================================
* Rock The Vote Extended
* Creates a map vote when the required number of players have requested one.
*
* Rock The Vote Extended (C)2012-2013 Powerlord (Ross Bemrose)
* SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <mapchooser>
#include "include/mapchooser_extended"
#include <nextmap>
#include <colors>
#pragma semicolon 1
#define MCE_VERSION "1.10.0"
public Plugin:myinfo =
{
name = "Rock The Vote Extended",
author = "Powerlord and AlliedModders LLC",
description = "Provides RTV Map Voting",
version = MCE_VERSION,
url = "https://forums.alliedmods.net/showthread.php?t=156974"
};
new Handle:g_Cvar_Needed = INVALID_HANDLE;
new Handle:g_Cvar_MinPlayers = INVALID_HANDLE;
new Handle:g_Cvar_InitialDelay = INVALID_HANDLE;
new Handle:g_Cvar_Interval = INVALID_HANDLE;
new Handle:g_Cvar_ChangeTime = INVALID_HANDLE;
new Handle:g_Cvar_RTVPostVoteAction = INVALID_HANDLE;
new bool:g_CanRTV = false; // True if RTV loaded maps and is active.
new bool:g_RTVAllowed = false; // True if RTV is available to players. Used to delay rtv votes.
new g_Voters = 0; // Total voters connected. Doesn't include fake clients.
new g_Votes = 0; // Total number of "say rtv" votes
new g_VotesNeeded = 0; // Necessary votes before map vote begins. (voters * percent_needed)
new bool:g_Voted[MAXPLAYERS+1] = {false, ...};
new bool:g_InChange = false;
public OnPluginStart()
{
LoadTranslations("common.phrases");
LoadTranslations("rockthevote.phrases");
LoadTranslations("basevotes.phrases");
g_Cvar_Needed = CreateConVar("sm_rtv_needed", "0.60", "Percentage of players needed to rockthevote (Def 60%)", 0, true, 0.05, true, 1.0);
g_Cvar_MinPlayers = CreateConVar("sm_rtv_minplayers", "0", "Number of players required before RTV will be enabled.", 0, true, 0.0, true, float(MAXPLAYERS));
g_Cvar_InitialDelay = CreateConVar("sm_rtv_initialdelay", "30.0", "Time (in seconds) before first RTV can be held", 0, true, 0.00);
g_Cvar_Interval = CreateConVar("sm_rtv_interval", "240.0", "Time (in seconds) after a failed RTV before another can be held", 0, true, 0.00);
g_Cvar_ChangeTime = CreateConVar("sm_rtv_changetime", "0", "When to change the map after a succesful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd", _, true, 0.0, true, 2.0);
g_Cvar_RTVPostVoteAction = CreateConVar("sm_rtv_postvoteaction", "0", "What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny", _, true, 0.0, true, 1.0);
HookEvent("player_team", OnPlayerChangedTeam);
RegConsoleCmd("say", Command_Say);
RegConsoleCmd("say_team", Command_Say);
RegConsoleCmd("sm_rtv", Command_RTV);
RegAdminCmd("sm_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote");
RegAdminCmd("mce_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote");
// Rock The Vote Extended cvars
CreateConVar("rtve_version", MCE_VERSION, "Rock The Vote Extended Version", FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);
AutoExecConfig(true, "rtv");
}
public OnMapStart()
{
g_Voters = 0;
g_Votes = 0;
g_VotesNeeded = 0;
g_InChange = false;
/* Handle late load */
for (new i=1; i<=MaxClients; i++)
{
if (IsClientConnected(i))
{
OnClientConnected(i);
}
}
}
public OnMapEnd()
{
g_CanRTV = false;
g_RTVAllowed = false;
}
public OnConfigsExecuted()
{
g_CanRTV = true;
g_RTVAllowed = false;
CreateTimer(GetConVarFloat(g_Cvar_InitialDelay), Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE);
}
public OnClientConnected(client)
{
if(IsFakeClient(client))
return;
g_Voted[client] = false;
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
return;
}
public OnClientDisconnect(client)
{
if(IsFakeClient(client))
return;
if(g_Voted[client])
{
g_Votes--;
}
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
if (!g_CanRTV)
{
return;
}
if (g_Votes &&
g_Voters &&
g_Votes >= g_VotesNeeded &&
g_RTVAllowed )
{
if (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished())
{
return;
}
StartRTV();
}
}
public OnPlayerChangedTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
new Client = GetClientOfUserId(GetEventInt(event, "userid"));
if(IsFakeClient(Client))
return;
if(Client == 0)
{
return;
}
if (IsClientInGame(Client) && IsClientConnected(Client))
{
if (GetClientTeam(Client) == 1)
{
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
if (g_Votes &&
g_Voters &&
g_Votes >= g_VotesNeeded &&
g_RTVAllowed )
{
if (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished())
{
return;
}
StartRTV();
}
}
}
}
public Action:Command_RTV(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Handled;
}
AttemptRTV(client);
return Plugin_Handled;
}
public Action:Command_Say(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Continue;
}
decl String:text[192];
if (!GetCmdArgString(text, sizeof(text)))
{
return Plugin_Continue;
}
new startidx = 0;
if(text[strlen(text)-1] == '"')
{
text[strlen(text)-1] = '\0';
startidx = 1;
}
new ReplySource:old = SetCmdReplySource(SM_REPLY_TO_CHAT);
if (strcmp(text[startidx], "rtv", false) == 0 || strcmp(text[startidx], "rockthevote", false) == 0)
{
AttemptRTV(client);
}
SetCmdReplySource(old);
return Plugin_Continue;
}
AttemptRTV(client)
{
if (!g_RTVAllowed || (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished()))
{
CReplyToCommand(client, "[SM] %t", "RTV Not Allowed");
return;
}
if (!CanMapChooserStartVote())
{
CReplyToCommand(client, "[SM] %t", "RTV Started");
return;
}
if (GetClientCount(true) < GetConVarInt(g_Cvar_MinPlayers))
{
CReplyToCommand(client, "[SM] %t", "Minimal Players Not Met");
return;
}
if (g_Voted[client])
{
CReplyToCommand(client, "[SM] %t", "Already Voted", g_Votes, g_VotesNeeded);
return;
}
new String:name[MAX_NAME_LENGTH];
GetClientName(client, name, sizeof(name));
g_Votes++;
g_Voted[client] = true;
CPrintToChatAll("[SM] %t", "RTV Requested", name, g_Votes, g_VotesNeeded);
if (g_Votes >= g_VotesNeeded)
{
StartRTV();
}
}
public Action:Timer_DelayRTV(Handle:timer)
{
g_RTVAllowed = true;
}
StartRTV()
{
if (g_InChange)
{
return;
}
if (EndOfMapVoteEnabled() && HasEndOfMapVoteFinished())
{
/* Change right now then */
new String:map[PLATFORM_MAX_PATH];
if (GetNextMap(map, sizeof(map)))
{
CPrintToChatAll("[SM] %t", "Changing Maps", map);
CreateTimer(5.0, Timer_ChangeMap, _, TIMER_FLAG_NO_MAPCHANGE);
g_InChange = true;
ResetRTV();
g_RTVAllowed = false;
}
return;
}
if (CanMapChooserStartVote())
{
new MapChange:when = MapChange:GetConVarInt(g_Cvar_ChangeTime);
InitiateMapChooserVote(when);
ResetRTV();
g_RTVAllowed = false;
CreateTimer(GetConVarFloat(g_Cvar_Interval), Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE);
}
}
ResetRTV()
{
g_Votes = 0;
for (new i=1; i<=MAXPLAYERS; i++)
{
g_Voted[i] = false;
}
}
public Action:Timer_ChangeMap(Handle:hTimer)
{
g_InChange = false;
LogMessage("RTV changing map manually");
new String:map[PLATFORM_MAX_PATH];
if (GetNextMap(map, sizeof(map)))
{
ForceChangeLevel(map, "RTV after mapvote");
}
return Plugin_Stop;
}
// Rock The Vote Extended functions
public Action:Command_ForceRTV(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Handled;
}
ShowActivity2(client, "[RTVE] ", "%t", "Initiated Vote Map");
StartRTV();
return Plugin_Handled;
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"chi" "下一幅地图投票了!"
}
"Nextmap Voting Started"
{
"chi" "下一幅地图投选已开始."
}
"Nextmap Voting Finished"
{
"chi" " 地图投票已结束. 下一幅地图将为 {1}. ( 得票{2}%% , {3}票)"
}
"Current Map Extended"
{
"chi" "当前地图已被延长."
}
"Extend Map"
{
"chi" "延长当前地图"
}
"Dont Change"
{
"chi" "请勿更换"
}
"Current Map Stays"
{
"chi" "当前地图已被延长! 投票显示! (得票 {1}%% 共 {2} 票)"
}
"Changed Next Map"
{
"chi" "更换下一幅地图为 \"{1}\"."
}
}
"Phrases"
{
"Vote Nextmap"
{
"chi" "下一幅地图投票了!"
}
"Nextmap Voting Started"
{
"chi" "下一幅地图投选已开始."
}
"Nextmap Voting Finished"
{
"chi" " 地图投票已结束. 下一幅地图将为 {1}. ( 得票{2}%% , {3}票)"
}
"Current Map Extended"
{
"chi" "当前地图已被延长."
}
"Extend Map"
{
"chi" "延长当前地图"
}
"Dont Change"
{
"chi" "请勿更换"
}
"Current Map Stays"
{
"chi" "当前地图已被延长! 投票显示! (得票 {1}%% 共 {2} 票)"
}
"Changed Next Map"
{
"chi" "更换下一幅地图为 \"{1}\"."
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"cze" "Hlasujte o příští mapě!"
}
"Nextmap Voting Started"
{
"cze" "Hlasování o příští mapě začalo."
}
"Nextmap Voting Finished"
{
"cze" "Hlasování o mapě skončilo. Příští mapou bude {1}. (Obdržela {2}%% z {3} hlasů)"
}
"Current Map Extended"
{
"cze" "Současná mapa byla prodloužena. (Obdržela {1}%% z {2} hlasů)"
}
"Extend Map"
{
"cze" "Prodloužit současnou mapu"
}
"Dont Change"
{
"cze" "Neměnit"
}
"Current Map Stays"
{
"cze" "Současná mapa pokračuje! Hlasování rozhodlo! (Obdržela {1}%% z {2} hlasů)"
}
"Changed Next Map"
{
"cze" "Změnil příští mapu na \"{1}\"."
}
}
"Phrases"
{
"Vote Nextmap"
{
"cze" "Hlasujte o příští mapě!"
}
"Nextmap Voting Started"
{
"cze" "Hlasování o příští mapě začalo."
}
"Nextmap Voting Finished"
{
"cze" "Hlasování o mapě skončilo. Příští mapou bude {1}. (Obdržela {2}%% z {3} hlasů)"
}
"Current Map Extended"
{
"cze" "Současná mapa byla prodloužena. (Obdržela {1}%% z {2} hlasů)"
}
"Extend Map"
{
"cze" "Prodloužit současnou mapu"
}
"Dont Change"
{
"cze" "Neměnit"
}
"Current Map Stays"
{
"cze" "Současná mapa pokračuje! Hlasování rozhodlo! (Obdržela {1}%% z {2} hlasů)"
}
"Changed Next Map"
{
"cze" "Změnil příští mapu na \"{1}\"."
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"da" "Stem om næste bane!"
}
"Nextmap Voting Started"
{
"da" "Afstemning for næste bane er begyndt."
}
"Nextmap Voting Finished"
{
"da" "Bane afstemning er fuldført. Den næste bane vil være {1}. (Modtog {2}%% af {3} stemmer) "
}
"Current Map Extended"
{
"da" "Den nuværende bane er blevet forlænget. (Modtog {1}%% af {2} stemmer) "
}
"Extend Map"
{
"da" "Forlæng bane"
}
"Dont Change"
{
"da" "Skift ikke!"
}
"Current Map Stays"
{
"da" "Den aktuelle bane fortsætter! Afstemningen har talt! (Modtog {1}%% af {2} stemmer)"
}
"Changed Next Map"
{
"da" "Skiftede næste bane til \"{1}'."
}
}
"Phrases"
{
"Vote Nextmap"
{
"da" "Stem om næste bane!"
}
"Nextmap Voting Started"
{
"da" "Afstemning for næste bane er begyndt."
}
"Nextmap Voting Finished"
{
"da" "Bane afstemning er fuldført. Den næste bane vil være {1}. (Modtog {2}%% af {3} stemmer) "
}
"Current Map Extended"
{
"da" "Den nuværende bane er blevet forlænget. (Modtog {1}%% af {2} stemmer) "
}
"Extend Map"
{
"da" "Forlæng bane"
}
"Dont Change"
{
"da" "Skift ikke!"
}
"Current Map Stays"
{
"da" "Den aktuelle bane fortsætter! Afstemningen har talt! (Modtog {1}%% af {2} stemmer)"
}
"Changed Next Map"
{
"da" "Skiftede næste bane til \"{1}'."
}
}

View File

@ -1,98 +1,98 @@
"Phrases"
{
"Vote Nextmap"
{
"de" "Stimme für die nächste Karte!"
}
"Nextmap Voting Started"
{
"de" "Abstimmung für die nächste Karte wurde gestartet."
}
"Nextmap Voting Finished"
{
"de" "Karten-Abstimmung wurde abgeschlossen. Nächste Karte wird {1} sein. ({2}%% von {3} Stimmen erhalten) "
}
"Current Map Extended"
{
"de" "Die aktuelle Karte wurde verlängert. ({1}%% von {2} Stimmen erhalten) "
}
"Extend Map"
{
"de" "Verlängere aktuelle Karte"
}
"Dont Change"
{
"de" "Nicht wechseln"
}
"Current Map Stays"
{
"de" "Aktuelle Karte geht weiter! Die Abstimmung hat entschieden! ({1}%% von {2} Stimmen erhalten) "
}
"Changed Next Map"
{
"de" "Nächste Karte wurde auf \"{1}\" geändert. "
}
"Runoff Vote Nextmap"
{
"de" "Stichwahl für die nächste Karte!"
}
"Number Of Votes"
{
"de" "Anzahl der Stimmen"
}
"Custom"
{
"de" "{1} (nicht vorhanden)"
}
"Revote Is Needed"
{
"de" "Keine Karte hat mehr als {1}%% der Stimmen.\nEine neue Abstimmung ist erforderlich!"
}
"Revote Warning"
{
"de" "Stichwahl startet in: {1} Sekunden"
}
"Vote Warning"
{
"de" "Achtung! Die Abstimmung für die nächste Karte startet in: {1} Sekunden"
}
"Line One"
{
"de" "Überlegen Sie, welche Karte Sie spielen möchten ..."
}
"Line Two"
{
"de" "... und nicht unüberlegt wählen!"
}
"Cannot Start Vote"
{
"de" "Abstimmung ist bereits im Gange. Versuch Sie es erneut in {1} Sekunden"
}
"Tie Vote"
{
"de" "Die Top-{1} Karten haben gleich viele Stimmen!.\nEine neue Abstimmung ist erforderlich!"
}
"Custom Marked"
{
"de" "*{1}"
}
"Phrases"
{
"Vote Nextmap"
{
"de" "Stimme für die nächste Karte!"
}
"Nextmap Voting Started"
{
"de" "Abstimmung für die nächste Karte wurde gestartet."
}
"Nextmap Voting Finished"
{
"de" "Karten-Abstimmung wurde abgeschlossen. Nächste Karte wird {1} sein. ({2}%% von {3} Stimmen erhalten) "
}
"Current Map Extended"
{
"de" "Die aktuelle Karte wurde verlängert. ({1}%% von {2} Stimmen erhalten) "
}
"Extend Map"
{
"de" "Verlängere aktuelle Karte"
}
"Dont Change"
{
"de" "Nicht wechseln"
}
"Current Map Stays"
{
"de" "Aktuelle Karte geht weiter! Die Abstimmung hat entschieden! ({1}%% von {2} Stimmen erhalten) "
}
"Changed Next Map"
{
"de" "Nächste Karte wurde auf \"{1}\" geändert. "
}
"Runoff Vote Nextmap"
{
"de" "Stichwahl für die nächste Karte!"
}
"Number Of Votes"
{
"de" "Anzahl der Stimmen"
}
"Custom"
{
"de" "{1} (nicht vorhanden)"
}
"Revote Is Needed"
{
"de" "Keine Karte hat mehr als {1}%% der Stimmen.\nEine neue Abstimmung ist erforderlich!"
}
"Revote Warning"
{
"de" "Stichwahl startet in: {1} Sekunden"
}
"Vote Warning"
{
"de" "Achtung! Die Abstimmung für die nächste Karte startet in: {1} Sekunden"
}
"Line One"
{
"de" "Überlegen Sie, welche Karte Sie spielen möchten ..."
}
"Line Two"
{
"de" "... und nicht unüberlegt wählen!"
}
"Cannot Start Vote"
{
"de" "Abstimmung ist bereits im Gange. Versuch Sie es erneut in {1} Sekunden"
}
"Tie Vote"
{
"de" "Die Top-{1} Karten haben gleich viele Stimmen!.\nEine neue Abstimmung ist erforderlich!"
}
"Custom Marked"
{
"de" "*{1}"
}
}

View File

@ -1,92 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"es" "Vota para el siguiente mapa!"
}
"Nextmap Voting Started"
{
"es" "La votacion para el siguiente mapa ha comenzado."
}
"Nextmap Voting Finished"
{
"es" "Votacion de Mapa finalizado. El siguiente mapa sera {1}. (Recibidos {2}%% de {3} votos)"
}
"Current Map Extended"
{
"es" "El mapa actual ha sido extendido. (Recibidos {1}%% de {2} votos)"
}
"Extend Map"
{
"es" "Extender mapa actual"
}
"Dont Change"
{
"es" "No cambiar"
}
"Current Map Stays"
{
"es" "El mapa actual continua! La votacion ha hablado! (Recibidos {1}%% de {2} votos)"
}
"Changed Next Map"
{
"es" "El siguiente mapa ha cambiado a \"{1}\"."
}
"Runoff Vote Nextmap"
{
"es" "Hacer votacion para el siguiente mapa!"
}
"Number Of Votes"
{
"es" "Numero de Votaciones"
}
"Custom"
{
"es" "{1} (Custom)"
}
"Revote Is Needed"
{
"es" "No hay ningun mapa que haya recibido el {1}%% de votaciones.\nEntonces, que mapa ganara? Es necesario otra votacion!"
}
"Revote Warning"
{
"es" "La votacion empezara en: {1}s"
}
"Vote Warning"
{
"es" "Atencion! La votacion para el siguiente mapa se iniciara en: {1}s"
}
"Line One"
{
"es" "Considera que mapa quieres jugar..."
}
"Line Two"
{
"es" "...y no pulse los botones sin pensar ;-)"
}
"Cannot Start Vote"
{
"es" "Votacion ya iniciada. Intentando de nuevo en {1}s."
}
"Tie Vote"
{
"es" "El top {1} de mapas tienen el mismo numero de votaciones.\nSe necesita una nueva votacion!"
}
"Phrases"
{
"Vote Nextmap"
{
"es" "Vota para el siguiente mapa!"
}
"Nextmap Voting Started"
{
"es" "La votacion para el siguiente mapa ha comenzado."
}
"Nextmap Voting Finished"
{
"es" "Votacion de Mapa finalizado. El siguiente mapa sera {1}. (Recibidos {2}%% de {3} votos)"
}
"Current Map Extended"
{
"es" "El mapa actual ha sido extendido. (Recibidos {1}%% de {2} votos)"
}
"Extend Map"
{
"es" "Extender mapa actual"
}
"Dont Change"
{
"es" "No cambiar"
}
"Current Map Stays"
{
"es" "El mapa actual continua! La votacion ha hablado! (Recibidos {1}%% de {2} votos)"
}
"Changed Next Map"
{
"es" "El siguiente mapa ha cambiado a \"{1}\"."
}
"Runoff Vote Nextmap"
{
"es" "Hacer votacion para el siguiente mapa!"
}
"Number Of Votes"
{
"es" "Numero de Votaciones"
}
"Custom"
{
"es" "{1} (Custom)"
}
"Revote Is Needed"
{
"es" "No hay ningun mapa que haya recibido el {1}%% de votaciones.\nEntonces, que mapa ganara? Es necesario otra votacion!"
}
"Revote Warning"
{
"es" "La votacion empezara en: {1}s"
}
"Vote Warning"
{
"es" "Atencion! La votacion para el siguiente mapa se iniciara en: {1}s"
}
"Line One"
{
"es" "Considera que mapa quieres jugar..."
}
"Line Two"
{
"es" "...y no pulse los botones sin pensar ;-)"
}
"Cannot Start Vote"
{
"es" "Votacion ya iniciada. Intentando de nuevo en {1}s."
}
"Tie Vote"
{
"es" "El top {1} de mapas tienen el mismo numero de votaciones.\nSe necesita una nueva votacion!"
}
}

View File

@ -1,87 +1,87 @@
"Phrases"
{
"Vote Nextmap"
{
"fr" "Voter pour la prochaine map!"
}
"Nextmap Voting Started"
{
"fr" "Voter pour la prochaine map est lancer."
}
"Nextmap Voting Finished"
{
"fr" "Le VoteMap est terminer. La prochaine map sera {1}. (Reçu {2}%% sur {3} votes)"
}
"Current Map Extended"
{
"fr" "La map actuelle a été prolonger. (Reçu {1}%% sur {2} votes)"
}
"Extend Map"
{
"fr" "Prolonger la map"
}
"Dont Change"
{
"fr" "Ne pas changer"
}
"Current Map Stays"
{
"fr" "La map continue! Le vote a tranché! (Reçu {1}%% sur {2} votes)"
}
"Changed Next Map"
{
"fr" "La map suivante sera \"{1}\"."
}
"Runoff Vote Nextmap"
{
"fr" "Votez a nouveau pour la prochaine Map!"
}
"Number Of Votes"
{
"fr" "Nombres de votes"
}
"Custom"
{
"fr" "{1} (Custom)"
}
"Revote Is Needed"
{
"fr" "Aucune map n'a reçu plus de {1}%% du vote.\nAlors, quels maps va gagner? Un nouveau vote va être lancé!"
}
"Revote Warning"
{
"fr" "Un nouveau vote commence dans: {1}s"
}
"Vote Warning"
{
"fr" "Attention! Le vote pour la prochaine map commence dans: {1}s"
}
"Line One"
{
"fr" "Voter pour la map que vous voulez jouer..."
}
"Line Two"
{
"fr" "...et ne pas cliquez sur une touche comme un con ;-)"
}
"Cannot Start Vote"
{
"fr" "Vote déjà en cours. Reassayer dans {1}s."
}
"Phrases"
{
"Vote Nextmap"
{
"fr" "Voter pour la prochaine map!"
}
"Nextmap Voting Started"
{
"fr" "Voter pour la prochaine map est lancer."
}
"Nextmap Voting Finished"
{
"fr" "Le VoteMap est terminer. La prochaine map sera {1}. (Reçu {2}%% sur {3} votes)"
}
"Current Map Extended"
{
"fr" "La map actuelle a été prolonger. (Reçu {1}%% sur {2} votes)"
}
"Extend Map"
{
"fr" "Prolonger la map"
}
"Dont Change"
{
"fr" "Ne pas changer"
}
"Current Map Stays"
{
"fr" "La map continue! Le vote a tranché! (Reçu {1}%% sur {2} votes)"
}
"Changed Next Map"
{
"fr" "La map suivante sera \"{1}\"."
}
"Runoff Vote Nextmap"
{
"fr" "Votez a nouveau pour la prochaine Map!"
}
"Number Of Votes"
{
"fr" "Nombres de votes"
}
"Custom"
{
"fr" "{1} (Custom)"
}
"Revote Is Needed"
{
"fr" "Aucune map n'a reçu plus de {1}%% du vote.\nAlors, quels maps va gagner? Un nouveau vote va être lancé!"
}
"Revote Warning"
{
"fr" "Un nouveau vote commence dans: {1}s"
}
"Vote Warning"
{
"fr" "Attention! Le vote pour la prochaine map commence dans: {1}s"
}
"Line One"
{
"fr" "Voter pour la map que vous voulez jouer..."
}
"Line Two"
{
"fr" "...et ne pas cliquez sur une touche comme un con ;-)"
}
"Cannot Start Vote"
{
"fr" "Vote déjà en cours. Reassayer dans {1}s."
}
}

View File

@ -1,92 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"fr" "Votez pour la prochaine map!"
}
"Nextmap Voting Started"
{
"fr" "Le vote pour la prochaine map est lancé."
}
"Nextmap Voting Finished"
{
"fr" "Le VoteMap est terminé. La prochaine map sera {1}. (Reçu {2}%% sur {3} votes)"
}
"Current Map Extended"
{
"fr" "La map actuelle a été prolongée. (Reçu {1}%% sur {2} votes)"
}
"Extend Map"
{
"fr" "Prolonger la map"
}
"Dont Change"
{
"fr" "Ne pas changer"
}
"Current Map Stays"
{
"fr" "La map continue! Le vote a tranché! (Reçu {1}%% sur {2} votes)"
}
"Changed Next Map"
{
"fr" "La map suivante sera \"{1}\"."
}
"Runoff Vote Nextmap"
{
"fr" "Votez à nouveau pour la prochaine Map!"
}
"Number Of Votes"
{
"fr" "Nombres de votes"
}
"Custom"
{
"fr" "{1} (Custom)"
}
"Revote Is Needed"
{
"fr" "Aucune map n'a reçu plus de {1}%% du vote.\nAlors, quelle map va gagner? Un nouveau vote va être lancé!"
}
"Revote Warning"
{
"fr" "Un nouveau vote commence dans: {1}s"
}
"Vote Warning"
{
"fr" "Attention! Le vote pour la prochaine map commence dans: {1}s"
}
"Line One"
{
"fr" "Votez pour la map que vous voulez jouer..."
}
"Line Two"
{
"fr" "...et n'appuyez pas sur une touche comme un con ;-)"
}
"Cannot Start Vote"
{
"fr" "Vote déjà en cours. Reassayez dans {1}s."
}
"Tie Vote"
{
"fr" "{1} maps ont eu un même nombre de voix.\nUn nouveau vote est nécessaire!"
}
"Phrases"
{
"Vote Nextmap"
{
"fr" "Votez pour la prochaine map!"
}
"Nextmap Voting Started"
{
"fr" "Le vote pour la prochaine map est lancé."
}
"Nextmap Voting Finished"
{
"fr" "Le VoteMap est terminé. La prochaine map sera {1}. (Reçu {2}%% sur {3} votes)"
}
"Current Map Extended"
{
"fr" "La map actuelle a été prolongée. (Reçu {1}%% sur {2} votes)"
}
"Extend Map"
{
"fr" "Prolonger la map"
}
"Dont Change"
{
"fr" "Ne pas changer"
}
"Current Map Stays"
{
"fr" "La map continue! Le vote a tranché! (Reçu {1}%% sur {2} votes)"
}
"Changed Next Map"
{
"fr" "La map suivante sera \"{1}\"."
}
"Runoff Vote Nextmap"
{
"fr" "Votez à nouveau pour la prochaine Map!"
}
"Number Of Votes"
{
"fr" "Nombres de votes"
}
"Custom"
{
"fr" "{1} (Custom)"
}
"Revote Is Needed"
{
"fr" "Aucune map n'a reçu plus de {1}%% du vote.\nAlors, quelle map va gagner? Un nouveau vote va être lancé!"
}
"Revote Warning"
{
"fr" "Un nouveau vote commence dans: {1}s"
}
"Vote Warning"
{
"fr" "Attention! Le vote pour la prochaine map commence dans: {1}s"
}
"Line One"
{
"fr" "Votez pour la map que vous voulez jouer..."
}
"Line Two"
{
"fr" "...et n'appuyez pas sur une touche comme un con ;-)"
}
"Cannot Start Vote"
{
"fr" "Vote déjà en cours. Reassayez dans {1}s."
}
"Tie Vote"
{
"fr" "{1} maps ont eu un même nombre de voix.\nUn nouveau vote est nécessaire!"
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"hu" "Mi legyen a következő pálya?"
}
"Nextmap Voting Started"
{
"hu" "Palyavalaszto szavazas elindult!"
}
"Nextmap Voting Finished"
{
"hu" "A szavazás lezárult. A következő pálya a {1} lesz"
}
"Current Map Extended"
{
"hu" "Az aktualis palya meghosszabitva."
}
"Extend Map"
{
"hu" "Palya meghosszabitasa"
}
"Dont Change"
{
"hu" "Ne valtsunk!"
}
"Current Map Stays"
{
"hu" "Jelenlegi palya folytatodik."
}
"Changed Next Map"
{
"hu" "\"{1}\" lesz a kovetkezo palya"
}
}
"Phrases"
{
"Vote Nextmap"
{
"hu" "Mi legyen a következő pálya?"
}
"Nextmap Voting Started"
{
"hu" "Palyavalaszto szavazas elindult!"
}
"Nextmap Voting Finished"
{
"hu" "A szavazás lezárult. A következő pálya a {1} lesz"
}
"Current Map Extended"
{
"hu" "Az aktualis palya meghosszabitva."
}
"Extend Map"
{
"hu" "Palya meghosszabitasa"
}
"Dont Change"
{
"hu" "Ne valtsunk!"
}
"Current Map Stays"
{
"hu" "Jelenlegi palya folytatodik."
}
"Changed Next Map"
{
"hu" "\"{1}\" lesz a kovetkezo palya"
}
}

View File

@ -1,92 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"it" "Vota per la prossima mappa!"
}
"Nextmap Voting Started"
{
"it" "Le votazione per scegliere la prossima mappa sono iniziate."
}
"Nextmap Voting Finished"
{
"it" "Le votazioni sono terminate. La prossima mappa sarà {1}. (Con {2}%% su {3} votes)"
}
"Current Map Extended"
{
"it" "La mappa attuale è stata estesa. (Con {1}%% su {2} votes)"
}
"Extend Map"
{
"it" "Estendi la mappa corrente"
}
"Dont Change"
{
"it" "Non cambiare"
}
"Current Map Stays"
{
"it" "La mappa continua! Il voto ha parlato! (Con {1}%% su {2} votes)"
}
"Changed Next Map"
{
"it" "La mappa successiva sarà \"{1}\"."
}
"Runoff Vote Nextmap"
{
"it" "Vota nuovamente per scegliere la prossima mappa!"
}
"Number Of Votes"
{
"it" "Numero di voti"
}
"Custom"
{
"it" "{1} (Custom)"
}
"Revote Is Needed"
{
"it" "Nessuna mappa ha ricevuto più del {1}%% di voti.\nAllora, quale mappa vincerà? Si inizia un' altra votazione!"
}
"Revote Warning"
{
"it" "Una nuova votazione inizierà tra: {1}s"
}
"Vote Warning"
{
"it" "Attenzione! Le votazione per la prossima mappa cominceranno tra: {1}s"
}
"Line One"
{
"it" "Vota la mappa chevorresti giocare..."
}
"Line Two"
{
"it" "...e non cliccare i tasti sconsideratamente :D"
}
"Cannot Start Vote"
{
"it" "Il voto è in corso. Riprova tra {1}s."
}
"Tie Vote"
{
"it" "Le mappe hanno raggiunto il pareggio dei voti.\nBisogna nuovamente votare!"
}
}
"Phrases"
{
"Vote Nextmap"
{
"it" "Vota per la prossima mappa!"
}
"Nextmap Voting Started"
{
"it" "Le votazione per scegliere la prossima mappa sono iniziate."
}
"Nextmap Voting Finished"
{
"it" "Le votazioni sono terminate. La prossima mappa sarà {1}. (Con {2}%% su {3} votes)"
}
"Current Map Extended"
{
"it" "La mappa attuale è stata estesa. (Con {1}%% su {2} votes)"
}
"Extend Map"
{
"it" "Estendi la mappa corrente"
}
"Dont Change"
{
"it" "Non cambiare"
}
"Current Map Stays"
{
"it" "La mappa continua! Il voto ha parlato! (Con {1}%% su {2} votes)"
}
"Changed Next Map"
{
"it" "La mappa successiva sarà \"{1}\"."
}
"Runoff Vote Nextmap"
{
"it" "Vota nuovamente per scegliere la prossima mappa!"
}
"Number Of Votes"
{
"it" "Numero di voti"
}
"Custom"
{
"it" "{1} (Custom)"
}
"Revote Is Needed"
{
"it" "Nessuna mappa ha ricevuto più del {1}%% di voti.\nAllora, quale mappa vincerà? Si inizia un' altra votazione!"
}
"Revote Warning"
{
"it" "Una nuova votazione inizierà tra: {1}s"
}
"Vote Warning"
{
"it" "Attenzione! Le votazione per la prossima mappa cominceranno tra: {1}s"
}
"Line One"
{
"it" "Vota la mappa chevorresti giocare..."
}
"Line Two"
{
"it" "...e non cliccare i tasti sconsideratamente :D"
}
"Cannot Start Vote"
{
"it" "Il voto è in corso. Riprova tra {1}s."
}
"Tie Vote"
{
"it" "Le mappe hanno raggiunto il pareggio dei voti.\nBisogna nuovamente votare!"
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"jp" "次のマップを投票してください!"
}
"Nextmap Voting Started"
{
"jp" "次のマップ投票をスタートしました。"
}
"Nextmap Voting Finished"
{
"jp" "マップ投票が完了しました。次はマップは{1}です。({3}中{2}%%)"
}
"Current Map Extended"
{
"jp" "現在のマップを延長します。({3}中{2}%%)"
}
"Extend Map"
{
"jp" "現在のマップを延長"
}
"Dont Change"
{
"jp" "変更しない"
}
"Current Map Stays"
{
"jp" "現在のマップを延長します。({3}中{2}%%)"
}
"Changed Next Map"
{
"jp" "次のマップを\"{1}\"に変更しました。"
}
}
"Phrases"
{
"Vote Nextmap"
{
"jp" "次のマップを投票してください!"
}
"Nextmap Voting Started"
{
"jp" "次のマップ投票をスタートしました。"
}
"Nextmap Voting Finished"
{
"jp" "マップ投票が完了しました。次はマップは{1}です。({3}中{2}%%)"
}
"Current Map Extended"
{
"jp" "現在のマップを延長します。({3}中{2}%%)"
}
"Extend Map"
{
"jp" "現在のマップを延長"
}
"Dont Change"
{
"jp" "変更しない"
}
"Current Map Stays"
{
"jp" "現在のマップを延長します。({3}中{2}%%)"
}
"Changed Next Map"
{
"jp" "次のマップを\"{1}\"に変更しました。"
}
}

View File

@ -1,98 +1,98 @@
"Phrases"
{
"Vote Nextmap"
{
"ko" "다음 맵을 결정하기 위한 투표!"
}
"Nextmap Voting Started"
{
"ko" "다음 맵을 결정하기 위한 투표가 시작되었습니다."
}
"Nextmap Voting Finished"
{
"ko" "맵 투표가 끝났습니다. 다음 맵은 {1} 이 될 것입니다. (전체 인원 {2}명 중 {1}%%의 표를 받았습니다.)"
}
"Current Map Extended"
{
"ko" "현재 맵을 더하기로 결정했습니다. (전체 인원 {2}명 중 {1}%%의 표를 받았습니다.)"
}
"Extend Map"
{
"ko" "지금 맵을 더 하자"
}
"Dont Change"
{
"ko" "바꾸지 말자"
}
"Current Map Stays"
{
"ko" "현재 맵을 계속 합니다!(전체 인원 {2} 명의 {1}%% 의 표를 받았습니다)"
}
"Changed Next Map"
{
"ko" "다음 맵을 \"{1}\" 로 바꾸었습니다."
}
"Runoff Vote Nextmap"
{
"ko" "다음 맵을 결정하기 위한 재투표!"
}
"Number Of Votes"
{
"ko" "투표수"
}
"Custom"
{
"ko" "{1} (커스텀 맵)"
}
"Revote Is Needed"
{
"ko" "{1}%% 이상 투표를 받은 맵이 없습니다.\n다음 맵을 결정하기 위해 재투표를 합니다!"
}
"Revote Warning"
{
"ko" "재투표까지: {1}초"
}
"Vote Warning"
{
"ko" "알립니다! 다음 맵을 결정하는 투표까지: {1}초"
}
"Line One"
{
"ko" "원하는 맵을 선택하세요..."
}
"Line Two"
{
"ko" "...그리고 아무거나 막 찍지 말고요 -_-"
}
"Cannot Start Vote"
{
"ko" "투표가 진행 중에 있습니다. {1}초 후 다시 시도합니다."
}
"Tie Vote"
{
"ko" "{1}개 맵이 같은 투표수를 얻었습니다.\n재투표를 합니다!"
}
"Custom Marked"
{
"ko" "*{1}"
}
}
"Phrases"
{
"Vote Nextmap"
{
"ko" "다음 맵을 결정하기 위한 투표!"
}
"Nextmap Voting Started"
{
"ko" "다음 맵을 결정하기 위한 투표가 시작되었습니다."
}
"Nextmap Voting Finished"
{
"ko" "맵 투표가 끝났습니다. 다음 맵은 {1} 이 될 것입니다. (전체 인원 {2}명 중 {1}%%의 표를 받았습니다.)"
}
"Current Map Extended"
{
"ko" "현재 맵을 더하기로 결정했습니다. (전체 인원 {2}명 중 {1}%%의 표를 받았습니다.)"
}
"Extend Map"
{
"ko" "지금 맵을 더 하자"
}
"Dont Change"
{
"ko" "바꾸지 말자"
}
"Current Map Stays"
{
"ko" "현재 맵을 계속 합니다!(전체 인원 {2} 명의 {1}%% 의 표를 받았습니다)"
}
"Changed Next Map"
{
"ko" "다음 맵을 \"{1}\" 로 바꾸었습니다."
}
"Runoff Vote Nextmap"
{
"ko" "다음 맵을 결정하기 위한 재투표!"
}
"Number Of Votes"
{
"ko" "투표수"
}
"Custom"
{
"ko" "{1} (커스텀 맵)"
}
"Revote Is Needed"
{
"ko" "{1}%% 이상 투표를 받은 맵이 없습니다.\n다음 맵을 결정하기 위해 재투표를 합니다!"
}
"Revote Warning"
{
"ko" "재투표까지: {1}초"
}
"Vote Warning"
{
"ko" "알립니다! 다음 맵을 결정하는 투표까지: {1}초"
}
"Line One"
{
"ko" "원하는 맵을 선택하세요..."
}
"Line Two"
{
"ko" "...그리고 아무거나 막 찍지 말고요 -_-"
}
"Cannot Start Vote"
{
"ko" "투표가 진행 중에 있습니다. {1}초 후 다시 시도합니다."
}
"Tie Vote"
{
"ko" "{1}개 맵이 같은 투표수를 얻었습니다.\n재투표를 합니다!"
}
"Custom Marked"
{
"ko" "*{1}"
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"lv" "Balso par nākamo karti!"
}
"Nextmap Voting Started"
{
"lv" "Balsošana par nākamo karti ir sākusies."
}
"Nextmap Voting Finished"
{
"lv" "Balsošana par karti ir beigusies. Nākamā karte būs {1}. (Saņēma {2}%% no {3} balsīm) "
}
"Current Map Extended"
{
"lv" "Patreizējās kartes laiks ir pagarināts. (Saņēma {1}%% no {2} balsīm) "
}
"Extend Map"
{
"lv" "Pagarināt laiku patreizējā kartē"
}
"Dont Change"
{
"lv" "Nemainīt"
}
"Current Map Stays"
{
"lv" "Patreizējā karte turpinās! Aptauja ir beigusies! (Saņēma {1}%% no {2} balsīm)"
}
"Changed Next Map"
{
"lv" "Nomainīja nākamo karti uz \"{1}\"."
}
}
"Phrases"
{
"Vote Nextmap"
{
"lv" "Balso par nākamo karti!"
}
"Nextmap Voting Started"
{
"lv" "Balsošana par nākamo karti ir sākusies."
}
"Nextmap Voting Finished"
{
"lv" "Balsošana par karti ir beigusies. Nākamā karte būs {1}. (Saņēma {2}%% no {3} balsīm) "
}
"Current Map Extended"
{
"lv" "Patreizējās kartes laiks ir pagarināts. (Saņēma {1}%% no {2} balsīm) "
}
"Extend Map"
{
"lv" "Pagarināt laiku patreizējā kartē"
}
"Dont Change"
{
"lv" "Nemainīt"
}
"Current Map Stays"
{
"lv" "Patreizējā karte turpinās! Aptauja ir beigusies! (Saņēma {1}%% no {2} balsīm)"
}
"Changed Next Map"
{
"lv" "Nomainīja nākamo karti uz \"{1}\"."
}
}

View File

@ -1,109 +1,109 @@
"Phrases"
{
"Vote Nextmap"
{
"en" "Vote for the next map!"
}
"Nextmap Voting Started"
{
"en" "Voting for next map has started."
}
"Nextmap Voting Finished"
{
"#format" "{1:s},{2:i},{3:i}"
"en" "Map voting has finished. The next map will be {1}. (Received {2}%% of {3} votes)"
}
"Current Map Extended"
{
"#format" "{1:i},{2:i}"
"en" "The current map has been extended. (Received {1}%% of {2} votes)"
}
"Extend Map"
{
"en" "Extend Current Map"
}
"Dont Change"
{
"en" "Don't Change"
}
"Current Map Stays"
{
"#format" "{1:i},{2:i}"
"en" "Current map continues! The Vote has spoken! (Received {1}%% of {2} votes)"
}
"Changed Next Map"
{
"#format" "{1:s}"
"en" "Changed nextmap to \"{1}\"."
}
"Runoff Vote Nextmap"
{
"en" "Runoff Vote for the next map!"
}
"Number Of Votes"
{
"en" "Number of votes"
}
"Custom"
{
"#format" "{1:s}"
"en" "{1} (Custom)"
}
"Revote Is Needed"
{
"#format" "{1:i}"
"en" "No map has received more than {1}%% of the vote.\nSo, which map will win? A revote is needed!"
}
"Revote Warning"
{
"#format" "{1:i}"
"en" "Runoff vote will start in: {1}s"
}
"Vote Warning"
{
"#format" "{1:i}"
"en" "Warning! Voting for the next map will begin in: {1}s"
}
"Line One"
{
"en" "Consider which map you want to play..."
}
"Line Two"
{
"en" "...and don't hit buttons thoughtlessly ;-)"
}
"Cannot Start Vote"
{
"#format" "{1:i}"
"en" "Vote already in progress. Retrying in {1}s."
}
"Tie Vote"
{
"#format" "{1:i}"
"en" "The top {1} maps had the same number of votes.\nA revote is needed!"
}
"Custom Marked"
{
"#format" "{1:s}"
"en" "*{1}"
}
"Phrases"
{
"Vote Nextmap"
{
"en" "Vote for the next map!"
}
"Nextmap Voting Started"
{
"en" "Voting for next map has started."
}
"Nextmap Voting Finished"
{
"#format" "{1:s},{2:i},{3:i}"
"en" "Map voting has finished. The next map will be {1}. (Received {2}%% of {3} votes)"
}
"Current Map Extended"
{
"#format" "{1:i},{2:i}"
"en" "The current map has been extended. (Received {1}%% of {2} votes)"
}
"Extend Map"
{
"en" "Extend Current Map"
}
"Dont Change"
{
"en" "Don't Change"
}
"Current Map Stays"
{
"#format" "{1:i},{2:i}"
"en" "Current map continues! The Vote has spoken! (Received {1}%% of {2} votes)"
}
"Changed Next Map"
{
"#format" "{1:s}"
"en" "Changed nextmap to \"{1}\"."
}
"Runoff Vote Nextmap"
{
"en" "Runoff Vote for the next map!"
}
"Number Of Votes"
{
"en" "Number of votes"
}
"Custom"
{
"#format" "{1:s}"
"en" "{1} (Custom)"
}
"Revote Is Needed"
{
"#format" "{1:i}"
"en" "No map has received more than {1}%% of the vote.\nSo, which map will win? A revote is needed!"
}
"Revote Warning"
{
"#format" "{1:i}"
"en" "Runoff vote will start in: {1}s"
}
"Vote Warning"
{
"#format" "{1:i}"
"en" "Warning! Voting for the next map will begin in: {1}s"
}
"Line One"
{
"en" "Consider which map you want to play..."
}
"Line Two"
{
"en" "...and don't hit buttons thoughtlessly ;-)"
}
"Cannot Start Vote"
{
"#format" "{1:i}"
"en" "Vote already in progress. Retrying in {1}s."
}
"Tie Vote"
{
"#format" "{1:i}"
"en" "The top {1} maps had the same number of votes.\nA revote is needed!"
}
"Custom Marked"
{
"#format" "{1:s}"
"en" "*{1}"
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"nl" "Stem voor de volgende map!"
}
"Nextmap Voting Started"
{
"nl" "Stemmen voor de volgende map is gestart."
}
"Nextmap Voting Finished"
{
"nl" "Map stemmen gestopt. De volgende map wordt {1}."
}
"Current Map Extended"
{
"nl" "De huidige map is verlengd."
}
"Extend Map"
{
"nl" "Verleng huidige map"
}
"Dont Change"
{
"nl" "Niet veranderen"
}
"Current Map Stays"
{
"nl" "Huidige map gaat verder! De Stem heeft gesproken! (Ontvangen {1}%% van de {2} stemmen)"
}
"Changed Next Map"
{
"nl" "Volgende map verandert naar \"{1}\"."
}
}
"Phrases"
{
"Vote Nextmap"
{
"nl" "Stem voor de volgende map!"
}
"Nextmap Voting Started"
{
"nl" "Stemmen voor de volgende map is gestart."
}
"Nextmap Voting Finished"
{
"nl" "Map stemmen gestopt. De volgende map wordt {1}."
}
"Current Map Extended"
{
"nl" "De huidige map is verlengd."
}
"Extend Map"
{
"nl" "Verleng huidige map"
}
"Dont Change"
{
"nl" "Niet veranderen"
}
"Current Map Stays"
{
"nl" "Huidige map gaat verder! De Stem heeft gesproken! (Ontvangen {1}%% van de {2} stemmen)"
}
"Changed Next Map"
{
"nl" "Volgende map verandert naar \"{1}\"."
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"no" "Stem for det neste kartet!"
}
"Nextmap Voting Started"
{
"no" "Avstemning for det neste kartet har startet."
}
"Nextmap Voting Finished"
{
"no" "Kart-avstemningen er avsluttet. Det neste kartet vil være {1}. (Mottok {2}%% av {3} stemmer)."
}
"Current Map Extended"
{
"no" "Gjeldende kart videreføres! (Mottok {1}%% av {2} stemmer)."
}
"Extend Map"
{
"no" "Forleng gjeldende kart."
}
"Dont Change"
{
"no" "Ikke bytt!"
}
"Current Map Stays"
{
"no" "Gjeldende kart videreføres! Avstemningen har talt! (Mottok {1}%% av {2} stemmer)."
}
"Changed Next Map"
{
"no" "Byttet neste kart til \"{1}\""
}
}
"Phrases"
{
"Vote Nextmap"
{
"no" "Stem for det neste kartet!"
}
"Nextmap Voting Started"
{
"no" "Avstemning for det neste kartet har startet."
}
"Nextmap Voting Finished"
{
"no" "Kart-avstemningen er avsluttet. Det neste kartet vil være {1}. (Mottok {2}%% av {3} stemmer)."
}
"Current Map Extended"
{
"no" "Gjeldende kart videreføres! (Mottok {1}%% av {2} stemmer)."
}
"Extend Map"
{
"no" "Forleng gjeldende kart."
}
"Dont Change"
{
"no" "Ikke bytt!"
}
"Current Map Stays"
{
"no" "Gjeldende kart videreføres! Avstemningen har talt! (Mottok {1}%% av {2} stemmer)."
}
"Changed Next Map"
{
"no" "Byttet neste kart til \"{1}\""
}
}

View File

@ -1,92 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"pl" "Głosuj na następną mapę!"
}
"Nextmap Voting Started"
{
"pl" "Rozpoczęto głosowanie na następną mapę."
}
"Nextmap Voting Finished"
{
"pl" "Głosowanie na mapę zostało zakończone. Następną mapą będzie {1}. (Otrzymała {2} procent z {3} głosów) "
}
"Current Map Extended"
{
"pl" "Aktualna mapa została przedłużona. (Otrzymała {1} procent z {2} głosów)"
}
"Extend Map"
{
"pl" "Przedłuż bieżącą mapę"
}
"Dont Change"
{
"pl" "Nie Zmieniaj"
}
"Current Map Stays"
{
"pl" "Aktualna mapa będzie kontynuowana! (Otrzymano {1} procent z {2} głosów)"
}
"Changed Next Map"
{
"pl" "Zmieniono następną mapę na: \"{1}\"."
}
"Runoff Vote Nextmap"
{
"pl" "Wybierz ponownie!"
}
"Number Of Votes"
{
"pl" "Otrzymane głosy"
}
"Custom"
{
"pl" "{1} (Niestandardowa)"
}
"Revote Is Needed"
{
"pl" "Żadna mapa nie otrzymała przynajmniej {1}%% głosów.\nWięc która mapa jest zwycięzcą? Trzeba zagłosować ponownie!"
}
"Revote Warning"
{
"pl" "Ponowne głosowanie rozpocznie się za: {1}s\nTym razem się już zdecydujcie ;-)"
}
"Vote Warning"
{
"pl" "UWAGA!!! Głosowanie na następną mapę rozpocznie się za: {1}s"
}
"Line One"
{
"pl" "Zastanów się na której mapie chcesz grać..."
}
"Line Two"
{
"pl" "...wpisując !revote możesz zmienić swój głos."
}
"Cannot Start Vote"
{
"pl" "Głosowanie w toku. Ponawiam za {1}s."
}
"Tie Vote"
{
"pl" "{1} najlepsze mapy otrzymały tę samą ilość głosów.\nPotrzeba ponownego głosowania!"
}
"Phrases"
{
"Vote Nextmap"
{
"pl" "Głosuj na następną mapę!"
}
"Nextmap Voting Started"
{
"pl" "Rozpoczęto głosowanie na następną mapę."
}
"Nextmap Voting Finished"
{
"pl" "Głosowanie na mapę zostało zakończone. Następną mapą będzie {1}. (Otrzymała {2} procent z {3} głosów) "
}
"Current Map Extended"
{
"pl" "Aktualna mapa została przedłużona. (Otrzymała {1} procent z {2} głosów)"
}
"Extend Map"
{
"pl" "Przedłuż bieżącą mapę"
}
"Dont Change"
{
"pl" "Nie Zmieniaj"
}
"Current Map Stays"
{
"pl" "Aktualna mapa będzie kontynuowana! (Otrzymano {1} procent z {2} głosów)"
}
"Changed Next Map"
{
"pl" "Zmieniono następną mapę na: \"{1}\"."
}
"Runoff Vote Nextmap"
{
"pl" "Wybierz ponownie!"
}
"Number Of Votes"
{
"pl" "Otrzymane głosy"
}
"Custom"
{
"pl" "{1} (Niestandardowa)"
}
"Revote Is Needed"
{
"pl" "Żadna mapa nie otrzymała przynajmniej {1}%% głosów.\nWięc która mapa jest zwycięzcą? Trzeba zagłosować ponownie!"
}
"Revote Warning"
{
"pl" "Ponowne głosowanie rozpocznie się za: {1}s\nTym razem się już zdecydujcie ;-)"
}
"Vote Warning"
{
"pl" "UWAGA!!! Głosowanie na następną mapę rozpocznie się za: {1}s"
}
"Line One"
{
"pl" "Zastanów się na której mapie chcesz grać..."
}
"Line Two"
{
"pl" "...wpisując !revote możesz zmienić swój głos."
}
"Cannot Start Vote"
{
"pl" "Głosowanie w toku. Ponawiam za {1}s."
}
"Tie Vote"
{
"pl" "{1} najlepsze mapy otrzymały tę samą ilość głosów.\nPotrzeba ponownego głosowania!"
}
}

View File

@ -1,98 +1,98 @@
"Phrases"
{
"Vote Nextmap"
{
"pt" "Vote para o próximo mapa!"
}
"Nextmap Voting Started"
{
"pt" "Votação para o próximo mapa começou."
}
"Nextmap Voting Finished"
{
"pt" "A votação para o próximo mapa terminou. O próximo mapa será {1}. (Recebidos {2}%% de {3} votos)"
}
"Current Map Extended"
{
"pt" "A mapa atual foi estendido. (Recebidos {1}%% de {2} votos)"
}
"Extend Map"
{
"pt" "Estender tempo do mapa atual"
}
"Dont Change"
{
"pt" "Não Mudar"
}
"Current Map Stays"
{
"pt" "O mapa atual continua! O Voto foi dado! (Recebidos {1}%% de {2} votos)"
}
"Changed Next Map"
{
"pt" "Mudado o próximo mapa para \"{1}\"."
}
"Runoff Vote Nextmap"
{
"pt" "Segundo turno de votos para o próximo mapa!"
}
"Number Of Votes"
{
"pt" "Número de votos"
}
"Custom"
{
"pt" "{1} (Custom)"
}
"Revote Is Needed"
{
"pt" "Nenhum mapa recebeu mais que {1}%% de votos.\nEntão, qual mapa ganhará? Precisa de uma nova votação!"
}
"Revote Warning"
{
"pt" "Segundo turno começa em: {1}s"
}
"Vote Warning"
{
"pt" "Atenção! Votação para o próximo mapa começará em: {1}s"
}
"Line One"
{
"pt" "Considere que mapa você quer jogar..."
}
"Line Two"
{
"pt" "...e não aperte os botões sem pensar ;-)"
}
"Cannot Start Vote"
{
"pt" "Votação em progresso. Tentando novamente em {1}s."
}
"Tie Vote"
{
"pt" "Os {1} mapas tiveram o mesmo número de votos.\nUma nova votação é necessária!"
}
"Custom Marked"
{
"pt" "*{1}"
}
"Phrases"
{
"Vote Nextmap"
{
"pt" "Vote para o próximo mapa!"
}
"Nextmap Voting Started"
{
"pt" "Votação para o próximo mapa começou."
}
"Nextmap Voting Finished"
{
"pt" "A votação para o próximo mapa terminou. O próximo mapa será {1}. (Recebidos {2}%% de {3} votos)"
}
"Current Map Extended"
{
"pt" "A mapa atual foi estendido. (Recebidos {1}%% de {2} votos)"
}
"Extend Map"
{
"pt" "Estender tempo do mapa atual"
}
"Dont Change"
{
"pt" "Não Mudar"
}
"Current Map Stays"
{
"pt" "O mapa atual continua! O Voto foi dado! (Recebidos {1}%% de {2} votos)"
}
"Changed Next Map"
{
"pt" "Mudado o próximo mapa para \"{1}\"."
}
"Runoff Vote Nextmap"
{
"pt" "Segundo turno de votos para o próximo mapa!"
}
"Number Of Votes"
{
"pt" "Número de votos"
}
"Custom"
{
"pt" "{1} (Custom)"
}
"Revote Is Needed"
{
"pt" "Nenhum mapa recebeu mais que {1}%% de votos.\nEntão, qual mapa ganhará? Precisa de uma nova votação!"
}
"Revote Warning"
{
"pt" "Segundo turno começa em: {1}s"
}
"Vote Warning"
{
"pt" "Atenção! Votação para o próximo mapa começará em: {1}s"
}
"Line One"
{
"pt" "Considere que mapa você quer jogar..."
}
"Line Two"
{
"pt" "...e não aperte os botões sem pensar ;-)"
}
"Cannot Start Vote"
{
"pt" "Votação em progresso. Tentando novamente em {1}s."
}
"Tie Vote"
{
"pt" "Os {1} mapas tiveram o mesmo número de votos.\nUma nova votação é necessária!"
}
"Custom Marked"
{
"pt" "*{1}"
}
}

View File

@ -1,83 +1,83 @@
"Phrases"
{
"Vote Nextmap"
{
"ru" "Голосование за следующую карту."
}
"Runoff Vote Nextmap"
{
"ru" "Повторное голосование за карту."
}
"Nextmap Voting Started"
{
"ru" "Голосование за следующую карту запущено."
}
"Nextmap Voting Finished"
{
"ru" "Голосование за карту завершено. Следующей картой будет: {1}. (Получено {2}%% из {3} голосов(а))"
}
"Current Map Extended"
{
"ru" "Текущая карта была продлена. (Получено {1}%% из {2} голосов(а))"
}
"Extend Map"
{
"ru" "Продлить текущую карту."
}
"Dont Change"
{
"ru" "Не менять карту."
}
"Current Map Stays"
{
"ru" "Текущая карта не сменится! (Получено {1}%% из {2} голосов(а))"
}
"Changed Next Map"
{
"ru" "Следующая карта изменена на \"{1}\"."
}
"Number Of Votes"
{
"ru" "Количество голосов"
}
"Custom"
{
"ru" "{1} (Случайная)"
}
"Revote Is Needed"
{
"ru" "Ни одна карта не получила более, чем {1}%% голосов(а).\nИтак, какая карта будет следующей? Приготовьтесь к повторному голосованию!"
}
"Revote Warning"
{
"ru" "Повторное голосование начнётся через: {1}s"
}
"Vote Warning"
{
"ru" "Внимание! Голосование за следующую карту начнётся через: {1}s"
}
"Line One"
{
"ru" "Выбери, какая карта будет следующей..."
}
"Line Two"
{
"ru" "...и не клацай кнопки,не подумав ;-)"
}
"Phrases"
{
"Vote Nextmap"
{
"ru" "Голосование за следующую карту."
}
"Runoff Vote Nextmap"
{
"ru" "Повторное голосование за карту."
}
"Nextmap Voting Started"
{
"ru" "Голосование за следующую карту запущено."
}
"Nextmap Voting Finished"
{
"ru" "Голосование за карту завершено. Следующей картой будет: {1}. (Получено {2}%% из {3} голосов(а))"
}
"Current Map Extended"
{
"ru" "Текущая карта была продлена. (Получено {1}%% из {2} голосов(а))"
}
"Extend Map"
{
"ru" "Продлить текущую карту."
}
"Dont Change"
{
"ru" "Не менять карту."
}
"Current Map Stays"
{
"ru" "Текущая карта не сменится! (Получено {1}%% из {2} голосов(а))"
}
"Changed Next Map"
{
"ru" "Следующая карта изменена на \"{1}\"."
}
"Number Of Votes"
{
"ru" "Количество голосов"
}
"Custom"
{
"ru" "{1} (Случайная)"
}
"Revote Is Needed"
{
"ru" "Ни одна карта не получила более, чем {1}%% голосов(а).\nИтак, какая карта будет следующей? Приготовьтесь к повторному голосованию!"
}
"Revote Warning"
{
"ru" "Повторное голосование начнётся через: {1}s"
}
"Vote Warning"
{
"ru" "Внимание! Голосование за следующую карту начнётся через: {1}s"
}
"Line One"
{
"ru" "Выбери, какая карта будет следующей..."
}
"Line Two"
{
"ru" "...и не клацай кнопки,не подумав ;-)"
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"sv" "Rösta för nästa bana!"
}
"Nextmap Voting Started"
{
"sv" "Röstning om nästa bana har börjat."
}
"Nextmap Voting Finished"
{
"sv" "Röstningen om banan har avslutats. Nästa bana kommer att bli {1}. (Fick {2}%% av {3} röster) "
}
"Current Map Extended"
{
"sv" "Den nuvarande banan har förlängts. (Fick {1}%% av {2} röster) "
}
"Extend Map"
{
"sv" "Förläng nuvarande bana"
}
"Dont Change"
{
"sv" "Byt inte"
}
"Current Map Stays"
{
"sv" "Nuvarande banan fortsätter! Röstningen har talat! (Fick {1}%% av {2} röster) "
}
"Changed Next Map"
{
"sv" "Bytta nästa bana till \"{1}\". "
}
}
"Phrases"
{
"Vote Nextmap"
{
"sv" "Rösta för nästa bana!"
}
"Nextmap Voting Started"
{
"sv" "Röstning om nästa bana har börjat."
}
"Nextmap Voting Finished"
{
"sv" "Röstningen om banan har avslutats. Nästa bana kommer att bli {1}. (Fick {2}%% av {3} röster) "
}
"Current Map Extended"
{
"sv" "Den nuvarande banan har förlängts. (Fick {1}%% av {2} röster) "
}
"Extend Map"
{
"sv" "Förläng nuvarande bana"
}
"Dont Change"
{
"sv" "Byt inte"
}
"Current Map Stays"
{
"sv" "Nuvarande banan fortsätter! Röstningen har talat! (Fick {1}%% av {2} röster) "
}
"Changed Next Map"
{
"sv" "Bytta nästa bana till \"{1}\". "
}
}

View File

@ -1,2 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"

View File

@ -1,43 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"tr" "Sonraki harita için oy ver!"
}
"Nextmap Voting Started"
{
"tr" "Sonraki harita için oylama başladı."
}
"Nextmap Voting Finished"
{
"tr" "Harita oylaması sona erdi. Sıradaki harita {1} olacak. ({3} oyun %%{2}'i alındı) "
}
"Current Map Extended"
{
"tr" "Geçerli harita uzatıldı. ({2} oyun %%{1}'i alındı) "
}
"Extend Map"
{
"tr" "Geçerli Haritayı Uzat"
}
"Dont Change"
{
"tr" "Değiştirme"
}
"Current Map Stays"
{
"tr" "Geçerli harita devam ediyor! Oylama konuştu! ({2} oyun %%{1}'i alındı) "
}
"Changed Next Map"
{
"tr" "Sıradaki harita \"{1}\" olarak değiştirildi."
}
}
"Phrases"
{
"Vote Nextmap"
{
"tr" "Sonraki harita için oy ver!"
}
"Nextmap Voting Started"
{
"tr" "Sonraki harita için oylama başladı."
}
"Nextmap Voting Finished"
{
"tr" "Harita oylaması sona erdi. Sıradaki harita {1} olacak. ({3} oyun %%{2}'i alındı) "
}
"Current Map Extended"
{
"tr" "Geçerli harita uzatıldı. ({2} oyun %%{1}'i alındı) "
}
"Extend Map"
{
"tr" "Geçerli Haritayı Uzat"
}
"Dont Change"
{
"tr" "Değiştirme"
}
"Current Map Stays"
{
"tr" "Geçerli harita devam ediyor! Oylama konuştu! ({2} oyun %%{1}'i alındı) "
}
"Changed Next Map"
{
"tr" "Sıradaki harita \"{1}\" olarak değiştirildi."
}
}