Написание плагинов

babka68

Участник
Сообщения
2,124
Реакции
956
Привет, ребят! Еще раз вот вопрос такой, подскажите, как вот подправить плагин. А то вот когда надпись выходит играть за бота и ник бота такой то, то она выходит не только когда мертвый, но и когда просто бежишь живой и она по центру. А нужно только когда не живой. (сервер cs source steam)

C-подобный:
#include <cstrike>
#include <sdktools>
#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =  {
    name = "Bot Replacer",
    author = "SenatoR, babka68",
    description = "Игрок может сыграть вместо бота",
    version = "1.2",
    url = "https://vk.com/zakazserver68, hlmod.ru"
}

Handle CheckSpecTimer[MAXPLAYERS + 1];
int BotAmount[MAXPLAYERS + 1], g_iAmountBot, g_iPriceBot;
bool g_bShow_Message_Hud, g_bType_Kick;

public void OnPluginStart() {
    //HookEvent("round_start", EventRoundStart);
    HookEvent("round_end", EventRoundEnd);
    ConVar cvar;
    cvar = CreateConVar("sm_bot_replacer_amount", "20", "Сколько раз за раунд игрок может сыграть вместо бота?", _, true, 0.0, true, 20.0);
    cvar.AddChangeHook(CVarChanged_Amount_Bot);
    g_iAmountBot = cvar.IntValue;
  
    cvar = CreateConVar("sm_bot_replacer_price", "1", "Сколько стоит сыграть за бота?", _, true, 0.0, true, 16000.0);
    cvar.AddChangeHook(CVarChanged_Price_Bot);
    g_iPriceBot = cvar.IntValue;
  
    cvar = CreateConVar("sm_bot_replacer_showhud", "1", "Показывать сообщение, что можно играть за бота?", _, true, 0.0, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Show_Message_Hud);
    g_bShow_Message_Hud = cvar.BoolValue;
  
    cvar = CreateConVar("sm_bot_replacer_typekick", "0", "0 - Кикнуть бота, 1 - Удалить бота", _, true, 0.0, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Type_Kick);
    g_bType_Kick = cvar.BoolValue;
  
    AutoExecConfig(true, "sm_bot_replacer");
}

public void CVarChanged_Amount_Bot(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_iAmountBot = cvar.IntValue;
}

public void CVarChanged_Price_Bot(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_iPriceBot = cvar.IntValue;
}

public void CVarChanged_Show_Message_Hud(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_bShow_Message_Hud = cvar.BoolValue;
}

public void CVarChanged_Type_Kick(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_bType_Kick = cvar.BoolValue;
}

