Неправильное форматирование сообщений

У меня есть следующий код для отправки блока текста на игровую консоль пользователя (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();
}

Редактировать:

Обратите внимание, что это не относится к тексту, используемому для центрирования, и что изображение и текстовый блок ниже приведены только в качестве примера; эта проблема возникает в каждом отправляемом фрагменте кода.

введите описание изображения здесь

msg1

3

Решение

Итак, вы говорите, что последовательность этих функций всегда приводит к выводу, который является полной противоположностью порядка функций. Так что … просто отправьте данные в задний ход порядок. Таким образом, это удвоит сторнирование и представит данные в ожидаемом порядке.

Есть множество способов сделать это. Вы можете создать простую функцию 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
2

Другие решения

Этот вывод инвертирован из вашего ввода. Если вы внимательно посмотрите на свои входные данные, вы заметите, что ваша вторая до последней строки содержимого на один символ длиннее, чем ваши другие строки. Это заставит это быть сосредоточено на экране по-другому. Попробуйте удалить это дополнительное пространство и посмотреть, решит ли это проблему.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector