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

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Подскажите, пожалуйста, как добавить дополнительно текст в чат 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;
            }
        }
    }
}
Что вообще делает функция NotifClient и зачем ее менять на C_PrintToChat?
если я правильно понял задачу то просто допишите после каждого NotifClient - CPrintToChat и выведите нужный текст
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Что вообще делает функция NotifClient и зачем ее менять на C_PrintToChat?
если я правильно понял задачу то просто допишите после каждого NotifClient - CPrintToChat и выведите нужный текст
Да, правильно поняли, не получается у меня добавить, поэтому и решил попросить помощи. Не пойму, что как должен выглядеть данный код, после добавления. Спасибо
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Да, правильно поняли, не получается у меня добавить, поэтому и решил попросить помощи. Не пойму, что как должен выглядеть данный код, после добавления. Спасибо
C-подобный:
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");
            C_PrintTochatAll("Бомбу задефали");
        }

        case 'l':     // bomb_planted
        {
            if(NotifClient(iClient, g_SettingsStats[LR_ExpBombPlanted], "BombPlanted"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = false;
                C_PrintTochatAll("Бомбу установили");
            }
        }

        case 'r':     // bomb_dropped
        {
            if(g_iPlayerInfo[iClient].bHaveBomb && NotifClient(iClient, -g_SettingsStats[LR_ExpBombDropped], "BombDropped"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = false;
                C_PrintTochatAll("Бомбу дропнули");
            }
        }

        default:     // bomb_pickup
        {
            if(!g_iPlayerInfo[iClient].bHaveBomb && NotifClient(iClient, g_SettingsStats[LR_ExpBombPickup], "BombPickup"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = true;
                C_PrintTochatAll("Бомбу подняли");
            }
        }
    }
}
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
C-подобный:
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");
            C_PrintTochatAll("Бомбу задефали");
        }

        case 'l':     // bomb_planted
        {
            if(NotifClient(iClient, g_SettingsStats[LR_ExpBombPlanted], "BombPlanted"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = false;
                C_PrintTochatAll("Бомбу установили");
            }
        }

        case 'r':     // bomb_dropped
        {
            if(g_iPlayerInfo[iClient].bHaveBomb && NotifClient(iClient, -g_SettingsStats[LR_ExpBombDropped], "BombDropped"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = false;
                C_PrintTochatAll("Бомбу дропнули");
            }
        }

        default:     // bomb_pickup
        {
            if(!g_iPlayerInfo[iClient].bHaveBomb && NotifClient(iClient, g_SettingsStats[LR_ExpBombPickup], "BombPickup"))
            {
                g_iPlayerInfo[iClient].bHaveBomb = true;
                C_PrintTochatAll("Бомбу подняли");
            }
        }
    }
}
Проверил, спасибо)), помог.
 
Последнее редактирование:

lesha

Участник
Сообщения
84
Реакции
7
Странно: должно одной и той же спамить - predicted_viewmodel.
Как эта энтити может перед спавном класс сменить?


Минут - 0?
Во всех остальных случаях функция возвращает какой-либо текст.

@7pElllHuK, ну и ещё: емнип в новом синтаксисе (вроде начиная со SM1.11, не помню точно) должно быть stock char[] NumToName(int num, const int type) вместо stock char NumToName(int num, const int type) (после типа должны быть квадратные скобки, обозначающие, что выводится массив).
Сообщения автоматически склеены:

@lesha, причесал код =)
SM1.6.3:
//// AKC 2.0.2.sp
// Header size:           4764 bytes
// Code size:            26992 bytes
// Data size:             9336 bytes
// Stack/heap size:      16384 bytes; Total requirements:   57476 bytes
//
// Compilation Time: 0,33 sec
// ----------------------------------------

//// AKC 2.0.2_fix.sp
// Header size:           4760 bytes
// Code size:            24332 bytes
// Data size:             8892 bytes
// Stack/heap size:      16384 bytes; Total requirements:   54368 bytes
//
// Compilation Time: 0,3 sec
// ----------------------------------------
Но боюсь проблема в используемом SM, наверное.
Ну не может энтити predicted_viewmodel менять класс перед спавном, тем более на те, что в логе.

L 02/01/2024 - 22:12:29: [SM] [0] GetEntPropEnt
L 02/01/2024 - 22:12:29: [SM] [1] Line 216, C:\Users\Desktop\Sourcemod\addons\sourcemod\scripting\AKC 2.0.2_fix.sp::SoundCallBackHook
L 02/01/2024 - 22:12:29: [SM] Exception reported: Property "m_hOwnerEntity" not found (entity 88/cs_ragdoll)
L 02/01/2024 - 22:12:29: [SM] Blaming: AKC 2.0.2_fix.smx
L 02/01/2024 - 22:12:29: [SM] Call stack trace:
L 02/01/2024 - 22:12:29: [SM] [0] GetEntPropEnt
L 02/01/2024 - 22:12:29: [SM] [1] Line 216, C:\Users\Desktop\Sourcemod\addons\sourcemod\scripting\AKC 2.0.2_fix.sp::SoundCallBackHook
L 02/01/2024 - 22:12:29: [SM] Exception reported: Property "m_hOwnerEntity" not found (entity 89/cs_ragdoll)
L 02/01/2024 - 22:12:29: [SM] Blaming: AKC 2.0.2_fix.smx
L 02/01/2024 - 22:12:29: [SM] Call stack trace:
L 02/01/2024 - 22:12:29: [SM] [0] GetEntPropEnt
L 02/01/2024 - 22:12:29: [SM] [1] Line 216, C:\Users\Desktop\Sourcemod\addons\sourcemod\scripting\AKC 2.0.2_fix.sp::SoundCallBackHook
L 02/01/2024 - 22:12:30: [SM] Exception reported: Property "m_hOwnerEntity" not found (entity 84/cs_ragdoll)
L 02/01/2024 - 22:12:30: [SM] Blaming: AKC 2.0.2_fix.smx
L 02/01/2024 - 22:12:30: [SM] Call stack trace:
L 02/01/2024 - 22:12:30: [SM] [0] GetEntPropEnt
L 02/01/2024 - 22:12:30: [SM] [1] Line 216, C:\Users\Desktop\Sourcemod\addons\sourcemod\scripting\AKC 2.0.2_fix.sp::SoundCallBackHook
L 02/01/2024 - 22:16:36: [SM] Exception reported: Property "m_hOwnerEntity" not found (entity 85/cs_ragdoll)
L 02/01/2024 - 22:16:36: [SM] Blaming: AKC 2.0.2_fix.smx
L 02/01/2024 - 22:16:36: [SM] Call stack trace:
L 02/01/2024 - 22:16:36: [SM] [0] GetEntPropEnt
L 02/01/2024 - 22:16:36: [SM] [1] Line 216, C:\Users\Desktop\Sourcemod\addons\sourcemod\scripting\AKC 2.0.2_fix.sp::SoundCallBackHook
L 02/01/2024 - 22:16:47: [SM] Exception reported: Property "m_hOwnerEntity" not found (entity 93/cs_ragdoll)
L 02/01/2024 - 22:16:47: [SM] Blaming: AKC 2.0.2_fix.smx
L 02/01/2024 - 22:16:47: [SM] Call stack trace:
L 02/01/2024 - 22:16:47: [SM] [0] GetEntPropEnt
L 02/01/2024 - 22:16:47: [SM] [1] Line 216, C:\Users\Desktop\Sourcemod\addons\sourcemod\scripting\AKC 2.0.2_fix.sp::SoundCallBackHook
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
@7pElllHuK, а тут не сможешь подсказать?))
Kill - это название перевода, и я хочу добавить еще один перевод, на это же событие. То есть чтобы на "Kill" отправлялся еще 1 перевод, например слово "Тест" , с помощью C_PrintTochat, как это будет выглядеть?

код:
                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);
                }
 

Synd1qate

Участник
Сообщения
745
Реакции
259
@7pElllHuK, а тут не сможешь подсказать?))
Kill - это название перевода, и я хочу добавить еще один перевод, на это же событие. То есть чтобы на "Kill" отправлялся еще 1 перевод, например слово "Тест" , с помощью C_PrintTochat, как это будет выглядеть?

код:
                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);
                }
Если Ты делаешь цветной чат в lvlranks, то ты занимаешься конкретным извращением))
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Если Ты делаешь цветной чат в lvlranks, то ты занимаешься конкретным извращением))
Да. Есть цель и почти все сделал, кроме этих нескольких вариантов, и убийств: дабл, трипл и прочее.

Прошу помощи у опытных скриптеров, которые смогут подсказать. :)
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
@7pElllHuK, а тут не сможешь подсказать?))
Kill - это название перевода, и я хочу добавить еще один перевод, на это же событие. То есть чтобы на "Kill" отправлялся еще 1 перевод, например слово "Тест" , с помощью C_PrintTochat, как это будет выглядеть?

код:
                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);
                }

C_PrintToChat(iClient, "%t", "Kill");
Сообщения автоматически склеены:

Всем доброго времени суток, подскажите пожалуйста, как выдать игроку запрещенное оружие в Weapon Restrict (Проще говоря нужно как-то обойти ограничение и выдать AWP игроку, даже если у него нет Иммунитета, при том что само AWP блокируется плагином Weapon Restrict)
 
Последнее редактирование:

Synd1qate

Участник
Сообщения
745
Реакции
259
C_PrintToChat(iClient, "%t", "Kill");
Сообщения автоматически склеены:

Всем доброго времени суток, подскажите пожалуйста, как выдать игроку запрещенное оружие в Weapon Restrict (Проще говоря нужно как-то обойти ограничение и выдать AWP игроку, даже если у него нет Иммунитета, при том что само AWP блокируется плагином Weapon Restrict)
Я предполагаю, что только по флагу
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Я предполагаю, что только по флагу
Разве нет другого способа? Не хотелось бы выдавать игроку флаг администратора, так как он тогда будет отображаться в !admins как админ и это многих путает
 

Synd1qate

Участник
Сообщения
745
Реакции
259
Разве нет другого способа? Не хотелось бы выдавать игроку флаг администратора, так как он тогда будет отображаться в !admins как админ и это многих путает
Выдавать ему условно флаг t, а в !admins сделать показ по основным флагам, а не кастомным
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Все-таки хотелось бы сделать это без выдачи адм флага игроку
Без редактирования самого weapon_restrict, никак
Или можно попробовать через CS_OnBuyCommand
Сделать проверку на необходимого игрока, и через EquipPlayerWeapon/GivePlayerItem выдавать игроку оружие, так как weapon_restrict заблокирует покупку
Правда тогда игроку будет писать что оружие заблокировано, хотя он все равно его получит, наверное
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Без редактирования самого weapon_restrict, никак
Или можно попробовать через CS_OnBuyCommand
Сделать проверку на необходимого игрока, и через EquipPlayerWeapon/GivePlayerItem выдавать игроку оружие, так как weapon_restrict заблокирует покупку
Правда тогда игроку будет писать что оружие заблокировано, хотя он все равно его получит, наверное
Пробовал в начале раунда выдавать игроку АВП через GivePlayerItem, оно просто удаляется плагином Weapon Restrict
 
Сверху Снизу