public void OnClientPostAdminCheck(int client) {
    if (!IsFakeClient(client) && g_bShow_Message_Hud)
        CheckSpecTimer[client] = CreateTimer(1.0, Spec_Timer, client, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
}

public Action Spec_Timer(Handle timer, any client) {
int i = 0;
i = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
if (i > 0 && IsFakeClient(i) && GetClientTeam(client) == GetClientTeam(i)) {
PrintHintText(client, "Нажмите E чтобы играть за бота %N", i);
PrintToChat(client, "Press E to play for bot %N", i);
}
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) {
    if (buttons & IN_USE && !IsPlayerAlive(client)) {
        int i = 0;
        i = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
        int price = g_iPriceBot;
        int cash = GetEntProp(client, Prop_Send, "m_iAccount");
        if (i > 0 && IsFakeClient(i) && GetClientTeam(client) == GetClientTeam(i) && BotAmount[client] < g_iAmountBot && price <= cash) {
            SetEntProp(client, Prop_Send, "m_iAccount", cash - price);
            int health = GetClientHealth(i);
            int armor = GetClientArmor(i);
            float pos[3];
            GetClientAbsOrigin(i, pos);
            if (g_bType_Kick)
                ServerCommand("bot_kick %N", i);
            else
                KickClient(i);
            CS_RespawnPlayer(client);
            SetEntityHealth(client, health);
            SetEntProp(client, Prop_Data, "m_ArmorValue", armor);
            TeleportEntity(client, pos, NULL_VECTOR, NULL_VECTOR);
            BotAmount[client]++;
        }
    }
}

public void EventRoundEnd(Event event, const char[] name, bool dontBroadcast) {
    for (int i = 1; i <= MaxClients; i++) {
        BotAmount[i] = 0;
    }
}

public void OnClientDisconnect(int client) {
    if (CheckSpecTimer[client] != null) {
        KillTimer(CheckSpecTimer[client]);
        CheckSpecTimer[client] = null;
    }
}
Сообщения автоматически склеены:


Ну вот, закинул плагин. Я прописан в випке как админ. Вот я перезапустил сервер, захожу. Вип у меня нету. Вот он выдает его. Я открываю вип меню и вижу только слово настройки управления там нет. А если удаляю вип статус через файлы в ftp, потом меняю карту, выдаю себе вип через управления системой. там все ок.
Вечером напомните, нужно добавить 1 проверку, пока что занят(
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Привет, ребят! Еще раз вот вопрос такой, подскажите, как вот подправить плагин. А то вот когда надпись выходит играть за бота и ник бота такой то, то она выходит не только когда мертвый, но и когда просто бежишь живой и она по центру. А нужно только когда не живой. (сервер cs source steam)

C-подобный:
#include <cstrike>
#include <sdktools>
#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =  {
    name = "Bot Replacer",
    author = "SenatoR, babka68",
    description = "Игрок может сыграть вместо бота",
    version = "1.2",
    url = "https://vk.com/zakazserver68, hlmod.ru"
}

Handle CheckSpecTimer[MAXPLAYERS + 1];
int BotAmount[MAXPLAYERS + 1], g_iAmountBot, g_iPriceBot;
bool g_bShow_Message_Hud, g_bType_Kick;

public void OnPluginStart() {
    //HookEvent("round_start", EventRoundStart);
    HookEvent("round_end", EventRoundEnd);
    ConVar cvar;
    cvar = CreateConVar("sm_bot_replacer_amount", "20", "Сколько раз за раунд игрок может сыграть вместо бота?", _, true, 0.0, true, 20.0);
    cvar.AddChangeHook(CVarChanged_Amount_Bot);
    g_iAmountBot = cvar.IntValue;
   
    cvar = CreateConVar("sm_bot_replacer_price", "1", "Сколько стоит сыграть за бота?", _, true, 0.0, true, 16000.0);
    cvar.AddChangeHook(CVarChanged_Price_Bot);
    g_iPriceBot = cvar.IntValue;
   
    cvar = CreateConVar("sm_bot_replacer_showhud", "1", "Показывать сообщение, что можно играть за бота?", _, true, 0.0, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Show_Message_Hud);
    g_bShow_Message_Hud = cvar.BoolValue;
   
    cvar = CreateConVar("sm_bot_replacer_typekick", "0", "0 - Кикнуть бота, 1 - Удалить бота", _, true, 0.0, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Type_Kick);
    g_bType_Kick = cvar.BoolValue;
   
    AutoExecConfig(true, "sm_bot_replacer");
}

public void CVarChanged_Amount_Bot(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_iAmountBot = cvar.IntValue;
}

public void CVarChanged_Price_Bot(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_iPriceBot = cvar.IntValue;
}

public void CVarChanged_Show_Message_Hud(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_bShow_Message_Hud = cvar.BoolValue;
}

public void CVarChanged_Type_Kick(ConVar cvar, const char[] oldValue, const char[] newValue) {
    g_bType_Kick = cvar.BoolValue;
}

public void OnClientPostAdminCheck(int client) {
    if (!IsFakeClient(client) && g_bShow_Message_Hud)
        CheckSpecTimer[client] = CreateTimer(1.0, Spec_Timer, client, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
}

public Action Spec_Timer(Handle timer, any client) {
int i = 0;
i = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
if (i > 0 && IsFakeClient(i) && GetClientTeam(client) == GetClientTeam(i)) {
PrintHintText(client, "Нажмите E чтобы играть за бота %N", i);
PrintToChat(client, "Press E to play for bot %N", i);
}
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon) {
    if (buttons & IN_USE && !IsPlayerAlive(client)) {
        int i = 0;
        i = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
        int price = g_iPriceBot;
        int cash = GetEntProp(client, Prop_Send, "m_iAccount");
        if (i > 0 && IsFakeClient(i) && GetClientTeam(client) == GetClientTeam(i) && BotAmount[client] < g_iAmountBot && price <= cash) {
            SetEntProp(client, Prop_Send, "m_iAccount", cash - price);
            int health = GetClientHealth(i);
            int armor = GetClientArmor(i);
            float pos[3];
            GetClientAbsOrigin(i, pos);
            if (g_bType_Kick)
                ServerCommand("bot_kick %N", i);
            else
                KickClient(i);
            CS_RespawnPlayer(client);
            SetEntityHealth(client, health);
            SetEntProp(client, Prop_Data, "m_ArmorValue", armor);
            TeleportEntity(client, pos, NULL_VECTOR, NULL_VECTOR);
            BotAmount[client]++;
        }
    }
}

public void EventRoundEnd(Event event, const char[] name, bool dontBroadcast) {
    for (int i = 1; i <= MaxClients; i++) {
        BotAmount[i] = 0;
    }
}

public void OnClientDisconnect(int client) {
    if (CheckSpecTimer[client] != null) {
        KillTimer(CheckSpecTimer[client]);
        CheckSpecTimer[client] = null;
    }
}
Сообщения автоматически склеены:


Ну вот, закинул плагин. Я прописан в випке как админ. Вот я перезапустил сервер, захожу. Вип у меня нету. Вот он выдает его. Я открываю вип меню и вижу только слово настройки управления там нет. А если удаляю вип статус через файлы в ftp, потом меняю карту, выдаю себе вип через управления системой. там все ок.
Вы группу вписали которую выдавать? В первых ковычках нужно группу указать
 

babka68

Участник
Сообщения
2,124
Реакции
956
хорошо спасибо буду ждать
По хорошему переписать бы это всё по новой, потому что живым не будет писать сообщение, а вот когда кончится лимит и игрок будет тыкать кнопку и не понимать почему он ее может сыграть), когда ему пишет надпись
C-подобный:
#include <cstrike>
#include <sdktools>
#pragma semicolon 1
#pragma newdecls required

public Plugin myinfo =
{
    name = "Bot Replacer",
    author = "SenatoR, babka68",
    description = "Игрок может сыграть вместо бота",
    version = "1.2",
    url = "https://vk.com/zakazserver68, hlmod.ru"
}

Handle CheckSpecTimer[MAXPLAYERS + 1];
int BotAmount[MAXPLAYERS + 1], g_iAmountBot, g_iPriceBot;
bool g_bShow_Message_Hud, g_bType_Kick;

public void OnPluginStart()
{
    HookEvent("round_end", EventRoundEnd);
    ConVar cvar;
    cvar = CreateConVar("sm_bot_replacer_amount", "20", "Сколько раз за раунд игрок может сыграть вместо бота?", _, true, 0.0, true, 20.0);
    cvar.AddChangeHook(CVarChanged_Amount_Bot);
    g_iAmountBot = cvar.IntValue;
   
    cvar = CreateConVar("sm_bot_replacer_price", "1", "Сколько стоит сыграть за бота?", _, true, 0.0, true, 16000.0);
    cvar.AddChangeHook(CVarChanged_Price_Bot);
    g_iPriceBot = cvar.IntValue;
   
    cvar = CreateConVar("sm_bot_replacer_showhud", "1", "Показывать сообщение, что можно играть за бота?", _, true, 0.0, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Show_Message_Hud);
    g_bShow_Message_Hud = cvar.BoolValue;
   
    cvar = CreateConVar("sm_bot_replacer_typekick", "0", "0 - Кикнуть бота, 1 - Удалить бота", _, true, 0.0, true, 1.0);
    cvar.AddChangeHook(CVarChanged_Type_Kick);
    g_bType_Kick = cvar.BoolValue;
   
    AutoExecConfig(true, "sm_bot_replacer");
}

public void CVarChanged_Amount_Bot(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    g_iAmountBot = cvar.IntValue;
}

public void CVarChanged_Price_Bot(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    g_iPriceBot = cvar.IntValue;
}

public void CVarChanged_Show_Message_Hud(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    g_bShow_Message_Hud = cvar.BoolValue;
}

public void CVarChanged_Type_Kick(ConVar cvar, const char[] oldValue, const char[] newValue)
{
    g_bType_Kick = cvar.BoolValue;
}

public void OnClientPostAdminCheck(int client)
{
    if (!IsFakeClient(client) && g_bShow_Message_Hud)
    {
        CheckSpecTimer[client] = CreateTimer(1.0, Spec_Timer, client, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action Spec_Timer(Handle timer, any client)
{
    int i = 0;
    i = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
    if (i > 0 && IsFakeClient(i) && GetClientTeam(client) == GetClientTeam(i) && IsPlayerAlive(i))
    {
        PrintHintText(client, "Нажмите E чтобы играть за бота %N", i);
        PrintToChat(client, "Press E to play for bot %N", i);
    }
    return Plugin_Continue;
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon)
{
    if (buttons & IN_USE && !IsPlayerAlive(client))
    {
        int i = 0;
        i = GetEntPropEnt(client, Prop_Send, "m_hObserverTarget");
        int price = g_iPriceBot;
        int cash = GetEntProp(client, Prop_Send, "m_iAccount");
       
        if (i > 0 && IsFakeClient(i) && GetClientTeam(client) == GetClientTeam(i) && BotAmount[client] < g_iAmountBot && price <= cash)
        {
            SetEntProp(client, Prop_Send, "m_iAccount", cash - price);
            int health = GetClientHealth(i);
            int armor = GetClientArmor(i);
            float pos[3];
            GetClientAbsOrigin(i, pos);
            if (g_bType_Kick)
                ServerCommand("bot_kick %N", i);
            else
                KickClient(i);
            CS_RespawnPlayer(client);
            SetEntityHealth(client, health);
            SetEntProp(client, Prop_Data, "m_ArmorValue", armor);
            TeleportEntity(client, pos, NULL_VECTOR, NULL_VECTOR);
            BotAmount[client]++;
        }
    }
    return Plugin_Continue;
}

public void EventRoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        BotAmount[i] = 0;
    }
}

public void OnClientDisconnect(int client)
{
    if (CheckSpecTimer[client] != null)
    {
        KillTimer(CheckSpecTimer[client]);
        CheckSpecTimer[client] = null;
    }
}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@alexnet, попробуй такой вариант (от спама сообщениями в чат каждую секунду не лечил)
 

Вложения

  • sm_bot_replacer 1.3.0_22.01.2024.sp
    4.7 КБ · Просмотры: 16

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@alexnet, а можно скрин что в результате вышло?
Просто PrintHintText() - это вывод в хинт, как на скриншоте выше.
В центре - это PrintCenterText() (белый текст чуть выше прицела и без фона).
 

khood

Участник
Сообщения
214
Реакции
51
Здравствуйте, пожалуйста, помогите мне отключить сообщения о получении достижений от игры.
1706195577123.png


C-подобный:
public void OnPluginStart() {
    HookEvent("player_connect_client", player_connect_client, EventHookMode_Pre);
    HookEvent("player_disconnect", EVT, EventHookMode_Pre);
    HookEvent("server_cvar", EVT, EventHookMode_Pre);
    HookEvent("player_team", EVT, EventHookMode_Pre);
}

public Action player_connect_client(Handle event, const char[] name, bool silent) {
  
    char s_steam[64], s_name[64], s_address[32];
    GetEventString(event, "name", s_name, sizeof(s_name));
    GetEventString(event, "networkid", s_steam, sizeof(s_steam));
    GetEventString(event, "address", s_address, sizeof(s_address));
          
    return Plugin_Handled;
}

public Action EVT(Event hEvent, const char[] sName, bool dontBroadcast) {
 
  if(!dontBroadcast) {
    SetEventBroadcast(hEvent, true);
  
    return Plugin_Changed;
  }
 
  return Plugin_Continue;
}
 
Последнее редактирование:

DarkerZ

Участник
Сообщения
395
Реакции
175
Здравствуйте, пожалуйста, помогите мне отключить сообщения о получении достижений от игры. Посмотреть вложение 116576

C-подобный:
public void OnPluginStart() {
    HookEvent("player_connect_client", player_connect_client, EventHookMode_Pre);
    HookEvent("player_disconnect", EVT, EventHookMode_Pre);
    HookEvent("server_cvar", EVT, EventHookMode_Pre);
    HookEvent("player_team", EVT, EventHookMode_Pre);
}

public Action player_connect_client(Handle event, const char[] name, bool silent) {
  
    char s_steam[64], s_name[64], s_address[32];
    GetEventString(event, "name", s_name, sizeof(s_name));
    GetEventString(event, "networkid", s_steam, sizeof(s_steam));
    GetEventString(event, "address", s_address, sizeof(s_address));
          
    return Plugin_Handled;
}

public Action EVT(Event hEvent, const char[] sName, bool dontBroadcast) {
 
  if(!dontBroadcast) {
    SetEventBroadcast(hEvent, true);
  
    return Plugin_Changed;
  }
 
  return Plugin_Continue;
}
Мб этот achievement_earned Counter-Strike: Source Events - AlliedModders Wiki
 

babka68

Участник
Сообщения
2,124
Реакции
956
Здравствуйте, пожалуйста, помогите мне отключить сообщения о получении достижений от игры. Посмотреть вложение 116576

C-подобный:
public void OnPluginStart() {
    HookEvent("player_connect_client", player_connect_client, EventHookMode_Pre);
    HookEvent("player_disconnect", EVT, EventHookMode_Pre);
    HookEvent("server_cvar", EVT, EventHookMode_Pre);
    HookEvent("player_team", EVT, EventHookMode_Pre);
}

public Action player_connect_client(Handle event, const char[] name, bool silent) {
 
    char s_steam[64], s_name[64], s_address[32];
    GetEventString(event, "name", s_name, sizeof(s_name));
    GetEventString(event, "networkid", s_steam, sizeof(s_steam));
    GetEventString(event, "address", s_address, sizeof(s_address));
       
    return Plugin_Handled;
}

public Action EVT(Event hEvent, const char[] sName, bool dontBroadcast) {
 
  if(!dontBroadcast) {
    SetEventBroadcast(hEvent, true);
 
    return Plugin_Changed;
  }
 
  return Plugin_Continue;
}
C-подобный:
// EN: Disabling the collection of statistics and achievements. (Default: 0)
// RU: Отключение сбора статистики и достижений. (По умолчанию: 0)
sv_nostats 0
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Подскажите, пожалуйста, правлю lvlrank под свои нужды и столкнулся с проблемой. Там есть функция LR_PrintMessage, которую можно заменить на тот же C_PrintToChat и все окей, а вот события убийств происходят через NotifClient. Как привести код к C_PrintToChat ?

пример в файле перевода "Suicide":
    "Suicide"
    {
        "#format"    "{1:i},{2:s}"
        "ru"        "{lightgreen}[LR] {green}Ваш опыт: {DEFAULT}{1} [{2} за самоубийство]"

    }

а в исходниках, только вот это отвечает за данный перевод

event.sp:
void Event_PlayerDeath(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid")),
        iAttacker = GetClientOfUserId(hEvent.GetInt("attacker")),
        iAssister = GetClientOfUserId(hEvent.GetInt("assister"));

    if(NotifClient(iAssister, g_SettingsStats[LR_ExpGiveAssist], "AssisterKill"))
    {
        g_iPlayerInfo[iAssister].iStats[ST_ASSISTS]++;
        g_iPlayerInfo[iAssister].iSessionStats[ST_ASSISTS]++;
    }

    if(iClient && iAttacker)
    {
        if(iAttacker == iClient)
        {
            NotifClient(iClient, -g_SettingsStats[LR_ExpGiveSuicide], "Suicide");
        }
        else
        {
            if(!g_Settings[LR_AllAgainstAll] && GetClientTeam(iClient) == GetClientTeam(iAttacker))
            {
                NotifClient(iAttacker, -g_SettingsStats[LR_ExpGiveTeamKill], "TeamKill");
            }
            else
            {
                bool bFakeClient = IsFakeClient(iClient),
                     bFakeAttacker = IsFakeClient(iAttacker);

                int iExpAttacker = 0, iExpVictim = 0;

                if(!g_Settings[LR_TypeStatistics])
                {
                    iExpAttacker = g_SettingsStats[LR_ExpKill + view_as<int>(bFakeClient)];        // LR_ExpKillIsBot
                    iExpVictim = g_SettingsStats[LR_ExpDeath + view_as<int>(bFakeAttacker)];        // LR_ExpDeathIsBot

                    CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker);
                }
                else if(!bFakeClient && !bFakeAttacker)
                {
                    if(g_Settings[LR_TypeStatistics] == 1)
                    {
                        iExpAttacker = RoundToNearest(float(g_iPlayerInfo[iClient].iStats[ST_EXP]) / g_iPlayerInfo[iAttacker].iStats[ST_EXP] * 5.0);

                        CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker);

                        if(iExpAttacker < 1)
                        {
                            iExpAttacker = 1;
                        }

                        if((iExpVictim = RoundToNearest(iExpAttacker * view_as<float>(g_SettingsStats[LR_ExpKillCoefficient]))) < 1)
                        {
                            iExpVictim = 1;
                        }
                    }
                    else
                    {
                        iExpAttacker = g_iPlayerInfo[iClient].iStats[ST_EXP] - g_iPlayerInfo[iAttacker].iStats[ST_EXP];

                        CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker);

                        iExpVictim = iExpAttacker = iExpAttacker < 3 ? 2 : (iExpAttacker / 100) + 2;
                    }
                }

                if(NotifClient(iAttacker, iExpAttacker, "Kill") + NotifClient(iClient, -iExpVictim, "MyDeath"))
                {
                    if(!bFakeAttacker)
                    {
                        if(hEvent.GetBool("headshot") && NotifClient(iAttacker, g_SettingsStats[LR_ExpGiveHeadShot], "HeadShotKill"))
                        {
                            g_iPlayerInfo[iAttacker].iStats[ST_HEADSHOTS]++;
                            g_iPlayerInfo[iAttacker].iSessionStats[ST_HEADSHOTS]++;
                        }

                        g_iPlayerInfo[iAttacker].iStats[ST_KILLS]++;
                        g_iPlayerInfo[iAttacker].iSessionStats[ST_KILLS]++;
                        g_iPlayerInfo[iAttacker].iKillStreak++;
                    }

                    if(!bFakeClient)
                    {
                        g_iPlayerInfo[iClient].iStats[ST_DEATHS]++;
                        g_iPlayerInfo[iClient].iSessionStats[ST_DEATHS]++;
                    }

                    CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker, false);
                }
            }
        }

        GiveExpForStreakKills(iClient);
    }
}
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Подскажите, пожалуйста, правлю lvlrank под свои нужды и столкнулся с проблемой. Там есть функция LR_PrintMessage, которую можно заменить на тот же C_PrintToChat и все окей, а вот события убийств происходят через NotifClient. Как привести код к C_PrintToChat ?

