View Single Post
nosoop
Veteran Member
Join Date: Aug 2014
Old 08-11-2017 , 04:55   Re: Advanced ShowMOTDPanel
Reply With Quote #26

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;
}
Attached Files
File Type: inc advanced_motd.inc (3.0 KB, 183 views)
__________________
I do TF2, TF2 servers, and TF2 plugins.
I don't do DMs over Discord -- PM me on the forums regarding inquiries.
AlliedModders Releases / Github / TF2 Server / Donate (BTC / BCH / coffee)

Last edited by nosoop; 08-11-2017 at 05:00. Reason: attached for ez download
nosoop is offline