У меня есть следующий код для отправки блока текста на игровую консоль пользователя (Crysis Wars):
CMCCPlayer(player, "================================================================================================================");
CMCCPlayer(player, "$4#### ### ### ###### ####");
CMCCPlayer(player, "$4## ### ### ## ## ##");
CMCCPlayer(player, "$4## ### ### ## ##");
CMCCPlayer(player, "$4## ### ##### ###### ### ##");
CMCCPlayer(player, "$4## ### ### ## ##");
CMCCPlayer(player, "$4## ### ### ## ## ## ");
CMCCPlayer(player, "$4#### ### ### ###### ####");
CMCCPlayer(player, "================================================================================================================");
Но я получаю такой результат:
Эта проблема практически преследует сообщество разработчиков Crysis Wars, и реальных решений для этого не было. Форматы кода хороши, если я делаю это прямо с C ++, а не с Lua на C ++, поэтому это должно быть проблемой на стороне Lua.
Я попытался синхронизировать сообщения с интервалом 1 мс, и это привело к тому, что некоторые сообщения пропали без вести (возможно, потому, что последние сообщения переопределяют старые).
Ребята, у вас есть предложения или решения по этому вопросу? Если вы предоставите работающее решение, вы будете довольно известны в сообществе разработчиков Crysis Wars, поскольку вы бы решили довольно досадную ошибку :). Я бы предложил немного своей репутации, но, к сожалению, сегодня утром я вручил награду кому-то за решение другой проблемы.
Код функции для отправки сообщений:
function CMCCPlayer(player, msg)
g_gameRules.game:SendConsoleMessage(player.id, g_gameRules.game:CentreTextForConsole(msg));
end
Если это поможет, вот код C ++ SendConsoleMessage:
int CScriptBind_GameRules::SendConsoleMessage(IFunctionHandler *pH, ScriptHandle playerId, const char *msg)
{
CGameRules *pGameRules=GetGameRules(pH);
if (!pGameRules)
return pH->EndFunction();
int channelId=pGameRules->GetChannelId((EntityId)playerId.n);
pGameRules->SendTextMessage(eTextMessageConsole, msg, eRMI_ToClientChannel, channelId);
msg=0; //Null the message.
return pH->EndFunction();
}
Редактировать:
Обратите внимание, что это не относится к тексту, используемому для центрирования, и что изображение и текстовый блок ниже приведены только в качестве примера; эта проблема возникает в каждом отправляемом фрагменте кода.
Итак, вы говорите, что последовательность этих функций всегда приводит к выводу, который является полной противоположностью порядка функций. Так что … просто отправьте данные в задний ход порядок. Таким образом, это удвоит сторнирование и представит данные в ожидаемом порядке.
Есть множество способов сделать это. Вы можете создать простую функцию Lua, которая принимает массив строк и транслирует их в обратном порядке:
function BroadcastToPlayer(player, strings)
for i = #strings, 1, -1 do
CMCCPlayer(player, strings[i]);
end
end
Вы можете увеличить это, чтобы принимать строки как массив или как ряд переменных строк, создавая массив на месте:
function BroadcastToPlayer(player, ...)
local test = ...
if(type(test) == "string") then return BroadcastToPlayer(player, {...}) end
for i = #strings, 1, -1 do
CMCCPlayer(player, strings[i]);
end
end
Вы даже можете создать простой объект Lua, которому будут переданы строки, а затем вызвать его для отправки всех сохраненных строк.
function CreateStringMan()
local man = {}
function man:add(str)
self._strings = self._strings or {}
self._strings[#self._strings + 1] = str
end
function man:CMCCPlayer(player)
for i = #self._strings, 1, -1 do
CMCCPlayer(player, self._strings[i]);
end
self._strings = {} --clear the strings
end
return man
end
Этот вывод инвертирован из вашего ввода. Если вы внимательно посмотрите на свои входные данные, вы заметите, что ваша вторая до последней строки содержимого на один символ длиннее, чем ваши другие строки. Это заставит это быть сосредоточено на экране по-другому. Попробуйте удалить это дополнительное пространство и посмотреть, решит ли это проблему.