Auto Choice Of Santa Claus

Стоит ли делать такой плагин или нет?

  • Нет

  • Да


Результаты будут видны только после голосования.

Grey83

не пишу плагины с весны 2022
Сообщения
6,585
Реакции
3,843
- Креды выдает неправильно. Игнорируется то что в конфиге.
если строка 143 закомментирована, то вообще не будет выдавать, а только в чат писать =)
- Не работает команда sm_santa.
команда доступна только руту (если это игрок, то должно назначить сантой его, если команда от имени сервера, то назначит случайного игрока)
- Выгружается нормально вроде (sm plugins unload), но потом хер загрузишь, ругается на отсутствие файла, хотя конфиг в дате на месте.
можно цитату из лога?
- Не понятно как выдается санта, по какой логике. по раунда м так получилось у меня 3 * 8 * 11 * 12 * 15 * 17. ( в конфиге стоит каждый 5й раунд)
на сервере случаем нет разминочных раундов?
- Не понятно, в чате не пишет что санта выбран, но он типа есть, хп нет, скорости вроде тоже нет, но кто его убивает, получает креды 111. Я так понял что какойто рандом без месаги в чате. =\
нашёл где косяк, пофикшу (в строках с 105 по 130 нужно заменить client на iSanta)
Возможно из-за этого и проблема с коммандой
- Спеки тоже могут быть сантой.
Опять же ошибка, упомянутая выше
Сообщения автоматически склеены:

@Deluks, проверяй фиксы.

Добавил защиту от дураков (если в конфиге установить отрицательные или нулевые значения для параметра, то этот параметр не будет использоваться).
Кроме того, при компиляции без инклюдов шопа и/или LR плагин скомпилируется, но соответствующая функция работать не будет (было бы странно если бы она вдруг смогла работать ^_^).
Также если в момент убийства Санты не будет работать ядро шопа и/или LR, то и соответствующую награду игрок не получит (и в чате плагин напишет только о полученном).
Теперь раунды считаются с помощью GameRules_GetProp("m_totalRoundsPlayed") (дефолтом, работает только в КСГО) CS_OnTerminateRound() (если расскомментить строки, где указано, что для КСС и заккоментить, где написано про КСГО), а не счётчиком событии "round_start".
 

Вложения

  • AutoChoiceOfSantaClausCSGO 1.0.2.sp
    8.4 КБ · Просмотры: 40
Последнее редактирование:

Deluks

Верховное DNO|
Сообщения
1,480
Реакции
543
@Grey83, Вроде все работает. Единственное, это данные с конфига не подсасываются, в исходнике выставлял и компилил. В целом годнота.
 

Grey83

не пишу плагины с весны 2022
Сообщения
6,585
Реакции
3,843
@ERROR404, может и будет, только нужно либо в исходнике теги менять на коды цветов (и менять CGOPrintToChat*() на просто PrintToChat*()), либо менять инклюд и ставить теги цветов уже от него (и ставить вместо CGOPrintToChat*() уже вызов функции из инклюда).
Также нужно раскомментировать каллбэк функций OnPluginStart() и CS_OnTerminateRound() (строки 69- 74 и 106 - 111), а также закомментировать строку 114. Если это не сделать, то в CS:S будет выбивать ошибку и санта не будет назначаться/
 

ERROR404

