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

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@panikajo, насколько я помню, я там специально отключал исчезновение мин после смерти.

Да и не люблю заниматься плагинами для КСГО: тестить не на чём, а для полноценной проверки нужен сервер (и желательно с возможностью делать перезагрузку), которого у меня нет и не планируется, т.к. токена у меня нет (а ради тестирования того, чем я не буду пользоваться он мне не нужен).

Кстати, разве [CS: GO] - Lasermines 1.5 всё ещё на КСГО работает?
 

makentosh

Участник
Сообщения
109
Реакции
6
@makentosh, чуть оптимизировал код
PHP:
static const String:team_prefix[][] = {"", "SPEC", "T", "CT"};


public bool:GetMenuItemPlayers(client, &Handle:hMenu, bool:showbot, bool:showdead)
{
    new EngineVersion:nEngine = GetEngineVersion();
    new iUserId[MAXPLAYERS+1], iArray[MAXPLAYERS], iSize, bool:teams;
    // вообще эту проверку нужно вынести из этой функции в OnPluginStart()
    teams = nEngine == Engine_SourceSDK2006 || nEngine == Engine_CSS || nEngine == Engine_CSGO;

    for (new i = 1; i <= MaxClients; i++)
    {
        if (IsClientConnected(i))
        {
            iUserId[i] = GetClientUserId(i);
            if (bool:iUserId[i] && IsClientInGame(i))
            {
                if (!showbot && IsFakeClient(i) || !showdead && !IsPlayerAlive(i) || !CanUserTarget(client, i))
                    continue;
                iArray[iSize++] = iUserId[i];
            }
        }
    }
    SortIntegers(iArray, iSize, Sort_Descending);

    decl String:sBuffer[2][128];
    for (new i, j; i < iSize; i++)
    {
        for (j = 1; j <= MaxClients; j++) if (iArray[i] == iUserId[j])
        {
            if (!IsClientInKickQueue(j))
            {
                if (!GetClientName(j, sBuffer[1], sizeof(sBuffer[])))
                    Format(sBuffer[1], sizeof(sBuffer[]), "Имя не распознано! [#%i] [%i]", iUserId[j], j);
                IntToString(iUserId[j], sBuffer[0], sizeof(sBuffer[]));
                // зачем нам каждый цикл проверять что за сервер у нас?! Игра всё равно никогда не изменится с момента запуска сервера
                if (!teams) Format(sBuffer[1], sizeof(sBuffer[]), "%s #%s", sBuffer[1], sBuffer[0]);
                else Format(sBuffer[1], sizeof(sBuffer[]), "[%s] %s #%s", team_prefix[GetClientTeam(j)], sBuffer[1], sBuffer[0]);
                AddMenuItem(hMenu, sBuffer[0], sBuffer[1]);
            }
            break;
        }
    }

    if (bool:GetMenuItemCount(hMenu))
        return true;

    CloseHandle(hMenu);
    return false;
}
ну что никак уже не зделать?
 

Grey83

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

Felton

Участник
Сообщения
799
Реакции
59
Установил плагин звуки гранат из CSGO на Counter-Strike Source v.34.Скомпелировал без ошибок.Но через какое то время начинает спамить ошибки в логах.Сам плагин продолжает работать нормально.Поправьте пожалуйста плагин что бы не было эрроров.Вот сам плагин
C-подобный:
#include <sourcemod>
#include <sdktools>

public Plugin:myinfo =
{
    name = "[CSGO] Grenades sounds",
    author = "css-rus.ru(skype:linuxuser41)",
    description = "Плагин добавляет звуки гранат",
    version = "1.0",
    url = "http://css-rus.ru/"
};

//Пути к звукам заменять на строчках с EmitAmbientSound


public OnPluginStart()
{
    LoadAllFiles();
    AddNormalSoundHook(SoundCallBackHook);
}

public OnMapStart()
{
    LoadAllFiles();
}

