Skocz do zawartości

Nowy szablon forum

mygo.pl

Stworzyliśmy dla Was nowy wygląd forum. Z pewnością znajdziesz rzeczy, które wg Ciebie mogą zostać zmienione - wspomnij o tym w specjalnym wątku.

Czytaj więcej

Jak założyć własną sieć

serwerów CS

Zastanawiasz się nad prowadzeniem własnej sieci serwerów? Przeczytaj podstawowe informacje, na które należy zwrócić uwagę, przy takim projekcie.

Czytaj więcej

Tworzymy spis sieci

dodaj swoją

Dodaj sieć do której należysz, pozwoli to na promocję i budowę ogólnopolskiej bazy sieci CS.

Czytaj więcej

RSSCustom admincmd


MYGO.pl
 Udostępnij

Rekomendowane odpowiedzi

  • RSSy
Hi, everyone. In my server some admins are "anonymous", so is it possible to make that the "show_activity_key" feature work only for admins with the "ADMIN_KICK" flag?

My amx_show_activity is set to 2. I want everyone to see everything but if the admin is lacking the ADMIN_KICK flag then I want no one to see anything. Thanks!

PHP Code:

// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
//     https://alliedmods.net/amxmodx-license

//
// Admin Commands Plugin
//

#include <amxmodx>
#include <amxmisc>

// This is not a dynamic array because it would be bad for 24/7 map servers.
#define OLD_CONNECTION_QUEUE 10

new g_pauseCon
new Float:g_pausAble
new bool:g_Paused
new bool:g_PauseAllowed false

new pausable;
new 
rcon_password;
new 
timelimit;
new 
p_amx_tempban_maxtime;

// Old connection queue
new g_Names[OLD_CONNECTION_QUEUE][MAX_NAME_LENGTH];
new 
g_SteamIDs[OLD_CONNECTION_QUEUE][32];
new 
g_IPs[OLD_CONNECTION_QUEUE][32];
new 
g_Access[OLD_CONNECTION_QUEUE];
new 
g_Tracker;
new 
g_Size;

public 
Trie:g_tempBans
new Trie:g_tXvarsFlags;

stock InsertInfo(id)
{
    
    
// Scan to see if this entry is the last entry in the list
    // If it is, then update the name and access
    // If it is not, then insert it again.

    
if (g_Size 0)
    {
        new 
ip[32]
        new 
auth[32];

        
get_user_authid(idauthcharsmax(auth));
        
get_user_ip(idipcharsmax(ip), 1/*no port*/);

        new 
last 0;
        
        if (
g_Size sizeof(g_SteamIDs))
        {
            
last g_Size 1;
        }
        else
        {
            
last g_Tracker 1;
            
            if (
last 0)
            {
                
last g_Size 1;
            }
        }
        
        if (
equal(authg_SteamIDs[last]) &&
            
equal(ipg_IPs[last])) // need to check ip too, or all the nosteams will while it doesn't work with their illegitimate server
        
{
            
get_user_name(idg_Names[last], charsmax(g_Names[]));
            
g_Access[last] = get_user_flags(id);
            
            return;
        }
    }
    
    
// Need to insert the entry
    
    
new target 0;  // the slot to save the info at

    // Queue is not yet full
    
if (g_Size sizeof(g_SteamIDs))
    {
        
target g_Size;
        
        ++
g_Size;
        
    }
    else
    {
        
target g_Tracker;
        
        ++
g_Tracker;
        
// If we reached the end of the array, then move to the front
        
if (g_Tracker == sizeof(g_SteamIDs))
        {
            
g_Tracker 0;
        }
    }
    
    
get_user_authid(idg_SteamIDs[target], charsmax(g_SteamIDs[]));
    
get_user_name(idg_Names[target], charsmax(g_Names[]));
    
get_user_ip(idg_IPs[target], charsmax(g_IPs[]), 1/*no port*/);
    
    
g_Access[target] = get_user_flags(id);

}
stock GetInfo(iname[], namesizeauth[], authsizeip[], ipsize, &access)
{
    if (
>= g_Size)
    {
        
abort(AMX_ERR_NATIVE"GetInfo: Out of bounds (%d:%d)"ig_Size);
    }
    
    new 
target = (g_Tracker i) % sizeof(g_SteamIDs);
    
    
copy(namenamesizeg_Names[target]);
    
copy(authauthsizeg_SteamIDs[target]);
    
copy(ip,   ipsize,   g_IPs[target]);
    
access g_Access[target];
    
}
public 
client_disconnected(id)
{
    if (!
is_user_bot(id))
    {
        
InsertInfo(id);
    }
}