Участник
Сообщения
244
Реакции
82
Почему то не получалось запустить, пока не убрал пробелы между названием и версией. Не создаёт конфиг( подскажите где в исходнике вставить путь к моделям ?
 

Grey83

не пишу плагины с весны 2022
Сообщения
6,585
Реакции
3,843
Почему то не получалось запустить, пока не убрал пробелы между названием и версией.
Ты про скомпилированный плагин и имя файла?
Я у скомпилированных всегда удаляю всё, что идёт между именем плагина и расширением.
А запуску пробелы не мешали никогда: достаточно заключить имя файла в кавычки (sm plugins load "name version")
 

StormX

Участник
Сообщения
828
Реакции
266

Вложения

  • AutoChoiceOfSantaClaus.smx
    12.8 КБ · Просмотры: 2
  • AutoChoiceOfSantaClaus.sp
    8.7 КБ · Просмотры: 7

Nobody

Участник
Сообщения
35
Реакции
1
@StormX, Спасибо!
Сообщения автоматически склеены:

@StormX, Не подскажите в чём проблема? Поменял только цвета сообщений
L 11/28/2022 - 09:18:54: [SM] Exception reported: Client index 0 is invalid
L 11/28/2022 - 09:18:54: [SM] Blaming: AutoChoiceOfSantaClaus.smx
L 11/28/2022 - 09:18:54: [SM] Call stack trace:
L 11/28/2022 - 09:18:54: [SM] [0] IsClientInGame
L 11/28/2022 - 09:18:54: [SM] [1] Line 142, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundEnd
L 11/28/2022 - 09:20:12: [SM] Exception reported: Client index 0 is invalid
L 11/28/2022 - 09:20:12: [SM] Blaming: AutoChoiceOfSantaClaus.smx
L 11/28/2022 - 09:20:12: [SM] Call stack trace:
L 11/28/2022 - 09:20:12: [SM] [0] IsClientInGame
L 11/28/2022 - 09:20:12: [SM] [1] Line 142, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundEnd

Исходник:
#include <sdktools_functions>
#include <sdktools_tempents>
#include <sdktools_tempents_stocks>
#include <sdkhooks>
#include <lvl_ranks>
#include <morecolors>

public Plugin myinfo =
{
    name = "Auto Choice Of Santa Claus",
    author = "KiKiEEKi (vk.com/kikieeki)",
    version = "1.0"
};

int iMaxPlayers = 6;
char sModelT[64] = "models/player/vad36santa/red.mdl";
char sModelCT[64] = "models/player/vad36santa/blue.mdl";
int iHealth = 150;
float fSpeed = 2.0;
float fGravity = 0.5;
float fDamage = 5.0;
float fBlockDamage = 0.6;
int iLvlRanksXP = 111;

int iRandomPlayer = 0;
float fGetGravityRandomPlayer;
int g_iClient = 0;
float fGetGravityClient;

int iNumberRound = 0; //Номер раунда
int iEveryRound = 2; //Каждый раунд N раунд будет выбран Санта

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post);
    //HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Post);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

    RegAdminCmd("sm_santa", Cmd_GiveSanta, ADMFLAG_ROOT, "Выбор дед-мороза");
    RegAdminCmd("sm_santa_reload", Cmd_ReloadCFG, ADMFLAG_CONFIG, "Перезагрузить конфиг");
}

public Action Cmd_GiveSanta(int iClient, int args)
{
    fGetGravityClient =  GetEntityGravity(iClient);
    g_iClient = iClient;
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере

    if(iGetCountPlayers >= iMaxPlayers)
    {
        SetSantaPlayer(g_iClient);
    }
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере
    
    iNumberRound++; //Прибавляем +1 к счетчику раундов
    if(iGetCountPlayers >= iMaxPlayers && iNumberRound == iEveryRound)
    {
        fGetGravityRandomPlayer =  GetEntityGravity(iRandomPlayer); //Получаем гравитацию рандомного игрока
        iRandomPlayer = GetRandomClient(); //Выбор рандомного игрока

        SetSantaPlayer(iRandomPlayer);
        iNumberRound = 0; //Обнуляем счетчик раундов
    }
}

stock void SetSantaPlayer(int iRandomPlayerANDiClient)
{
    if(GetClientTeam(iRandomPlayerANDiClient) == 2) //2 - это Т
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelT); //Установить модель
    }
    else if(GetClientTeam(iRandomPlayerANDiClient) == 3) //3 - это КТ
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelCT); //Установить модель
    }

    SetEntityHealth(iRandomPlayerANDiClient, iHealth); //Установить здоровье
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flLaggedMovementValue", fSpeed); //Установить скорость
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flGravity", fGravity); //Установить гравитацию

    SDKHook(iRandomPlayerANDiClient, SDKHook_OnTakeDamage, OnTakeDamage);

    CPrintToChatAll("\x04Игрок \x01%N \x04был выбран дед-морозом!", iRandomPlayerANDiClient);
    CPrintToChat(iRandomPlayerANDiClient, "\x04Вы стали дед-морозом, ваше \x01HP \x04изменились до \x01%iHP");
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    if(iAttacker != iVictim && iVictim == iRandomPlayer || iVictim == g_iClient)
    {
        //LR_ChangeClientValue(iAttacker, iLvlRanksXP);

        CPrintToChatAll("\x04Игрок \x01%N \x04получает награду за убийство дед-мороза!", iAttacker);
        CPrintToChatAll("\x04Его награда\x01: %i \x04Опыта!", iLvlRanksXP);
    }
}

