Ian*_*Ian 5 java minecraft bukkit
我试图在Bukkit mod中更新Minecraft中的块,并能够//undo在Minecraft中进行那些更改.我可以改变块但我无法//undo改变.
我一定错过了一些简单的东西,因为谷歌没有帮我找到解决方案.
这是我的mod.它将当前所选区域中的单个块设置为空中.注释掉的行是我尝试过的对我不起作用的东西.
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是有效的.感谢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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我可以使用WorldEdit选择一些东西,运行/setair以设置其中一个块.并且//undo做你期望的.
我不明白为什么这不起作用editSession = worldEditPlugin.createEditSession(bukkitPlayer);,但是因为您选择了更长的方式,worldEditPlugin.getWorldEdit().getEditSessionFactory().getEditSession(bukkitPlayer)您还需要使用:editSession.enableQueue();after。
下一个问题可能是你如何设置障碍。快速浏览一下源代码setBlock中的方法。有一个数字表明:
Run Code Online (Sandbox Code Playgroud)/** * 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) {
请注意它是如何说的“设置一个块,绕过历史记录和块重新排序”。
因此,如果您想记住块更改,您需要自己跟踪它,或者使用不同的 setBlock 方法:
Run Code Online (Sandbox Code Playgroud)/** * 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)
请注意它是如何说的“将块设置在某个位置,受历史记录和块重新排序的影响”。
例如,这将设置一个块来播放,并且还将保留块历史记录:
Pattern pattern = new BlockPattern(BlockTypes.AIR.getDefaultState());
editSession.setBlock(minV, pattern);
Run Code Online (Sandbox Code Playgroud)
现在您可以稍后使用撤消方法,如下所示:
//use a different EditSession to perform the undo in:
EditSession undoSession = ......;
editSession.undo(undoSession);
Run Code Online (Sandbox Code Playgroud)
请注意,undoSession不应与您尝试撤消的会话相同。
编辑:源代码当前正在经历许多编辑/更改以支持版本 1.13(EditSession 类已于 23 小时前更新)。因此,您的 WorldEdit 库/插件可能需要更新,然后才能继续。
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |