Иконка ресурса

Auto Demo Record 1.0

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
если "запоминать" время записи каждого клиента
Всё-таки время для каждого указывается? Хорошо бы тогда брать серверу строку со всеми демками (сервер сам её обновляет) и записывать на стороне клиента, типа clientprefs. Далее её просто сравниваем по дате, "затираем" сильно старые демо, строку укорочиваем и снова записываем в память клиента игры.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Всё-таки время для каждого указывается? Хорошо бы тогда брать серверу строку со всеми демками (сервер сам её обновляет) и записывать на стороне клиента, типа clientprefs. Далее её просто сравниваем по дате, "затираем" сильно старые демо, строку укорочиваем и снова записываем в память клиента игры.
Тоже вариант. Только вот clientprefs ничего не сохраняет клиенту, а хранит все в sqlite базе сервера :)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Только вот clientprefs ничего не сохраняет клиенту
Оффтоп
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Оффтоп

Оффтоп
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Ясно. Я не это подразумевал под "догадайся", если что. Клиенту мы демо-ролик перезакачивать не будем.
Дак я и не про это имел ввиду)
Мы будем его перезаписывать (через record) и сразу же останавливать (ч-з stop).
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Всё верно. Только беспокоит один момент: а запись просто-напросто не продолжится, не "склеится" с тем демо, что уже было? Оффтоп
Перезапишется старая демка, во всяком случае не v34.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Ну всё, все идеи реализации набросали. Оффтоп
Оффтоп
--- Добавлено позже ---
Гы-гы, забавно.
PHP:
public Action:RecordPanel(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    if (client && GetClientTeam(client) > 0)
    {
        WelcomePanel(client);
        return Plugin_Stop;
    }
    else
    {
        CreateTimer(4.0, RecordPanel, GetClientUserId(client));
    }
    return Plugin_Continue;
}
Имеем вечный таймер, когда заходит сервер x)
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #71

Danyas

Участник
Сообщения
2,173
Реакции
1,072
L 03/25/2016 - 17:56:16: [DemoRecord.smx] Counter-Strike: Source
L 03/25/2016 - 17:56:16: [DemoRecord.smx] Counter-Strike_Source
L 03/25/2016 - 17:56:16: [DemoRecord.smx] record "SAVE/Counter-Strike_Source"
L 03/25/2016 - 17:56:18: [DemoRecord.smx] OnClientPutInServer: 1:2
L 03/25/2016 - 17:56:22: [DemoRecord.smx] RecordPanel: 1:2

Оказалось что OnClientPutInServer не ловит подключение "сервера".
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Вот набросал чего-то, теоретически должно работать.

PHP:
#include <sourcemod>

new String:command_record[128];

public OnPluginStart()
{
    new Handle:hCvarHostName = FindConVar("hostname"), String:sHostName[64];
    HookConVarChange(hCvarHostName, OnHostNameChanged);
    GetConVarString(hCvarHostName, sHostName, sizeof(sHostName));
    LogMessage(sHostName);
    EscapeHostNameStr(sHostName, sizeof(sHostName));
    LogMessage(sHostName);
    FormatEx(command_record, sizeof(command_record), "record \"SAVE/%s\"", sHostName);
    LogMessage(command_record);
}

public OnConfigsExecuted()
{
    new String:sHostName[64];
    GetConVarString(hCvarHostName, sHostName, sizeof(sHostName));
    EscapeHostNameStr(sHostName, sizeof(sHostName));
    FormatEx(command_record, sizeof(command_record), "record \"SAVE/%s\"", sHostName);
}

EscapeHostNameStr(String:str[], size)
{
    ReplaceString(str, size, " ","_");
    ReplaceString(str, size, "/","");
    ReplaceString(str, size, "\\", "");
    ReplaceString(str, size, ":","");
    ReplaceString(str, size, ";","");
    ReplaceString(str, size, "*","");
    ReplaceString(str, size, "?","");
    ReplaceString(str, size, "<","");
    ReplaceString(str, size, ">","");
    ReplaceString(str, size, "|","");
    ReplaceString(str, size, " ","");
    ReplaceString(str, size, "\"",""); // попытка экранировать "
    return String:str[size];
}


public OnHostNameChanged(Handle:convar, const String:oldValue[], const String:newValue[])
{
    if (!StrEqual(newValue, oldValue)) FormatEx(command_record, sizeof(command_record), "record SAVE/%s", newValue);
}