public Action OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    bool bChange;
    bChange = false;
    if(iRandomPlayer == attacker)
    {
        damage *= fDamage;
        bChange = true;
    }

    if(iRandomPlayer == victim)
    {
        damage *= fBlockDamage;
        bChange = true;
    }

    return bChange ? Plugin_Changed : Plugin_Continue;
}

/*
public void Event_PlayerHurt(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    int iDmgHealth = GetEventInt(event, "dmg_health"); //Получает количество нанесенного урона игроку (не включая броню).
    
    if(iAttacker != iVictim && iVictim == iRandomPlayer)
    {
        //Shop_GiveClientCredits(iAttacker, iShopCredits);
        PrintToChatAll("Игрок %N Получил %i Кредитов за убийство Санты!", iAttacker, iShopCredits);
    }
}
*/
public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(IsClientInGame(iRandomPlayer)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(iRandomPlayer, Prop_Data, "m_flGravity", fGetGravityRandomPlayer);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты, и убийца не получил награду
        iRandomPlayer = 0;
    }
    if(IsClientInGame(g_iClient)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(g_iClient, Prop_Data, "m_flGravity", fGetGravityClient);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты и убийца не получил награду
        g_iClient = 0;
    }
}

GetRandomClient()
{
    int iIndexPlayers[MAXPLAYERS+1]; //Индекс игроков
    int iPlayers = 0; //Масив для хранение игроков которые в игре

    for(int i = 1; i <= MaxClients; i++) //Цикл по всем игрокам
    {
        if(IsClientInGame(i)) //Проверяем в игре ли игрок
        {
            iIndexPlayers[iPlayers++] = i; //Прибавляем игрока в масив
        }
    }

    if(iPlayers > 0) //Если игроков больше нуля
    {
        return iIndexPlayers[GetRandomInt(0, iPlayers-1)]; //Возвращаем рандомный индекс игрока в вызывающию функцию
    }

    return 0;
}

stock void LoadCfg()
{
    char szPath[PLATFORM_MAX_PATH]; //PLATFORM_MAX_PATH - Применяется в буферах под путь файла
    BuildPath(Path_SM, szPath, sizeof(szPath), "data/AutoChoiceOfSantaClaus.ini"); //Формируем путь к файлу
    KeyValues hKeyValues = new KeyValues("AutoChoiceOfSantaClaus");
    if(hKeyValues.ImportFromFile(szPath)) //Загружаем из файла
    {
        //Успешно загрузили
        //hKeyValues.Rewind(); //Возвращает указатель на позицию в самое начало структуры.
        iMaxPlayers = hKeyValues.GetNum("MaxPlayers");
        iEveryRound = hKeyValues.GetNum("EveryRound");
        hKeyValues.GetString("ModelT", sModelT, sizeof(sModelT));
        hKeyValues.GetString("ModelCT", sModelCT, sizeof(sModelCT));
        iHealth = hKeyValues.GetNum("Health");
        fSpeed = hKeyValues.GetFloat("Speed");
        fGravity = hKeyValues.GetFloat("Gravity");
        fDamage = hKeyValues.GetFloat("Damage");
        fBlockDamage = hKeyValues.GetFloat("BlockDamage");
        iLvlRanksXP = hKeyValues.GetNum("LvlRanksXP");
    }
    //delete hKeyValues;
}

public void OnMapStart()
{
    LoadCfg();
    PrecacheModel(sModelT);
    PrecacheModel(sModelCT);
}

public Action Cmd_ReloadCFG(int client, int args)
{
    LoadCfg();
    return Plugin_Handled;
}
 
Последнее редактирование:

StormX

Участник
Сообщения
828
Реакции
266
@StormX, Спасибо!
Сообщения автоматически склеены:

@StormX, Не подскажите в чём проблема? Поменял только цвета сообщений
L 11/28/2022 - 09:18:54: [SM] Exception reported: Client index 0 is invalid
L 11/28/2022 - 09:18:54: [SM] Blaming: AutoChoiceOfSantaClaus.smx
L 11/28/2022 - 09:18:54: [SM] Call stack trace:
L 11/28/2022 - 09:18:54: [SM] [0] IsClientInGame
L 11/28/2022 - 09:18:54: [SM] [1] Line 142, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundEnd
L 11/28/2022 - 09:20:12: [SM] Exception reported: Client index 0 is invalid
L 11/28/2022 - 09:20:12: [SM] Blaming: AutoChoiceOfSantaClaus.smx
L 11/28/2022 - 09:20:12: [SM] Call stack trace:
L 11/28/2022 - 09:20:12: [SM] [0] IsClientInGame
L 11/28/2022 - 09:20:12: [SM] [1] Line 142, C:\Users\Professional\Desktop\см\addons\sourcemod\scripting\AutoChoiceOfSantaClaus.sp::Event_RoundEnd

Исходник:
#include <sdktools_functions>
#include <sdktools_tempents>
#include <sdktools_tempents_stocks>
#include <sdkhooks>
#include <lvl_ranks>
#include <morecolors>

public Plugin myinfo =
{
    name = "Auto Choice Of Santa Claus",
    author = "KiKiEEKi (vk.com/kikieeki)",
    version = "1.0"
};

int iMaxPlayers = 6;
char sModelT[64] = "models/player/vad36santa/red.mdl";
char sModelCT[64] = "models/player/vad36santa/blue.mdl";
int iHealth = 150;
float fSpeed = 2.0;
float fGravity = 0.5;
float fDamage = 5.0;
float fBlockDamage = 0.6;
int iLvlRanksXP = 111;

int iRandomPlayer = 0;
float fGetGravityRandomPlayer;
int g_iClient = 0;
float fGetGravityClient;

int iNumberRound = 0; //Номер раунда
int iEveryRound = 2; //Каждый раунд N раунд будет выбран Санта

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_PlayerDeath, EventHookMode_Post);
    //HookEvent("player_hurt", Event_PlayerHurt, EventHookMode_Post);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);

    RegAdminCmd("sm_santa", Cmd_GiveSanta, ADMFLAG_ROOT, "Выбор дед-мороза");
    RegAdminCmd("sm_santa_reload", Cmd_ReloadCFG, ADMFLAG_CONFIG, "Перезагрузить конфиг");
}

public Action Cmd_GiveSanta(int iClient, int args)
{
    fGetGravityClient =  GetEntityGravity(iClient);
    g_iClient = iClient;
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере

    if(iGetCountPlayers >= iMaxPlayers)
    {
        SetSantaPlayer(g_iClient);
    }
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iGetCountPlayers = GetClientCount(true); //Максимальное кол-во игроков на сервере
 
    iNumberRound++; //Прибавляем +1 к счетчику раундов
    if(iGetCountPlayers >= iMaxPlayers && iNumberRound == iEveryRound)
    {
        fGetGravityRandomPlayer =  GetEntityGravity(iRandomPlayer); //Получаем гравитацию рандомного игрока
        iRandomPlayer = GetRandomClient(); //Выбор рандомного игрока

        SetSantaPlayer(iRandomPlayer);
        iNumberRound = 0; //Обнуляем счетчик раундов
    }
}

stock void SetSantaPlayer(int iRandomPlayerANDiClient)
{
    if(GetClientTeam(iRandomPlayerANDiClient) == 2) //2 - это Т
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelT); //Установить модель
    }
    else if(GetClientTeam(iRandomPlayerANDiClient) == 3) //3 - это КТ
    {
        SetEntityModel(iRandomPlayerANDiClient, sModelCT); //Установить модель
    }

    SetEntityHealth(iRandomPlayerANDiClient, iHealth); //Установить здоровье
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flLaggedMovementValue", fSpeed); //Установить скорость
    SetEntPropFloat(iRandomPlayerANDiClient, Prop_Data, "m_flGravity", fGravity); //Установить гравитацию

    SDKHook(iRandomPlayerANDiClient, SDKHook_OnTakeDamage, OnTakeDamage);

    CPrintToChatAll("\x04Игрок \x01%N \x04был выбран дед-морозом!", iRandomPlayerANDiClient);
    CPrintToChat(iRandomPlayerANDiClient, "\x04Вы стали дед-морозом, ваше \x01HP \x04изменились до \x01%iHP");
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    if(iAttacker != iVictim && iVictim == iRandomPlayer || iVictim == g_iClient)
    {
        //LR_ChangeClientValue(iAttacker, iLvlRanksXP);

        CPrintToChatAll("\x04Игрок \x01%N \x04получает награду за убийство дед-мороза!", iAttacker);
        CPrintToChatAll("\x04Его награда\x01: %i \x04Опыта!", iLvlRanksXP);
    }
}

