<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://mineplugin.org/index.php?action=history&amp;feed=atom&amp;title=WorldEdit%2F%E5%BC%80%E5%8F%91%E4%B8%8EAPI</id>
	<title>WorldEdit/开发与API - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://mineplugin.org/index.php?action=history&amp;feed=atom&amp;title=WorldEdit%2F%E5%BC%80%E5%8F%91%E4%B8%8EAPI"/>
	<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=WorldEdit/%E5%BC%80%E5%8F%91%E4%B8%8EAPI&amp;action=history"/>
	<updated>2026-04-10T03:37:42Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://mineplugin.org/index.php?title=WorldEdit/%E5%BC%80%E5%8F%91%E4%B8%8EAPI&amp;diff=9231&amp;oldid=prev</id>
		<title>TROU：​创建开发与API页面并翻译一部分</title>
		<link rel="alternate" type="text/html" href="https://mineplugin.org/index.php?title=WorldEdit/%E5%BC%80%E5%8F%91%E4%B8%8EAPI&amp;diff=9231&amp;oldid=prev"/>
		<updated>2020-03-08T02:28:23Z</updated>

		<summary type="html">&lt;p&gt;创建开发与API页面并翻译一部分&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[分类:开发教程]]&lt;br /&gt;
&lt;br /&gt;
{{待翻译}}&lt;br /&gt;
&lt;br /&gt;
==简介==&lt;br /&gt;
&lt;br /&gt;
WorldEdit为其他Mod和插件开发提供了一个稳定的公共接口, 这个接口提供了平台独立的接口和类去让你使用Minecraft内部的方块, 生物群系, 和世界的操作, 也支持一部分的实体操作&lt;br /&gt;
&lt;br /&gt;
===API支持===&lt;br /&gt;
&lt;br /&gt;
你可以在[https://help.sonatype.com/repomanager3/repository-manager-concepts/an-example---maven-repository-format Maven仓库]下载到API, 兼容[https://maven.apache.org/ Maven], [https://gradle.org/ Gradle]和[https://www.scala-sbt.org/ sbt]等构建工具, Maven仓库可以在[https://maven.enginehub.org/repo/ 这里https://maven.enginehub.org/repo/]下载到&lt;br /&gt;
&lt;br /&gt;
WorldEdit的库在com.sk89q.worldedit包下面, 根据你需要的不同API, 你可以选择下面这些库来使用&lt;br /&gt;
&lt;br /&gt;
* worldedit-core: 核心的API库, 不依赖于任何的平台, 也不提供任何平台的相互兼容&lt;br /&gt;
* worldedit-bukkit: Bukkit的接口实现, 依赖于Bukkit, 使用BukkitAdapter来提供Bukkit和WorldEdit两个平台的相互兼容&lt;br /&gt;
* worldedit-fabric-mcXYZ: Fabric接口实现, 依赖于Facric API, 使用FabricAdapter来提供Facric和WorldEdit两个平台的相互兼容, XYZ应该换成对应Minecraft的版本&lt;br /&gt;
* worldedit-forge-mcXYZ: Forge接口实现, 依赖于Forge, 使用ForgeAdapter来提供Forge和WorldEdit两个平台的相互兼容, XYZ应该换成对应Minecraft的版本&lt;br /&gt;
* worldedit-sponge-mcXYZ: Sponge接口实现, 依赖于Sponge API, 使用SpongeAdapter来提供Sponge和WorldEdit两个平台的相互兼容, XYZ应该换成对应Minecraft的版本(因为Sponge还没出新版Minecraft支持, 所以最新只支持到Minecraft1.12.2)&lt;br /&gt;
* worldedit-cli: 命令行接口实现, 当做依赖来用不太方便, 但是可以在Minecraft外部来调用WorldEdit&lt;br /&gt;
&lt;br /&gt;
应该依据你使用的Minecraft版本来选择对应的WorldEdit API版本, WorldEdit6支持1.12.2以下的版本, WorldEdit7是给1.13+用的, 我们只给最新的WorldEdit和Minecraft的提供支持与更新, 但通常来说API跨了版本也是很相似的, 所以说使用方式和例子也很相似, 虽然你还能找到旧版的文档, 但是你现在看到的内容只包括了最新版本的WorldEdit内容&lt;br /&gt;
&lt;br /&gt;
接下来你可以开始使用这些API了, 这里可以浏览[[#API概论]], 一些常用的API的用法在[[#API实例]]里面介绍, 在开发的时候, 记得留意[#内部API]来保证你在使用受支持的API&lt;br /&gt;
&lt;br /&gt;
==API概论==&lt;br /&gt;
&lt;br /&gt;
WorldEdit使用了一些很简单的概念来灵活的操作元素和组件, 下面是一些具体的概念的细节, 你应该按顺序来读, 因为后面的概念通常需要你理解前面的概念才能读懂&lt;br /&gt;
&lt;br /&gt;
===发动者 (Actors)===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Actor&amp;#039;&amp;#039;&amp;#039;是使用某些API的时候会用到的东西, 通常来说, &amp;#039;&amp;#039;&amp;#039;Actor&amp;#039;&amp;#039;&amp;#039;可以是一个玩家, 也可以是命令方块、控制台或实体, 你需要明白的是, 虽然提供&amp;#039;&amp;#039;&amp;#039;Actor&amp;#039;&amp;#039;&amp;#039;的玩家、命令方块等等一般都有对应的坐标位置, 但是&amp;#039;&amp;#039;&amp;#039;Actor&amp;#039;&amp;#039;&amp;#039;本身不表示世界上的一个具体位置.&lt;br /&gt;
&lt;br /&gt;
Mod和插件使用WorldEdit API的时候一般都不需要提供&amp;#039;&amp;#039;&amp;#039;Actor&amp;#039;&amp;#039;&amp;#039;作为参数, 但你监听某些事件(比如说EditSessionEvent)的时候, 事件所返回的参数中会提供一个&amp;#039;&amp;#039;&amp;#039;Actor&amp;#039;&amp;#039;&amp;#039;对象, 来让你判断和操作这个&amp;#039;&amp;#039;&amp;#039;Actor&amp;#039;&amp;#039;&amp;#039;所对应的玩家或命令方块等&lt;br /&gt;
&lt;br /&gt;
===方块 (Blocks)===&lt;br /&gt;
&lt;br /&gt;
方块被拆分成了两部分, Type(方块类型)和State(方块状态), 拆成具体的类也就是&amp;#039;&amp;#039;&amp;#039;BlockType&amp;#039;&amp;#039;&amp;#039;和&amp;#039;&amp;#039;&amp;#039;BlockState&amp;#039;&amp;#039;&amp;#039;类, &amp;#039;&amp;#039;&amp;#039;BlockType&amp;#039;&amp;#039;&amp;#039;举个例子可以是 &amp;quot;minecraft:oak_log&amp;quot; 而BlockState一般是&amp;#039;&amp;#039;&amp;#039;类型&amp;#039;&amp;#039;&amp;#039;(像这样的type: minecraft:oak_log)和&amp;#039;&amp;#039;&amp;#039;属性&amp;#039;&amp;#039;&amp;#039;(像这样的properties [axis=y])的一个组合&lt;br /&gt;
&lt;br /&gt;
如果你想从BlockType中获取到一个BlockState, 你可以调用&amp;#039;&amp;#039;&amp;#039;getDefaultState()&amp;#039;&amp;#039;&amp;#039;方法, 或者提供对应的属性的Mapping来获取, 使用的是&amp;#039;&amp;#039;&amp;#039;getState(Map)&amp;#039;&amp;#039;&amp;#039;方法&lt;br /&gt;
&lt;br /&gt;
下面举个例子, 获取&amp;#039;&amp;#039;minecraft:oak_log[axis=y]&amp;#039;&amp;#039;这个属性&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
BlockType oakLog = Objects.requireNonNull(BlockTypes.OAK_LOG);&lt;br /&gt;
BlockState yFacingOakLog = oakLog.getState(ImmutableMap.of(&lt;br /&gt;
    oakLog.getProperty(&amp;quot;axis&amp;quot;), &amp;quot;y&amp;quot;&lt;br /&gt;
));&lt;br /&gt;
System.err.println(&amp;quot;State: &amp;quot; + yFacingOakLog);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一些包含[https://minecraft.gamepedia.com/NBT_format NBT]的方块, 是用&amp;#039;&amp;#039;&amp;#039;BaseBlock&amp;#039;&amp;#039;&amp;#039;类的实例来表示的&lt;br /&gt;
&lt;br /&gt;
调用BlockState的&amp;#039;&amp;#039;&amp;#039;toBaseBlock(NBTCompoundTag)&amp;#039;&amp;#039;&amp;#039;方法可以得到对应的&amp;#039;&amp;#039;&amp;#039;BaseBlock&amp;#039;&amp;#039;&amp;#039;实例&lt;br /&gt;
&lt;br /&gt;
===图案和蒙版 (Patterns and Masks)===&lt;br /&gt;
&lt;br /&gt;
对于图层和蒙版的描述和[http://mineplugin.org/WorldEdit#.E5.9B.BE.E6.A1.88 主页面条目]里面相同. 唯一的不同点是API中要操作对应的类来构建图层和蒙版, 不再使用字符串格式了&lt;br /&gt;
&lt;br /&gt;
单方块的图案可以用像是&amp;#039;&amp;#039;&amp;#039;BlockState&amp;#039;&amp;#039;&amp;#039;和&amp;#039;&amp;#039;&amp;#039;BaseBlock&amp;#039;&amp;#039;&amp;#039;这样的&amp;#039;&amp;#039;&amp;#039;BlockStateHolder&amp;#039;&amp;#039;&amp;#039;来表示, 像是&amp;#039;&amp;#039;&amp;#039;TypeApplyingPattern&amp;#039;&amp;#039;&amp;#039;和&amp;#039;&amp;#039;&amp;#039;RandomStatePattern&amp;#039;&amp;#039;&amp;#039;这样其他的图案, 类名就直接是它们的名字了. 当然, 你也可以用你的IDE去找&amp;#039;&amp;#039;&amp;#039;Pattern&amp;#039;&amp;#039;&amp;#039;类的子类&lt;br /&gt;
&lt;br /&gt;
蒙版就完全不是这么简单的了, 使用&amp;#039;&amp;#039;&amp;#039;BlockMask&amp;#039;&amp;#039;&amp;#039;类可以直接精确匹配或者模糊匹配对应的&amp;#039;&amp;#039;&amp;#039;BlockState&amp;#039;&amp;#039;&amp;#039;, 但你也可以只通过&amp;#039;&amp;#039;&amp;#039;BlockType(BlockTypeMask)&amp;#039;&amp;#039;&amp;#039;&amp;#039;或者是&amp;#039;&amp;#039;&amp;#039;Properties(BlockStateMask)&amp;#039;&amp;#039;&amp;#039;来选取目标, 在&amp;#039;&amp;#039;&amp;#039;Masks&amp;#039;&amp;#039;&amp;#039;类中有一些预设的实用蒙版, 你可以去使用一下. 当然我们还是推荐你用IDE去找找&amp;#039;&amp;#039;&amp;#039;Mask&amp;#039;&amp;#039;&amp;#039;的子类 &lt;br /&gt;
&lt;br /&gt;
===Extents接口(Extents)===&lt;br /&gt;
&lt;br /&gt;
Extent接口形式是WorldEdit方块处理的骨干部分. &amp;#039;&amp;#039;&amp;#039;Extent&amp;#039;&amp;#039;&amp;#039;通常被分成三类: (输入)&amp;#039;&amp;#039;&amp;#039;Input&amp;#039;&amp;#039;&amp;#039;, (输出)&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;, (输入输出)&amp;#039;&amp;#039;&amp;#039;both&amp;#039;&amp;#039;&amp;#039;, 虽然Extents接收和提供方块和生物群系的信息, 但它不与世界和维度相关联&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Input&amp;#039;&amp;#039;&amp;#039;的Extent是用来为给定的位置设置方块和生物群系的, 但是你不能用它来设置方块&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output&amp;#039;&amp;#039;&amp;#039;的Extent是用来从给定的位置获取方块和生物群系的, 但是你不能用它来获取方块&lt;br /&gt;
&lt;br /&gt;
几乎WorldEdit中所有的Extent都实现了&amp;#039;&amp;#039;&amp;#039;*Extent接口&amp;#039;&amp;#039;&amp;#039;typically through the Extent interface. Extent instances also provide a minimum and maximum point, as well as entity manipulation methods.&lt;br /&gt;
&lt;br /&gt;
Some examples of extents are worlds and clipboards. Many block placement features in WorldEdit - such as fast and reorder mode - are implemented using AbstractDelegateExtent and hooking into setBlock.&lt;/div&gt;</summary>
		<author><name>TROU</name></author>
	</entry>
</feed>