LoadAllFiles()
{
    new Handle:dir = OpenDirectory("sound/replaced_sounds");
    if (dir)
    {
        decl String:Name[100];
        decl String:fsnd[256];
        new FileType:type;
        while (ReadDirEntry(dir, Name, 100, type))
        {
            if (type == FileType:2)
            {
                Format(fsnd, 256, "replaced_sounds/%s", Name);
                PrintToServer(fsnd);
                PrecacheSound(fsnd, true);
                Format(fsnd, 256, "sound/replaced_sounds/%s", Name);
                AddFileToDownloadsTable(fsnd);
            }
        }
        CloseHandle(dir);
    }
    else
    {
        PrintToServer("Не удалось открыть директорию");
    }
}

public Action:SoundCallBackHook(clients[64], &numClients, String:sample[256], &entity, &channel, &Float:volume, &level, &pitch, &flags)
{
    new Owner = GetEntPropEnt(entity, Prop_Send, "m_hOwnerEntity");
    new Float:sndplace[3] = 0.0;
    if (Owner > 0 && Owner <= MaxClients)
    {
        if (StrEqual(sample, "^weapons/smokegrenade/sg_explode.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/sg_explode.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "weapons/smokegrenade/grenade_hit1.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/grenade_hit1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "^weapons/flashbang/flashbang_explode1.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/flashbang_explode1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "^weapons/flashbang/flashbang_explode2.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/flashbang_explode2.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "weapons/flashbang/grenade_hit1.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/grenade_hit1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "^weapons/hegrenade/explode3.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/explode3.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "^weapons/hegrenade/explode4.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/explode4.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "^weapons/hegrenade/explode5.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/explode5.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
        if (StrEqual(sample, "weapons/hegrenade/he_bounce-1.wav", true))
        {
            GetEntPropVector(entity, Prop_Send, "m_vecOrigin", sndplace);
            EmitAmbientSound("replaced_sounds/he_bounce-1.wav", sndplace, entity, level, flags, volume, pitch, 0.0);
            return Plugin_Handled;
        }
    }
    return Plugin_Continue;
}
А вот кусок errors
C-подобный:
L 05/21/2018 - 01:06:54: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 71/cs_ragdoll)
L 05/21/2018 - 01:06:54: [SM] Displaying call stack trace for plugin "csgogrenades.smx":
L 05/21/2018 - 01:06:54: [SM]   [0]  Line 56, /home/groups/sourcemod/upload_tmp/php0nmAXz.sp::SoundCallBackHook()
L 05/21/2018 - 01:07:34: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 76/cs_ragdoll)
L 05/21/2018 - 01:07:34: [SM] Displaying call stack trace for plugin "csgogrenades.smx":
L 05/21/2018 - 01:07:34: [SM]   [0]  Line 56, /home/groups/sourcemod/upload_tmp/php0nmAXz.sp::SoundCallBackHook()
L 05/21/2018 - 01:09:52: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 85/cs_ragdoll)
L 05/21/2018 - 01:09:52: [SM] Displaying call stack trace for plugin "csgogrenades.smx":
L 05/21/2018 - 01:09:52: [SM]   [0]  Line 56, /home/groups/sourcemod/upload_tmp/php0nmAXz.sp::SoundCallBackHook()
L 05/21/2018 - 01:16:23: [SM] Native "GetEntPropEnt" reported: Property "m_hOwnerEntity" not found (entity 75/cs_ragdoll)
 
Последнее редактирование:

opportune

Участник
Сообщения
49
Реакции
7
Здравствуйте. Вряд ли Вы возьметесь помогать с этим, но попытаться стоит)
Перешел в CS:GO из CS 1.6 и админ меню крайне не удобное, так же имеется много лишних пунктов.
По-этому прошу его изменить под мои "хотелки". Возможно на платной основе)
На сервере стоит [v1.1.5.4] Material Admin - рефорк SB++ 1.5.4.7 и используется плагин админ меню из него. Скажите пожалуйста какие файлы Вам необходимо предоставить для выполнения моей просьбы. Прикреплю ТЗ. Спасибо.
--- Добавлено позже ---

Имеется еще плагин с error логами, помогите убрать их пожалуйста. Спасибо)