public Action OnTakeDamage(victim, &attacker, &inflictor, &Float:damage, &damagetype)
{
    bool bChange;
    bChange = false;
    if(iRandomPlayer == attacker)
    {
        damage *= fDamage;
        bChange = true;
    }

    if(iRandomPlayer == victim)
    {
        damage *= fBlockDamage;
        bChange = true;
    }

    return bChange ? Plugin_Changed : Plugin_Continue;
}

/*
public void Event_PlayerHurt(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    int iVictim = GetClientOfUserId(hEvent.GetInt("userid"));

    int iDmgHealth = GetEventInt(event, "dmg_health"); //Получает количество нанесенного урона игроку (не включая броню).
 
    if(iAttacker != iVictim && iVictim == iRandomPlayer)
    {
        //Shop_GiveClientCredits(iAttacker, iShopCredits);
        PrintToChatAll("Игрок %N Получил %i Кредитов за убийство Санты!", iAttacker, iShopCredits);
    }
}
*/
public void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    if(IsClientInGame(iRandomPlayer)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(iRandomPlayer, Prop_Data, "m_flGravity", fGetGravityRandomPlayer);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты, и убийца не получил награду
        iRandomPlayer = 0;
    }
    if(IsClientInGame(g_iClient)) //Проверяем в игре ли игрок
    {
        SetEntPropFloat(g_iClient, Prop_Data, "m_flGravity", fGetGravityClient);
        //Обнуляем индекс игрока, что бы после раунда с Сантой его индес
        //Не сохранился на следущий раунд без Санты и убийца не получил награду
        g_iClient = 0;
    }
}

GetRandomClient()
{
    int iIndexPlayers[MAXPLAYERS+1]; //Индекс игроков
    int iPlayers = 0; //Масив для хранение игроков которые в игре

    for(int i = 1; i <= MaxClients; i++) //Цикл по всем игрокам
    {
        if(IsClientInGame(i)) //Проверяем в игре ли игрок
        {
            iIndexPlayers[iPlayers++] = i; //Прибавляем игрока в масив
        }
    }

    if(iPlayers > 0) //Если игроков больше нуля
    {
        return iIndexPlayers[GetRandomInt(0, iPlayers-1)]; //Возвращаем рандомный индекс игрока в вызывающию функцию
    }

    return 0;
}

stock void LoadCfg()
{
    char szPath[PLATFORM_MAX_PATH]; //PLATFORM_MAX_PATH - Применяется в буферах под путь файла
    BuildPath(Path_SM, szPath, sizeof(szPath), "data/AutoChoiceOfSantaClaus.ini"); //Формируем путь к файлу
    KeyValues hKeyValues = new KeyValues("AutoChoiceOfSantaClaus");
    if(hKeyValues.ImportFromFile(szPath)) //Загружаем из файла
    {
        //Успешно загрузили
        //hKeyValues.Rewind(); //Возвращает указатель на позицию в самое начало структуры.
        iMaxPlayers = hKeyValues.GetNum("MaxPlayers");
        iEveryRound = hKeyValues.GetNum("EveryRound");
        hKeyValues.GetString("ModelT", sModelT, sizeof(sModelT));
        hKeyValues.GetString("ModelCT", sModelCT, sizeof(sModelCT));
        iHealth = hKeyValues.GetNum("Health");
        fSpeed = hKeyValues.GetFloat("Speed");
        fGravity = hKeyValues.GetFloat("Gravity");
        fDamage = hKeyValues.GetFloat("Damage");
        fBlockDamage = hKeyValues.GetFloat("BlockDamage");
        iLvlRanksXP = hKeyValues.GetNum("LvlRanksXP");
    }
    //delete hKeyValues;
}

public void OnMapStart()
{
    LoadCfg();
    PrecacheModel(sModelT);
    PrecacheModel(sModelCT);
}

public Action Cmd_ReloadCFG(int client, int args)
{
    LoadCfg();
    return Plugin_Handled;
}

Попробуйте этот вариант.

P/S - ставить нету смысла данный плагин ибо он не цепляет даже конфиг, толку в нем не будет.
Нужно править все возможные баги 🤷‍♂️

У меня где то валяется приватный подобный плагин, найду, сброшу в тему, правда тоже криво работает, но лучше чем этот.
 

Вложения

  • AutoChoiceOfSantaClaus.smx
    12.8 КБ · Просмотры: 4
  • AutoChoiceOfSantaClaus.sp
    8.1 КБ · Просмотры: 7
Последнее редактирование:

Похожие темы

Сверху Снизу