-
-
Notifications
You must be signed in to change notification settings - Fork 836
/
World.java
273 lines (242 loc) · 8.39 KB
/
World.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/*
* WorldEdit, a Minecraft world manipulation toolkit
* Copyright (C) sk89q <http://www.sk89q.com>
* Copyright (C) WorldEdit team and contributors
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.sk89q.worldedit.world;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.blocks.BaseItemStack;
import com.sk89q.worldedit.extension.platform.Platform;
import com.sk89q.worldedit.extent.Extent;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.math.BlockVector2;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.registry.Keyed;
import com.sk89q.worldedit.util.Direction;
import com.sk89q.worldedit.util.TreeGenerator;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.weather.WeatherType;
import javax.annotation.Nullable;
import java.nio.file.Path;
/**
* Represents a world (dimension).
*/
public interface World extends Extent, Keyed {
/**
* Get the name of the world.
*
* @return a name for the world
*/
String getName();
/**
* Get the folder in which this world is stored. May return null if unknown
* or if this world is not serialized to disk.
*
* @return world storage path
*/
@Nullable
Path getStoragePath();
/**
* Get the maximum Y.
*
* @return the maximum Y
*/
int getMaxY();
/**
* Create a mask that matches all liquids.
*
* <p>Implementations should override this so that custom liquids
* are supported.</p>
*
* @return a mask
*/
Mask createLiquidMask();
/**
* Use the given item on the block at the given location on the given side.
*
* @param item The item
* @param face The face
* @return Whether it succeeded
*/
boolean useItem(BlockVector3 position, BaseItem item, Direction face);
/**
* Similar to {@link Extent#setBlock(BlockVector3, BlockStateHolder)} but a
* {@code notifyAndLight} parameter indicates whether adjacent blocks
* should be notified that changes have been made and lighting operations
* should be executed.
*
* <p>If it's not possible to skip lighting, or if it's not possible to
* avoid notifying adjacent blocks, then attempt to meet the
* specification as best as possible.</p>
*
* <p>On implementations where the world is not simulated, the
* {@code notifyAndLight} parameter has no effect either way.</p>
*
* @param position position of the block
* @param block block to set
* @param notifyAndLight true to to notify and light
* @return true if the block was successfully set (return value may not be accurate)
*/
<B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B block, boolean notifyAndLight) throws WorldEditException;
/**
* Notifies the simulation that the block at the given location has
* been changed and it must be re-lighted (and issue other events).
*
* @param position position of the block
* @param previousType the type of the previous block that was there
* @return true if the block was successfully notified
*/
boolean notifyAndLightBlock(BlockVector3 position, BlockState previousType) throws WorldEditException;
/**
* Get the light level at the given block.
*
* @param position the position
* @return the light level (0-15)
*/
int getBlockLightLevel(BlockVector3 position);
/**
* Clear a chest's contents.
*
* @param position the position
* @return true if the container was cleared
*/
boolean clearContainerBlockContents(BlockVector3 position);
/**
* Drop an item at the given position.
*
* @param position the position
* @param item the item to drop
* @param count the number of individual stacks to drop (number of item entities)
*/
void dropItem(Vector3 position, BaseItemStack item, int count);
/**
* Drop one stack of the item at the given position.
*
* @param position the position
* @param item the item to drop
* @see #dropItem(Vector3, BaseItemStack, int) shortcut method to specify the number of stacks
*/
void dropItem(Vector3 position, BaseItemStack item);
/**
* Simulate a block being mined at the given position.
*
* @param position the position
*/
void simulateBlockMine(BlockVector3 position);
/**
* Regenerate an area.
*
* @param region the region
* @param editSession the {@link EditSession}
* @return true if re-generation was successful
*/
boolean regenerate(Region region, EditSession editSession);
/**
* Generate a tree at the given position.
*
* @param type the tree type
* @param editSession the {@link EditSession}
* @param position the position
* @return true if generation was successful
* @throws MaxChangedBlocksException thrown if too many blocks were changed
*/
boolean generateTree(TreeGenerator.TreeType type, EditSession editSession, BlockVector3 position) throws MaxChangedBlocksException;
/**
* Load the chunk at the given position if it isn't loaded.
*
* @param position the position
*/
void checkLoadedChunk(BlockVector3 position);
/**
* Fix the given chunks after fast mode was used.
*
* <p>Fast mode makes calls to {@link #setBlock(BlockVector3, BlockStateHolder, boolean)}
* with {@code false} for the {@code notifyAndLight} parameter, which
* may causes lighting errors to accumulate. Use of this method, if
* it is implemented by the underlying world, corrects those lighting
* errors and may trigger block change notifications.</p>
*
* @param chunks a list of chunk coordinates to fix
*/
void fixAfterFastMode(Iterable<BlockVector2> chunks);
/**
* Relight the given chunks if possible.
*
* @param chunks a list of chunk coordinates to fix
*/
void fixLighting(Iterable<BlockVector2> chunks);
/**
* Play the given effect.
*
* @param position the position
* @param type the effect type
* @param data the effect data
* @return true if the effect was played
*/
boolean playEffect(Vector3 position, int type, int data);
/**
* Queue a block break effect.
*
* @param server the server
* @param position the position
* @param blockType the block type
* @param priority the priority
* @return true if the effect was played
*/
boolean queueBlockBreakEffect(Platform server, BlockVector3 position, BlockType blockType, double priority);
/**
* Gets the weather type of the world.
*
* @return The weather
*/
WeatherType getWeather();
/**
* Gets the remaining weather duration.
*
* @return The weather duration
*/
long getRemainingWeatherDuration();
/**
* Sets the weather type of the world.
*
* @param weatherType The weather type
*/
void setWeather(WeatherType weatherType);
/**
* Sets the weather type of the world.
*
* @param weatherType The weather type
* @param duration The duration of the weather
*/
void setWeather(WeatherType weatherType, long duration);
/**
* Gets the spawn position of this world.
*
* @return The spawn position
*/
BlockVector3 getSpawnPosition();
@Override
boolean equals(Object other);
@Override
int hashCode();
}