【发布时间】:2018-08-23 03:04:43
【问题描述】:
我正在尝试在 Bukkit 模组中更新 Minecraft 中的块,并能够//undo Minecraft 中的这些更改。我可以更改块,但我不能//undo 更改。
我一定错过了一些简单的事情,因为 Google 没有帮助我找到解决方案。
这是我的模组。它将当前选定区域的单个块设置为空气。注释掉的行是我尝试过但对我不起作用的东西。
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 将其中一个块设置为空气。 //undo 符合您的预期。
【问题讨论】:
-
我不明白为什么这不起作用
editSession = worldEditPlugin.createEditSession(bukkitPlayer);。你得到什么样的错误?如果您按照自己的方式进行操作,则需要在设置块之前使用editSession.enableQueue();。