380465530
我想修改角色的经验,可是表面上是修改了,但是保存后再进来,角色经验并没有被修改。

我修改经验调用的代码是
Minecraft(的对象).thePlayer.addExperience();
据我分析thePlayer对象只是用来显示的表象,真正生效的数值储存并不是它。
在这我想请教一下高手有没有什么办法可以修改。


我想给小地图插件增加瞬移功能。
在小地图的标记点编辑界面增加了一个瞬移按钮。
当瞬移按钮被单击时,调用那个函数。(先拿增加经验做实验。免得坐标算错了跳到陌生的地方。)
不知道修改那个对象的属性或者调用哪个方法可以让数据生效,请高手指点迷津。


hendyzone
楼主的意思是在gui上点击按钮然后改变角色的属性?
那么你首先需要获取到要改变的角色EntityPlayer的实例
然后直接修改就行
当然在gui上操作的话还有个同步的问题lz不要忘了=.=
(怎么觉得这个帖子之见过)

380465530
hendyzone 发表于 2013-4-18 22:30
楼主的意思是在gui上点击按钮然后改变角色的属性?
那么你首先需要获取到要改变的角色EntityPlayer的实例
...

我在别的区发过帖子,结果被删了,还扣了我的分,新人伤不起啊。
对啊对啊困扰我的似乎就是这个同步问题,EntityPlayer很好找,但是我不知道怎么同步。
当我修改了坐标后,在gui关闭之前,坐标都是改的,但是在gui关闭之后,坐标又自动回来了。

我后来又尝试修改经验,表面上看是修改了,但是在杀怪之后,经验又变回来了。

问题似乎就是数据同步问题。

hendyzone
380465530 发表于 2013-4-19 09:23
我在别的区发过帖子,结果被删了,还扣了我的分,新人伤不起啊。
对啊对啊困扰我的似乎就是这个同步问题 ...

在gui操作只会改变客户端的数据 需要通过包传递数据到服务端=。=
基本步骤就是 在@network里加上Packethandle=niiT使用的定义包处理类 以及channel={""线程名称}
然后建立一个包处理类(就是实现IPackethandle接口的)
再详细的就去看看forge的wiki或者其他人的代码
我语死早。。。

380465530
hendyzone 发表于 2013-4-19 12:25
在gui操作只会改变客户端的数据 需要通过包传递数据到服务端=。=
基本步骤就是 在@network里加上Packeth ...

只有自己玩也要这么处理么?

hendyzone
380465530 发表于 2013-4-19 18:46
只有自己玩也要这么处理么?

是的 你本身在玩的时候也是在服务器上 1.3之后都是这样了╮( ̄▽ ̄")╭

380465530
本帖最后由 380465530 于 2013-4-19 20:17 编辑
hendyzone 发表于 2013-4-19 18:50
是的 你本身在玩的时候也是在服务器上 1.3之后都是这样了╮( ̄▽ ̄")╭

MinecraftServer.java
里的这几句是不是就是储存角色数据的地方。
            theProfiler.startSection("save");
            serverConfigManager.saveAllPlayerData();
            saveAllDimensions(true);
            theProfiler.endSection();
不知道我在修改角色信息之后调用这几句储存数据行不行。


hendyzone
380465530 发表于 2013-4-19 20:16
MinecraftServer.java
里的这几句是不是就是储存角色数据的地方。
            theProfiler.startSecti ...

{:10_493:}
不能你说错了。。。
但是你如果调用这个也不过是再把原本的数据再存一遍 没把客户端的数据同步上去

380465530
hendyzone 发表于 2013-4-19 20:21
不能你说错了。。。
但是你如果调用这个也不过是再把原本的数据再存一遍 没把客户端的数据同 ...

MinecraftServer.java
和Minecraft.java
应该有同步数据的部分吧。要么原生的数据交互是怎么完成的。我找到原生的同步数据代码调用一下应该就能实现上传数据了吧,因为我不需要上传什么特殊的数据到服务器,只是想把当前thePlayer保存一下。

hendyzone
380465530 发表于 2013-4-19 20:28
MinecraftServer.java
和Minecraft.java
应该有同步数据的部分吧。要么原生的数据交互是怎么完成的。我 ...

packet是minecraft用来同步数据的工具 话说我前面已经说过了= =

380465530
hendyzone 发表于 2013-4-19 20:43
packet是minecraft用来同步数据的工具 话说我前面已经说过了= =

嗯,对的,由于我之前从没接触过mc代码。只是一边看一边理解。
您说的@network我暂时还不知道它是个什么玩意。
包处理类好像有现成的,我找到了NetClientHandler.java里的
public void handleEntityTeleport(Packet34EntityTeleport par1Packet34EntityTeleport)
方法,它应该就是处理包进行瞬移的。
剩下的就是怎么去触发这个处理程序了对吧。

380465530
hendyzone 发表于 2013-4-19 20:43
packet是minecraft用来同步数据的工具 话说我前面已经说过了= =

好像不对,我找到的是处理客户端收到的包的处理程序,您说的应该是组织包然后上传到服务器的处理程序对吧。

hendyzone
380465530 发表于 2013-4-19 20:59
好像不对,我找到的是处理客户端收到的包的处理程序,您说的应该是组织包然后上传到服务器的处理程序对吧 ...

NetClientHandler内的处理大部分都是对于原版
我们需要通过实现一个继承于自制包的类将需要传递的数据放在这个包里传递给服务器
而包处理程序是接受到包之后进行的动作 当然这个包本身是可以从客户端传递到服务端也可以从客户端 传递到服务端
、、、其实有具体的代码的话应该很好理解的。。。你去找找饮水mod的源码看看

380465530
hendyzone 发表于 2013-4-19 21:08
NetClientHandler内的处理大部分都是对于原版
我们需要通过实现一个继承于自制包的类将需要传递的数据放 ...

好的谢谢你,我再研究研究。
我的这次修改应该不需要使用自制的包,找到储存角色实体的包,构造一个对象传到服务器应该就可以了,一切应该都有现成的代码,只是没有找到而已。

hendyzone
380465530 发表于 2013-4-19 21:12
好的谢谢你,我再研究研究。
我的这次修改应该不需要使用自制的包,找到储存角色实体的包,构造一个对象 ...

在客户端和服务端之间建立连接的方法只有包。。。 或者你的操作本身在两端会同步

第一页 上一页 下一页 最后一页