消息格式错误

我有以下代码将一块文本发送到用户的游戏主机(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, "================================================================================================================");

但我得到了以下结果:

Wrong Text

这个问题几乎困扰着Crysis Wars开发者社区,但是没有真正的解决方案。如果我直接从C++而不是从Lua到C++执行,那么代码格式就可以正常显示,所以这一定是Lua方面的问题。

我尝试将消息的时间间隔定为1ms,但这导致有些消息丢失了(可能是因为最近的消息覆盖了旧的消息)。

你们有什么建议或解决此问题的解决方案吗?如果你们提供有效的解决方案,你们将在Crysis Wars开发者社区中变得非常出名,因为你们解决了一个非常烦人的bug :)。我愿意提供我的一些声望,但不幸的是,今天早上我授予了赏金给某人解决了另一个问题。

发送消息的函数代码:

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();
}

** 编辑: **

请注意,这与文本用于居中有关,下面的图像和文本块仅作为示例提供;此问题发生在发送的每个代码上。

enter image description here

Msg1

点赞
用户258523
用户258523

该输出结果是与您的输入相反的。如果您仔细查看您的输入内容,您会注意到倒数第二行比其他行多一个字符。 这会导致其在屏幕上居中显示的方式不同。 请尝试删除该额外的空格,并查看是否可以解决问题。

2013-07-15 23:36:05
用户734069
用户734069

所以您说这些功能的序列始终会产生与函数顺序完全相反的输出。 所以...只需按相反的顺序发送数据即可。这将使反转加倍,并按预期顺序提交数据。

有许多方法可以做到这一点。您可以创建一个简单的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 = {} --清除字符串
    end
    return man
end
2013-07-21 09:03:01