L 05/21/2018 - 17:28:00: [SM] Exception reported: Invalid edict (3730 - -2089611630)
L 05/21/2018 - 17:28:00: [SM] Blaming: NadeTails.smx
L 05/21/2018 - 17:28:00: [SM] Call stack trace:
L 05/21/2018 - 17:28:00: [SM] [0] GetEdictClassname
L 05/21/2018 - 17:28:00: [SM] [1] Line 342, C:\Users\scripting\NadeTails.sp::OnEntitySpawned
 

Вложения

  • админ меню.txt
    2.1 КБ · Просмотры: 16
  • NadeTails.sp
    13.6 КБ · Просмотры: 8
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@makentosh, вот на новом:
PHP:
static const char team_prefix[][] = {"", "SPEC", "T", "CT"};

public bool GetMenuItemPlayers(int client, Menu &hMenu, bool showbot, bool showdead)
{
    if(hMenu == null)
        return false;

    EngineVersion nEngine = GetEngineVersion();
    int userID[MAXPLAYERS+1], array[MAXPLAYERS], size;
    // вообще эту проверку нужно вынести из этой функции в OnPluginStart()
    bool teams;
    teams = nEngine == Engine_SourceSDK2006 || nEngine == Engine_CSS || nEngine == Engine_CSGO;

    for (int i = 1; i <= MaxClients; i++)
        if (IsClientConnected(i) && (userID[i] = GetClientUserId(i)) && IsClientInGame(i)
        && (showbot || !IsFakeClient(i)) && (showdead || IsPlayerAlive(i)) && CanUserTarget(client, i))
            array[size++] = userID[i];
    SortIntegers(array, size, Sort_Descending);

    for (new i, j; i < size; i++)
    {
        for (j = 1; j <= MaxClients; j++) if (array[i] == userID[j])
        {
            if (!IsClientInKickQueue(j))
            {
                static char buffer[2][128];
                if (!GetClientName(j, buffer[1], sizeof(buffer[])))
                    Format(buffer[1], sizeof(buffer[]), "Имя не распознано! [#%i] [%i]", userID[j], j);
                IntToString(userID[j], buffer[0], sizeof(buffer[]));
                // зачем нам каждый цикл проверять что за сервер у нас?! Игра всё равно никогда не изменится с момента запуска сервера
                if (!teams) Format(buffer[1], sizeof(buffer[]), "%s #%s", buffer[1], buffer[0]);
                else Format(buffer[1], sizeof(buffer[]), "[%s] %s #%s", team_prefix[GetClientTeam(j)], buffer[1], buffer[0]);
                hMenu.AddItem(buffer[0], buffer[1]);
            }
            break;
        }
    }

    if (hMenu.ItemCount)
        return true;

    CloseHandle(hMenu);
    return false;
}
 

makentosh

Участник
Сообщения
109
Реакции
6
@makentosh, вот на новом:
PHP:
static const char team_prefix[][] = {"", "SPEC", "T", "CT"};

public bool GetMenuItemPlayers(int client, Menu &hMenu, bool showbot, bool showdead)
{
    if(hMenu == null)
        return false;

    EngineVersion nEngine = GetEngineVersion();
    int userID[MAXPLAYERS+1], array[MAXPLAYERS], size;
    // вообще эту проверку нужно вынести из этой функции в OnPluginStart()
    bool teams;
    teams = nEngine == Engine_SourceSDK2006 || nEngine == Engine_CSS || nEngine == Engine_CSGO;

    for (int i = 1; i <= MaxClients; i++)
        if (IsClientConnected(i) && (userID[i] = GetClientUserId(i)) && IsClientInGame(i)
        && (showbot || !IsFakeClient(i)) && (showdead || IsPlayerAlive(i)) && CanUserTarget(client, i))
            array[size++] = userID[i];
    SortIntegers(array, size, Sort_Descending);

    for (new i, j; i < size; i++)
    {
        for (j = 1; j <= MaxClients; j++) if (array[i] == userID[j])
        {
            if (!IsClientInKickQueue(j))
            {
                static char buffer[2][128];
                if (!GetClientName(j, buffer[1], sizeof(buffer[])))
                    Format(buffer[1], sizeof(buffer[]), "Имя не распознано! [#%i] [%i]", userID[j], j);
                IntToString(userID[j], buffer[0], sizeof(buffer[]));
                // зачем нам каждый цикл проверять что за сервер у нас?! Игра всё равно никогда не изменится с момента запуска сервера
                if (!teams) Format(buffer[1], sizeof(buffer[]), "%s #%s", buffer[1], buffer[0]);
                else Format(buffer[1], sizeof(buffer[]), "[%s] %s #%s", team_prefix[GetClientTeam(j)], buffer[1], buffer[0]);
                hMenu.AddItem(buffer[0], buffer[1]);
            }
            break;
        }
    }

    if (hMenu.ItemCount)
        return true;

    CloseHandle(hMenu);
    return false;
}
 

