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

over_trax

Участник
Сообщения
1,451
Реакции
488
да, он тоже подходит, но там не от плагина цвет зависит, а от карты.
--- Добавлено позже ---
C-подобный:
#include <sdktools_functions>

new String:g_sGiveWeapons[][] =
{
    "weapon_snowball"
};

public OnPluginStart() HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);

public Event_RoundStart(Handle:event, String:name[], bool:dontBroadcast)
{
    decl weapons;
    for (new i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && IsPlayerAlive(i))
        {
            for (weapons = 0; weapons < sizeof(g_sGiveWeapons); ++weapons) GivePlayerItem(i, g_sGiveWeapons[weapons]);
        }
    }
}
только нужно при спавне выдачу реализовать, а не при старте раунда
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@REDWOOD, попробуй так:
PHP:
public OnPluginStart()
{
    HookEvent("player_connect", Event_Connect);
}

public void Event_Connect(Event event, const char[] name, bool dontBroadcast)
{
    if(!event.GetBool("bot")) CreateTimer(5.0, OpenMOTD, event.GetInt("userid"));
}

public Action OpenMOTD(Handle timer, any client)
{
    if((client = GetClientOfUserId(client))) ShowMOTDPanel(client, "Site HLmod", "https://hlmod.ru", MOTDPANEL_TYPE_URL);
}
Правда скомпилил на 1.10: у меня используются только 1.6.3, 1.8 и 1.10
 

Вложения

  • 00.sp
    419 байт · Просмотры: 10
  • 00.smx
    3.2 КБ · Просмотры: 6

StormX

Участник
Сообщения
891
Реакции
302
@Grey83, к сожалению не завелся L 12/18/2018 - 22:35:18: [SM] Failed to load plugin "motd.smx": Unable to load plugin (no debug string table).
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323

Faya™

Жуестер
Сообщения
867
Реакции
457
да, он тоже подходит, но там не от плагина цвет зависит, а от карты.
--- Добавлено позже ---

только нужно при спавне выдачу реализовать, а не при старте раунда
PHP:
#include <sdktools>
#pragma semicolon 1

public Plugin myinfo =
{
    name = "Endless Snowballs",
    author = "Phoenix (˙·٠●Феникс●٠·˙)",
    version = "1.0.0",
    url = "http://www.hlmod.ru/ http://zizt.ru/"
};

int AmmoTypeSnowballs = -1;

public void OnPluginStart()
{
    HookEvent("player_spawn", EventPlayerSpawn);
}

public void OnMapStart()
{
    if(AmmoTypeSnowballs == - 1)
    {
        int iEntity = CreateEntityByName("weapon_snowball");
        DispatchSpawn(iEntity);
        AmmoTypeSnowballs = GetEntProp(iEntity, Prop_Send, "m_iPrimaryAmmoType");
        AcceptEntityInput(iEntity, "Kill");
    }
}

public void EventPlayerSpawn(Event hEvent, char[] chEvent, bool bDontBroadcast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    if(IsPlayerAlive(iClient))
    {
        if(GetEntProp(iClient, Prop_Data, "m_iAmmo", _, AmmoTypeSnowballs) == 0)
        {
            GivePlayerItem(iClient, "weapon_snowball");
        }
        SetEntProp(iClient, Prop_Data, "m_iAmmo", 999, _, AmmoTypeSnowballs);
    }
}
PHP:
#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_spawn", ePS);
}

public void ePS(Event hEvent, const char[] name, bool dontBroadcast)
{
    RequestFrame(PS, GetEventInt(hEvent, "userid"));
}

void PS(int iUserid)
{
    int iClient = GetClientOfUserId(iUserid);
    if(IsClientInGame(iClient) && !IsFakeClient(iClient) && !IsClientSourceTV(iClient)) GivePlayerItem(iClient, "weapon_snowball");
}
 

Вложения

  • endless_snowballs.smx
    4.4 КБ · Просмотры: 4
  • endless_snowballs.sp
    1,006 байт · Просмотры: 6
Последнее редактирование:

Faya™

Жуестер
Сообщения
867
Реакции
457
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Faya™, можно чуть упростить:
PHP:
#include <sdktools_functions>

public void OnPluginStart()
{
    HookEvent("player_spawn", ePS);
}

public void ePS(Event event, const char[] name, bool dontBroadcast)
{
    RequestFrame(PS, event.GetInt("userid"));
}

void PS(int client)
{
    if((client = GetClientOfUserId(client)) && !IsFakeClient(client) && !IsClientSourceTV(client))
//  не уверен в необходимости последней проверки: емнип, если IsClientSourceTV() истинно, то и IsFakeClient() должно быть истинно
    {
        GivePlayerItem(client, "weapon_snowball");
        GivePlayerItem(client, "weapon_snowball");
        GivePlayerItem(client, "weapon_snowball");
    }
}
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Grey83, тогда уж в цикл долбануть.
PHP:
#include <sdktools_functions>

public void OnPluginStart()
{
    HookEvent("player_spawn", ePS);
}

public void ePS(Event event, const char[] name, bool dontBroadcast)
{
    RequestFrame(PS, event.GetInt("userid"));
}

