如题
我想做一个类似全球市场的插件,但是致命的一点在于
每次上架的货品 玩家卖出后 都需要 重新上架
于是我打算 让玩家可以设定 一个 箱子作为仓库
插件将会自动 获取箱子里的东西 发货
于是乎就有两个问题
1. 如何获取某世界某位置的箱子
2. 如何监听玩家打开了某世界某位置的箱子
大佬救助
我想做一个类似全球市场的插件,但是致命的一点在于
每次上架的货品 玩家卖出后 都需要 重新上架
于是我打算 让玩家可以设定 一个 箱子作为仓库
插件将会自动 获取箱子里的东西 发货
于是乎就有两个问题
1. 如何获取某世界某位置的箱子
2. 如何监听玩家打开了某世界某位置的箱子

首先你得知道箱子的位置 Location 或者 (x,y,z) ,使用 World::getBlockAt方法获取该位置的Block 对象 ,然后 将block 转为 org.bukkit.block.Chest 类型(注意先进行类型判断) ,然后使用 Chest::getBlockInventory() 获取该箱子的Inventory。
你这问题让我想起以前看过一个不使用nbt来保存物品,而是创建一个世界,里面放满箱子的方式来保存物品(为了兼容mod)的插件
你这问题让我想起以前看过一个不使用nbt来保存物品,而是创建一个世界,里面放满箱子的方式来保存物品(为了兼容mod)的插件
结冰的离季 发表于 2022-4-15 15:19
首先你得知道箱子的位置 Location 或者 (x,y,z) ,使用 World::getBlockAt方法获取该位置的Block 对象 ,然 ...
大佬你看我这样获取对吗 ?
- Block block = YanewxunMain.getMain().getServer().getWorld("世界名").getBlockAt(location);
- Chest chest = (Chest) block;
但是这样会报错
- java.lang.ClassCastException: org.bukkit.craftbukkit.v1_16_R3.block.CraftBlock cannot be cast to org.bukkit.block.Chest
我也不知道 到底怎么才能正确的 获取并且转换为 chest

本帖最后由 微笑大人 于 2022-4-19 18:57 编辑
额 那到底是哪里的问题 我真看不出来 ..
而且我位置放置的是 箱子啊
那个 block 我getType 出的也是 Chest
美味的曲奇 发表于 2022-4-19 18:29
你想打开的是工作台吧...
方块是箱子要类转箱子,工作台类转箱子哪行,转成工作台呀 ...
额 那到底是哪里的问题 我真看不出来 ..
而且我位置放置的是 箱子啊
那个 block 我getType 出的也是 Chest
本帖最后由 美味的曲奇 于 2022-4-19 19:11 编辑
很明显
你获取到的方块不是箱子,而是工作台!好像不是方块类型的问题
好像丢人了XD
微笑大人 发表于 2022-4-19 18:48
额 那到底是哪里的问题 我真看不出来 ..
很明显
美味的曲奇 发表于 2022-4-19 18:55
很明显
你获取到的方块不是箱子,而是工作台!
我是 当玩家放置箱子后 把箱子的位置记录下来
然后 玩家做某些事情的时候 需要获取这个箱子里面东西
- public void destroy(BlockPlaceEvent event){ //当玩家放置方块
- if(YanewxunMain.playername.contains(event.getPlayer().getName())){ //确保在需要被监听的玩家暂存库中有此玩家
- if(event.getBlockPlaced().getType().equals(Material.CHEST)){ //放置的是箱子
- Location location = event.getBlockPlaced().getLocation();
微笑大人 发表于 2022-4-19 18:59
我是 当玩家放置箱子后 把箱子的位置记录下来
然后 玩家做某些事情的时候 需要获取这个箱子里面东西
...
emmm仔细看了一下,你用哪里的方法获取的方块,为什么是NMS类
本帖最后由 微笑大人 于 2022-4-19 19:05 编辑
我现在改成了
org.bukkit.Location
的 location.getblock()
以前是
org.bukkit.world.getBlockAt(location)
依然是 NMS 类的东西
美味的曲奇 发表于 2022-4-19 19:01
emmm仔细看了一下,你用哪里的方法获取的方块,为什么是NMS类
我现在改成了
org.bukkit.Location
的 location.getblock()
以前是
org.bukkit.world.getBlockAt(location)
依然是 NMS 类的东西
*我的错,我没有深入研究过方块的机制
Chest chest = (Chest) block;
改成
Chest chest = (Chest) block.getState();
试试

Chest chest = (Chest) block;
改成
Chest chest = (Chest) block.getState();
试试
微笑大人 发表于 2022-4-19 17:59
大佬你看我这样获取对吗 ?
Chest 是 BlockState 的子类 得用 (Chest)block.getState()
微笑大人 发表于 2022-4-19 18:59
我是 当玩家放置箱子后 把箱子的位置记录下来
然后 玩家做某些事情的时候 需要获取这个箱子里面东西
...
感谢大佬解了我的燃眉之急
同求 这个确实不清楚
那么长的一串导致我翻了好久
666666666666666666666666
list.youku.com/albumlist/show/id_68374094?yd=yenmh