пример в файле перевода "Suicide""Suicide":
    "Suicide"
    {
        "#format"    "{1:i},{2:s}"
        "ru"        "{lightgreen}[LR] {green}Ваш опыт: {DEFAULT}{1} [{2} за самоубийство]"

    }

а в исходниках, только вот это отвечает за данный перевод

event.sp:
void Event_PlayerDeath(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid")),
        iAttacker = GetClientOfUserId(hEvent.GetInt("attacker")),
        iAssister = GetClientOfUserId(hEvent.GetInt("assister"));

    if(NotifClient(iAssister, g_SettingsStats[LR_ExpGiveAssist], "AssisterKill"))
    {
        g_iPlayerInfo[iAssister].iStats[ST_ASSISTS]++;
        g_iPlayerInfo[iAssister].iSessionStats[ST_ASSISTS]++;
    }

    if(iClient && iAttacker)
    {
        if(iAttacker == iClient)
        {
            NotifClient(iClient, -g_SettingsStats[LR_ExpGiveSuicide], "Suicide");
        }
        else
        {
            if(!g_Settings[LR_AllAgainstAll] && GetClientTeam(iClient) == GetClientTeam(iAttacker))
            {
                NotifClient(iAttacker, -g_SettingsStats[LR_ExpGiveTeamKill], "TeamKill");
            }
            else
            {
                bool bFakeClient = IsFakeClient(iClient),
                     bFakeAttacker = IsFakeClient(iAttacker);

                int iExpAttacker = 0, iExpVictim = 0;

                if(!g_Settings[LR_TypeStatistics])
                {
                    iExpAttacker = g_SettingsStats[LR_ExpKill + view_as<int>(bFakeClient)];        // LR_ExpKillIsBot
                    iExpVictim = g_SettingsStats[LR_ExpDeath + view_as<int>(bFakeAttacker)];        // LR_ExpDeathIsBot

                    CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker);
                }
                else if(!bFakeClient && !bFakeAttacker)
                {
                    if(g_Settings[LR_TypeStatistics] == 1)
                    {
                        iExpAttacker = RoundToNearest(float(g_iPlayerInfo[iClient].iStats[ST_EXP]) / g_iPlayerInfo[iAttacker].iStats[ST_EXP] * 5.0);

                        CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker);

                        if(iExpAttacker < 1)
                        {
                            iExpAttacker = 1;
                        }

                        if((iExpVictim = RoundToNearest(iExpAttacker * view_as<float>(g_SettingsStats[LR_ExpKillCoefficient]))) < 1)
                        {
                            iExpVictim = 1;
                        }
                    }
                    else
                    {
                        iExpAttacker = g_iPlayerInfo[iClient].iStats[ST_EXP] - g_iPlayerInfo[iAttacker].iStats[ST_EXP];

                        CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker);

                        iExpVictim = iExpAttacker = iExpAttacker < 3 ? 2 : (iExpAttacker / 100) + 2;
                    }
                }

                if(NotifClient(iAttacker, iExpAttacker, "Kill") + NotifClient(iClient, -iExpVictim, "MyDeath"))
                {
                    if(!bFakeAttacker)
                    {
                        if(hEvent.GetBool("headshot") && NotifClient(iAttacker, g_SettingsStats[LR_ExpGiveHeadShot], "HeadShotKill"))
                        {
                            g_iPlayerInfo[iAttacker].iStats[ST_HEADSHOTS]++;
                            g_iPlayerInfo[iAttacker].iSessionStats[ST_HEADSHOTS]++;
                        }

                        g_iPlayerInfo[iAttacker].iStats[ST_KILLS]++;
                        g_iPlayerInfo[iAttacker].iSessionStats[ST_KILLS]++;
                        g_iPlayerInfo[iAttacker].iKillStreak++;
                    }

                    if(!bFakeClient)
                    {
                        g_iPlayerInfo[iClient].iStats[ST_DEATHS]++;
                        g_iPlayerInfo[iClient].iSessionStats[ST_DEATHS]++;
                    }

                    CallForward_OnPlayerKilled(hEvent, iExpAttacker, iClient, iAttacker, false);
                }
            }
        }

        GiveExpForStreakKills(iClient);
    }
}