public 
plugin_init()
{
    
register_plugin("Admin Commands"AMXX_VERSION_STR"AMXX Dev Team")

    
register_dictionary("admincmd.txt")
    
register_dictionary("common.txt")
    
register_dictionary("adminhelp.txt")

    
register_concmd("amx_kick""cmdKick"ADMIN_KICK"<name or #userid> [reason]")
    
register_concmd("amx_ban""cmdBan"ADMIN_BAN|ADMIN_BAN_TEMP"<name or #userid> <minutes> [reason]")
    
register_concmd("amx_banip""cmdBanIP"ADMIN_BAN|ADMIN_BAN_TEMP"<name or #userid> <minutes> [reason]")
    
register_concmd("amx_addban""cmdAddBan"ADMIN_BAN"<^"authid^" or ip> <minutes> [reason]")
    
register_concmd("amx_unban""cmdUnban"ADMIN_BAN|ADMIN_BAN_TEMP"<^"authid^" or ip>")
    
register_concmd("amx_slay""cmdSlay"ADMIN_SLAY"<name or #userid>")
    
register_concmd("amx_slap""cmdSlap"ADMIN_SLAY"<name or #userid> [power]")
    
register_concmd("amx_leave""cmdLeave"ADMIN_KICK"<tag> [tag] [tag] [tag]")
    
register_concmd("amx_pause""cmdPause"ADMIN_CVAR"- pause or unpause the game")
    
register_concmd("amx_who""cmdWho"ADMIN_ADMIN"- displays who is on server")
    
register_concmd("amx_cvar""cmdCvar"ADMIN_CVAR"<cvar> [value]")
    
register_concmd("amx_xvar_float""cmdXvar"ADMIN_CVAR"<xvar> [value]")
    
register_concmd("amx_xvar_int""cmdXvar"ADMIN_CVAR"<xvar> [value]")
    
register_concmd("amx_plugins""cmdPlugins"ADMIN_ADMIN)
    
register_concmd("amx_modules""cmdModules"ADMIN_ADMIN)
    
register_concmd("amx_map""cmdMap"ADMIN_MAP"<mapname>")
    
register_concmd("amx_extendmap""cmdExtendMap"ADMIN_MAP"<number of minutes> - extend map")
    
register_concmd("amx_cfg""cmdCfg"ADMIN_CFG"<filename>")
    
register_concmd("amx_nick""cmdNick"ADMIN_SLAY"<name or #userid> <new nick>")
    
register_concmd("amx_last""cmdLast"ADMIN_BAN"- list the last few disconnected clients info");
    
register_clcmd("amx_rcon""cmdRcon"ADMIN_RCON"<command line>")
    
register_clcmd("amx_showrcon""cmdShowRcon"ADMIN_RCON"<command line>")
    
register_clcmd("pauseAck""cmdLBack")

    
rcon_password=get_cvar_pointer("rcon_password");
    
pausable=get_cvar_pointer("pausable");
    
timelimit=get_cvar_pointer"mp_timelimit" );
    
p_amx_tempban_maxtime register_cvar("amx_tempban_maxtime""4320"FCVAR_PROTECTED);

    
g_tempBans TrieCreate();

    new 
flags get_pcvar_flags(rcon_password);

    if (!(
flags FCVAR_PROTECTED))
    {
        
set_pcvar_flags(rcon_passwordflags FCVAR_PROTECTED);
    }
}

public 
cmdKick(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED

    
new arg[32]
    
read_argv(1argcharsmax(arg))
    new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF)
    
    if (!
player)
        return 
PLUGIN_HANDLED
    
    
new authid[32], authid2[32], name2[MAX_NAME_LENGTH], name[MAX_NAME_LENGTH], userid2reason[32]
    
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_authid(playerauthid2charsmax(authid2))
    
get_user_name(playername2charsmax(name2))
    
get_user_name(idnamecharsmax(name))
    
userid2 get_user_userid(player)
    
read_argv(2reasoncharsmax(reason))
    
remove_quotes(reason)
    
    
log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^" (reason ^"%s^")"nameget_user_userid(id), authidname2userid2authid2reason)

    
show_activity_key("ADMIN_KICK_1""ADMIN_KICK_2"namename2);

    if (
is_user_bot(player))
        
server_cmd("kick #%d"userid2)
    else
    {
        if (
reason[0])
            
server_cmd("kick #%d ^"%s^""userid2reason)
        else
            
server_cmd("kick #%d"userid2)
    }
    
    
console_print(id"[AMXX] Client ^"%s^" kicked"name2)
    
    return 
PLUGIN_HANDLED
}

/**
 * ';' and '^n' are command delimiters. If a command arg contains these 2
 * it is not safe to be passed to server_cmd() as it may be trying to execute
 * a command.
 */
isCommandArgSafe(const arg[])
{
    return 
contain(arg";") == -&& contain(arg"^n") == -1;
}

public 
cmdUnban(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[32], authid[32], name[MAX_NAME_LENGTH]
    
    
read_argv(1argcharsmax(arg))

    
get_user_authid(idauthidcharsmax(authid))

    if( !(
get_user_flags(id) & ( ADMIN_BAN ADMIN_RCON )) )
    {
        new 
storedAdminAuth[32]
        if( !
TrieGetString(g_tempBansargstoredAdminAuthcharsmax(storedAdminAuth)) || !equal(storedAdminAuthauthid) )
        {
            
console_print(id"%L"id"ADMIN_MUST_TEMPUNBAN");
            return 
PLUGIN_HANDLED;
        }
    }
    
    if (
contain(arg".") != -1)
    {
        
server_cmd("removeip ^"%s^";writeip"arg)
        
console_print(id"[AMXX] %L"id"IP_REMOVED"arg)
    } else {
        if(!
isCommandArgSafe(arg))
        {
            
console_print(id"%l""CL_NOT_FOUND");
            return 
PLUGIN_HANDLED;
        }

        
server_cmd("removeid %s;writeid"arg)
        
console_print(id"[AMXX] %L"id"AUTHID_REMOVED"arg)
    }

    
get_user_name(idnamecharsmax(name))

    
show_activity_key("ADMIN_UNBAN_1""ADMIN_UNBAN_2"namearg);

    
log_amx("Cmd: ^"%s<%d><%s><>^" unban ^"%s^""nameget_user_userid(id), authidarg)
    
    return 
PLUGIN_HANDLED
}

/* amx_addban is a special command now.
 * If a user with rcon uses it, it bans the user.  No questions asked.
 * If a user without rcon but with ADMIN_BAN uses it, it will scan the old
 * connection queue, and if it finds the info for a player in it, it will
 * check their old access.  If they have immunity, it will not ban.
 * If they do not have immunity, it will ban.  If the user is not found,
 * it will refuse to ban the target.
 */
 
