intial commit: CallAdmin
with "_" until fully ready
This commit is contained in:
parent
0ee475c2b4
commit
540aaf2c95
1448
_CallAdmin/scripting/CallAdmin.sp
Normal file
1448
_CallAdmin/scripting/CallAdmin.sp
Normal file
File diff suppressed because it is too large
Load Diff
402
_CallAdmin/scripting/CallAdminUsermanager.sp
Normal file
402
_CallAdmin/scripting/CallAdminUsermanager.sp
Normal file
@ -0,0 +1,402 @@
|
||||
/**
|
||||
* -----------------------------------------------------
|
||||
* File calladmin_usermanager.sp
|
||||
* Authors dordnung, Impact
|
||||
* License GPLv3
|
||||
* Web https://dordnung.de, http://gugyclan.eu
|
||||
* -----------------------------------------------------
|
||||
*
|
||||
* CallAdmin
|
||||
* Copyright (C) 2013-2018 dordnung, Impact
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* 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/>
|
||||
*/
|
||||
|
||||
|
||||
#include <sourcemod>
|
||||
#include "include/autoexecconfig"
|
||||
#include "include/calladmin"
|
||||
#include "include/calladmin_stocks"
|
||||
|
||||
#undef REQUIRE_PLUGIN
|
||||
#include "include/updater"
|
||||
#include <basecomm>
|
||||
|
||||
#pragma semicolon 1
|
||||
#pragma newdecls required
|
||||
|
||||
|
||||
// Version cvar
|
||||
ConVar g_hVersion;
|
||||
|
||||
// Cvar to blacklist muted players
|
||||
ConVar g_hBlacklistMuted;
|
||||
bool g_bBlacklistMuted;
|
||||
|
||||
// Cvar to blacklist gagged players
|
||||
ConVar g_hBlacklistGagged;
|
||||
bool g_bBlacklistGagged;
|
||||
|
||||
// Cvar to show information
|
||||
ConVar g_hShowInformation;
|
||||
bool g_bShowInformation;
|
||||
|
||||
|
||||
|
||||
// Is immune or on blacklist?
|
||||
bool g_bClientOnBlacklist[MAXPLAYERS + 1];
|
||||
bool g_bClientImmune[MAXPLAYERS + 1];
|
||||
|
||||
|
||||
|
||||
// Updater
|
||||
#define UPDATER_URL "http://plugins.gugyclan.eu/calladmin/calladmin_usermanager.txt"
|
||||
|
||||
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
name = "CallAdmin UserManager",
|
||||
author = "dordnung, Impact",
|
||||
description = "The usermanagermodule for CallAdmin",
|
||||
version = CALLADMIN_VERSION,
|
||||
url = "https://dordnung.de"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Sourcemod
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// Register the library
|
||||
public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
|
||||
{
|
||||
RegPluginLibrary("calladmin_usermanager");
|
||||
|
||||
|
||||
// Api
|
||||
CreateNative("CallAdmin_SetClientOnBlacklist", Native_SetClientOnBlacklist);
|
||||
CreateNative("CallAdmin_SetClientImmune", Native_SetClientImmune);
|
||||
CreateNative("CallAdmin_IsClientOnBlacklist", Native_IsClientOnBlacklist);
|
||||
CreateNative("CallAdmin_IsClientImmune", Native_IsClientImmune);
|
||||
|
||||
|
||||
return APLRes_Success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void OnConfigsExecuted()
|
||||
{
|
||||
g_bBlacklistMuted = g_hBlacklistMuted.BoolValue;
|
||||
g_bBlacklistGagged = g_hBlacklistGagged.BoolValue;
|
||||
g_bShowInformation = g_hShowInformation.BoolValue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Plugin Started
|
||||
public void OnPluginStart()
|
||||
{
|
||||
// Create config and load it
|
||||
AutoExecConfig_SetFile("plugin.calladmin_usermanager");
|
||||
|
||||
|
||||
g_hVersion = AutoExecConfig_CreateConVar("sm_calladmin_usermanager_version", CALLADMIN_VERSION, "Plugin version", FCVAR_NOTIFY|FCVAR_DONTRECORD);
|
||||
g_hBlacklistMuted = AutoExecConfig_CreateConVar("sm_calladmin_blacklist_muted", "0", "Disallow muted players to report a player", FCVAR_NONE);
|
||||
g_hBlacklistGagged = AutoExecConfig_CreateConVar("sm_calladmin_blacklist_gagged", "1", "Disallow gagged players to report a player", FCVAR_NONE);
|
||||
g_hShowInformation = AutoExecConfig_CreateConVar("sm_calladmin_show_information", "0", "Show status to player on mute/gag", FCVAR_NONE);
|
||||
|
||||
|
||||
AutoExecConfig(true, "plugin.CallAdminUsermanager");
|
||||
AutoExecConfig_CleanFile();
|
||||
|
||||
|
||||
// Load translation
|
||||
LoadTranslations("calladmin_usermanager.phrases");
|
||||
|
||||
|
||||
// Set Version
|
||||
g_hVersion.SetString(CALLADMIN_VERSION);
|
||||
|
||||
// Hook changes
|
||||
g_hVersion.AddChangeHook(OnCvarChanged);
|
||||
g_hBlacklistMuted.AddChangeHook(OnCvarChanged);
|
||||
g_hBlacklistGagged.AddChangeHook(OnCvarChanged);
|
||||
g_hShowInformation.AddChangeHook(OnCvarChanged);
|
||||
}
|
||||
|
||||
|
||||
// Convar Changed
|
||||
public void OnCvarChanged(Handle cvar, const char[] oldValue, const char[] newValue)
|
||||
{
|
||||
if (cvar == g_hBlacklistMuted)
|
||||
{
|
||||
g_bBlacklistMuted = g_hBlacklistMuted.BoolValue;
|
||||
|
||||
// Check basecomm
|
||||
if (!LibraryExists("basecomm") && g_bBlacklistMuted)
|
||||
{
|
||||
CallAdmin_LogMessage("Couldn't find Plugin basecomm.smx. But you've activated mute blacklisting!");
|
||||
}
|
||||
}
|
||||
|
||||
else if (cvar == g_hBlacklistGagged)
|
||||
{
|
||||
g_bBlacklistGagged = g_hBlacklistGagged.BoolValue;
|
||||
|
||||
// Check basecomm
|
||||
if (!LibraryExists("basecomm") && g_hBlacklistGagged)
|
||||
{
|
||||
CallAdmin_LogMessage("Couldn't find Plugin basecomm.smx. But you've activated gag blacklisting!");
|
||||
}
|
||||
}
|
||||
|
||||
else if (cvar == g_hShowInformation)
|
||||
{
|
||||
g_bShowInformation = g_hShowInformation.BoolValue;
|
||||
}
|
||||
|
||||
else if (cvar == g_hVersion)
|
||||
{
|
||||
g_hVersion.SetString(CALLADMIN_VERSION);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Updater
|
||||
public void OnAllPluginsLoaded()
|
||||
{
|
||||
if (LibraryExists("updater"))
|
||||
{
|
||||
Updater_AddPlugin(UPDATER_URL);
|
||||
}
|
||||
|
||||
if (!LibraryExists("basecomm") && (g_bBlacklistMuted || g_bBlacklistGagged))
|
||||
{
|
||||
CallAdmin_LogMessage("Couldn't find Plugin basecomm.smx. But you've activated mute or gag blacklisting!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Updater
|
||||
public void OnLibraryAdded(const char[] name)
|
||||
{
|
||||
if (StrEqual(name, "updater"))
|
||||
{
|
||||
Updater_AddPlugin(UPDATER_URL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
NATIVES
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// Set client on blacklist
|
||||
public int Native_SetClientOnBlacklist(Handle plugin, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
if (IsClientValid(client))
|
||||
{
|
||||
g_bClientOnBlacklist[client] = GetNativeCell(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Set Client immune
|
||||
public int Native_SetClientImmune(Handle plugin, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
if (IsClientValid(client))
|
||||
{
|
||||
g_bClientImmune[client] = GetNativeCell(2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Checks if the client is on the blacklist
|
||||
public int Native_IsClientOnBlacklist(Handle plugin, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
if (IsClientValid(client))
|
||||
{
|
||||
return g_bClientOnBlacklist[client];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Checks if the client is immune
|
||||
public int Native_IsClientImmune(Handle plugin, int numParams)
|
||||
{
|
||||
int client = GetNativeCell(1);
|
||||
|
||||
if (IsClientValid(client))
|
||||
{
|
||||
return g_bClientImmune[client];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
CallAdmin
|
||||
|
||||
*/
|
||||
|
||||
// Client open the menu
|
||||
public Action CallAdmin_OnDrawMenu(int client)
|
||||
{
|
||||
// Client is on blacklist, so don't open menu
|
||||
if (g_bClientOnBlacklist[client])
|
||||
{
|
||||
// Info text
|
||||
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientOnBlacklist");
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
// Client will drawn to menu
|
||||
public Action CallAdmin_OnDrawTarget(int client, int target)
|
||||
{
|
||||
// Target is immune, so don't draw it
|
||||
if (g_bClientImmune[target])
|
||||
{
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
// Client will report
|
||||
public Action CallAdmin_OnReportPre(int client, int target, const char[] reason)
|
||||
{
|
||||
// Target is immune, so don't report
|
||||
if (g_bClientImmune[target])
|
||||
{
|
||||
// Info text
|
||||
if (client != REPORTER_CONSOLE)
|
||||
{
|
||||
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_TargetImmune", target);
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
// Client is on blacklist so don't allow report
|
||||
if (client != REPORTER_CONSOLE && g_bClientOnBlacklist[client])
|
||||
{
|
||||
// Info text
|
||||
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientOnBlacklist");
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Basecomm
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// Client get muted
|
||||
public void BaseComm_OnClientMute(int client, bool muteState)
|
||||
{
|
||||
if (g_bBlacklistMuted && IsClientValid(client))
|
||||
{
|
||||
// Show information
|
||||
if (g_bShowInformation && muteState != g_bClientOnBlacklist[client])
|
||||
{
|
||||
if (muteState)
|
||||
{
|
||||
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistMute");
|
||||
}
|
||||
else
|
||||
{
|
||||
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistRemove");
|
||||
}
|
||||
}
|
||||
|
||||
// Set client on blacklist
|
||||
g_bClientOnBlacklist[client] = muteState;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Client get gagged
|
||||
public void BaseComm_OnClientGag(int client, bool gagState)
|
||||
{
|
||||
if (g_bBlacklistGagged && IsClientValid(client))
|
||||
{
|
||||
// Show information
|
||||
if (g_bShowInformation && g_bClientOnBlacklist[client] != gagState)
|
||||
{
|
||||
if (gagState)
|
||||
{
|
||||
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistGag");
|
||||
}
|
||||
else
|
||||
{
|
||||
PrintToChat(client, "\x04[CALLADMIN]\x03 %t", "CallAdmin_ClientBlacklistRemove");
|
||||
}
|
||||
}
|
||||
|
||||
// Set client on blacklist
|
||||
g_bClientOnBlacklist[client] = gagState;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void OnClientDisconnect_Post(int client)
|
||||
{
|
||||
g_bClientOnBlacklist[client] = false;
|
||||
g_bClientImmune[client] = false;
|
||||
}
|
715
_CallAdmin/scripting/include/autoexecconfig.inc
Normal file
715
_CallAdmin/scripting/include/autoexecconfig.inc
Normal file
@ -0,0 +1,715 @@
|
||||
#if defined _autoexecconfig_included
|
||||
#endinput
|
||||
#endif
|
||||
#define _autoexecconfig_included
|
||||
|
||||
|
||||
#include <sourcemod>
|
||||
|
||||
|
||||
// Append
|
||||
#define AUTOEXEC_APPEND_BAD_FILENAME 0
|
||||
#define AUTOEXEC_APPEND_FILE_NOT_FOUND 1
|
||||
#define AUTOEXEC_APPEND_BAD_HANDLE 2
|
||||
#define AUTOEXEC_APPEND_SUCCESS 3
|
||||
|
||||
|
||||
|
||||
// Find
|
||||
#define AUTOEXEC_FIND_BAD_FILENAME 10
|
||||
#define AUTOEXEC_FIND_FILE_NOT_FOUND 11
|
||||
#define AUTOEXEC_FIND_BAD_HANDLE 12
|
||||
#define AUTOEXEC_FIND_NOT_FOUND 13
|
||||
#define AUTOEXEC_FIND_SUCCESS 14
|
||||
|
||||
|
||||
|
||||
// Clean
|
||||
#define AUTOEXEC_CLEAN_FILE_NOT_FOUND 20
|
||||
#define AUTOEXEC_CLEAN_BAD_HANDLE 21
|
||||
#define AUTOEXEC_CLEAN_SUCCESS 22
|
||||
|
||||
|
||||
|
||||
// General
|
||||
#define AUTOEXEC_NO_CONFIG 30
|
||||
|
||||
|
||||
|
||||
// Formatter
|
||||
#define AUTOEXEC_FORMAT_BAD_FILENAME 40
|
||||
#define AUTOEXEC_FORMAT_SUCCESS 41
|
||||
|
||||
|
||||
|
||||
// Global variables
|
||||
static char g_sConfigFile[PLATFORM_MAX_PATH];
|
||||
static char g_sRawFileName[PLATFORM_MAX_PATH];
|
||||
static char g_sFolderPath[PLATFORM_MAX_PATH];
|
||||
|
||||
static bool g_bCreateFile = false;
|
||||
static Handle g_hPluginHandle = null;
|
||||
|
||||
|
||||
|
||||
// Workaround for now
|
||||
static int g_iLastFindResult;
|
||||
static int g_iLastAppendResult;
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns the last result from the parser.
|
||||
*
|
||||
* @return Returns one of the AUTOEXEC_FIND values or -1 if not set.
|
||||
*/
|
||||
stock int AutoExecConfig_GetFindResult()
|
||||
{
|
||||
return g_iLastFindResult;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns the last result from the appender.
|
||||
*
|
||||
* @return Returns one of the AUTOEXEC_APPEND values or -1 if not set.
|
||||
*/
|
||||
stock int AutoExecConfig_GetAppendResult()
|
||||
{
|
||||
return g_iLastAppendResult;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set if the config file should be created if it doesn't exist yet.
|
||||
*
|
||||
* @param create True if config file should be created, false otherwise.
|
||||
* @noreturn
|
||||
*/
|
||||
stock void AutoExecConfig_SetCreateFile(bool create)
|
||||
{
|
||||
g_bCreateFile = create;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns if the config file should be created if it doesn't exist.
|
||||
*
|
||||
* @return Returns true, if the config file should be created or false if it should not.
|
||||
*/
|
||||
stock bool AutoExecConfig_GetCreateFile()
|
||||
{
|
||||
return g_bCreateFile;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the plugin for which the config file should be created.
|
||||
* Set to null to use the calling plugin.
|
||||
* Used to print the correct filename in the top comment when creating the file.
|
||||
*
|
||||
* @param plugin The plugin to create convars for or null to use the calling plugin.
|
||||
* @noreturn
|
||||
*/
|
||||
stock void AutoExecConfig_SetPlugin(Handle plugin)
|
||||
{
|
||||
g_hPluginHandle = plugin;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the plugin for which the config file is created.
|
||||
*
|
||||
* @return The plugin handle
|
||||
*/
|
||||
stock Handle AutoExecConfig_GetPlugin()
|
||||
{
|
||||
return g_hPluginHandle;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the global autoconfigfile used by functions of this file.
|
||||
*
|
||||
* @param file Name of the config file, path and .cfg extension is being added if not given.
|
||||
* @param folder Folder under cfg/ to use. By default this is "sourcemod."
|
||||
* @return True if formatter returned success, false otherwise.
|
||||
*/
|
||||
stock bool AutoExecConfig_SetFile(char[] file, char[] folder="sourcemod")
|
||||
{
|
||||
Format(g_sConfigFile, sizeof(g_sConfigFile), "%s", file);
|
||||
|
||||
// Global buffers for cfg execution
|
||||
strcopy(g_sRawFileName, sizeof(g_sRawFileName), file);
|
||||
strcopy(g_sFolderPath, sizeof(g_sFolderPath), folder);
|
||||
|
||||
|
||||
// Format the filename
|
||||
return AutoExecConfig_FormatFileName(g_sConfigFile, sizeof(g_sConfigFile), folder) == AUTOEXEC_FORMAT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the formatted autoconfigfile used by functions of this file.
|
||||
*
|
||||
* @param buffer String to format.
|
||||
* @param size Maximum size of buffer
|
||||
* @return True if filename was set, false otherwise.
|
||||
*/
|
||||
stock bool AutoExecConfig_GetFile(char[] buffer,int size)
|
||||
{
|
||||
if(strlen(g_sConfigFile) > 0)
|
||||
{
|
||||
strcopy(buffer, size, g_sConfigFile);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Security for decl users
|
||||
buffer[0] = '\0';
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Creates a convar and appends it to the autoconfigfile if not found.
|
||||
* FCVAR_DONTRECORD will be skipped.
|
||||
*
|
||||
* @param name Name of new convar.
|
||||
* @param defaultValue String containing the default value of new convar.
|
||||
* @param description Optional description of the convar.
|
||||
* @param flags Optional bitstring of flags determining how the convar should be handled. See FCVAR_* constants for more details.
|
||||
* @param hasMin Optional boolean that determines if the convar has a minimum value.
|
||||
* @param min Minimum floating point value that the convar can have if hasMin is true.
|
||||
* @param hasMax Optional boolean that determines if the convar has a maximum value.
|
||||
* @param max Maximum floating point value that the convar can have if hasMax is true.
|
||||
* @return A handle to the newly created convar. If the convar already exists, a handle to it will still be returned.
|
||||
* @error Convar name is blank or is the same as an existing console command.
|
||||
*/
|
||||
stock ConVar AutoExecConfig_CreateConVar(const char[] name, const char[] defaultValue, const char[] description="", int flags=0, bool hasMin=false, float min=0.0, bool hasMax=false, float max=0.0)
|
||||
{
|
||||
// If configfile was set and convar has no dontrecord flag
|
||||
if(!(flags & FCVAR_DONTRECORD) && strlen(g_sConfigFile) > 0)
|
||||
{
|
||||
// Reset the results
|
||||
g_iLastFindResult = -1;
|
||||
g_iLastAppendResult = -1;
|
||||
|
||||
|
||||
// Add it if not found
|
||||
char buffer[64];
|
||||
|
||||
g_iLastFindResult = AutoExecConfig_FindValue(name, buffer, sizeof(buffer), true);
|
||||
|
||||
// We only add this convar if it doesn't exist, or the file doesn't exist and it should be auto-generated
|
||||
if(g_iLastFindResult == AUTOEXEC_FIND_NOT_FOUND || (g_iLastFindResult == AUTOEXEC_FIND_FILE_NOT_FOUND && g_bCreateFile))
|
||||
{
|
||||
g_iLastAppendResult = AutoExecConfig_AppendValue(name, defaultValue, description, flags, hasMin, min, hasMax, max);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Create the convar
|
||||
return CreateConVar(name, defaultValue, description, flags, hasMin, min, hasMax, max);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Executes the autoconfigfile, and adds it to the OnConfigsExecuted forward.
|
||||
* If we didn't created it already we let SourceMod create it.
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
stock void AutoExecConfig_ExecuteFile()
|
||||
{
|
||||
// Only let sourcemod create the file, if we didn't do that already.
|
||||
AutoExecConfig(!g_bCreateFile, g_sRawFileName, g_sFolderPath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Formats a autoconfigfile, prefixes path and adds .cfg extension if missed.
|
||||
*
|
||||
* @param buffer String to format.
|
||||
* @param size Maximum size of buffer.
|
||||
* @return Returns one of the AUTOEXEC_FORMAT values..
|
||||
*/
|
||||
stock static int AutoExecConfig_FormatFileName(char[] buffer, int size, char[] folder="sourcemod")
|
||||
{
|
||||
// No config set
|
||||
if(strlen(g_sConfigFile) < 1)
|
||||
{
|
||||
return AUTOEXEC_NO_CONFIG;
|
||||
}
|
||||
|
||||
|
||||
// Can't be an cfgfile
|
||||
if(StrContains(g_sConfigFile, ".cfg") == -1 && strlen(g_sConfigFile) < 4)
|
||||
{
|
||||
return AUTOEXEC_FORMAT_BAD_FILENAME;
|
||||
}
|
||||
|
||||
|
||||
// Pathprefix
|
||||
char pathprefixbuffer[PLATFORM_MAX_PATH];
|
||||
if(strlen(folder) > 0)
|
||||
{
|
||||
Format(pathprefixbuffer, sizeof(pathprefixbuffer), "cfg/%s/", folder);
|
||||
}
|
||||
else
|
||||
{
|
||||
Format(pathprefixbuffer, sizeof(pathprefixbuffer), "cfg/");
|
||||
}
|
||||
|
||||
|
||||
char filebuffer[PLATFORM_MAX_PATH];
|
||||
filebuffer[0] = '\0';
|
||||
|
||||
// Add path if file doesn't begin with it
|
||||
if(StrContains(buffer, pathprefixbuffer) != 0)
|
||||
{
|
||||
StrCat(filebuffer, sizeof(filebuffer), pathprefixbuffer);
|
||||
}
|
||||
|
||||
StrCat(filebuffer, sizeof(filebuffer), g_sConfigFile);
|
||||
|
||||
|
||||
// Add .cfg extension if file doesn't end with it
|
||||
if(StrContains(filebuffer[strlen(filebuffer) - 4], ".cfg") != 0)
|
||||
{
|
||||
StrCat(filebuffer, sizeof(filebuffer), ".cfg");
|
||||
}
|
||||
|
||||
strcopy(buffer, size, filebuffer);
|
||||
|
||||
return AUTOEXEC_FORMAT_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Appends a convar to the global autoconfigfile
|
||||
*
|
||||
* @param name Name of new convar.
|
||||
* @param defaultValue String containing the default value of new convar.
|
||||
* @param description Optional description of the convar.
|
||||
* @param flags Optional bitstring of flags determining how the convar should be handled. See FCVAR_* constants for more details.
|
||||
* @param hasMin Optional boolean that determines if the convar has a minimum value.
|
||||
* @param min Minimum floating point value that the convar can have if hasMin is true.
|
||||
* @param hasMax Optional boolean that determines if the convar has a maximum value.
|
||||
* @param max Maximum floating point value that the convar can have if hasMax is true.
|
||||
* @return Returns one of the AUTOEXEC_APPEND values
|
||||
*/
|
||||
stock int AutoExecConfig_AppendValue(const char[] name, const char[] defaultValue, const char[] description, int flags, bool hasMin, float min, bool hasMax, float max)
|
||||
{
|
||||
// No config set
|
||||
if(strlen(g_sConfigFile) < 1)
|
||||
{
|
||||
return AUTOEXEC_NO_CONFIG;
|
||||
}
|
||||
|
||||
|
||||
char filebuffer[PLATFORM_MAX_PATH];
|
||||
strcopy(filebuffer, sizeof(filebuffer), g_sConfigFile);
|
||||
|
||||
|
||||
//PrintToServer("pathbuffer: %s", filebuffer);
|
||||
|
||||
bool bFileExists = FileExists(filebuffer);
|
||||
|
||||
if(g_bCreateFile || bFileExists)
|
||||
{
|
||||
// If the file already exists we open it in append mode, otherwise we use a write mode which creates the file
|
||||
File fFile = OpenFile(filebuffer, (bFileExists ? "a" : "w"));
|
||||
char writebuffer[2048];
|
||||
|
||||
|
||||
if(fFile == null)
|
||||
{
|
||||
return AUTOEXEC_APPEND_BAD_HANDLE;
|
||||
}
|
||||
|
||||
// We just created the file, so add some header about version and stuff
|
||||
if(g_bCreateFile && !bFileExists)
|
||||
{
|
||||
fFile.WriteLine( "// This file was auto-generated by AutoExecConfig read and append beta");
|
||||
|
||||
GetPluginFilename(g_hPluginHandle, writebuffer, sizeof(writebuffer));
|
||||
Format(writebuffer, sizeof(writebuffer), "// ConVars for plugin \"%s\"", writebuffer);
|
||||
fFile.WriteLine(writebuffer);
|
||||
}
|
||||
|
||||
// Spacer
|
||||
fFile.WriteLine("\n");
|
||||
|
||||
|
||||
// This is used for multiline comments
|
||||
int newlines = GetCharCountInStr('\n', description);
|
||||
if(newlines == 0)
|
||||
{
|
||||
// We have no newlines, we can write the description to the file as is
|
||||
Format(writebuffer, sizeof(writebuffer), "// %s", description);
|
||||
fFile.WriteLine(writebuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
char[][] newlineBuf = new char[newlines +1][2048];
|
||||
ExplodeString(description, "\n", newlineBuf, newlines +1, 2048, false);
|
||||
|
||||
// Each newline gets a commented newline
|
||||
for(int i; i <= newlines; i++)
|
||||
{
|
||||
if(strlen(newlineBuf[i]) > 0)
|
||||
{
|
||||
fFile.WriteLine("// %s", newlineBuf[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Descspacer
|
||||
fFile.WriteLine("// -");
|
||||
|
||||
|
||||
// Default
|
||||
Format(writebuffer, sizeof(writebuffer), "// Default: \"%s\"", defaultValue);
|
||||
fFile.WriteLine(writebuffer);
|
||||
|
||||
|
||||
// Minimum
|
||||
if(hasMin)
|
||||
{
|
||||
Format(writebuffer, sizeof(writebuffer), "// Minimum: \"%f\"", min);
|
||||
fFile.WriteLine(writebuffer);
|
||||
}
|
||||
|
||||
|
||||
// Maximum
|
||||
if(hasMax)
|
||||
{
|
||||
Format(writebuffer, sizeof(writebuffer), "// Maximum: \"%f\"", max);
|
||||
fFile.WriteLine(writebuffer);
|
||||
}
|
||||
|
||||
|
||||
// Write end and defaultvalue
|
||||
Format(writebuffer, sizeof(writebuffer), "%s \"%s\"", name, defaultValue);
|
||||
fFile.WriteLine(writebuffer);
|
||||
|
||||
|
||||
fFile.Close();
|
||||
|
||||
|
||||
// Clean up the file
|
||||
//AutoExecConfig_CleanFile(filebuffer, false);
|
||||
|
||||
|
||||
return AUTOEXEC_APPEND_SUCCESS;
|
||||
}
|
||||
|
||||
return AUTOEXEC_APPEND_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns a convars value from the global autoconfigfile
|
||||
*
|
||||
* @param cvar Cvar to search for.
|
||||
* @param value Buffer to store result into.
|
||||
* @param size Maximum size of buffer.
|
||||
* @param caseSensitive Whether or not the search should be case sensitive.
|
||||
* @return Returns one of the AUTOEXEC_FIND values
|
||||
*/
|
||||
stock int AutoExecConfig_FindValue(const char[] cvar, char[] value, int size, bool caseSensitive=false)
|
||||
{
|
||||
// Security for decl users
|
||||
value[0] = '\0';
|
||||
|
||||
|
||||
// No config set
|
||||
if(strlen(g_sConfigFile) < 1)
|
||||
{
|
||||
return AUTOEXEC_NO_CONFIG;
|
||||
}
|
||||
|
||||
|
||||
char filebuffer[PLATFORM_MAX_PATH];
|
||||
strcopy(filebuffer, sizeof(filebuffer), g_sConfigFile);
|
||||
|
||||
|
||||
|
||||
//PrintToServer("pathbuffer: %s", filebuffer);
|
||||
|
||||
bool bFileExists = FileExists(filebuffer);
|
||||
|
||||
// We want to create the config file and it doesn't exist yet.
|
||||
if(g_bCreateFile && !bFileExists)
|
||||
{
|
||||
return AUTOEXEC_FIND_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
if(bFileExists)
|
||||
{
|
||||
File fFile = OpenFile(filebuffer, "r");
|
||||
int valuestart;
|
||||
int valueend;
|
||||
int cvarend;
|
||||
|
||||
// Just an reminder to self, leave the values that high
|
||||
char sConvar[64];
|
||||
char sValue[64];
|
||||
char readbuffer[2048];
|
||||
char copybuffer[2048];
|
||||
|
||||
if(fFile == null)
|
||||
{
|
||||
return AUTOEXEC_FIND_BAD_HANDLE;
|
||||
}
|
||||
|
||||
|
||||
while(!fFile.EndOfFile() && fFile.ReadLine(readbuffer, sizeof(readbuffer)))
|
||||
{
|
||||
// Is a comment or not valid
|
||||
if(IsCharSpace(readbuffer[0]) || readbuffer[0] == '/' || !IsCharAlpha(readbuffer[0]))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Has not enough spaces, must have at least 1
|
||||
if(GetCharCountInStr(' ', readbuffer) < 1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Ignore cvars which aren't quoted
|
||||
if(GetCharCountInStr('"', readbuffer) != 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Get the start of the value
|
||||
if( (valuestart = StrContains(readbuffer, "\"")) == -1 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Get the end of the value
|
||||
if( (valueend = StrContains(readbuffer[valuestart+1], "\"")) == -1 )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Get the start of the cvar,
|
||||
if( (cvarend = StrContains(readbuffer, " ")) == -1 || cvarend >= valuestart)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Skip if cvarendindex is before valuestartindex
|
||||
if(cvarend >= valuestart)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Convar
|
||||
// Tempcopy for security
|
||||
strcopy(copybuffer, sizeof(copybuffer), readbuffer);
|
||||
copybuffer[cvarend] = '\0';
|
||||
|
||||
strcopy(sConvar, sizeof(sConvar), copybuffer);
|
||||
|
||||
|
||||
// Value
|
||||
// Tempcopy for security
|
||||
strcopy(copybuffer, sizeof(copybuffer), readbuffer[valuestart+1]);
|
||||
copybuffer[valueend] = '\0';
|
||||
|
||||
strcopy(sValue, sizeof(sValue), copybuffer);
|
||||
|
||||
|
||||
//PrintToServer("Cvar %s has a value of %s", sConvar, sValue);
|
||||
|
||||
if(StrEqual(sConvar, cvar, caseSensitive))
|
||||
{
|
||||
Format(value, size, "%s", sConvar);
|
||||
|
||||
fFile.Close();
|
||||
return AUTOEXEC_FIND_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
fFile.Close();
|
||||
return AUTOEXEC_FIND_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
return AUTOEXEC_FIND_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Cleans the global autoconfigfile from too much spaces
|
||||
*
|
||||
* @return One of the AUTOEXEC_CLEAN values.
|
||||
*/
|
||||
stock int AutoExecConfig_CleanFile()
|
||||
{
|
||||
// No config set
|
||||
if(strlen(g_sConfigFile) < 1)
|
||||
{
|
||||
return AUTOEXEC_NO_CONFIG;
|
||||
}
|
||||
|
||||
|
||||
char sfile[PLATFORM_MAX_PATH];
|
||||
strcopy(sfile, sizeof(sfile), g_sConfigFile);
|
||||
|
||||
|
||||
// Security
|
||||
if(!FileExists(sfile))
|
||||
{
|
||||
return AUTOEXEC_CLEAN_FILE_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
|
||||
char sfile2[PLATFORM_MAX_PATH];
|
||||
Format(sfile2, sizeof(sfile2), "%s_tempcopy", sfile);
|
||||
|
||||
|
||||
char readbuffer[2048];
|
||||
int count;
|
||||
bool firstreached;
|
||||
|
||||
|
||||
// Open files
|
||||
File fFile1 = OpenFile(sfile, "r");
|
||||
File fFile2 = OpenFile(sfile2, "w");
|
||||
|
||||
|
||||
|
||||
// Check filehandles
|
||||
if(fFile1 == null || fFile2 == null)
|
||||
{
|
||||
if(fFile1 != null)
|
||||
{
|
||||
//PrintToServer("Handle1 invalid");
|
||||
fFile1.Close();
|
||||
}
|
||||
|
||||
if(fFile2 != null)
|
||||
{
|
||||
//PrintToServer("Handle2 invalid");
|
||||
fFile2.Close();
|
||||
}
|
||||
|
||||
return AUTOEXEC_CLEAN_BAD_HANDLE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
while(!fFile1.EndOfFile() && fFile1.ReadLine(readbuffer, sizeof(readbuffer)))
|
||||
{
|
||||
// Is space
|
||||
if(IsCharSpace(readbuffer[0]))
|
||||
{
|
||||
count++;
|
||||
}
|
||||
// No space, count from start
|
||||
else
|
||||
{
|
||||
count = 0;
|
||||
}
|
||||
|
||||
|
||||
// Don't write more than 1 space if seperation after informations have been reached
|
||||
if(count < 2 || !firstreached)
|
||||
{
|
||||
ReplaceString(readbuffer, sizeof(readbuffer), "\n", "");
|
||||
fFile2.WriteLine(readbuffer);
|
||||
}
|
||||
|
||||
|
||||
// First bigger seperation after informations has been reached
|
||||
if(count == 2)
|
||||
{
|
||||
firstreached = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fFile1.Close();
|
||||
fFile2.Close();
|
||||
|
||||
|
||||
// This might be a risk, for now it works
|
||||
DeleteFile(sfile);
|
||||
RenameFile(sfile, sfile2);
|
||||
|
||||
return AUTOEXEC_CLEAN_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns how many times the given char occures in the given string.
|
||||
*
|
||||
* @param str String to search for in.
|
||||
* @return Occurences of the given char found in string.
|
||||
*/
|
||||
stock static int GetCharCountInStr(int character, const char[] str)
|
||||
{
|
||||
int len = strlen(str);
|
||||
int count;
|
||||
|
||||
for(int i; i < len; i++)
|
||||
{
|
||||
if(str[i] == character)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
18
_CallAdmin/scripting/include/calladmin_stocks.inc
Normal file
18
_CallAdmin/scripting/include/calladmin_stocks.inc
Normal file
@ -0,0 +1,18 @@
|
||||
/** Include guard */
|
||||
#if defined _calladmin_stocks_included
|
||||
#endinput
|
||||
#endif
|
||||
#define _calladmin_stocks_included
|
||||
|
||||
|
||||
|
||||
|
||||
stock bool IsClientValid(int id)
|
||||
{
|
||||
if (id > 0 && id <= MaxClients && IsClientInGame(id))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
83
_CallAdmin/scripting/include/calladmin_usermanager.inc
Normal file
83
_CallAdmin/scripting/include/calladmin_usermanager.inc
Normal file
@ -0,0 +1,83 @@
|
||||
/** Include guard */
|
||||
#if defined _calladmin_usermanager_included
|
||||
#endinput
|
||||
#endif
|
||||
#define _calladmin_usermanager_included
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether a client is immune or not.
|
||||
* If a client is immune, he can't be reported.
|
||||
*
|
||||
* @param client The Client.
|
||||
* @return True if client is immune, false otherwise.
|
||||
*/
|
||||
native bool CallAdmin_IsClientImmune(int client);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns whether a client is on the blacklist or not.
|
||||
* If a client is on the blacklist, he can't report players.
|
||||
*
|
||||
* @param client The Client.
|
||||
* @return True if client is on blacklist, false otherwise.
|
||||
*/
|
||||
native bool CallAdmin_IsClientOnBlacklist(int client);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Sets whether a client is immune or not.
|
||||
* If a client is immune, he can't be reported.
|
||||
*
|
||||
* @param client The Client.
|
||||
* @param immune True to immune client, false otherwise.
|
||||
* @noreturn
|
||||
*/
|
||||
native void CallAdmin_SetClientImmune(int client, bool immune);
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Sets whether a client is in the backlist or not.
|
||||
* If a client is on the blacklist, he can't report players.
|
||||
*
|
||||
* @param client The Client.
|
||||
* @param add True to add client to blacklist, false to remove.
|
||||
* @noreturn
|
||||
*/
|
||||
native void CallAdmin_SetClientOnBlacklist(int client, bool add);
|
||||
|
||||
|
||||
|
||||
|
||||
/* Do not edit below this line */
|
||||
public SharedPlugin __pl_calladmin_usermanager =
|
||||
{
|
||||
name = "calladmin_usermanager",
|
||||
file = "calladmin_usermanager.smx",
|
||||
#if defined REQUIRE_PLUGIN
|
||||
required = 1,
|
||||
#else
|
||||
required = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
#if !defined REQUIRE_PLUGIN
|
||||
public __pl_calladmin_SetNTVOptional()
|
||||
{
|
||||
MarkNativeAsOptional("CallAdmin_SetClientOnBlacklist");
|
||||
MarkNativeAsOptional("CallAdmin_SetClientImmune");
|
||||
MarkNativeAsOptional("CallAdmin_IsClientOnBlacklist");
|
||||
MarkNativeAsOptional("CallAdmin_IsClientImmune");
|
||||
}
|
||||
#endif
|
168
_CallAdmin/scripting/translations/calladmin.phrases.txt
Normal file
168
_CallAdmin/scripting/translations/calladmin.phrases.txt
Normal file
@ -0,0 +1,168 @@
|
||||
"Phrases"
|
||||
{
|
||||
"CallAdmin_CommandNotAllowed"
|
||||
{
|
||||
"#format" "{1:d}"
|
||||
"en" "You are not allowed to use this command for the next {1} seconds"
|
||||
"de" "Du darfst diesen Befehl nicht innerhalb der nächsten {1} Sekunden benutzen"
|
||||
"fr" "Vous ne pouvez pas utiliser cette commande avant {1} secondes"
|
||||
"ru" "Вы не можете использовать эту команду в течение следующих {1} секунд"
|
||||
}
|
||||
"CallAdmin_HasReported"
|
||||
{
|
||||
"#format" "{1:N},{2:N},{3:s}"
|
||||
"en" "{1} reported {2} for {3}"
|
||||
"de" "{1} hat {2} wegen {3} gemeldet"
|
||||
"fr" "{1} a signalé {2} pour {3}"
|
||||
"ru" "{1} пожаловался на {2} по причине {3}"
|
||||
}
|
||||
"CallAdmin_YouHaveReported"
|
||||
{
|
||||
"#format" "{1:N},{2:s}"
|
||||
"en" "You have reported {1} for {2}"
|
||||
"de" "Du hast {1} wegen {2} gemeldet"
|
||||
"fr" "Vous avez signalé {1} pour {2}"
|
||||
"ru" "Вы успешно пожаловались на {1} по причине {2}"
|
||||
}
|
||||
"CallAdmin_NoPlayers"
|
||||
{
|
||||
"en" "There are no players you can report at this time"
|
||||
"de" "Es sind derzeit keine Spieler vorhanden die du melden kannst"
|
||||
"fr" "Aucun joueur ne peut être signalé pour le moment"
|
||||
"ru" "В настоящее время на сервере нет игроков, на которых вы можете пожаловаться"
|
||||
}
|
||||
"CallAdmin_NotInGame"
|
||||
{
|
||||
"en" "Player is not on the server anymore"
|
||||
"de" "Spieler ist nicht mehr auf dem Server"
|
||||
"fr" "Le joueur n'est plus sur le serveur"
|
||||
"ru" "Игрок уже покинул данный сервер"
|
||||
}
|
||||
"CallAdmin_SelectClient"
|
||||
{
|
||||
"en" "Select a client to report"
|
||||
"de" "Wähle einen Spieler zum Melden"
|
||||
"fr" "Sélectionnez un joueur à signaler"
|
||||
"ru" "Выберите игрока, на которого вы хотите пожаловаться"
|
||||
}
|
||||
"CallAdmin_SelectReason"
|
||||
{
|
||||
"#format" "{1:N}"
|
||||
"en" "Select a reason to report {1}"
|
||||
"de" "Wähle einen Grund um {1} zu melden"
|
||||
"fr" "Sélectionnez une raison pour signaler {1}"
|
||||
"ru" "Выберите причину, по которой вы хотите пожаловаться на {1}"
|
||||
}
|
||||
// Used when exactly 1 admin is available
|
||||
"CallAdmin_AdvertMessageSingular"
|
||||
{
|
||||
"#format" "{1:d}"
|
||||
"en" "There is {1} admin available, type !call or /call in chat to report a player"
|
||||
"de" "Es ist {1} Admin verfügbar, tippe !call oder /call in den Chat um einen Spieler zu melden"
|
||||
"fr" "Il y a {1} admin disponible , tapez !call ou /call dans le chat pour signaler un joueur"
|
||||
"ru" "Сейчас на сервере находится {1} администратор. Напишите в чате !call или /call, чтобы пожаловаться ему на игрока"
|
||||
}
|
||||
"CallAdmin_AdvertMessagePlural"
|
||||
{
|
||||
"#format" "{1:d}"
|
||||
"en" "There are {1} admins available, type !call or /call in chat to report a player"
|
||||
"de" "Es sind {1} Admins verfügbar, tippe !call oder /call in den Chat um einen Spieler zu melden"
|
||||
"fr" "Il y a {1} admins disponibles , tapez !call ou /call dans le chat pour signaler un joueur"
|
||||
"ru" "Администраторов на сервере в настоящее время: {1}. Напишите в чате !call или /call, чтобы пожаловаться на игрока"
|
||||
}
|
||||
"CallAdmin_OwnReason"
|
||||
{
|
||||
"en" "Own reason"
|
||||
"de" "Eigener Grund"
|
||||
"fr" "Raison personnelle"
|
||||
"ru" "Другая причина"
|
||||
}
|
||||
"CallAdmin_TypeOwnReason"
|
||||
{
|
||||
"en" "You now can type your own banreason in the chat, please keep it short\nType '!noreason' or '!abort' to abort"
|
||||
"de" "Du kannst nun deinen eigenen Bangrund in den Chat schreiben, fasse dich bitte kurz\nSchreibe '!noreason' oder '!abort' um abzubrechen"
|
||||
"fr" "Vous pouvez maintenant écrire une raison personnelle dans le chat , écrivez une raison abrégée s'il vous plait\nEcrivez '!noreason' ou '!abort' pour annuler"
|
||||
"ru" "Сейчас вы можете указать свою причину в чате. Будьте лаконичнее\nВведите '!noreason' или '!abort' для отмены"
|
||||
}
|
||||
"CallAdmin_CallAborted"
|
||||
{
|
||||
"en" "Your call has been aborted"
|
||||
"de" "Der Meldevorgang wurde abgebrochen"
|
||||
"fr" "Votre appel à été annulé"
|
||||
"ru" "Ваша жалоба была отменена"
|
||||
}
|
||||
"CallAdmin_OwnReasonTooShort"
|
||||
{
|
||||
"en" "Your banreason is too short, please try it again"
|
||||
"de" "Dein Bangrund ist zu kurz, bitte versuche es erneut"
|
||||
"fr" "La raison du ban est trop courte , veuillez réessayer"
|
||||
"ru" "Вы указали слишком короткую причину жалобы. Попробуйте ещё раз"
|
||||
}
|
||||
"CallAdmin_ConfirmCall"
|
||||
{
|
||||
"en" "Are you sure you want to call an admin?, abuse will be punished"
|
||||
"de" "Bist du sicher dass du einen Admin rufen willst?, Missbrauch wird bestraft"
|
||||
"fr" "Voulez-vous vraiment appeler un admin ?, les abus seront sanctionnés"
|
||||
"ru" "Вы уверены, что хотите отправить жалобу администратору? Помните, что существует наказание за ложные вызовы"
|
||||
}
|
||||
"CallAdmin_Yes"
|
||||
{
|
||||
"en" "Yes"
|
||||
"de" "Ja"
|
||||
"fr" "Oui"
|
||||
"ru" "Да"
|
||||
}
|
||||
"CallAdmin_No"
|
||||
{
|
||||
"en" "No"
|
||||
"de" "Nein"
|
||||
"fr" "Non"
|
||||
"ru" "Нет"
|
||||
}
|
||||
"CallAdmin_AlreadyReported"
|
||||
{
|
||||
"en" "Player was already reported"
|
||||
"de" "Spieler wurde bereits gemeldet"
|
||||
"fr" "Joueur déjà signalé"
|
||||
"ru" "На этого игрока уже пожаловались"
|
||||
}
|
||||
"CallAdmin_IngameAdminNotified"
|
||||
{
|
||||
"en" "An admin in-game was notified about your report"
|
||||
"de" "Ein Admin in-game wurde über deine Meldung benachrichtigt"
|
||||
"fr" "Un admin en jeu a été notifié de votre signalement"
|
||||
"ru" "Администраторы, находящиеся на сервере, были проинформированы о вашей жалобе"
|
||||
}
|
||||
"CallAdmin_AdminNotification"
|
||||
{
|
||||
"#format" "{1:N},{2:N},{3:s}"
|
||||
"en" "Player {1} reported {2} for {3}"
|
||||
"de" "Spieler {1} hat {2} wegen {3} gemeldet"
|
||||
"fr" "Le joueur {1} à signalé {2} pour {3}"
|
||||
"ru" "Игрок {1} пожаловался на {2} по причине {3}"
|
||||
}
|
||||
"CallAdmin_ReportAlreadyHandled"
|
||||
{
|
||||
"en" "This report was already handled"
|
||||
"de" "Diese Meldung wurde bereits erledigt"
|
||||
"ru" "Эта жалоба уже была рассмотрена"
|
||||
}
|
||||
"CallAdmin_NoAdmin"
|
||||
{
|
||||
"en" "Only admins have access to this command"
|
||||
"de" "Nur Admins können diesen Befehl ausführen"
|
||||
"ru" "Только администраторы имеют доступ к этой команде"
|
||||
}
|
||||
"CallAdmin_WrongNumberOfArguments"
|
||||
{
|
||||
"en" "You've used a wrong number of arguments"
|
||||
"de" "Du hast eine falsche Anzahl an Argumenten benutzt"
|
||||
"ru" "Указано неправильное количество аргументов"
|
||||
}
|
||||
"CallAdmin_WrongReportID"
|
||||
{
|
||||
"en" "You've used a wrong report id"
|
||||
"de" "Du hast eine falsche Melde-id benutzt"
|
||||
"ru" "Указан неправильный ID жалобы"
|
||||
}
|
||||
}
|
@ -0,0 +1,34 @@
|
||||
"Phrases"
|
||||
{
|
||||
"CallAdmin_ClientBlacklistMute"
|
||||
{
|
||||
"en" "You are now, because of muting, on the blacklist. You can't report players anymore!"
|
||||
"de" "Aufgrund eines Mutes bist du nun auf der Blacklist. Du kannst jetzt keine Spieler mehr reporten!"
|
||||
"ru" "Из-за того, что вам был отключён микрофон, вы попали в чёрный список и больше не можете жаловаться на других игроков!"
|
||||
}
|
||||
"CallAdmin_ClientBlacklistGag"
|
||||
{
|
||||
"en" "You are now, because of gagging, on the blacklist. You can't report players anymore!"
|
||||
"de" "Aufgrund eines Maulkorbes bist du nun auf der Blacklist. Du kannst jetzt keine Spieler mehr reporten!"
|
||||
"ru" "Из-за того, что вам был отключён чат, вы попали в чёрный список и больше не можете жаловаться на других игроков!"
|
||||
}
|
||||
"CallAdmin_ClientBlacklistRemove"
|
||||
{
|
||||
"en" "You got removed from blacklist. You can report players again!"
|
||||
"de" "Du wurdest von der Blacklist entfernt. Du kannst jetzt wieder Spieler reporten!"
|
||||
"ru" "Вы были удалены из чёрного списка и теперь снова можете жаловаться на других игроков!"
|
||||
}
|
||||
"CallAdmin_ClientOnBlacklist"
|
||||
{
|
||||
"en" "You are currently on the blacklist. You can't report players!"
|
||||
"de" "Du bist zurzeit auf der Blacklist. Du kannst keine Spieler reporten!"
|
||||
"ru" "Вы находитесь в чёрном списке и не можете жаловаться на других игроков!"
|
||||
}
|
||||
"CallAdmin_TargetImmune"
|
||||
{
|
||||
"#format" "{1:N}"
|
||||
"en" "Player {1} is immune. You can't report him."
|
||||
"de" "Spieler {1} ist Immun. Du kannst ihn nicht reporten!"
|
||||
"ru" "У игрока {1} есть иммунитет. Вы не можете жаловаться на него."
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user