Достаточно изменить только функцию LR_PrintMessage:
code:
void LR_PrintMessage(int iClient, bool bPrefix, bool bNative, const char[] sFormat, any ...)
{
    if(iClient && IsClientInGame(iClient) && !IsFakeClient(iClient))
    {
        static char sMessage[2048];
        VFormat(sMessage, sizeof(sMessage), sFormat, 5);
        C_PrintToChat(iClient, sMessage);
    }
}
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Подскажите, пожалуйста, как добавить дополнительно текст в чат C_PrintToChat, ничего не удаляя, на каждое событие: BombDefused, BombPlanted, BombDropped, BombPickup, например на BombPlanted, в чат текст "Бомба установлена"

код:
void Events_Bomb(Event hEvent, const char[] sName, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));

    switch(sName[6])
    {
        case 'e':     // bomb_defused
        {
            NotifClient(iClient, g_SettingsStats[LR_ExpBombDefused], "BombDefused");
        }

        case 'l':     // bomb_planted
        {
            if(NotifClient(iClient, g_SettingsStats[LR_ExpBombPlanted], "BombPlanted"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = false;
            }
        }

        case 'r':     // bomb_dropped
        {
            if(g_iPlayerInfo[iClient].bHaveBomb && NotifClient(iClient, -g_SettingsStats[LR_ExpBombDropped], "BombDropped"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = false;
            }
        }

        default:     // bomb_pickup
        {
            if(!g_iPlayerInfo[iClient].bHaveBomb && NotifClient(iClient, g_SettingsStats[LR_ExpBombPickup], "BombPickup"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = true;
            }
        }
    }
}
 
Сверху Снизу