Вложения

  • 3.PNG
    3.PNG
    6.7 КБ · Просмотры: 22

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Felton, ну попробуй так
--- Добавлено позже ---
@makentosh, исправь for (new i, j; i < size; i++) на for (int i, j; i < size; i++)
--- Добавлено позже ---
@opportune, для вышедших игроков нужно отдельный плагин пилить (который будет использовать БД, как я понимаю)
А для остального есть файл adminmenu_custom.txt
 

Вложения

  • grenades_sounds.sp
    3.5 КБ · Просмотры: 18
Последнее редактирование:

makentosh

Участник
Сообщения
109
Реакции
6
@Felton, ну попробуй так
--- Добавлено позже ---
@makentosh, исправь for (new i, j; i < size; i++) на for (int i, j; i < size; i++)
--- Добавлено позже ---
@opportune, для вышедших игроков нужно отдельный плагин пилить (который будет использовать БД, как я понимаю)
А для остального есть файл adminmenu_custom.txt
ну а как зделано в см 1.6.3 там не через бд
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@makentosh, ну хз, не видел я у себя в админке SM1.6.3 управления вышедшими игроками

@opportune, вот попробуй так (немного пофиксил, но оптимизировать код лень)
 

makentosh

Участник
Сообщения
109
Реакции
6
ну а как зделано в см 1.6.3 там не через бд
зделал и заменил скомплектировал плагини те что надо и толку 0 что было то и сталось!
Да ты меня походу не понял! мне не нежно вышедших игроков мне нужно приставка при кике игрока при бане и так далее вот что мне нужно!
 

Вложения

  • awp_lego_20000.jpg
    awp_lego_20000.jpg
    103 КБ · Просмотры: 57

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@makentosh, так я про БД писал opportune, а не тебе
Это ты сам про БД начал мне писать
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@makentosh, ну так у тебя компилится уже без ошибок?
 

Felton

Участник
Сообщения
799
Реакции
59
@Grey83,
Не компелиться на старом см и даже не хочет и онлайн помелятором
SourceMod: Half-Life 2 Scripting
/home/groups/sourcemod/upload_tmp/phpDlxM5M.sp(72) : error 017: undefined symbol "HasEntProp"
/home/groups/sourcemod/upload_tmp/phpDlxM5M.sp(73) : warning 204: symbol is assigned a value that is never used: "Owner"
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Скинь любой исправленый
Ещё можешь убрать вот эти 2 строки из кода
if(hMenu == null)
return
false;
Но я думаю, что не особо это и поможет (по идее просто меньше вероятность появления сообщений об ошибоках в консоли сервера)
--- Добавлено позже ---
@Felton, у тебя какая версия SM?
В 1.6.3, емнип, уже было HasEntProp

пробуй
 

Вложения

  • NadeTails 2.0.1.sp
    13.2 КБ · Просмотры: 12
  • NadeTails 2.0.1.smx
    10.1 КБ · Просмотры: 7
Последнее редактирование:

opportune

Участник
Сообщения
49
Реакции
7
@Felton, ну попробуй так
--- Добавлено позже ---
@makentosh, исправь for (new i, j; i < size; i++) на for (int i, j; i < size; i++)
--- Добавлено позже ---
@opportune, для вышедших игроков нужно отдельный плагин пилить (который будет использовать БД, как я понимаю)
А для остального есть файл adminmenu_custom.txt
Используется SB-MaterialAdmin/NewServer и сейчас в меню есть такой пункт. Требуется просто упорядочить пункты как указано в ТЗ, надеюсь на Вашу помощь)
 
Сверху Снизу