[SourcePawn] Урок 15 - API (natives, forwards, functions)

crux

Участник
Сообщения
49
Реакции
4
Отсюда, не? AskPluginLoad2
Я пытаюсь запустить форвард после полной загрузки плагина, конфига, и все, что будет находиться в OnPluginStart. В AskPluginLoad2 я создаю форварды, запускать я их буду позже. И кстати, из AskPluginLoad2 форвард тоже не отрабатывает, может и отрабатывает, но другой плагин этого не видит)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@crux, форварды нужно создавать либо в AskPluginLoad2(), либо в OnPluginStart().
Все остальные варианты будут пытаться созать один и тот же форвард несколько раз.
OnMapStart() срабатывает также при запуске плагина сразу после OnPluginStart().
И если уж делаешь нативы и форварды (особенно если их много), то лучше регистрировать библиотеку (в AskPluginLoad2() вот таким образом: RegPluginLibrary("уникальное_имя_библиотеки_латиницей");), чтобы другие плагины могли простым способом определит загрузилось ли ядро.
 

crux

Участник
Сообщения
49
Реакции
4
@crux, форварды нужно создавать либо в AskPluginLoad2(), либо в OnPluginStart().
Все остальные варианты будут пытаться созать один и тот же форвард несколько раз.
OnMapStart() срабатывает также при запуске плагина сразу после OnPluginStart().
И если уж делаешь нативы и форварды (особенно если их много), то лучше регистрировать библиотеку (в AskPluginLoad2() вот таким образом: RegPluginLibrary("уникальное_имя_библиотеки_латиницей");), чтобы другие плагины могли простым способом определит загрузилось ли ядро.
У меня будет 1-2 форварда, но Ваш совет учту, спасибо. Я пока вот так сделал, не знаю грамотно ли это, но это то, что пришло в голову:
C-подобный:
#if defined _deathmatch_included
#endinput
#endif
#define _deathmatch_included

Handle hDeathMath_Core;
forward void DM_OnLoaded();
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#define PLUGIN_AUTHOR                        ""
#define PLUGIN_VERSION                         ""
#define PLUGIN_URL                             ""

#include <sourcemod>
#include <sdktools>

Handle g_hDM_OnLoaded;

public Plugin myinfo =
{
   name = "DM_Core",
   author = PLUGIN_AUTHOR,
   description = "DM_Core",
   version = PLUGIN_VERSION,
   url = PLUGIN_URL
};

public APLRes AskPluginLoad2(Handle hMyself, bool bLate, char[] sError, int iErr_max)
{
   g_hDM_OnLoaded = CreateGlobalForward("DM_OnLoaded", ET_Ignore);
   return APLRes_Success;
}

public void OnPluginStart()
{
   hDeathMath_Core = GetMyHandle();
   Call_StartForward(g_hDM_OnLoaded);
   Call_Finish();
}
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#define PLUGIN_AUTHOR ""
#define PLUGIN_VERSION ""

#include <sourcemod>
#include <sdktools>

public Plugin myinfo =
{
   name = "",
   author = PLUGIN_AUTHOR,
   description = "",
   version = PLUGIN_VERSION,
   url = ""
};

public void OnPluginStart()
{
   if (GetPluginStatus(hDeathMath_Core) == Plugin_Running)
   {
       LogMessage("DM_Core загружен ранее");
   }
}


public void DM_OnLoaded()
{
   if (GetPluginStatus(GetMyHandle()) != Plugin_Running)
   {
       LogMessage("DM_Core загружен");
   }
}
Я так понял, что второй плагин не реагировал, потому что он еще не был загружен, когда в основном запустился форвард, по этому нужно чтобы была синхронизация и вторичные плагины реагировали на загрузку основного плагина как перед ними, так и после них.
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
if (GetPluginStatus(hDeathMath_Core) == Plugin_Running)
не сработает никогда (и даже не скомпилится, потому что ты не создал хэндл hDeathMath_Core)
Загрузку ядра проверяют иначе как правило. Посмотри как в админку соурсмода добавляют пункты/разделы меню.
C-подобный:
#include <adminmenu>

TopMenu hTopMenu;
TopMenuObject obj_category;

public void OnAllPluginsLoaded()
{
    TopMenu topmenu;
    if(LibraryExists("adminmenu") && (topmenu = GetAdminTopMenu())) OnAdminMenuReady(topmenu);
}

public void OnLibraryRemoved(const char[] name)
{
    if(StrEqual(name, "adminmenu")) hTopMenu = null;
}

public void OnAdminMenuReady(Handle aTopMenu)
{
    TopMenu topmenu = TopMenu.FromHandle(aTopMenu);
    if(obj_category == INVALID_TOPMENUOBJECT) OnAdminMenuCreated(topmenu);
    if(topmenu == hTopMenu)
        return;

    hTopMenu = topmenu;

    // добавляем пункты
}

public void OnAdminMenuCreated(Handle aTopMenu)
{
    TopMenu topmenu = TopMenu.FromHandle(aTopMenu);
    if(topmenu == hTopMenu && obj_category != INVALID_TOPMENUOBJECT) return;

    obj_category = AddToTopMenu(topmenu, "Название категории", TopMenuObject_Category, Handle_MenuCategory, INVALID_TOPMENUOBJECT);
}
 

crux

Участник
Сообщения
49
Реакции
4
не сработает никогда (и даже не скомпилится, потому что ты не создал хэндл hDeathMath_Core)
Загрузку ядра проверяют иначе как правило. Посмотри как в админку соурсмода добавляют пункты/разделы меню.
Почему? В inc же дескриптор. Я уже проверил, все работает. Сейчас посмотрю админку.
 

Вложения

  • Screenshot_52.png
    Screenshot_52.png
    7.4 КБ · Просмотры: 15

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Почему? В inc же дескриптор.
Но у тебя нет его в списке инклюдов модуля, зато есть ненужный sourcemod (емнип, начиная с SM 1.7 его добавлять не нужно, т.к. компилятор его сам добавляет).
 
Сверху Снизу