Here's my implementation that doesn't seem to work... and I can't figure out why. Here's what happens when I use the below code: <url no longer valid>
Look at what's in the red markings. I'm assuming this is the break between user messages sent, but I can't figure out what exactly the problem is.
Code:
void ShowMenu(int player_index, int seconds, unsigned int keys, const char *menu_string)
{
if (g_iShowMenu)
{
size_t len = strlen(menu_string);
if (len < 251)
{
RecipientFilter rf;
rf.RemoveAllRecipients();
rf.AddRecipient(player_index);
bf_write *msg = engine->UserMessageBegin(&rf, g_iShowMenu);
msg->WriteShort((!keys ? (1<<9) : keys));
msg->WriteChar(seconds);
msg->WriteByte(0);
msg->WriteString(menu_string);
engine->MessageEnd();
}
else
{
char menu_string_clamped [240];
RecipientFilter rf;
rf.RemoveAllRecipients();
rf.AddRecipient(player_index);
do
{
bf_write *msg = engine->UserMessageBegin(&rf, g_iShowMenu);
msg->WriteShort((!keys ? (1<<9) : keys));
msg->WriteChar(seconds);
if (len < 251)
msg->WriteByte(0); // Draw immediately
else
msg->WriteByte(1); // Draw later more info required
snprintf(menu_string_clamped, sizeof(menu_string_clamped), "%s", menu_string);
msg->WriteString(menu_string_clamped);
engine->MessageEnd();
if (len > 250)
{
size_t s = strlen(menu_string_clamped);
menu_string += s;
len -= s;
}
else break;
}
while (len);
}
}
}