返回列表 发帖

问个小问题CustomData相关

如果保存了信息在CustomData,那就必须注册CUSTOM_DATA_LOADED,或者你确定CUSTOM_DATA已经加载之后才能调用与保存信息相关的函数。但是对于一个没有界面,也就是不调用OnFrameCreate的插件,该怎么注册这个函数呢。
直接在代码里面Test:RegisterEvent("CUSTOM_DATA_LOADED")注册貌似是行不通的。。。
-------------------------------------------------------------
补充一个问题,我通过创建一个不可见的Frame在OnFrameCreate中调用了RegisterEvent("CUSTOM_DATA_LOADED"),然后成功了,但是发现我之前持久化到CustomData中的数据没有效果
  1. A.b = true
  2. RegisterCustomData("A.b")
复制代码
当改变A.b = false以后,它在CustomData中保存成
  1. _custom_data_ =
  2. {
  3. ["A.b"] = false
  4. }
复制代码
但是再进入游戏,在
  1. OnEvent(event)
  2.      if event =="CUSTOM_DATA_LOADED" then
  3.            --这里查看A.b
  4.      end
  5. end
复制代码
这时候,A.b还是true。。。这又是为啥呢。。。

上面这个问题解决了,我在RegisterEvent以后就用Wnd.CloseWindow()把隐形窗口消灭了。但是这样就导致前面注册的动作通通失效。所以,应该来说,除非创建隐形窗口,否则是不可能RegisterEvent了。。。

写在main里 独立于所有函数 我是这样做的

另外 当游戏由于延迟原因登陆失败 CustomData会被自动清除 NMBD...
  1. MChat={
  2. Channels={"近聊","地图","帮会","世界","门派","阵营","密语"},
  3. SetCh={1,5,19,20,21,11,6},
  4. InitWords="点卡|淘宝|5173|收G|领取|奖品|招收|公会",
  5. InitBlackList="李忘生|东方宇轩|玄正|李承恩|叶芷青",
  6. ChatCount=0,
  7. OnPlayerTalk_Old=GlobalEventHandler.OnPlayerTalk
  8. }

  9. --最大可以保存的聊天记录数目
  10. local MaxLength=100

  11. local ChannelChName={
  12.         [20]="世界",
  13.         [21]="门派",
  14.         [22]="阵营",
  15.         [11]="剧情",
  16.         [5]="地图",
  17.         [19]="公会",
  18.         [1]="近聊",
  19.         [6]="密语",
  20.         [2]="小队",
  21.         [3]="团队"
  22. }

  23. RegisterCustomData("MChat.Settings")

  24. if not MChat.Settings then
  25.         MChat.Settings={}
  26. end
  27. if not MChat.Settings.Words then
  28.         MChat.Settings.Words=MChat.InitWords
  29. end
  30. if not MChat.Settings.BlackList then
  31.         MChat.Settings.BlackList=MChat.InitBlackList
复制代码


你注册的是你的名字 也就是Table的名字 比如注册MySettings.UI 然后直接对这个表赋值就可以了 不是注册选项的名字

TOP

2# murmur

我仔细看了你的代码,觉得可能会有问题,MChat.Settings保存在CustomData中的数据还没来得及覆盖旧的信息,那么你就将MChat.Settings初始化为一个空的table。
对于要持久化到CustomData中的数据感觉还是在RegisterEvent("CUSTOM_DATA_LOADED")的回调中处理比较好。
对由于延迟原因登陆失败导致CustomData还原,太阳啊,这玩意儿清的真是。。。每次把插件勾选掉,登陆,再退出,也会清楚。虽然这样防止了这个文件的过于庞大,但是这种处理方式实在是很扯淡。。

另外写在main里是什么意思,能再说下么,谢啦~

TOP

C语言的main函数么 对应lua就是没有任何函数定义那部份

这样不注册事件是不是很好 既然这东西做的那么扯蛋 也没必要太认真了 认真你就输了

另外 数据保存是在你关闭UI 也就是返回角色选择或者关闭游戏的时候进行的

中间干什么就不管了 反正初始化数据能读出来就对了 如果注册失败整个代码最多卡住而已

TOP

没窗口注册事件,参考下面的写法,代码是官方脚本里的。
  1. function Login.OnCustomDataLoaded()
  2.         if arg0 == "LoginGlobal" then
  3.                 Login.m_szAccount = g_tLoginData.szAccount       
  4.         end
  5. end
  6. RegisterEvent("CUSTOM_DATA_LOADED", Login.OnCustomDataLoaded)
复制代码
"LoginGlobal"是不同的数据装载,还有Global,Account,Role等等。
还可以这样写
RegisterEvent("CUSTOM_DATA_LOADED", function(event) EmotionPanel.OnEvent(event) end)
下面这个没试过。可能只对“Role”的数据有效。
RegisterLoadFunction(func)
1

评分人数

  • hahaso

TOP

4# murmur

TOP

5# limke

你是我的偶像。。。

TOP

  1. data1={}
  2. data2={}
  3. data3={}
  4. data4={}
  5. data5={}

  6. RegisterCustomData("LoginGlobal\data1")
  7. RegisterCustomData("LoginAccount\data2")
  8. RegisterCustomData("Account\data3")
  9. RegisterCustomData("Role\data4")
  10. RegisterCustomData("data5")

  11. local function OnCustomDataLoaded()
  12. if arg0 == "LoginGlobal" then --GAME_START userdata\config.dat
  13. --data1
  14. elseif arg0 == "LoginAccount" then --ACCOUNT_LOGIN userdata\ACCOUNT\config.dat
  15. --data2
  16. elseif arg0 == "Account" then --PLAYER_ENTER_GAME userdata\ACCOUNT\custom.dat
  17. --data3
  18. elseif arg0 == "Role" then --PLAYER_ENTER_GAME userdata\ACCOUNT\区\服\名.dat
  19. --data4
  20. --data5
  21. end
  22. end

  23. RegisterEvent("CUSTOM_DATA_LOADED", OnCustomDataLoaded)
复制代码
RegisterCustomData("LoginGlobal\data1")

RegisterCustomData("LoginAccount\data2")

RegisterCustomData("Account\data3")
插件可能会取不到

TOP

返回列表