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

acrobite

Участник
Сообщения
182
Реакции
33
PHP:
#include <sourcemod>
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required



public void OnPluginStart()
{
    HookEvent("player_death",Event_Death, EventHookMode_Post);
}

public Action Event_Death(Event hEvent, const char[] name, bool dontBroadcast){
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient)
        CreateTimer(0.5, Timer_Respawn, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);    //Вместо 0.5 ваше время
    return Plugin_Continue;
}
public Action Timer_Respawn(Handle hT, int client)    {
    int iClient = GetClientOfUserId(client);
    if(IsClientInGame(iClient) && GetClientTeam(iClient) != 0) 
        CS_RespawnPlayer(iClient);
    KillTimer(hT);
    return Plugin_Handled;
}
Можете исправить?
L 05/09/2018 - 21:29:58: [SM] Exception reported: Client index 0 is invalid
L 05/09/2018 - 21:29:58: [SM] Blaming: autoresp_dm.smx
L 05/09/2018 - 21:29:58: [SM] Call stack trace:
L 05/09/2018 - 21:29:58: [SM] [0] IsClientInGame
L 05/09/2018 - 21:29:58: [SM] [1] Line 22, C:\addons\sourcemod\scripting\autoresp_dm.sp::Timer_Respawn
 

Allen

love society
Сообщения
352
Реакции
274
Можете исправить?
L 05/09/2018 - 21:29:58: [SM] Exception reported: Client index 0 is invalid
L 05/09/2018 - 21:29:58: [SM] Blaming: autoresp_dm.smx
L 05/09/2018 - 21:29:58: [SM] Call stack trace:
L 05/09/2018 - 21:29:58: [SM] [0] IsClientInGame
L 05/09/2018 - 21:29:58: [SM] [1] Line 22, C:\addons\sourcemod\scripting\autoresp_dm.sp::Timer_Respawn
PHP:
#include <sourcemod>
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required



public void OnPluginStart()
{
    HookEvent("player_death",Event_Death, EventHookMode_Post);
}

public Action Event_Death(Event hEvent, const char[] name, bool dontBroadcast){
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient)
        CreateTimer(0.5, Timer_Respawn, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);    //Вместо 0.5 ваше время
    return Plugin_Continue;
}
public Action Timer_Respawn(Handle hT, int client)    {
    int iClient = GetClientOfUserId(client);
    if(iClient && IsClientInGame(iClient) && GetClientTeam(iClient) != 0)
        CS_RespawnPlayer(iClient);
    KillTimer(hT);
    return Plugin_Handled;
}
 

Boeing 767

заскамили мамонта ни за что, ни про что
Сообщения
524
Реакции
913
PHP:
#include <sourcemod>
#include <cstrike>

#pragma semicolon 1
#pragma newdecls required



public void OnPluginStart()
{
    HookEvent("player_death",Event_Death, EventHookMode_Post);
}

public Action Event_Death(Event hEvent, const char[] name, bool dontBroadcast){
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(iClient)
        CreateTimer(0.5, Timer_Respawn, GetClientUserId(iClient), TIMER_FLAG_NO_MAPCHANGE);    //Вместо 0.5 ваше время
    return Plugin_Continue;
}
public Action Timer_Respawn(Handle hT, int client)    {
    int iClient = GetClientOfUserId(client);
    if(iClient && IsClientInGame(iClient) && GetClientTeam(iClient) != 0)
        CS_RespawnPlayer(iClient);
    KillTimer(hT);
    return Plugin_Handled;
}
Не совсем понял, зачем проверять индекс клиента во время смерти игрока, игрок не может быть на сервере, далее, зачем снова получать userid клиента для отправки в таймере, можно же записать в переменную до получения индекса клиента. Затем, в каллбеке таймера создана не нужная переменная под индекс клиента, можно же записать в ту , которая есть в аргументах каллбека, и проверка GetClientTeam(iClient) != 0 не продумана, игрок может умереть и перейти в наблюдатели и после его возродит, зачем? И убийство таймера не обязательно т.к таймер не Repeat и сам удалится после выполнения кода в каллбеке.

PHP:
#include <cstrike>

#define TIME 1.0 //время через которое возродит игрока

#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("player_death",view_as<EventHook>(D));
}

void D(Event event)
{
    CreateTimer(TIME, view_as<Timer>(R), event.GetInt("userid"), TIMER_FLAG_NO_MAPCHANGE);
}

void R(Handle g,int client)
{
    client = GetClientOfUserId(client);
    if(client <= 0 || !IsClientInGame(client) || GetClientTeam(client) <= 1)
        return;
    CS_RespawnPlayer(client);
}
 

Allen

love society
Сообщения
352
Реакции
274
Не совсем понял, зачем проверять индекс клиента во время смерти игрока, игрок не может быть на сервере, далее, зачем снова получать userid клиента для отправки в таймере, можно же записать в переменную до получения индекса клиента. Затем, в каллбеке таймера создана не нужная переменная под индекс клиента, можно же записать в ту , которая есть в аргументах каллбека, и проверка GetClientTeam(iClient) != 0 не продумана, игрок может умереть и перейти в наблюдатели и после его возродит, зачем? И убийство таймера не обязательно т.к таймер не Repeat и сам удалится после выполнения кода в каллбеке.

PHP:
#include <cstrike>

#define TIME 1.0 //время через которое возродит игрока

#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("player_death",view_as<EventHook>(D));
}

void D(Event event)
{
    CreateTimer(TIME, view_as<Timer>(R), event.GetInt("userid"), TIMER_FLAG_NO_MAPCHANGE);
}

void R(Handle g,int client)
{
    client = GetClientOfUserId(client);
    if(client <= 0 || !IsClientInGame(client) || GetClientTeam(client) <= 1)
        return;
    CS_RespawnPlayer(client);
}
Специально для великих умов, код не мой, я всего лишь вставил проверку на индекс, дабы исправить ошибку.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
@Samoletik1337, вообще-то в таймере можно немного иначе проверку делать: if(!client || !IsClientInGame(client) || GetClientTeam(client) < 2)
а так всё остальное норм

PS Кстати HookEvent("player_death", Event_Death, EventHookMode_Post) то же самое что и HookEvent("player_death", Event_Death)
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Если игра CS:GO, то в данном случае проверка на команду игрока не нужна, игрок не будет возрожден, если находится в команде спекторов или же выбирает команду (когда только зашел).
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
@Lisoh, ну мало ли: вдруг он за эти полсекунды успеет команду сменить
 

Felton

Участник
Сообщения
799
Реакции
59
Пишу сюда что бы не создовать темы.Декопелите пожалуйста этот плагин.Нет ли там ничего подозрительного?Исходник не могу найти.А может у кого то есть?
 

Вложения

  • c4_sprite_v34.smx
    9.9 КБ · Просмотры: 7

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Пишу сюда что бы не создовать темы.Декопелите пожалуйста этот плагин.Нет ли там ничего подозрительного?Исходник не могу найти.А может у кого то есть?
Плагин чистый, бекдуров не нашел. P.S Автор SWAT выложил этот плагин на свой сайт без исходника, а вот написан он плохо...
 

Felton

Участник
Сообщения
799
Реакции
59
@Lisoh,
Спасибо! а можно исходник сделать с помощю декомпила а потом заново компельнуть?А мжно ссылку на сайт этого автора?
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@Lisoh,
Спасибо! а можно исходник сделать с помощю декомпила а потом заново компельнуть?А мжно ссылку на сайт этого автора?
Проще новый написать, чем декомпилировать и восстанавливать.
P.S Ссылку на сайт не дам, нет там ничего интересного, сам архив плагина скину.
 

Вложения

  • bomb_sprite_skull.rar
    80.6 КБ · Просмотры: 42

Felton

Участник
Сообщения
799
Реакции
59
@Lisoh,
архив у меня есть Спасибо!У меня нет ни одного плагина что бы не было исходника .Скинь сайт в личку -посмотреть охота.
--- Добавлено позже ---
@Lisoh,
А можеш новый запилить плагин для Counter-Strike Source v.34?
Уж больно понравился плагин.
 
Последнее редактирование:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Felton, а скажите честно - зачем Вам исходники от плагинов, если Вы даже декомпилировать и изучить декомпил в поисках бэкдоров и тд не в состоянии?
 

Felton

Участник
Сообщения
799
Реакции
59
@Kr1kuzya,
Ну компельнуть то я могу ну и так чуть чуть по мелочи кое что испрваить в исходнике.Да а вот декомпельнуть не умею.
Ну я больше боялся нет ли там гадости кокой нибудь я про c4_sprite_v34.smx
 

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
Доброго времени суток.Мне нужны 3 плагина,которые будут работать с Zombie Plague 7.8 fix2(Смотрите на оленях.Тут тему забросили)
1)Плагин выбора ножей.В начале каждого раунда,когда появляется человек,ему выдаётся меню с выбором ножей.Желательно,чтобы всё это настраивалось через конфиг(+добавление к вип группам).Каждый из ножей даёт определённые бонусы: гравитацию,скорость,урон(больше дамага),урон(отбрасывание).

2)Гранаты для зомби:
а)Граната массового заражения,как в 1.6,которая после взрыва, заражает всех людей,находившихся в радиусе её действия.
б)Граната "джамп".При взрыве подбрасывает игроков,которые находились в зоне её взрыва.

3)Граната щит
На месте взрыва образуется текстура круга,которая не даёт зайти зомби во внутрь.Действует определённое время.
 

over_trax

Участник
Сообщения
1,451
Реакции
488
Доброго времени суток.Мне нужны 3 плагина,которые будут работать с Zombie Plague 7.8 fix2(Смотрите на оленях.Тут тему забросили)
1)Плагин выбора ножей.В начале каждого раунда,когда появляется человек,ему выдаётся меню с выбором ножей.Желательно,чтобы всё это настраивалось через конфиг(+добавление к вип группам).Каждый из ножей даёт определённые бонусы: гравитацию,скорость,урон(больше дамага),урон(отбрасывание).

2)Гранаты для зомби:
а)Граната массового заражения,как в 1.6,которая после взрыва, заражает всех людей,находившихся в радиусе её действия.
б)Граната "джамп".При взрыве подбрасывает игроков,которые находились в зоне её взрыва.

3)Граната щит
На месте взрыва образуется текстура круга,которая не даёт зайти зомби во внутрь.Действует определённое время.
бесплатно никто такое делать не будет. Оставляй заявку в заказах или ищи скриптера
 

WanekWest

Помешан на "Даунских названиях"
Сообщения
442
Реакции
143
бесплатно никто такое делать не будет. Оставляй заявку в заказах или ищи скриптера
Попытаться всегда стоит.Да и скриптеров сейчас мало.Написал ВСЕМ,но либо ценник дерут(10%),либо просто не хотят заниматься(90%)
Спасибо за совет.Пойду искать еще раз скриптера:D
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@Lisoh,
А можеш новый запилить плагин для Counter-Strike Source v.34?
Уж больно понравился плагин.
Попробуй, должно работать как и в CS:GO так и в CSS.

PHP:
#include <sdktools>

#define SPRITEPATH "rank/rankup"       // Путь к спрайту (без папки materials/ и формата файла vtf/vmt)
#define SCALE "1.0"                       // Размер спрайта
#define HEIGHT 0.0                       // Высота спрайта от позиции бомбы / 0.0 - стандратная позиция
#define DELETEDEFUSE 1                   // Удалить спрайт после того как бомбу обезвредили? / любое другое значение - не удалять
#define DELETEEXPLODE 1                   // Удалить спрайт после того как бомба взорвалась? / любое другое значение - не удалять

int g_iGame, g_iEntity;

public APLRes AskPluginLoad2(Handle hMySelf, bool bLate, char[] szError, int iErrMax)
{
   switch(GetEngineVersion())
   {
        case Engine_CSS: g_iGame = 0;
        case Engine_CSGO: g_iGame = 1;
        default: SetFailState("Supported only CS:S and CS:GO!");
   }
}

public void OnPluginStart()
{
   HookEvent("bomb_planted", BombPlanted);
   HookEvent("bomb_defused", BombEnd);
   HookEvent("bomb_exploded", BombEnd);
   HookEvent("round_start", RoundStart);
}

public void OnMapStart()
{
   char sBuffer[128];
   FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vmt", SPRITEPATH);
   AddFileToDownloadsTable(sBuffer);
   FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vtf", SPRITEPATH);
   AddFileToDownloadsTable(sBuffer);
   FormatEx(sBuffer, sizeof(sBuffer), "%s.vtf", SPRITEPATH);
   PrecacheDecal(sBuffer, true);
}

public void BombPlanted(Event hEvent, const char[] sName, bool bDbc)
{
   int iEntity = FindEntityByClassname(MaxClients +1, "planted_c4");
   if(iEntity != -1)
   {
       float fPos[3];
       GetEntPropVector(iEntity, Prop_Send, "m_vecOrigin", fPos);
     
       switch(g_iGame)
       {
           case 0:
           {
               iEntity = CreateEntityByName("env_sprite");
               DispatchKeyValue(iEntity, "classname", "env_sprite");
           }
           case 1:
           {
               iEntity = CreateEntityByName("env_sprite_oriented");
               DispatchKeyValue(iEntity, "classname", "env_sprite_oriented");
           }
       }
     
       if(iEntity != -1)
       {
           char sModel[150];
           FormatEx(sModel, sizeof(sModel), "materials/%s.vmt", SPRITEPATH);
           fPos[2] += HEIGHT;
         
           DispatchKeyValue(iEntity, "model", sModel);
           DispatchKeyValue(iEntity, "scale", SCALE);
           DispatchKeyValue(iEntity, "rendermode", "1");
           DispatchKeyValue(iEntity, "rendercolor", "255 255 255");
           DispatchKeyValueVector(iEntity, "origin", fPos);
           DispatchSpawn(iEntity);
           g_iEntity = EntIndexToEntRef(iEntity);
       }
   }
}

public void RoundStart(Event hEvent, const char[] sName, bool bDbc)
{
   DeleteSprite();
}

public void BombEnd(Event hEvent, const char[] sName, bool bDbc)
{
   int i; // warning 205: redundant code: constant expression is zero
   if(sName[5] == 'd') i = DELETEDEFUSE;
   else i = DELETEEXPLODE;
 
   if(i != 1) return;
   DeleteSprite();
}

void DeleteSprite()
{
   int iEntity = EntRefToEntIndex(g_iEntity);
   if(iEntity != INVALID_ENT_REFERENCE && iEntity > 0 && IsValidEntity(iEntity)) AcceptEntityInput(iEntity, "Kill");

   g_iEntity = -1;
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Lisoh, а вот и не будет.
v34 определяется Сурсмодом как Engine2006.
 
Сверху Снизу