Подбор лежавшего на земле/которое дропнулиЧто конкретно вы подразумеваете под поднятием оружия?
1) Подбор лежавшего на земле
2) Подбор только что купленного оружия
3) Подбор по иным причинам (выдан плагином)
4) Свой вариант
Игрок купил, ему выдалось оружие. Это тоже считается за выдачу.А что имеется ввиду под "Подбор только что купленного оружия"?
#include <sdkhooks>
File hFile;
ConVar cvType;
int iType;
public void OnClientPostAdminCheck(int client)
{
SDKHook(client, SDKHook_WeaponCanUse, WeaponCanUse);
}
public void OnPluginEnd()
{
delete hFile;
}
public void OnCvHooked(ConVar convar, const char[] OldValue, const char[] NewValue)
{
if(convar != INVALID_HANDLE)
{
if(convar == cvType) iType = convar.IntValue;
}
}
public void OnPluginStart()
{
HookConVarChange((cvType = CreateConVar("log_type", "1")), OnCvHooked);
char path[PLATFORM_MAX_PATH];
BuildPath(Path_SM, path, sizeof(path), "logs/info.log");
hFile = OpenFile(path, "a+");
}
public Action WeaponCanUse(int client, int weapon)
{
if(weapon != -1 && 0 < client && IsClientInGame(client) && !IsFakeClient(client))
{
char sWeaponName[64];
GetEntityClassname(weapon, sWeaponName, sizeof(sWeaponName));
if(sWeaponName[0] && hFile != INVALID_HANDLE)
{
switch(iType)
{
case 0: WriteFileLine(hFile, "%N поднял %s", client, sWeaponName);
case 1: LogMessage("%N поднял %s", client, sWeaponName);
}
}
}
return Plugin_Continue;
}
Лучше через "%L", что бы в логе потом через SteamId можно было идентифицировать игрокапеременная log_type отвечает за тип лога(0 - Запись в файл, 1 - Вывод в консоле сервера)C-подобный:#include <sdkhooks> File hFile; ConVar cvType; int iType; public void OnClientPostAdminCheck(int client) { SDKHook(client, SDKHook_WeaponCanUse, WeaponCanUse); } public void OnPluginEnd() { HookConVarChange((cvType = CreateConVar("log_type", "1")), OnCvHooked); delete hFile; } public void OnCvHooked(ConVar convar, const char[] OldValue, const char[] NewValue) { if(convar != INVALID_HANDLE) { if(convar == cvType) iType = convar.IntValue; } } public void OnPluginStart() { char path[PLATFORM_MAX_PATH]; BuildPath(Path_SM, path, sizeof(path), "logs/info.log"); hFile = OpenFile(path, "a+"); } public Action WeaponCanUse(int client, int weapon) { if(weapon != -1 && 0 < client && IsClientInGame(client) && !IsFakeClient(client)) { char sWeaponName[64]; GetEntityClassname(weapon, sWeaponName, sizeof(sWeaponName)); if(sWeaponName[0] && hFile != INVALID_HANDLE) { switch(iType) { case 0: WriteFileLine(hFile, "%N поднял %s", client, sWeaponName); case 1: LogMessage("%N поднял %s", client, sWeaponName); } } } return Plugin_Continue; }
логгирует все что поднимаешь
Не юзаю никогда L, поэтому если нужно, сами все под себя сделают. Я просто пример +- написалЛучше через "%L", что бы в логе потом через SteamId можно было идентифицировать игрока
Если можно, я посмотрел бы и на Вашу версию
Спасибо!переменная log_type отвечает за тип лога(0 - Запись в файл, 1 - Вывод в консоле сервера)C-подобный:#include <sdkhooks> File hFile; ConVar cvType; int iType; public void OnClientPostAdminCheck(int client) { SDKHook(client, SDKHook_WeaponCanUse, WeaponCanUse); } public void OnPluginEnd() { HookConVarChange((cvType = CreateConVar("log_type", "1")), OnCvHooked); delete hFile; } public void OnCvHooked(ConVar convar, const char[] OldValue, const char[] NewValue) { if(convar != INVALID_HANDLE) { if(convar == cvType) iType = convar.IntValue; } } public void OnPluginStart() { char path[PLATFORM_MAX_PATH]; BuildPath(Path_SM, path, sizeof(path), "logs/info.log"); hFile = OpenFile(path, "a+"); } public Action WeaponCanUse(int client, int weapon) { if(weapon != -1 && 0 < client && IsClientInGame(client) && !IsFakeClient(client)) { char sWeaponName[64]; GetEntityClassname(weapon, sWeaponName, sizeof(sWeaponName)); if(sWeaponName[0] && hFile != INVALID_HANDLE) { switch(iType) { case 0: WriteFileLine(hFile, "%N поднял %s", client, sWeaponName); case 1: LogMessage("%N поднял %s", client, sWeaponName); } } } return Plugin_Continue; }
логгирует все что поднимаешь
логгирует в addons/sourcemod/logs/info.log
Ок, часов через 3 будет готовЕсли можно, я посмотрел бы и на Вашу версию
Сообщения автоматически склеены:
Спасибо!
@Palonez, ты бы границы значений квара задал (и имя более понятное сделал):
HookConVarChange((cvType = CreateConVar("log_type", "1")), OnCvHooked);
==>
HookConVarChange((cvType = CreateConVar("weapon_pickup_log_type", "1", _, _, true, _, true, 1.0)), OnCvHooked);
if(convar != INVALID_HANDLE)
if(sWeaponName[0] && hFile != INVALID_HANDLE)
#pragma semicolon 1
#pragma newdecls required
#include <sdkhooks>
File hFile;
public void OnPluginStart()
{
ConVar cvar = CreateConVar("weapon_pickup_log_type", "1", "Запись в: 0 - info.log, 1 - обычный лог", _, true, _, true, 1.0);
cvar.AddChangeHook(CVarChange);
CVarChange(cvar, "", "");
}
public void CVarChange(ConVar cvar, const char[] OldValue, const char[] NewValue)
{
if(cvar.BoolValue == !hFile)
return;
if(!hFile)
{
char path[PLATFORM_MAX_PATH];
BuildPath(Path_SM, path, sizeof(path), "logs/info.log");
hFile = OpenFile(path, "a");
}
else delete hFile;
}
public void OnClientPostAdminCheck(int client)
{
if(!IsFakeClient(client)) SDKHook(client, SDKHook_WeaponEquipPost, WeaponEquipPost);
}
public void WeaponEquipPost(int client, int weapon)
{
static char class[32];
if(weapon <= MaxClients || !GetEntityClassname(weapon, class, sizeof(class)))
return;
if(hFile) // выбрана запись в файл info.log и при этом получилось его открыть/создать
WriteFileLine(hFile, "%N поднял %s", client, class);
else LogMessage("%N поднял %s", client, class);
}
SDKHook_WeaponCanUse
- это не поднял, а только прикоснулся к оружию.А если мне потом потребуется отправлять логи на веб-сервер, то нудно что-то будет поменять в коде или эти логи будут отправляться вместе с теми, что отправляются без плагина?Ну и заодно переместил создание квара из OnPluginEnd() в OnPluginStart() ^_^
Сообщения автоматически склеены:
В хуке изменения квара вот эта проверка без надобности:if(convar != INVALID_HANDLE)
Вот тут проверять наличие хэндла нужно только при сохрании в отдельный файл:if(sWeaponName[0] && hFile != INVALID_HANDLE)
Переменную iType имеет смысл сделать bool, раз у неё бывает всего 2 значения. Ну и вместо switch() достаточно if ... else
Сообщения автоматически склеены:
и в OnPluginEnd() удалять хэндл без надобности: емнип, при завершении работы плагина все хэндлы им созданные удаляются
Сообщения автоматически склеены:
В каллбэке WeaponCanUse() не нужны проверки индекса (индекс игрока не меняется пока игрок на сервере), в игре ли игрок (при выходе игрока хук повешеный на него удаляется) и является ли игрок ботом (эту проверку лучше поместить в создание хука, чего зря нагружать проц бессмысленными действиями?).
Сообщения автоматически склеены:
В общем я бы сделал вот так (и в лог бы писалось независимо от значения квара даже если файл "logs/info.log" невозможно создать и открыть):C-подобный:#pragma semicolon 1 #pragma newdecls required #include <sdkhooks> File hFile; public void OnPluginStart() { ConVar cvar = CreateConVar("weapon_pickup_log_type", "1", "Запись в: 0 - info.log, 1 - обычный лог", _, true, _, true, 1.0); cvar.AddChangeHook(CVarChange); CVarChange(cvar, "", ""); } public void CVarChange(ConVar cvar, const char[] OldValue, const char[] NewValue) { if(cvar.BoolValue == !hFile) return; if(!hFile) { char path[PLATFORM_MAX_PATH]; BuildPath(Path_SM, path, sizeof(path), "logs/info.log"); hFile = OpenFile(path, "a"); } else delete hFile; } public void OnClientPostAdminCheck(int client) { if(!IsFakeClient(client)) SDKHook(client, SDKHook_WeaponEquipPost, WeaponEquipPost); } public void WeaponEquipPost(int client, int weapon) { static char class[32]; if(weapon <= MaxClients || !GetEntityClassname(weapon, class, sizeof(class))) return; if(hFile) // выбрана запись в файл info.log и при этом получилось его открыть/создать WriteFileLine(hFile, "%N поднял %s", client, class); else LogMessage("%N поднял %s", client, class); }
Сообщения автоматически склеены:
И да,SDKHook_WeaponCanUse
- это не поднял, а только прикоснулся к оружию.
нет, без проблем. Возможно даже не понадобиться ничего дописывать. Если плагин, что отправляет на WEB работает через `OnLogAction`.А если мне потом потребуется отправлять логи на веб-сервер, то нудно что-то будет поменять в коде или эти логи будут отправляться вместе с теми, что отправляются без плагина?
Спасибо большое!нет, без проблем. Возможно даже не понадобиться ничего дописывать. Если плагин, что отправляет на WEB работает через `OnLogAction`.
Сообщения автоматически склеены:
![]()
Weapon Pickup Logger
Записывает событие, когда игрок подбирает оружие. Специфическая причина записывается в лог. Существует 4 типа подъема: 1. При покупке. Игрок купил оружие и оно ему бросилось в глаза. 2. При спавне. Выдача дефолтного оружия при спавне (в течение...hlmod.net
Извините, а не могли бы, пожалуйста, подсказать этот плагин? Всё ищу как отправить на веб, но ничего не могу найтинет, без проблем. Возможно даже не понадобиться ничего дописывать. Если плагин, что отправляет на WEB работает через `OnLogAction`.
Сообщения автоматически склеены:
![]()
Weapon Pickup Logger
Записывает событие, когда игрок подбирает оружие. Специфическая причина записывается в лог. Существует 4 типа подъема: 1. При покупке. Игрок купил оружие и оно ему бросилось в глаза. 2. При спавне. Выдача дефолтного оружия при спавне (в течение...hlmod.net
Rest In Pawn в помощь если надо на апи отправлять, если так, то в MSQL записывать =) Да и если этим 100% придётся забивать бд, чувствую, умрёт она у тебя через месяц, если она ещё и на арене то через неделю забьётся, т.к там всего то максимум вроде 1гб =)Извините, а не могли бы, пожалуйста, подсказать этот плагин? Всё ищу как отправить на веб, но ничего не могу найти
А не подскажите какой тип должен быть у входного параметра, если по апи передавать? Я ставил String/Map/JSONObject, но Spring мне говорит, что это всё не те типы, которые ему нужныRest In Pawn в помощь если надо на апи отправлять, если так, то в MSQL записывать =) Да и если этим 100% придётся забивать бд, чувствую, умрёт она у тебя через месяц, если она ещё и на арене то через неделю забьётся, т.к там всего то максимум вроде 1гб =)
JSONObject ты передаёшь любые данные, ключ -> значение, но ты передавай в ключи нужное.А не подскажите какой тип должен быть у входного параметра, если по апи передавать? Я ставил String/Map/JSONObject, но Spring мне говорит, что это всё не те типы, которые ему нужны
JSONObject hObj = new JSONObject();
char sBuffer[256];
g_hCvar_ServerName.GetString(sBuffer, sizeof(sBuffer));
hObj.SetString("server_name", sBuffer);
hObj.SetInt("tt_win", GetTeamScore(CS_TEAM_T));