public OnClientPutInServer(client)
{
    LogMessage("OnClientPutInServer: %i:%i",client, GetClientUserId(client));
    CreateTimer(4.0, RecordPanel, GetClientUserId(client));
}


public Action:RecordPanel(Handle:timer, any:userid)
{
    new client = GetClientOfUserId(userid);
    LogMessage("RecordPanel: %i:%i",client, GetClientUserId(client));
    if (GetClientTeam(client) > 0)
    {
        WelcomePanel(client);
        return Plugin_Stop;
    }
    else
    {
        CreateTimer(4.0, RecordPanel, GetClientUserId(client));
    }
    return Plugin_Continue;
}

WelcomePanel(client)
{
    decl String:name[32], String:buffer[64];
    GetClientName(client, name, sizeof(name));

    new Handle:panel = CreatePanel();
    SetPanelTitle(panel, "[DemoRecord] Автоматическая запись демо.\n");
    
    Format(buffer, sizeof(buffer), "Добро пожаловать, %s!", name);
    DrawPanelText(panel, buffer);

    DrawPanelText(panel, "Хочешь записать свою игру?");
    DrawPanelText(panel, " ");
    DrawPanelItem(panel, "Да.");
    DrawPanelItem(panel, "Нет.");
    DrawPanelText(panel, " ");
    DrawPanelItem(panel, "Как это работает?");

    SendPanelToClient(panel, client, Select_Record_Panel, 0);

    CloseHandle(panel);
}

public Select_Record_Panel(Handle:panel, MenuAction:action, client, index)
{
    if (action == MenuAction_Select)
    {
        switch(index)
        {
            case 1:    Recorder(client);
            case 2: PrintToChat(client, "\x04[DemoRecord] \x01Вы отказались от записи демо!");
            case 3:    RulesPanel(client);
        }
    }
}

RulesPanel(client)
{
    new Handle:panel = CreatePanel();
    SetPanelTitle(panel, "[DemoRecord] Как это работает?");
    DrawPanelText(panel, " ");

    DrawPanelText(panel, "С Вашего соглашения автоматически запишется демо,");
    DrawPanelText(panel, "которое будет сохранено в папке cssv34/cstrike/save/");
    DrawPanelText(panel, "В случае бана или других спорных моментов,");
    DrawPanelText(panel, "при предоставлении демо вопросы будут решаться быстрей.");
    DrawPanelText(panel, " ");
    DrawPanelText(panel, "С уважением, администрация!");
    DrawPanelItem(panel, "Вернуться назад...");

    SendPanelToClient(panel, client, Select_Rules_Panel, 0);

    CloseHandle(panel);
}

public Select_Rules_Panel(Handle:panel, MenuAction:action, client, index)
{
    if (action == MenuAction_Select)
    {
        if (index == 1)
        {
            WelcomePanel(client);
        }
    }
}

Recorder(client)
{
    new Handle:KV = CreateKeyValues("DemoRecord");
    KvSetString(KV, "cmd", command_record);
    ShowVGUIPanel(client, "info", KV);
    CloseHandle(KV);
}
--- Добавлено позже ---
И вообще, нашел у себя в помойке тогдашние наброски
PHP:
public Plugin:myinfo =
{
    name = "Client Demo Recorder",
    author = "Danyas"
}

new Handle:g_hDemoName = INVALID_HANDLE;

public OnClientPutInServer(client)
{
decl String:demoname[192];
GetConVarString(g_hDemoName, demoname, 192);
Format(demoname, 192, "record %s;vban 0 0;chooseteam",demoname);
new Handle:fr = CreateKeyValues( "data", "", "" );
KvSetString(fr, "cmd", demoname);
ShowVGUIPanel(client, "info", fr, true);
CloseHandle(fr);
}

public OnPluginStart()
{
    g_hDemoName = CreateConVar("sm_demoname", "Danyas-autodemo", "Custom demo name", FCVAR_PLUGIN);
}
PHP:
public Plugin:myinfo =
{
    name = "Client Demo Recorder",
    author = "Danyas",
    description = "Records client-side demo",
    version = "1.7"
}

new Handle:g_hDemoName = INVALID_HANDLE;
new Handle:g_hDelayDemo = INVALID_HANDLE;

public OnClientPutInServer(client)
{
CreateTimer(GetConVarFloat(g_hDelayDemo), Timer_DemoRec, GetClientUserId(client), TIMER_FLAG_NO_MAPCHANGE);
}


