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

xstage

🏹
Сообщения
726
Реакции
754
Не получается заблокировать события (последним пробовал выбрасывание бомбы)
C-подобный:
public void OnPluginStart()
{
    HookEvent("bomb_dropped", Event_BombDropped, EventHookMode_Pre);
}

public Action Event_BombDropped(Event event, const char[] name, bool dontBroadcast)
{
    return Plugin_Handled;
}
Ну по названию евента понятно, что бомба уже дропнута. Чтобы заблокировать выбрасывание, надо заблокировать команду.

C-подобный:
public void OnPluginStart()
{
    AddCommandListener(DropCommand_Handler, "drop");
}

Action DropCommand_Handler(int client, const char[] command, int argc)
{
    char szClassname[64];
    GetEntityClassname(GetEntPropEnt(client, Prop_Send, "m_hActiveWeapon"), szClassname, sizeof(szClassname));
    
    if (!strcmp(szClassname, "weapon_c4"))
    {
        return Plugin_Handled;
    }
    
    return Plugin_Continue;
}
 

xstage

🏹
Сообщения
726
Реакции
754

Temlik

Участник
Сообщения
668
Реакции
174
@xstage, приведи, пожалуйста, пример события, которое можно заблокировать таким образом. Я пробовал уже player_death, player_falldamage - события не блокируются
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
@-=|УЧЕНИК|=-, разве что вылавливать любой браш на карте и использовать его модель. =)
Сообщения автоматически склеены:

ещё можно попробовать просто не назначать модель
Сообщения автоматически склеены:

Это вообще просто предупреждение и ничего больше:
Да я пробовал убирал модель,там была другая ошибка)
Решил убрать ошибку через cleaner.Чтоб глаза не мозолила,так как всегда смотрю консоль.
 

xstage

🏹
Сообщения
726
Реакции
754
@xstage, приведи, пожалуйста, пример события, которое можно заблокировать таким образом. Я пробовал уже player_death, player_falldamage - события не блокируются
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@Temlik, ты так можешь заблокировать только сообщение, но не её выбрасывание.
Многие вещи не блочатся блокировкой их события. Чаще всего так блочится только сообщение о событии.
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Привет всем!
Кому если не сложно,сделайте пожалуйста,чтоб дамаг был только от ножа.
Потому что щас бывает такое,что можно с гранаты убить двоих сразу,или же с мухи убить одним выстрелом.
Заранее благодарю.


Сам код:
#include <sdkhooks>

bool bAuthorized[MAXPLAYERS+1];
char cSteamIDs[][32] = {
   "STEAM_0:0:123456",
   "STEAM_0:1:111111"
};

public void OnClientPutInServer(int client)
{
   bAuthorized[client] = GetAuthentication(client);
  
   SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive);
}

public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
   if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
   {
     damage *= 2.0;
     return Plugin_Changed;
   }
  
   return Plugin_Continue;
}

bool GetAuthentication(int client)
{
   char cAuth[32];
   GetClientAuthId(client, AuthId_Engine, cAuth, sizeof(cAuth));
  
   for (int i = 0; i < sizeof(cSteamIDs); ++i)
   {
     if (strcmp(cAuth, cSteamIDs[i], false) == 0)
       return true;
   }
  
   return false;
}
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Привет всем!
Кому если не сложно,сделайте пожалуйста,чтоб дамаг был только от ножа.
Потому что щас бывает такое,что можно с гранаты убить двоих сразу,или же с мухи убить одним выстрелом.
Заранее благодарю.


Сам код:
#include <sdkhooks>

bool bAuthorized[MAXPLAYERS+1];
char cSteamIDs[][32] = {
   "STEAM_0:0:123456",
   "STEAM_0:1:111111"
};

public void OnClientPutInServer(int client)
{
   bAuthorized[client] = GetAuthentication(client);
 
   SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive);
}

public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
   if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
   {
     damage *= 2.0;
     return Plugin_Changed;
   }
 
   return Plugin_Continue;
}

bool GetAuthentication(int client)
{
   char cAuth[32];
   GetClientAuthId(client, AuthId_Engine, cAuth, sizeof(cAuth));
 
   for (int i = 0; i < sizeof(cSteamIDs); ++i)
   {
     if (strcmp(cAuth, cSteamIDs[i], false) == 0)
       return true;
   }
 
   return false;
}
C++:
#include <sdkhooks>

bool bAuthorized[MAXPLAYERS+1];
char cSteamIDs[][32] = {
    "STEAM_0:0:123456",
    "STEAM_0:1:111111"
};

public void OnClientPutInServer(int client)
{
    bAuthorized[client] = GetAuthentication(client);

    SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive);
}

public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
    if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
    {
        char h[256];
        GetClientWeapon(attacker, h, sizeof(h));
        if(strcmp(h, "knife", true) || strcmp(h, "bayonet", true))
        {
            damage *= 2.0;
            return Plugin_Changed;         
        }
        if(strcmp(h, "ssg08", true) || strcmp(h, "hegrenade", true))
        {
            damage /= 2.0;
            return Plugin_Changed;         
        }
    }
    return Plugin_Continue;
}

bool GetAuthentication(int client)
{
    char cAuth[32];
    GetClientAuthId(client, AuthId_Engine, cAuth, sizeof(cAuth));

    for (int i = 0; i < sizeof(cSteamIDs); ++i)
    {
        if (strcmp(cAuth, cSteamIDs[i], false) == 0)
        return true;
    }

    return false;
}
 
Последнее редактирование:

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
C++:
#include <sdkhooks>

bool bAuthorized[MAXPLAYERS+1];
char cSteamIDs[][32] = {
    "STEAM_0:0:123456",
    "STEAM_0:1:111111"
};

public void OnClientPutInServer(int client)
{
    bAuthorized[client] = GetAuthentication(client);

    SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive);
}

public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
    if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
    {
        char weapon[256];
        GetClientWeapon(attacker, weapon, sizeof(weapon));
        if(strcmp(weapon, "weapon_knife", true) || strcmp(weapon, "weapon_bayonet", true))
        {
            damage *= 2.0;
            return Plugin_Changed;           
        }
    }
    return Plugin_Continue;
}

bool GetAuthentication(int client)
{
    char cAuth[32];
    GetClientAuthId(client, AuthId_Engine, cAuth, sizeof(cAuth));

    for (int i = 0; i < sizeof(cSteamIDs); ++i)
    {
        if (strcmp(cAuth, cSteamIDs[i], false) == 0)
        return true;
    }

    return false;
}
Работать работает)
Нуу так же как и было,что можно с мухи убить с одного выстрела,либо гранатой с первого раза)
Ну и вот ошибка еще при компиляции,ну думаю она не на что не влияет.
Damage_knife.sp
C:\Users\Desktop\Damage_knife.sp(20) : warning 219: local variable "weapon" shadows a variable at a preceding level
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Работать работает)
Нуу так же как и было,что можно с мухи убить с одного выстрела,либо гранатой с первого раза)
Ну и вот ошибка еще при компиляции,ну думаю она не на что не влияет.
Damage_knife.sp
C:\Users\Desktop\Damage_knife.sp(20) : warning 219: local variable "weapon" shadows a variable at a preceding level
Исправил, проверь
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Исправил, проверь

Исправил, проверь
Тоже самое)
То-есть не как по стандарту,если без этого плагина,то ты не можешь убить с одного выстрела с мухи.
Или же если даже гранату кинуть под себя<то тебя сразу не убьет.
Блин что-то тупанул,не написал что версия игры 34.Ну если это влияет на что-то.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@Palonez, твоя версия будет считать, что игроку нанесён урон ножом, если игрока ранила граната, но атакующий держал в момент нанесения урона нож в руке.
Как точно определить граната ли использовалась для нанесения урона я уже и не помню. Возможно нужно проверять значение damagetype (weapon в CS:S с SM1.9 никогда не возвращал оружие, не помню отличается ли inflictor при использовании гранат).
Сообщения автоматически склеены:

Нуу так же как и было,что можно с мухи убить с одного выстрела,либо гранатой с первого раза)
перед strcmp() восклицательный знак забыли поставить (возвращается 0 при совпадении строк)
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
@Palonez, твоя версия будет считать, что игроку нанесён урон ножом, если игрока ранила граната, но атакующий держал в момент нанесения урона нож в руке.
Как точно определить граната ли использовалась для нанесения урона я уже и не помню. Возможно нужно проверять значение damagetype (weapon в CS:S с SM1.9 никогда не возвращал оружие, не помню отличается ли inflictor при использовании гранат).
Сообщения автоматически склеены:


перед strcmp() восклицательный знак забыли поставить (возвращается 0 при совпадении строк)
Так?
C++:
public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
    if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
    {
        if(damagetype == DMG_SLASH)
        {
            damage *= 2.0;
            return Plugin_Changed;             
        }
    }
    return Plugin_Continue;
}
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Так?
C++:
public Action OnTakeDamageAlive(int victim, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3], int damagecustom)
{
    if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
    {
        if(damagetype == DMG_SLASH)
        {
            damage *= 2.0;
            return Plugin_Changed;            
        }
    }
    return Plugin_Continue;
}
Если я делаю так,то все работает.И дамаг с другова оружия как по стандарту идет.
Правильно или нет сделал не знаю.


C-подобный:
if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
    {
        char h[256];
        GetClientWeapon(attacker, h, sizeof(h));
        if(!(strcmp(h, "weapon_knife", true)))
        {
            damage *= 2.0;
            return Plugin_Changed;             
        }
    }
    return Plugin_Continue;
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Если я делаю так,то все работает.И дамаг с другова оружия как по стандарту идет.
Правильно или нет сделал не знаю.


C-подобный:
if (attacker > 0 && attacker <= MaxClients && victim > 0 && victim <= MaxClients && bAuthorized[attacker] && IsClientInGame(victim) && IsClientInGame(attacker))
    {
        char h[256];
        GetClientWeapon(attacker, h, sizeof(h));
        if(!(strcmp(h, "weapon_knife", true)))
        {
            damage *= 2.0;
            return Plugin_Changed;           
        }
    }
    return Plugin_Continue;
weapon_knife это classname
а GetClientWeapon возвращает название оружия
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
проверка victim > 0 && victim <= MaxClients не нужна: жертва всегда имеет правильный индекс
IsClientInGame(victim) не требуется, т.к при выходе с сервера с игрока хук сразу снимается автоматически
if(damagetype == DMG_SLASH) нужно проверять ещё до индексов и прочего (так меньше лишних проверок будет)

и класс оружия всё же м/б понадобится проверить: лучше провести тесты, чтобы убедиться в правильности работы проверок
 

HAIRAKE

Участник
Сообщения
36
Реакции
4
\addons\sourcemod\scripting\Connects (3).sp(4) : fatal error 183: cannot read from file: "thc_rpg" скомпилить немогу =(
 

skaeN

Участник
Сообщения
204
Реакции
108
1. Players Online Mysql [CSGO]
2. Простенький плагин который будет записывать данные о подключении игрока в бд и удалять запись при отключении.
Так же ботов вносить в этот список (если возможно)
id (int autoincrement), auth (steam_1 или BOT), connect_time (время подключение игрока в timestamp, чтобы можно было отсчитать сколько он провел на серваке)
Заранее спасибо 🥲
 
Сверху Снизу