The transitional syntax version of
AdvMOTD_OnQueryFinished function isn't completing the callback with
Call_Finish(). It always fails silently. The pretransitional one is fine, on the other hand.
Here's a fixed copy that actually completes the call and removes the forward instantiation in favor of just packing in the function.
Code:
#if defined _advmotd_enabled
#endinput
#endif
#define _advmotd_enabled
enum MOTDFailureReason {
MOTDFailure_Unknown, // Failure reason unknown
MOTDFailure_Disabled, // Client has explicitly disabled HTML MOTDs
MOTDFailure_Matchmaking, // HTML MOTD is disabled by Quickplay/matchmaking (TF2 only)
MOTDFailure_QueryFailed // cl_disablehtmlmotd convar query failed
};
typedef MOTDFailure = function void (int client, MOTDFailureReason reason);
/**
* Displays an MOTD panel to a client with advanced options
*
* @param client Client index the panel should be shown to
* @param title Title of the MOTD panel (not displayed on all games)
* @param msg Content of the MOTD panel; could be a URL, plain text, or a stringtable index
* @param type Type of MOTD this is, one of MOTDPANEL_TYPE_TEXT, MOTDPANEL_TYPE_INDEX, MOTDPANEL_TYPE_URL, MOTDPANEL_TYPE_FILE
* @param visible Whether the panel should be shown to the client
* @param big true if this should be a big MOTD panel (TF2 only)
* @param verify true if we should check if the client can actually receive HTML MOTDs before sending it, false otherwise
* @param callback A callback to be called if we determine that the client can't receive HTML MOTDs
* @noreturn
*/
stock void AdvMOTD_ShowMOTDPanel(int client, const char[] title, const char[] msg, int type=MOTDPANEL_TYPE_INDEX, bool visible=true, bool big=false, bool verify=false, MOTDFailure callback=INVALID_FUNCTION) {
char connectmethod[32];
if(verify && GetClientInfo(client, "cl_connectmethod", connectmethod, sizeof(connectmethod))) {
if(StrContains(connectmethod, "quickplay", false) != -1 || StrContains(connectmethod, "matchmaking", false) != -1) {
if(callback != INVALID_FUNCTION) {
Call_StartFunction(null, callback);
Call_PushCell(client);
Call_PushCell(MOTDFailure_Matchmaking);
Call_Finish();
}
return;
}
}
KeyValues kv = new KeyValues("data");
kv.SetString("title", title);
kv.SetNum("type", type);
kv.SetString("msg", msg);
if(big) {
kv.SetNum("customsvr", 1);
}
if(verify) {
DataPack pack = new DataPack();
pack.WriteCell(kv);
pack.WriteCell(visible);
pack.WriteFunction(callback);
QueryClientConVar(client, "cl_disablehtmlmotd", AdvMOTD_OnQueryFinished, pack);
} else {
ShowVGUIPanel(client, "info", kv, visible);
CloseHandle(kv);
}
}
public void AdvMOTD_OnQueryFinished(QueryCookie cookie, int client, ConVarQueryResult result, const char[] cvarName, const char[] cvarValue, DataPack pack) {
pack.Reset();
KeyValues kv = pack.ReadCell();
bool visible = pack.ReadCell();
Function callback = pack.ReadFunction();
delete pack;
if(result != ConVarQuery_Okay || StringToInt(cvarValue)) {
delete kv;
if(callback != INVALID_FUNCTION) {
Call_StartFunction(INVALID_HANDLE, callback);
Call_PushCell(client);
Call_PushCell((result != ConVarQuery_Okay) ? MOTDFailure_QueryFailed : MOTDFailure_Disabled);
Call_Finish();
}
return;
}
ShowVGUIPanel(client, "info", kv, visible);
delete kv;
}