public Action:Timer_DemoRec(Handle:timer, any:userid)
{
new client = GetClientOfUserId(userid);
decl String:demoname[192];
GetConVarString(g_hDemoName, demoname, 192);
Format(demoname, 192, "record %s",demoname);
new Handle:fr = CreateKeyValues( "data", "", "" );
KvSetString(fr, "cmd", demoname);
ShowVGUIPanel(client, "info", fr, true);
CloseHandle(fr);
}


public OnPluginStart()
{
    g_hDemoName = CreateConVar("sm_demoname", "ServerName-autodemo", "Custom demo name", FCVAR_PLUGIN);
    g_hDelayDemo = CreateConVar("sm_demoname_delay", "10.0", "Delay before record", FCVAR_PLUGIN);
}
 
Последнее редактирование:

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Мда... И это всё, из-за чего был сыр-бор?! Оффтоп Оффтоп
В каком смысле "всё"?
Это наброски, не более. Всё что мною задумано в первом посте - я реализовал, т.е. взятие hostname c "отсеканием" неразрешенных символов и ловли его при изменении, ну и запись соответственно.

Таймер не трогал, лишнюю проверку убрал.
На счет своего - хз, даже код не смотрел, но вроде как лежал в папке с рабочими исходниками
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Ну, такое мог и ТС уж дописать)
Не пойму, а где время, дата и карта в названии демки?
Насчёт символов - разве это все? Так ты замучаешься все перечислять.
Этих символов будет достаточно для записи файла, если найду более рациональное решение чем реплейс посимвольно - отпишу.
Это же получается, что она постоянно будет перезаписываться, 1 файл на 1 сервер? А как же доказательства, если потребуется предоставить через день-два "читерства"?
Как ты сможешь перезаписать демку после бана?)
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
если найду более рациональное решение чем реплейс посимвольно
Поиграйся, добавь допускаемые значения:
PHP:
public OnPluginStart()
{
    new String:buffer[] = "D/a\\n:y;as is cool";
    ToleranceFileSystem(buffer);
    PrintToServer("NEW file name: %s", buffer);
}

stock ToleranceFileSystem(String:FileName[])
{
    decl String:ReplaceChar[2];
    for (new i = strlen(FileName) - 1; i > -1; --i)
    {
        if (IsCharAlpha(FileName[i]) == false && IsCharSpace(FileName[i]) == false)
        {
            strcopy(ReplaceChar, sizeof(ReplaceChar), FileName[i]);
            ReplaceStringEx(FileName, 2, ReplaceChar, "", 1, 0);
        }
    }
}
Не совсем понял, зачем заменять пробел, если ФС его всегда допускает. Разве не примет в имени демо-ролика?
Зашёл, согласился - пошла запись. Карта сменилась - файл перезаписывает и доказательств, даже пары минут назад, уже нет.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Поиграйся, добавь допускаемые значения:
PHP:
public OnPluginStart()
{
    new String:buffer[] = "D/a\\n:y;as is cool";
    ToleranceFileSystem(buffer);
    PrintToServer("NEW file name: %s", buffer);
}

stock ToleranceFileSystem(String:FileName[])
{
    decl String:ReplaceChar[2];
    for (new i = strlen(FileName) - 1; i > -1; --i)
    {
        if (IsCharAlpha(FileName[i]) == false && IsCharSpace(FileName[i]) == false)
        {
            strcopy(ReplaceChar, sizeof(ReplaceChar), FileName[i]);
            ReplaceStringEx(FileName, 2, ReplaceChar, "", 1, 0);
        }
    }
}
Не совсем понял, зачем заменять пробел, если ФС его всегда допускает. Разве не примет в имени демо-ролика?
Зашёл, согласился - пошла запись. Карта сменилась - файл перезаписывает и доказательств, даже пары минут назад, уже нет.
record blah-blah blah - была бы blah-blah.dem, если бы не использовались лапки record "blah-blah blah"
Оффтоп
Про IsCharAlpha не знал, скорее всего им и воспользуюсь.


На счет перезаписи так и задумывалось (не баг, а фича! x)), разве что можно добавить в конце названии демо какой то символ, и менять его.
Например:
PHP:
new count;
...
public OnConfigsExecuted()
{
...
FormatEx(command_record, sizeof(command_record), "record \"SAVE/%s_%i\"", sHostName, count++);
...
}
 

666FoX666

Участник
Сообщения
702
Реакции
210
Народ, плагин будет работать на последней CSS? Если да, может кто кинуть рабочую версию, т.к. из 1го поста не работает.
 
Сверху Снизу