void PS(int client)
{
    if((client = GetClientOfUserId(client)) && !IsFakeClient(client))
    {
        for (int i = 3; i != 0; --i)
            GivePlayerItem(client, "weapon_snowball");
    }
}
 

Grey83

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

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@Grey83, поспорю. Зависит от типа цикла.
Но в данном случае будет сэкономлена память, как минимум. Компилятор SourcePawn очень тупой, и продублировал бы три раза строку с названием "оружия".
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Как это определить?
При компиляции в обоих случаях Stack/heap size равны, а размер скомпиленного файла у моей версии даже меньше, чем у твоей.
Насколько мне известно Stack/Heap Size - фиксирован, а из тестов с циклами( while / for ), ваш вариант по Code size больше всего байт.
Я к чему, данные показатели относительны. Сам же ловил приколы с учетом размера файла от длинны комментариев...
upload_2018-12-19_21-38-53.png
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Как это определить?
В дизассемблер закинуть файл, и посмотреть в секцию .data.
upload_2018-12-20_0-42-49.png

При компиляции в обоих случаях Stack/heap size равны,
Оно фиксированно. Надо смотреть на Code size и Data size.

Code size - кол-во ассемблерных инструкций.
Data size - кол-во константных данных (строки, числа, etc.).

Сам же ловил приколы с учетом размера файла от длинны комментариев...
Потому что:
Компилятор SourcePawn очень тупой
Вы ради интереса как-нибудь под дизассемблером посмотрите файл, и всё станет понятно.

И вообще, использовать compile.exe - себя не уважать, потому что:
  • В итоговый бинарный файл гарантированно попадёт путь к исходнику, который обычно в логах пишется при ошибках, из-за чего билд жирнее, и размер всегда будет отличаться от машины к машине, если папка с исходниками лежит в разных местах.
  • Это обёртка над spcomp.exe (!), написанная на Паскале (!!!).
  • Часто скрывает ошибки от spcomp.exe, если они фатальные. Причём скрывает гениальнейшим способом: либо Internal error, либо тупо краш.
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
В дизассемблер закинуть файл, и посмотреть в секцию .data.
Посмотреть вложение 36713


Оно фиксированно. Надо смотреть на Code size и Data size.

Code size - кол-во ассемблерных инструкций.
Data size - кол-во константных данных (строки, числа, etc.).


Потому что:

Вы ради интереса как-нибудь под дизассемблером посмотрите файл, и всё станет понятно.

И вообще, использовать compile.exe - себя не уважать, потому что:

  • В итоговый бинарный файл гарантированно попадёт путь к исходнику, который обычно в логах пишется при ошибках, из-за чего билд жирнее, и размер всегда будет отличаться от машины к машине, если папка с исходниками лежит в разных местах.

    Это обёртка над spcomp.exe (!), написанная на Паскале (!!!).
    Часто скрывает ошибки от spcomp.exe, если они фатальные. Причём скрывает гениальнейшим способом: либо Internal error, либо тупо краш.
А чем тогда компилить нужно?)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Wightjeck, видимо батником или ярлыком к spcomp.exe с параметрами
C-подобный:
SourcePawn Compiler 1.8.0.5928
Copyright (c) 1997-2006 ITB CompuPhase
Copyright (c) 2004-2015 AlliedModders LLC

Usage:   spcomp <filename> [filename...] [options]

Options:
         -a       output assembler code
         -c<name> codepage name or number; e.g. 1252 for Windows Latin-1
         -Dpath   active directory path
         -e<name> set name of error file (quiet compile)
         -H<hwnd> window handle to send a notification message on finish
         -h       show included file paths
         -i<name> path for include files
         -l       create list file (preprocess only)
         -o<name> set base name of (P-code) output file
         -O<num>  optimization level (default=-O2)
             0    no optimization
             2    full optimizations
         -p<name> set name of "prefix" file
         -s<num>  skip lines from the input file
         -t<num>  TAB indent size (in character positions, default=8)
         -v<num>  verbosity level; 0=quiet, 1=normal, 2=verbose (default=1)
         -w<num>  disable a specific warning by its number
         -E       treat warnings as errors
         -\       use '\' for escape characters
         -^       use '^' for escape characters
         -;<+/->  require a semicolon to end each statement (default=-)
         sym=val  define constant "sym" with value "val"
         sym=     define constant "sym" with value 0

Options may start with a dash or a slash; the options "-d0" and "/d0" are equivalent.

Options with a value may optionally separate the value from the option letter with a colon (":"), an equal sign ("="), or a space (" "). That is, the options "-d0", "-d=0", "-d:0", and "-d 0" are all equivalent. "-;" is an exception to this and cannot use a space.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Я лично компилирую через spcomp. Причем переносить исходники на компилятор - плохая практика. Могу завтра расписать, как правильнее всего (т.е. через консоль).
 

wightjeck

Костыли заказывали?
Сообщения
472
Реакции
154
Я лично компилирую через spcomp. Причем переносить исходники на компилятор - плохая практика. Могу завтра расписать, как правильнее всего (т.е. через консоль).
Давай, жду))))
Будет весьма полезно.
 

StormX

Участник
Сообщения
891
Реакции
302
Добавьте пожалуйста командный цвет в данный плагин для старушки 34-ки :).
 

Вложения

  • Adverts.sp
    4.8 КБ · Просмотры: 10
Сверху Снизу