1.12FORGE,出于一些限制有时需要在服务端往玩家背包里塞个物品(addItemStackToInventory)或者玩家掉落个物品(dropItem),这时应该需要往客户端发包是吧。。具体该怎么操作呢?托腮.PNG
直接addItemStackToInventory
然后player.inventoryContainer.detectAndSendChanges()
Minecraft会自动同步的
可以参考net.minecraft.command.CommandGive
然后player.inventoryContainer.detectAndSendChanges()
Minecraft会自动同步的
可以参考net.minecraft.command.CommandGive
清晨w 发表于 2020-1-20 18:22
直接addItemStackToInventory
然后player.inventoryContainer.detectAndSendChanges()
Minecraft会自动同步 ...
if((world.isRemote)&&(!player.capabilities.isCreativeMode)){
player.inventory.addItemStackToInventory(new ItemStack(JAVELIN, 1, 0));
player.inventoryContainer.detectAndSendChanges();
}
这样子和原来还是一样,游戏里获得的只是一个没有效果的虚假物体,一旦移动背包位置或者使用就会直接消失,
为什么要判断world.isRemote呢
添加物品应该在服务端进行
world.isRemote == true是指客户端,当然没有效果
添加物品应该在服务端进行
world.isRemote == true是指客户端,当然没有效果
/**
* True if the world is a 'slave' client; changes will not be saved or propagated from this world. For example,
* server worlds have this set to false, client worlds have this set to true.
*/
public final boolean isRemote;
清晨w 发表于 2020-1-20 22:21
为什么要判断world.isRemote呢
添加物品应该在服务端进行
world.isRemote == true是指客户端,当然没有效果
?,,,remote是远程的意思,所以我一直认为isRemete是服务端。。
清晨w 发表于 2020-1-21 10:24
是的,这个命名很容易造成误解
不过注释倒是写得很明白
这个。。算是我望文生义了吧。这样子一来很多东西一下子就清晰不少了。也就是服务端的逻辑一般系统会自动发包到客户端,只有某些特殊的只能在客户端监听的东西,之后执行的逻辑(例如什么给予物品,生成实体)需要特殊考虑怎么往服务端发包,是吧?
YZL314159265 发表于 2020-1-21 08:32
?,,,remote是远程的意思,所以我一直认为isRemete是服务端。。
remote 这里取“遥控”的意思。表示客户端的内容是受服务器遥控的。
也就是服务端的逻辑一般系统会自动发包到客户端
Minecraft 本体处理了绝大部分数据处理,但极少数时候你仍然需要考虑服务器到客户端的数据包。典型案例如 TileEntity 和某些全新的逻辑。