public cmdAddBan(idlevelcid)
{
    if (!
cmd_access(idlevelcid3true)) // check for ADMIN_BAN access
    
{
        if (
get_user_flags(id) & level// Getting here means they didn't input enough args
        
{
            return 
PLUGIN_HANDLED;
        }
        if (!
cmd_access(idADMIN_RCONcid3)) // If somehow they have ADMIN_RCON without ADMIN_BAN, continue
        
{
            return 
PLUGIN_HANDLED;
        }
    }

    new 
arg[32], authid[32], name[MAX_NAME_LENGTH], minutes[32], reason[32]
    
    
read_argv(1argcharsmax(arg))
    
read_argv(2minutescharsmax(minutes))
    
read_argv(3reasoncharsmax(reason))
    
    
trim(arg);
    
    if (!(
get_user_flags(id) & ADMIN_RCON))
    {
        new 
bool:canban false;
        new 
bool:isip false;
        
// Limited access to this command
        
if (equali(arg"STEAM_ID_PENDING") ||
            
equali(arg"STEAM_ID_LAN") ||
            
equali(arg"HLTV") ||
            
equali(arg"4294967295") ||
            
equali(arg"VALVE_ID_LAN") ||
            
equali(arg"VALVE_ID_PENDING"))
        {
            
// Hopefully we never get here, so ML shouldn't be needed
            
console_print(id"Cannot ban %s"arg);
            return 
PLUGIN_HANDLED;
        }
        
        if (
contain(arg".") != -1)
        {
            
isip true;
        }
        
        
// Scan the disconnection queue
        
if (isip)
        {
            new 
IP[32];
            new 
Name[MAX_NAME_LENGTH];
            new 
dummy[1];
            new 
Access;
            for (new 
0g_Sizei++)
            {
                
GetInfo(iNamecharsmax(Name), dummy0IPcharsmax(IP), Access);
                
                if (
equal(IParg))
                {
                    if (
Access ADMIN_IMMUNITY)
                    {
                        
console_print(id"[AMXX] %s : %L"IPid"CLIENT_IMM"Name);
                        
                        return 
PLUGIN_HANDLED;
                    }
                    
// User did not have immunity
                    
canban true;
                }
            }
        }
        else
        {
            new 
Auth[32];
            new 
Name[MAX_NAME_LENGTH];
            new 
dummy[1];
            new 
Access;
            for (new 
0g_Sizei++)
            {
                
GetInfo(iNamecharsmax(Name), Authcharsmax(Auth), dummy0Access);
                
                if (
equal(Autharg))
                {
                    if (
Access ADMIN_IMMUNITY)
                    {
                        
console_print(id"[AMXX] %s : %L"Authid"CLIENT_IMM"Name);
                        
                        return 
PLUGIN_HANDLED;
                    }
                    
// User did not have immunity
                    
canban true;
                }
            }
        }
        
        if (!
canban)
        {
            
console_print(id"[AMXX] You may only ban recently disconnected clients.  Use ^"amx_last^" to view.");
            
            return 
PLUGIN_HANDLED;
        }
        
    }
    
    
// User has access to ban their target
    
if (contain(arg".") != -1)
    {
        
server_cmd("addip ^"%s^" ^"%s^";wait;writeip"minutesarg)
        
console_print(id"[AMXX] Ip ^"%s^" added to ban list"arg)
    } else {
        if(!
isCommandArgSafe(arg))
        {
            
console_print(id"%l""CL_NOT_FOUND");
            return 
PLUGIN_HANDLED;
        }

        
server_cmd("banid ^"%s^" %s;wait;writeid"minutesarg)
        
console_print(id"[AMXX] Authid ^"%s^" added to ban list"arg)
    }

    
get_user_name(idnamecharsmax(name))

    
show_activity_key("ADMIN_ADDBAN_1""ADMIN_ADDBAN_2"namearg);

    
get_user_authid(idauthidcharsmax(authid))
    
TrieSetString(g_tempBansargauthid)
    
log_amx("Cmd: ^"%s<%d><%s><>^" ban ^"%s^" (minutes ^"%s^") (reason ^"%s^")"nameget_user_userid(id), authidargminutesreason)

    return 
PLUGIN_HANDLED
}

public 
cmdBan(idlevelcid)
{
    if (!
cmd_access(idlevelcid3))
        return 
PLUGIN_HANDLED

    
new target[32], minutes[8], reason[64]
    
    
read_argv(1targetcharsmax(target))
    
read_argv(2minutescharsmax(minutes))
    
read_argv(3reasoncharsmax(reason))
    
    new 
player cmd_target(idtargetCMDTARGET_OBEY_IMMUNITY CMDTARGET_NO_BOTS CMDTARGET_ALLOW_SELF)
    
    if (!
player)
        return 
PLUGIN_HANDLED

    
new nNum str_to_num(minutes)
    new const 
tempBanMaxTime get_pcvar_num(p_amx_tempban_maxtime);
    if( 
nNum // since negative values result in permanent bans
    
{
        
nNum 0;
        
minutes "0";
    }
    if( !(
get_user_flags(id) & ( ADMIN_BAN ADMIN_RCON )) && (nNum <= || nNum tempBanMaxTime) )
    {
        
console_print(id"%L"id"ADMIN_MUST_TEMPBAN"tempBanMaxTime);
        return 
PLUGIN_HANDLED
    
}

    new 
authid[32], name2[MAX_NAME_LENGTH], authid2[32], name[MAX_NAME_LENGTH]
    new 
userid2 get_user_userid(player)

    
get_user_authid(playerauthid2charsmax(authid2))
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(playername2charsmax(name2))
    
get_user_name(idnamecharsmax(name))
    
    
log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")"nameget_user_userid(id), authidname2userid2authid2minutesreason)

    
TrieSetString(g_tempBansauthid2authid); // store all bans in case a permanent ban would override a temporary one.
    
    
new temp[64], banned[16]
    if (
nNum)
        
formatex(tempcharsmax(temp), "%L"player"FOR_MIN"minutes)
    else
        
formatex(tempcharsmax(temp), "%L"player"PERM")

    
formatex(bannedcharsmax(banned), "%L"player"BANNED")

    if (
reason[0])
        
server_cmd("kick #%d ^"%(%%s)^";wait;banid %s %s;wait;writeid"userid2reasonbannedtempminutesauthid2)
    else
        
server_cmd("kick #%d ^"%%s^";wait;banid %s %s;wait;writeid"userid2bannedtempminutesauthid2)

    
    
// Display the message to all clients

    
new msg[256];
    new 
len;
    new 
players[MAX_PLAYERS], pnumplr
    get_players
(playerspnum"ch")
    for (new 
ii<pnumi++)
    {
        
plr players[i]

        
len formatex(msgcharsmax(msg), "%L"plr"BAN");
        
len += formatex(msg[len], charsmax(msg) - len" %s "name2);
        if (
nNum)
        {
            
len += formatex(msg[len], charsmax(msg) - len"%L"plr"FOR_MIN"minutes);
        }
        else
        {
            
len += formatex(msg[len], charsmax(msg) - len"%L"plr"PERM");
        }
        if (
strlen(reason) > 0)
        {
            
formatex(msg[len], charsmax(msg) - len" (%L: %s)"plr"REASON"reason);
        }
        
show_activity_id(plridnamemsg);
    }
    
    
console_print(id"[AMXX] %L"id"CLIENT_BANNED"name2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdBanIP(idlevelcid)
{
    if (!
cmd_access(idlevelcid3))
        return 
PLUGIN_HANDLED
    
    
new target[32], minutes[8], reason[64]
    
    
read_argv(1targetcharsmax(target))
    
read_argv(2minutescharsmax(minutes))
    
read_argv(3reasoncharsmax(reason))
    
    new 
player cmd_target(idtargetCMDTARGET_OBEY_IMMUNITY CMDTARGET_NO_BOTS CMDTARGET_ALLOW_SELF)
    
    if (!
player)
        return 
PLUGIN_HANDLED

    
new nNum str_to_num(minutes)
    new const 
tempBanMaxTime get_pcvar_num(p_amx_tempban_maxtime);
    if( 
nNum // since negative values result in permanent bans
    
{
        
nNum 0;
        
minutes "0";
    }
    if( !(
get_user_flags(id) & ( ADMIN_BAN ADMIN_RCON )) && (nNum <= || nNum tempBanMaxTime) )
    {
        
console_print(id"%L"id"ADMIN_MUST_TEMPBAN"tempBanMaxTime);
        return 
PLUGIN_HANDLED
    
}
    
    new 
authid[32], name2[MAX_NAME_LENGTH], authid2[32], name[MAX_NAME_LENGTH]
    new 
userid2 get_user_userid(player)
    
    
get_user_authid(playerauthid2charsmax(authid2))
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(playername2charsmax(name2))
    
get_user_name(idnamecharsmax(name))
    
    
log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")"nameget_user_userid(id), authidname2userid2authid2minutesreason)

    
TrieSetString(g_tempBansauthid2authid);

    new 
temp[64], banned[16]
    if (
nNum)
        
formatex(tempcharsmax(temp), "%L"player"FOR_MIN"minutes)
    else
        
formatex(tempcharsmax(temp), "%L"player"PERM")
    
format(banned15"%L"player"BANNED")

    new 
address[32]
    
get_user_ip(playeraddresscharsmax(address), 1)

    if (
reason[0])
        
server_cmd("kick #%d ^"%(%%s)^";wait;addip ^"%s^" ^"%s^";wait;writeip"userid2reasonbannedtempminutesaddress)
    else
        
server_cmd("kick #%d ^"%%s^";wait;addip ^"%s^" ^"%s^";wait;writeip"userid2bannedtempminutesaddress)

    
// Display the message to all clients

    
new msg[256];
    new 
len;
    new 
players[MAX_PLAYERS], pnumplr
    get_players
(playerspnum"ch")
    for (new 
ii<pnumi++)
    {
        
plr players[i]

        
len formatex(msgcharsmax(msg), "%L"plr"BAN");
        
len += formatex(msg[len], charsmax(msg) - len" %s "name2);
        if (
nNum)
        {
            
formatex(msg[len], charsmax(msg) - len"%L"plr"FOR_MIN"minutes);
        }
        else
        {
            
formatex(msg[len], charsmax(msg) - len"%L"plr"PERM");
        }
        if (
strlen(reason) > 0)
        {
            
formatex(msg[len], charsmax(msg) - len" (%L: %s)"plr"REASON"reason);
        }
        
show_activity_id(plridnamemsg);
    }

    
console_print(id"[AMXX] %L"id"CLIENT_BANNED"name2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdSlay(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[32]
    
    
read_argv(1argcharsmax(arg))
    
    new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF CMDTARGET_ONLY_ALIVE)
    
    if (!
player)
        return 
PLUGIN_HANDLED
    
    user_kill
(player)
    
    new 
authid[32], name2[MAX_NAME_LENGTH], authid2[32], name[MAX_NAME_LENGTH]
    
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
get_user_authid(playerauthid2charsmax(authid2))
    
get_user_name(playername2charsmax(name2))
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" slay ^"%s<%d><%s><>^""nameget_user_userid(id), authidname2get_user_userid(player), authid2)

    
show_activity_key("ADMIN_SLAY_1""ADMIN_SLAY_2"namename2);

    
console_print(id"[AMXX] %L"id"CLIENT_SLAYED"name2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdSlap(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED

    
new arg[32]
    
    
read_argv(1argcharsmax(arg))
    new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF CMDTARGET_ONLY_ALIVE)
    
    if (!
player)
        return 
PLUGIN_HANDLED

    
new spower[32], authid[32], name2[MAX_NAME_LENGTH], authid2[32], name[MAX_NAME_LENGTH]
    
    
read_argv(2spowercharsmax(spower))
    
    new 
damage clampstr_to_num(spower), 0)
    
    
user_slap(playerdamage)
    
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
get_user_authid(playerauthid2charsmax(authid2))
    
get_user_name(playername2charsmax(name2))
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" slap with %d damage ^"%s<%d><%s><>^""nameget_user_userid(id), authiddamagename2get_user_userid(player), authid2)

    
show_activity_key("ADMIN_SLAP_1""ADMIN_SLAP_2"namename2damage);

    
console_print(id"[AMXX] %L"id"CLIENT_SLAPED"name2damage)
    
    return 
PLUGIN_HANDLED
}

public 
chMap(map[])
{
    
engine_changelevel(map);
}

public 
cmdMap(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED

    
new arg[32]
    new 
arglen read_argv(1argcharsmax(arg))
    
    if (!
is_map_valid(arg) || contain(arg"..") != -1)
    {
        
console_print(id"[AMXX] %L"id"MAP_NOT_FOUND")
        return 
PLUGIN_HANDLED
    
}

    new 
authid[32], name[MAX_NAME_LENGTH]
    
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
    
show_activity_key("ADMIN_MAP_1""ADMIN_MAP_2"namearg);
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" changelevel ^"%s^""nameget_user_userid(id), authidarg)
    
    new 
_modName[10]
    
get_modname(_modNamecharsmax(_modName))
    
    if (!
equal(_modName"zp"))
    {
        
message_begin(MSG_ALLSVC_INTERMISSION)
        
message_end()
    }
    
    
set_task(2.0"chMap"0argarglen 1)
    
    return 
PLUGIN_HANDLED
}

public 
cmdExtendMap(idlevelcid)
{
    if(!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[32]
    
read_argv(1argcharsmax(arg))
    new 
mns str_to_num(arg)
    
    if(
mns <= 0)
        return 
PLUGIN_HANDLED
    
    
new mapname[32]
    
get_mapname(mapnamecharsmax(mapname))
    
set_pcvar_numtimelimit get_pcvar_numtimelimit ) + mns)
    
    new 
authid[32], name[MAX_NAME_LENGTH]
    
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
    
show_activity_key("ADMIN_EXTEND_1""ADMIN_EXTEND_2"namemns)
    
    
log_amx("ExtendMap: ^"%s<%d><%s><>^" extended map ^"%s^" for %d minutes."nameget_user_userid(id), authidmapnamemns)
    
console_print(id"%L"id"MAP_EXTENDED"mapnamemns)
    
    return 
PLUGIN_HANDLED
}

stock bool:onlyRcon(const name[])
{
    new 
ptr=get_cvar_pointer(name);
    if (
ptr && get_pcvar_flags(ptr) & FCVAR_PROTECTED)
    {
        return 
true;
    }
    return 
false;
}

public 
cmdCvar(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[32], arg2[64]
    
    
read_argv(1argcharsmax(arg))
    
read_argv(2arg2charsmax(arg2))
    
    new 
pointer;
    
    if (
equal(arg"add") && (get_user_flags(id) & ADMIN_RCON))
    {
        if ((
pointer=get_cvar_pointer(arg2))!=0)
        {
            new 
flags=get_pcvar_flags(pointer);
            
            if (!(
flags FCVAR_PROTECTED))
            {
                
set_pcvar_flags(pointer,flags FCVAR_PROTECTED);
            }
        }
        return 
PLUGIN_HANDLED
    
}
    
    
trim(arg);
    
    if ((
pointer=get_cvar_pointer(arg))==0)
    {
        
console_print(id"[AMXX] %L"id"UNKNOWN_CVAR"arg)
        return 
PLUGIN_HANDLED
    
}
    
    if (
onlyRcon(arg) && !(get_user_flags(id) & ADMIN_RCON))
    {
        
// Exception for the new onlyRcon rules:
        //   sv_password is allowed to be modified by ADMIN_PASSWORD
        
if (!(equali(arg,"sv_password") && (get_user_flags(id) & ADMIN_PASSWORD)))
        {
            
console_print(id"[AMXX] %L"id"CVAR_NO_ACC")
            return 
PLUGIN_HANDLED
        
}
    }
    
    if (
read_argc() < 3)
    {
        
get_pcvar_string(pointerarg2charsmax(arg2))
        
console_print(id"[AMXX] %L"id"CVAR_IS"argarg2)
        return 
PLUGIN_HANDLED
    
}

    if (
equali(arg"servercfgfile") || equali(arg"lservercfgfile") || equali(arg"mapchangecfgfile"))
    {
        new 
pos contain(arg2";")
        if (
pos != -1)
        {
            
arg2[pos] = '^0'
        
}
        else if ((
pos contain(arg2"^n")) != -1)
        {
            
arg2[pos] = '^0'
        
}
    }

    new 
authid[32], name[MAX_NAME_LENGTH]
    
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" set cvar (name ^"%s^") (value ^"%s^")"nameget_user_userid(id), authidargarg2)
    
