PDA

Просмотр полной версии : [Вопрос] Перенос мода на include(перехват)



Igoreshka
12.03.2019, 20:22
Начал переносить системы из мода по инклудам.
У меня командный процессор dc_cmd, в консоли возникла ошибкаhttps://cdn1.savepice.ru/uploads/2019/3/12/e221397edcded3242c38df0f490430a5-full.jpg, сама команда работает и проблем нет с ней, как и с альтернативной командой. Но пугает этот текст.
Момент подключения в самом моде.

#include "server/player/cmd/pm.pwn"
сам pm.pwn

CMD:pm(playerid, params[])
{
if(sscanf(params, "us[84]", params[0],params[1])) return send(playerid, COLOR_LIGHTBLUE, "{ffffff} /pm [playerid] [Текст]");
if(!IsPlayerConnected(params[0])) return send(playerid, COLOR_RED, NoConnectGivePlayer);
new Float:pos[3], phoneIsHand = IsAHandType(playerid, 17);
GetPlayerPos(playerid, pos[0], pos[1], pos[2]);
if(!IsPlayerInRangeOfPoint(params[0], 10.0, pos[0], pos[1], pos[2]) && phoneIsHand == -1)
{
new string[144];
f(string, "[ОШИБКА] {FFFFFF}Вы слишком далеко от %s[%i]", sendername(params[0]), params[0]);
SendClientMessageError(playerid, COLOR_RED, string);
send(playerid, COLOR_LIGHTBLUE, "[ПОДСКАЗКА]{FFFFFF} Используйте телефон(переложите в руку), чтобы общаться с любой точки карты.");
return 1;
}
if(pTogPm[params[0]] == 0) return SendClientMessageError(playerid, COLOR_RED, "[ОШИБКА] {FFFFFF}Игрок заблокировал персональные сообщения.");
new string[144];
if(IsIpFound(params[1]))
{
f(string, "[Анти-реклама]:(IP:%s)%s[%d]: %s",ConnectIP[playerid],sendername(playerid),playerid,params[1]);
ABroadCast(COLOR_YELLOW,string,1);
return 0;
}
f(string, "ПМ от %s[%d]: %s", sendername(playerid), playerid, params[1]);
send(params[0], COLOR_YELLOW, string);
f(string, "ПМ к %s[%d]: %s", sendername(params[0]), params[0], params[1]);
send(playerid, TAXI_COLOR, string);
GivePlayerKapusta(playerid, -10);
format(string,sizeof(string),"~r~ -$%d", 10);
GameTextForPlayer(playerid,string,2000,1);
GiveBiznesTill(1, 10);
if(GetPVarInt(params[0], "PlayerInAFK") > 0)
{
f(string, "Игрок находится в AFK: %s!",ConvertSeconds(GetPVarInt(params[0], "PlayerInAFK")));
send(playerid, COLOR_YELLOW, string);
}
foreach(new i: Player)
{
if(apm[i] == 1)
{
f(string, "ПМ от %s[%d] к %s[%d]: %s",sendername(playerid),playerid,sendername(params[0]),params[0],params[1]);
send(i,0xFFFF80FF,string);
}
}
return 1;
}
public OnGameModeInit()
{
RegisterAlt("/pw", "/w");
#if defined pm__OnGameModeInit
return pm__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit pm__OnGameModeInit
#if defined pm__OnGameModeInit
forward pm__OnGameModeInit();
#endif

DeimoS
12.03.2019, 20:26
RegisterAlt("/pw", "/w");
На
RegisterAlt("/pm", "/pw", "/w");
Сначала должна указываться оригинальная команда.

И да, не советовал бы использовать перехваты при разделении мода на инклуды. Вот тут (http://pro-pawn.ru/showthread.php?16576-%D0%A1%D0%BE%D0%B2%D0%B5%D1%82-%D0%BF%D0%BE-%D0%B0%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B5-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&p=93323&viewfull=1#post93323) это обсуждалось

Igoreshka
12.03.2019, 20:48
почитал, предлагаешь лучше перехват пабликов делать один раз, и в этом месте записывать все мини функции разбитые по действиям?
тип:

#include "server/object/create_map_icon.pwn"
#include "server/object/object.pwn"
#include "server/object/create_text3d.pwn"
onGame()
{
LoadObject();
LoadMapIcon();
Load3dText();
return 1;
}
public OnGameModeInit()
{
onGame();
#if defined onGameMode__OnGameModeInit
return onGameMode__OnGameModeInit();
#endif
}
#if defined _ALS_OnGameModeInit
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#define OnGameModeInit onGameMode__OnGameModeInit
#if defined onGameMode__OnGameModeInit
forward onGameMode__OnGameModeInit();
#endif

/*в файлах находятся LoadObject, LoadMapIcon, Load3dText*/

DeimoS
12.03.2019, 20:53
Нет. В каждом инклуде создавать stock, в котором прописывать код, который нужно вызвать в паблике. А после уже в самом моде прописывать вызов этого stock.

Типа такого

//Инклуд 1:
stock includename1_OnGameModeInit()
{
//Нужный код
}

//Инклуд 2:
stock includename2_OnGameModeInit()
{
//Нужный код
}

//Инклуд 3:
stock includename3_OnGameModeInit()
{
//Нужный код
}

//Мод
public OnGameModeInit()
{
includename3_OnGameModeInit();
includename1_OnGameModeInit();
includename2_OnGameModeInit();
return 1;
}

Это позволяет контролировать порядок вызова кода из инклудов, легко его меняя (например, создать 2 функции в инклуде и первую функцию вызывать в начале коллбэка, а другую - в конце. С перехватами это сделать сложнее и никогда не будет уверенности, что код действительно сработает первым/последним) + позволяет легко увидеть то, какие инклуды вызывают тот или иной паблик.

Igoreshka
12.03.2019, 21:03
Спасибо, нашел ответ. Тему закройте.