- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试在 Bukkit 模组中更新 Minecraft 中的方 block ,并能够//undo
Minecraft 中的这些更改。我可以更改 block ,但无法//undo
更改。
我一定是遗漏了一些简单的东西,因为 Google 没有帮助我找到解决方案。
这是我的模组。它将当前选定区域的单个 block 设置为空气。注释掉的行是我尝试过但对我不起作用的内容。
public class Main extends JavaPlugin implements Listener
{
// ... //
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
{
if (command.getName().equalsIgnoreCase("setair"))
{
org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) sender;
WorldEditPlugin worldEditPlugin = null;
worldEditPlugin = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
if(worldEditPlugin == null){
bukkitPlayer.sendMessage("Error: WorldEdit is null.");
}
else
{
com.sk89q.worldedit.bukkit.selections.Selection s = worldEditPlugin.getSelection(bukkitPlayer);
com.sk89q.worldedit.LocalSession localSession = worldEditPlugin.getSession(bukkitPlayer);
com.sk89q.worldedit.world.World localWorld = localSession.getSelectionWorld();
com.sk89q.worldedit.bukkit.BukkitPlayer wrappedPlayer = worldEditPlugin.wrapPlayer(bukkitPlayer);
com.sk89q.worldedit.LocalPlayer localPlayer = wrappedPlayer;
//com.sk89q.worldedit.world.World localWorld2 = localPlayer.getWorld();
com.sk89q.worldedit.EditSession editSession = worldEditPlugin.getWorldEdit().getEditSessionFactory().getEditSession(localWorld, -1, localPlayer);
//com.sk89q.worldedit.EditSession editSession = worldEditPlugin.createEditSession(bukkitPlayer);
//localSession.remember(editSession);
Vector minV = s.getNativeMinimumPoint();
try {
editSession.setBlock(minV, new com.sk89q.worldedit.blocks.BaseBlock(0,0));
} catch (MaxChangedBlocksException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//try {
// localWorld.setBlock(minV, new com.sk89q.worldedit.blocks.BaseBlock(0,0));
//} catch (WorldEditException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
//}
localSession.getRegionSelector(localWorld).learnChanges();
localSession.getRegionSelector(localWorld).explainRegionAdjust(localPlayer, localSession);
bukkitPlayer.performCommand("tellraw @p \"Done setair\"");
}
return true;
}
}
}
编辑:这是有效的。感谢 sorifiend 在下面的回答。为了让它工作,我还必须将 localSession.remember(editSession)
移动到 setBlock 调用之后。
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
{
if (command.getName().equalsIgnoreCase("setair"))
{
org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) sender;
WorldEditPlugin worldEditPlugin = null;
worldEditPlugin = (WorldEditPlugin) Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
if(worldEditPlugin == null){
bukkitPlayer.sendMessage("Error: WorldEdit is null.");
}
else
{
com.sk89q.worldedit.bukkit.selections.Selection s = worldEditPlugin.getSelection(bukkitPlayer);
com.sk89q.worldedit.LocalSession localSession = worldEditPlugin.getSession(bukkitPlayer);
com.sk89q.worldedit.EditSession editSession = worldEditPlugin.createEditSession(bukkitPlayer);
Vector minV = s.getNativeMinimumPoint();
try {
editSession.setBlock(minV, new com.sk89q.worldedit.blocks.BaseBlock(0,0));
} catch (MaxChangedBlocksException e) {
e.printStackTrace();
}
localSession.remember(editSession);
bukkitPlayer.performCommand("tellraw @p \"Done setair\"");
}
return true;
}
}
现在我可以用 WorldEdit 选择一些东西,运行 /setair
将其中一个 block 设置为空气。而 //undo
会做你期望的事情。
最佳答案
我不明白为什么这不起作用 editSession = worldEditPlugin.createEditSession(bukkitPlayer);
,但是因为您选择了更长的方式 worldEditPlugin.getWorldEdit() .getEditSessionFactory().getEditSession(bukkitPlayer)
您还需要使用:editSession.enableQueue();
之后。
下一个问题可能是如何设置 block 。快速浏览一下 source code 中的 setBlock
方法.有一个数字表示:
/**
* Set a block, bypassing history but still utilizing block re-ordering.
*
* @param position the position to set the block at
* @param block the block
* @return whether the block changed
*/
public boolean setBlock(Vector position, BlockStateHolder block) {
注意它是怎么说的“设置一个 block ,绕过历史和 block 重新排序”。
因此,如果您想记住 block 更改,您将需要自己跟踪它,或者使用不同的 setBlock 方法:
/**
* Sets the block at a position, subject to both history and block re-ordering.
*
* @param position the position
* @param pattern a pattern to use
* @return Whether the block changed -- not entirely dependable
* @throws MaxChangedBlocksException thrown if too many blocks are changed
*/
public boolean setBlock(Vector position, Pattern pattern)
注意它是怎么说的“将 block 设置在一个位置,受历史和 block 重新排序”。
例如,这会将一个区 block 设置为空气并且还将保留区 block 历史:
Pattern pattern = new BlockPattern(BlockTypes.AIR.getDefaultState());
editSession.setBlock(minV, pattern);
现在您可以稍后像这样使用撤消方法:
//use a different EditSession to perform the undo in:
EditSession undoSession = ......;
editSession.undo(undoSession);
请注意,undoSession
不应与您要撤消的 session 相同。
编辑:源代码目前正在进行大量编辑/更改以支持 1.13 版(EditSession 类在 23 小时前更新)。因此,在您继续之前,您的 WorldEdit 库/插件可能需要更新。
关于java - 如何在 Bukkit 模组中使用 Minecraft 的 WorldEdit 撤消堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51939352/
这是我第一次为 iPhone 开发钛金属模块。我正在为 iPhone 构建 Google Analytics 模块。 如果我要使用 XCode 实现 Google Analytics,我可以使用 di
有人可以解释为什么这不起作用吗? main = do let a = 50 let y = 7 let area = (a ** y) print (area)
我正在为我的速度黑客制作一些按键绑定(bind)。我已经完成了部分按键绑定(bind)。这是我得到的错误我认为这是由于将 boolean 值放在错误的位置引起的。 == MCP v4.4 == > R
如果您在键盘 GUI 中输入的代码正确,我将尝试使用 setBlock 命令来放置我的键盘的 Activity (发出红石电源)版本。我将向您展示的代码在客户端(单人游戏)端可以完美运行,但在服务器(
我在编写第一个 Minecraft Mod 时遇到问题。 这是源代码: Events.java: public class Events { @SubscribeEvent pub
我对 retrofit 还很陌生。 我想创造一把可以点燃小怪或玩家的剑。我正在使用 hitEntity 方法,我注意到该函数甚至没有运行。我使用控制台对其进行了测试。当我在 hitEntity 方法之
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
我试图在 1.9 mod 中使用自定义模型渲染一个 block ,但它在 .getItemModelMesher 处给了我一个错误 代码: public class ModBlocks extends
我正在制作一个模组,但收到此错误: Using missing texture, unable to load null:textures/items/TrainingCorpsBoots.png j
互联网上的人们大家好,我想知道是否有一种方法可以让定制食品为您提供XP。我正在制作一个模组,希望“SimonApple”能给我 XP。如果有办法做到这一点,请告诉我。 package com.nots
首先,我真的只是在尝试学习 Java。此时我想做的就是在屏幕上显示一个字符串; 所以我有我的 mod_Bite 类和我的 BiteGui 类。 (Bite只是一个随意的名字,我当时正在吃饭) //mo
我希望玩家每次持有基岩 block 时都会获得一个随机 block (只是一个例子,稍后我想做更酷的事情)我编码它是当玩家持有基岩 block 时会发生一些事情。但我不知道如何给玩家一个随机 bloc
我是一名优秀的程序员,十分优秀!