set_pcvar_string(pointerarg2)
    
    
    
// Display the message to all clients

    
new cvar_val[64];
    new 
players[MAX_PLAYERS], pnumplr
    get_players
(playerspnum"ch")
    for (new 
ii<pnumi++)
    {
        
plr players[i]
        if (
get_pcvar_flags(pointer) & FCVAR_PROTECTED || equali(arg"rcon_password"))
        {
            
formatex(cvar_valcharsmax(cvar_val), "*** %L ***"plr"PROTECTED");
        }
        else
        {
            
copy(cvar_valcharsmax(cvar_val), arg2);
        }
        
show_activity_id(plridname"%L"plr"SET_CVAR_TO"""argcvar_val);
    }

    
console_print(id"[AMXX] %L"id"CVAR_CHANGED"argarg2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdXvar(idlevelcid)
{
    if( !
cmd_access(idlevelcid2) )
    {
        return 
PLUGIN_HANDLED;
    }

    new 
cmd[15], arg1[32], arg2[32];
    
    
read_argv(0cmdcharsmax(cmd));
    
read_argv(1arg1charsmax(arg1));
    
trim(arg1);
    if( 
read_argc() > )
    {
        
read_argv(2arg2charsmax(arg2));
        
trim(arg2);

        if( 
equali(arg1"add") )
        {
            if( 
get_user_flags(id) & ADMIN_RCON && xvar_exists(arg2) )
            {
                if( !
g_tXvarsFlags )
                {
                    
g_tXvarsFlags TrieCreate();
                }
                
TrieSetCell(g_tXvarsFlagsarg21);
            }
            return 
PLUGIN_HANDLED;
        }
    }

    new 
bFloat equali(cmd"amx_xvar_float");

    new 
xvar get_xvar_idarg1 );

    if( 
xvar == -)
    {
        
console_print(id"[AMXX] %L"id"UNKNOWN_XVAR"arg1)
        return 
PLUGIN_HANDLED
    
}

    new 
any:value;

    if( !
arg2[0] ) // get value
    
{
        
value get_xvar_num(xvar);
        if( 
bFloat )
        {
            
float_to_str(valuearg2charsmax(arg2));
        }
        else
        {
            
num_to_str(valuearg2charsmax(arg2));
        }
        
console_print(id"[AMXX] %L"id"XVAR_IS"arg1arg2);
        return 
PLUGIN_HANDLED;
    }

    
// set value
    
if( g_tXvarsFlags && TrieKeyExists(g_tXvarsFlagsarg1) && ~get_user_flags(id) & ADMIN_RCON )
    {
        
console_print(id"[AMXX] %L"id"XVAR_NO_ACC");
        return 
PLUGIN_HANDLED;
    }

    new 
endPos;
    if( 
bFloat )
    {
        
value strtof(arg2endPos);
        if( !
endPos )
        {
            return 
PLUGIN_HANDLED;
        }
    }
    else
    {
        
value strtol(arg2endPos);
        if( !
endPos )
        {
            return 
PLUGIN_HANDLED;
        }
    }

    
set_xvar_num(xvarvalue);

    
// convert back value to string so admin can know value has been set correctly
    
if( bFloat )
    {
        
float_to_str(valuearg2charsmax(arg2));
    }
    else
    {
        
num_to_str(valuearg2charsmax(arg2));
    }

    new 
authid[32], name[MAX_NAME_LENGTH];
    
    
get_user_authid(idauthidcharsmax(authid));
    
get_user_name(idnamecharsmax(name));
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" set xvar (name ^"%s^") (value ^"%s^")"nameget_user_userid(id), authidarg1arg2);
    
    
// Display the message to all clients
    
new players[MAX_PLAYERS], pnumplr;
    
get_players(playerspnum"ch");
    for (new 
ii<pnumi++)
    {
        
plr players[i];
        
show_activity_id(plridname"%L"plr"SET_XVAR_TO"""arg1arg2);
    }
    
    
console_print(id"[AMXX] %L"id"XVAR_CHANGED"arg1arg2);

    return 
PLUGIN_HANDLED;
}

public 
cmdPlugins(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED
        
    
if (id==0// If server executes redirect this to "amxx plugins" for more in depth output
    
{
        
server_cmd("amxx plugins");
        
server_exec();
        return 
PLUGIN_HANDLED;
    }

    new 
name[MAX_NAME_LENGTH], version[32], author[32], filename[32], status[32]
    new 
lName[32], lVersion[32], lAuthor[32], lFile[32], lStatus[32]

    
format(lNamecharsmax(lName), "%L"id"NAME")
    
format(lVersioncharsmax(lVersion), "%L"id"VERSION")
    
format(lAuthorcharsmax(lAuthor), "%L"id"AUTHOR")
    
format(lFilecharsmax(lFile), "%L"id"FILE")
    
format(lStatuscharsmax(lStatus), "%L"id"STATUS")

    new 
StartPLID=0;
    new 
EndPLID;

    new 
Temp[96]

    new 
num get_pluginsnum()
    
    if (
read_argc() > 1)
    {
        
read_argv(1,Temp,charsmax(Temp));
        
StartPLID=str_to_num(Temp)-1// zero-based
    
}

    
EndPLID=min(StartPLID 10num);
    
    new 
running 0
    
    console_print
(id"----- %L -----"id"LOADED_PLUGINS")
    
console_print(id"%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s"lNamelVersionlAuthorlFilelStatus)

    new 
i=StartPLID;
    while (
<EndPLID)
    {
        
get_plugin(i++, filenamecharsmax(filename), namecharsmax(name), versioncharsmax(version), authorcharsmax(author), statuscharsmax(status))
        
console_print(id"%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s"nameversionauthorfilenamestatus)
        
        if (
status[0]=='d' || status[0]=='r'// "debug" or "running"
            
running++
    }
    
console_print(id"%L"id"PLUGINS_RUN"EndPLID-StartPLIDrunning)
    
console_print(id"----- %L -----",id,"HELP_ENTRIES",StartPLID 1,EndPLID,num);
    
    if (
EndPLID num)
    {
        
formatex(Temp,charsmax(Temp),"----- %L -----",id,"HELP_USE_MORE""amx_help"EndPLID 1);
        
replace_all(Temp,charsmax(Temp),"amx_help","amx_plugins");
        
console_print(id,"%s",Temp);
    }
    else
    {
        
formatex(Temp,charsmax(Temp),"----- %L -----",id,"HELP_USE_BEGIN""amx_help");
        
replace_all(Temp,charsmax(Temp),"amx_help","amx_plugins");
        
console_print(id,"%s",Temp);
    }

    return 
PLUGIN_HANDLED
}

public 
cmdModules(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED

    
new name[32], version[32], author[32], statussStatus[16]
    new 
lName[32], lVersion[32], lAuthor[32], lStatus[32];

    
format(lNamecharsmax(lName), "%L"id"NAME")
    
format(lVersioncharsmax(lVersion), "%L"id"VERSION")
    
format(lAuthorcharsmax(lAuthor), "%L"id"AUTHOR")
    
format(lStatuscharsmax(lStatus), "%L"id"STATUS")

    new 
num get_modulesnum()
    
    
console_print(id"%L:"id"LOADED_MODULES")
    
console_print(id"%-23.22s %-11.10s %-20.19s %-11.10s"lNamelVersionlAuthorlStatus)
    
    for (new 
0numi++)
    {
        
get_module(inamecharsmax(name), authorcharsmax(author), versioncharsmax(version), status)
        
        switch (
status)
        {
            case 
module_loadedcopy(sStatuscharsmax(sStatus), "running")
            default: 
            {
                
copy(sStatuscharsmax(sStatus), "bad load");
                
copy(namecharsmax(name), "unknown");
                
copy(authorcharsmax(author), "unknown");
                
copy(versioncharsmax(version), "unknown");
            }
        }
        
        
console_print(id"%-23.22s %-11.10s %-20.19s %-11.10s"nameversionauthorsStatus)
    }
    
console_print(id"%L"id"NUM_MODULES"num)

    return 
PLUGIN_HANDLED
}

public 
cmdCfg(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[128]
    
read_argv(1argcharsmax(arg))
    
    if (!
file_exists(arg))
    {
        
console_print(id"[AMXX] %L"id"FILE_NOT_FOUND"arg)
        return 
PLUGIN_HANDLED
    
}
    
    new 
authid[32], name[MAX_NAME_LENGTH]
    
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" execute cfg (file ^"%s^")"nameget_user_userid(id), authidarg)
    
    
console_print(id"[AMXX] Executing file ^"%s^""arg)
    
server_cmd("exec ^"%s^""arg)

    
show_activity_key("ADMIN_CONF_1""ADMIN_CONF_2"namearg);

    return 
PLUGIN_HANDLED
}

public 
cmdLBack()
{
    if (!
g_PauseAllowed)
        return 
PLUGIN_CONTINUE    

    
new paused[25]
    
    
format(paused24"%L"g_pauseCong_Paused "UNPAUSED" "PAUSED")
    
set_pcvar_float(pausableg_pausAble)
    
console_print(g_pauseCon"[AMXX] Server %s"paused)
    
g_PauseAllowed false
    
    
if (g_Paused)
        
g_Paused false
    
else 
        
g_Paused true
    
    
return PLUGIN_HANDLED
}

public 
cmdPause(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED 
    
    
new authid[32], name[MAX_NAME_LENGTH], slayer id
    
    get_user_authid
(idauthidcharsmax(authid)) 
    
get_user_name(idnamecharsmax(name)) 
    if (
pausable!=0)
    {
        
g_pausAble get_pcvar_float(pausable)
    }
    
    if (!
slayer)
        
slayer find_player("h"
    
    if (!
slayer)
    { 
        
console_print(id"[AMXX] %L"id"UNABLE_PAUSE"
        return 
PLUGIN_HANDLED
    
}

    
set_pcvar_float(pausable1.0)
    
g_PauseAllowed true
    client_cmd
(slayer"pause;pauseAck")
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" %s server"nameget_user_userid(id), authidg_Paused "unpause" "pause")
    
    
console_print(id"[AMXX] %L"idg_Paused "UNPAUSING" "PAUSING")

    
// Display the message to all clients

    
new players[MAX_PLAYERS], pnum
    get_players
(playerspnum"ch")
    for (new 
ii<pnumi++)
    {
        
show_activity_id(players[i], idname"%L server"ig_Paused "UNPAUSE" "PAUSE");
    }

    
g_pauseCon id
    
    
return PLUGIN_HANDLED


public 
cmdShowRcon(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
        
    
new password[64]
    
    
get_pcvar_string(rcon_passwordpasswordcharsmax(password))
    
    if (!
password[0])
    {
        
cmdRcon(idlevelcid)
    } 
    else 
    {
        new 
args[128]
        
        
read_args(argscharsmax(args))
        
client_cmd(id"rcon_password %s"password)
        
client_cmd(id"rcon %s"args)
    }
    
    return 
PLUGIN_HANDLED
}

public 
cmdRcon(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[128], authid[32], name[MAX_NAME_LENGTH]
    
    
read_args(argcharsmax(arg))
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" server console (cmdline ^"%s^")"nameget_user_userid(id), authidarg)
    
    
console_print(id"[AMXX] %L"id"COM_SENT_SERVER"arg)
    
server_cmd("%s"arg)
    
    return 
PLUGIN_HANDLED
}

public 
cmdWho(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED

    
new players[MAX_PLAYERS], inumcl_on_server[64], authid[32], name[MAX_NAME_LENGTH], flagssflags[32], plr
    
new lImm[16], lRes[16], lAccess[16], lYes[16], lNo[16]
    
    
formatex(lImmcharsmax(lImm), "%L"id"IMMU")
    
formatex(lRescharsmax(lRes), "%L"id"RESERV")
    
formatex(lAccesscharsmax(lAccess), "%L"id"ACCESS")
    
formatex(lYescharsmax(lYes), "%L"id"YES")
    
formatex(lNocharsmax(lNo), "%L"id"NO")
    
    
get_players(playersinum)
    
format(cl_on_servercharsmax(cl_on_server), "%L"id"CLIENTS_ON_SERVER")
    
console_print(id"^n%s:^n #  %-16.15s %-20s %-8s %-4.3s %-4.3s %s"cl_on_server"nick""authid""userid"lImmlReslAccess)
    
    for (new 
0inum; ++a)
    {
        
plr players[a]
        
get_user_authid(plrauthidcharsmax(authid))
        
get_user_name(plrnamecharsmax(name))
        
flags get_user_flags(plr)
        
get_flags(flagssflagscharsmax(sflags))
        
console_print(id"%2d  %-16.15s %-20s %-8d %-6.5s %-6.5s %s"plrnameauthid
        
get_user_userid(plr), (flags&ADMIN_IMMUNITY) ? lYes lNo, (flags&ADMIN_RESERVATION) ? lYes lNosflags)
    }
    
    
console_print(id"%L"id"TOTAL_NUM"inum)
    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
log_amx("Cmd: ^"%s<%d><%s><>^" ask for players list"nameget_user_userid(id), authid
    
    return 
PLUGIN_HANDLED
}

hasTag(name[], tags[4][32], tagsNum)
{
    for (new 
0tagsNum; ++a)
        if (
contain(nametags[a]) != -1)
            return 
a
    
return -1
}

public 
cmdLeave(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new argnum read_argc()
    new 
ltags[4][32]
    new 
ltagsnum 0
    
    
for (new 15; ++a)
    {
        if (
argnum)
            
read_argv(altags[ltagsnum++], charsmax(ltags[]))
        else
            
ltags[ltagsnum++][0] = 0
    
}
    
    new 
nick[MAX_NAME_LENGTH], irespnum MaxClientscount 0lReason[128]
    
    for (new 
1<= pnum; ++b)
    {
        if (!
is_user_connected(b) && !is_user_connecting(b)) continue

        
get_user_name(bnickcharsmax(nick))
        
ires hasTag(nickltagsltagsnum)
        
        if (
ires != -1)
        {
            
console_print(id"[AMXX] %L"id"SKIP_MATCH"nickltags[ires])
            continue
        }
        
        if (
get_user_flags(b) & ADMIN_IMMUNITY)
        {
            
console_print(id"[AMXX] %L"id"SKIP_IMM"nick)
            continue
        }
        
        
console_print(id"[AMXX] %L"id"KICK_PL"nick)
        
        if (
is_user_bot(b))
            
server_cmd("kick #%d"get_user_userid(b))
        else
        {
            
formatex(lReasoncharsmax(lReason), "%L"b"YOU_DROPPED")
            
server_cmd("kick #%d ^"%s^""get_user_userid(b), lReason)
        }
        
count++
    }
    
    
console_print(id"[AMXX] %L"id"KICKED_CLIENTS"count)
    
    new 
authid[32], name[MAX_NAME_LENGTH]

    
get_user_authid(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
log_amx("Kick: ^"%s<%d><%s><>^" leave some group (tag1 ^"%s^") (tag2 ^"%s^") (tag3 ^"%s^") (tag4 ^"%s^")"nameget_user_userid(id), authidltags[0], ltags[1], ltags[2], ltags[3])

    
show_activity_key("ADMIN_LEAVE_1""ADMIN_LEAVE_2"nameltags[0], ltags[1], ltags[2], ltags[3]);

    return 
PLUGIN_HANDLED
}

public 
cmdNick(idlevelcid)
{
    if (!
cmd_access(idlevelcid3))
        return 
PLUGIN_HANDLED

    
new arg1[32], arg2[32], authid[32], name[32], authid2[32], name2[32]

    
read_argv(1arg1charsmax(arg1))
    
read_argv(2arg2charsmax(arg2))

    new 
player cmd_target(idarg1CMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF)
    
    if (!
player)
        return 
PLUGIN_HANDLED

    get_user_authid
(idauthidcharsmax(authid))
    
get_user_name(idnamecharsmax(name))
    
get_user_authid(playerauthid2charsmax(authid2))
    
get_user_name(playername2charsmax(name2))

    
set_user_info(player"name"arg2)

    
log_amx("Cmd: ^"%s<%d><%s><>^" change nick to ^"%s^" ^"%s<%d><%s><>^""nameget_user_userid(id), authidarg2name2get_user_userid(player), authid2)

    
show_activity_key("ADMIN_NICK_1""ADMIN_NICK_2"namename2arg2);

    
console_print(id"[AMXX] %L"id"CHANGED_NICK"name2arg2)

    return 
PLUGIN_HANDLED
}

public 
cmdLast(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
    {
        return 
PLUGIN_HANDLED;
    }
    
    new 
name[MAX_NAME_LENGTH];
    new 
authid[32];
    new 
ip[32];
    new 
flags[32];
    new 
access;
    
    
    
// This alignment is a bit weird (it should grow if the name is larger)
    // but otherwise for the more common shorter name, it'll wrap in server console
    // Steam client display is all skewed anyway because of the non fixed font.
    
console_print(id"%19s %20s %15s %s""name""authid""ip""access");
    
    for (new 
0g_Sizei++)
    {
        
GetInfo(inamecharsmax(name), authidcharsmax(authid), ipcharsmax(ip), access);
        
        
get_flags(accessflagscharsmax(flags));
        
        
console_print(id"%19s %20s %15s %s"nameauthidipflags);
    }
    
    
console_print(id"%d old connections saved."g_Size);
    
    return 
PLUGIN_HANDLED;
}

public 
plugin_end()
{
    
TrieDestroy(g_tempBans);
    
TrieDestroy(g_tXvarsFlags);


Przeczytaj cały wpis

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...