Odbieranie stringa:
Spoiler
#include <amxmodx> #define AUTHOR "Robin - amxx.pl/user/60210-wicked/" #define MAX_MESSAGE_SIZE 32 #define DEBUG_MODE public plugin_init() { register_plugin("Hud message receiver", "v1.0", AUTHOR); } public plugin_natives() { register_native("add_message", "handle_add_message", 0); } // add_message(const message[]) public handle_add_message(plugin, params) { if(params != 1) { return 1; } new msg[MAX_MESSAGE_SIZE + 1]; get_string(1, msg, charsmax(msg)); #if defined DEBUG_MODE log_amx("Received message: ^"%s^"", msg); #endif return 0; }
Wysyłanie stringa:
Spoiler
#include <amxmodx> #define AUTHOR "Robin - amxx.pl/user/60210-wicked/" native add_message(const message[]); public plugin_init() { register_plugin("Hud message sender", "v1.0", AUTHOR); new hello[16] = "Hello"; add_message(hello); add_message("World!"); }
Output:
L 05/15/2022 - 12:19:52: [receiver.amxx] Received message: "Hello" L 05/15/2022 - 12:19:52: [receiver.amxx] Received message: "World!"
Pomysł ma sens, jeśli wiesz co robisz. Osobiście uważam, że limit 4 kanałów jest przydatny i wychodzi wszystkim na dobre, chociaż sam wiele razy potrzebowałem się go pozbyć. Dla przykładu, potrzebowałem zrobić hud feed, czyli wiadomości wyświetlane kolejkowo (coś jak reward feed w Call Of Duty i innych tego typu grach), i rozwiązałem problem przesyłając do głównego pluginu wiadomości i zapisując je do tablicy dynamicznej, z której później odczytywałem je w odpowiednim momencie:Ogólnie to chcę obejść problem ilości wiadomości jakie można wypisać na hud. Wiadomo, są 4 kanały, ale gdyby zsumować wiadomości z kilku pluginów i wyświetlać je jedna pod drugą, można by to obejść.
Spoiler
#include <amxmodx> #include <common> #define AUTHOR "Wicked - amxx.pl/user/60210-wicked/" #define TASK_DISPLAY_FEED 1337 #define MAX_HUD_LEN 128 static const CONFIG_PATH[] = "feed/feed.cfg"; enum _:FeedMessageEnumerator (+= 1) { FM_MESSAGE[MAX_HUD_LEN], FM_ID }; new Array:feed_messages[MAX_PLAYERS], displayed_messages, hud_object; public plugin_init() { register_plugin("Hud feed", "v1.0", AUTHOR); hud_object = CreateHudSyncObj(); create_cvar("feed_max_len", "128"); create_cvar("feed_max_messages", "5"); create_cvar("feed_display_time", "2.0"); create_cvar("feed_hold_time", "2.0"); create_cvar("feed_refresh_rate", "1.0"); create_cvar("feed_brightness", "0.2"); create_cvar("feed_r", "20"); create_cvar("feed_g", "20"); create_cvar("feed_b", "20"); create_cvar("feed_x", "-1.0"); create_cvar("feed_y", "0.85"); exec_config(); register_clcmd("say /test_feed", "test_feed"); } public test_feed(index) { static const Chars[] = "qwertyuiopasdfghjklmnbvcxz"; new msg[30]; ForRange(i, 0, 10) { formatex(msg, charsmax(msg), "%i. ", i + 1); ForRange(j, 0, random_num(10, 20)) { add(msg, charsmax(msg), fmt("%c", Chars[random(sizeof(Chars) - 1)])); } add_to_feed(index, msg); // log(LOG_DEBUG, "Adding message to user (%i) feed: %s", index, msg); } } public client_putinserver(index) { if(!is_valid_player(index)) { return; } feed_messages[index] = ArrayCreate(FeedMessageEnumerator, 1); // log(LOG_DEBUG, "Creating array of feed messages for user %i", index); } public client_disconnected(index) { if(!is_valid_player(index) || feed_messages[index] == Invalid_Array) { return; } ArrayDestroy(feed_messages[index]); // log(LOG_DEBUG, "Destroying array of feed messages for user %i", index); } public plugin_natives() { register_native("add_user_feed", "native_add_feed", 0); } // native add_user_feed(index, const message[]); public native_add_feed(plugin, params) { if(!valid_params(params, 2, "add_user_feed")) { return 0; } new index = get_param(1); if(!is_valid_player(index)) { return 0; } new msg[MAX_HUD_LEN]; get_string(1, msg, charsmax(msg)); add_to_feed(index, msg); // log(LOG_DEBUG, "Adding feed message for user %i: %s", index, msg); return 1; } add_to_feed(index, const message[]) { if(!strlen(message) || !is_valid_player(index)) { return 0; } new data[FeedMessageEnumerator], Float:time = get_cvar_float("feed_display_time"), max = get_cvar_num("feed_max_messsages"), size = ArraySize(feed_messages[index]); // If currently there are max or more messages displayed, add a delay to the new ones. if(size >= max) { new place = size - max + 1; time *= place; } copy(data[FM_MESSAGE], MAX_HUD_LEN - 1, message); data[FM_ID] = displayed_messages++; // Add new message. ArrayPushArray(feed_messages[index], data); // Set task to remove the message from feed after it is displayed. set_task(time, "remove_from_feed", index); new task = TASK_DISPLAY_FEED + index; // Show hud if it isn't there yet. if(!task_exists(task)) { new Float:refresh = get_cvar_float("feed_refresh_rate"); set_task(refresh, "show_feed", task, .flags = "b"); // log(LOG_DEBUG, "Setting up feed message task: (User: %i) (Time: %0.2f)", index, refresh); } return 1; } public remove_from_feed(index) { if(!is_valid_player(index) || !ArraySize(feed_messages[index])) { return; } // Remove first (oldest) message. ArrayDeleteItem(feed_messages[index], 0); // log(LOG_DEBUG, "Removing oldest message from user %i", index); } // public remove_from_feed(data[]) // { // new index = data[0]; // if(!is_valid_player(index)) // { // return; // } // new id = data[1], // array_id = -1, // data[FeedMessageEnumerator]; // ForDynamicArray(i, feed_messages[index]) // { // ArrayGetArray(feed_messages[index], i, data); // if(data[FM_ID] == id) // { // array_id = i; // break; // } // } // if(array_id != -1) // { // ArrayDeleteItem(feed_messages[index], array_id); // // log(LOG_DEBUG, "Removing message of %i from feed of user %i", array_id, index); // } // } public show_feed(task) { new index = task - TASK_DISPLAY_FEED; // No messages or players on the server. if(!ArraySize(feed_messages[index]) || !is_valid_player(index)) { return; } new msg[MAX_HUD_LEN], message[MAX_HUD_LEN]; ForDynamicArray(i, feed_messages[index]) { // Limit amount of displayed messages. if(i >= get_cvar_num("feed_max_messages")) { break; } ArrayGetString(feed_messages[index], i, msg, charsmax(msg)); // Format feed with oldest (first to disappear) on the bottom and newest on the top. format(message, charsmax(message), "%s^n%s", msg, message); } new Float:br = get_cvar_float("feed_brightness"), r = clamp(floatround(get_cvar_num("feed_r") * br), 0, 255), g = clamp(floatround(get_cvar_num("feed_g") * br), 0, 255), b = clamp(floatround(get_cvar_num("feed_b") * br), 0, 255), Float:x = get_cvar_float("feed_x"), Float:y = get_cvar_float("feed_y"), Float:refresh = get_cvar_float("feed_refresh_rate"); // Show the feed. set_hudmessage(r, g, b, x, y, 0, 0.0, refresh, 0.0, 0.0); ShowSyncHudMsg(index, hud_object, message); } exec_config() { new path[64]; get_localinfo("amxx_configsdir", path, charsmax(path)); server_cmd("exec %s/%s", path, CONFIG_PATH); server_exec(); } bool:is_valid_player(index) { return is_user_connected(index) && !is_user_hltv(index) && !is_user_bot(index); }
No i pamiętaj o tym, że istnieje też sync hud.