This repository has been archived by the owner on Apr 12, 2022. It is now read-only.
/
LoadWorldCommand.java
230 lines (221 loc) · 11.4 KB
/
LoadWorldCommand.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
package com.denizenscript.denizen2sponge.commands.world;
import com.denizenscript.denizen2core.Denizen2Core;
import com.denizenscript.denizen2core.commands.AbstractCommand;
import com.denizenscript.denizen2core.commands.CommandEntry;
import com.denizenscript.denizen2core.commands.CommandQueue;
import com.denizenscript.denizen2core.tags.AbstractTagObject;
import com.denizenscript.denizen2core.tags.objects.BooleanTag;
import com.denizenscript.denizen2core.tags.objects.IntegerTag;
import com.denizenscript.denizen2core.tags.objects.ListTag;
import com.denizenscript.denizen2core.utilities.debugging.ColorSet;
import com.denizenscript.denizen2sponge.tags.objects.LocationTag;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.entity.living.player.gamemode.GameMode;
import org.spongepowered.api.world.GeneratorType;
import org.spongepowered.api.world.World;
import org.spongepowered.api.world.WorldArchetype;
import org.spongepowered.api.world.difficulty.Difficulty;
import org.spongepowered.api.world.gen.WorldGeneratorModifier;
import org.spongepowered.api.world.storage.WorldProperties;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
public class LoadWorldCommand extends AbstractCommand {
// <--[command]
// @Since 0.3.0
// @Name loadworld
// @Arguments <world name> <template>
// @Short loads an existing world, or creates a new one.
// @Updated 2017/05/16
// @Group World
// @Minimum 1
// @Maximum 2
// @Named difficulty (TextTag) Sets the difficulty of the world.
// @Named gamemode (TextTag) Sets default gamemode of the world.
// @Named modifiers (ListTag) Sets the generator modifiers for creating the world.
// @Named generator (TextTag) Sets the generator type for creating the world.
// @Named commands_allowed (BooleanTag) Sets whether commands are allowed in the world.
// @Named enabled (BooleanTag) Sets whether the world will automatically load if an entity enters it.
// @Named generate_spawn_on_load (BooleanTag) Sets whether the spawn will be generated automatically on world load.
// @Named hardcore (BooleanTag) Sets whether the world is hardcore.
// @Named keep_spawn_loaded (BooleanTag) Sets the world keeps the spawn loaded.
// @Named load_on_startup (BooleanTag) Sets whether the world is loaded automatically when the server starts.
// @Named map_features (BooleanTag) Sets whether map features (such as villages) will be generated in the world.
// @Named pvp (BooleanTag) Sets whether pvp is enabled by default in the world.
// @Named seed (IntegerTag) Sets the seed of the world.
// @Named spawn (LocationTag) Sets the default spawn location of the world.
// @Description
// Loads an existing world, or creates it (and loads it) from a template if it doesn't exist yet.
// Any world property specified will overwrite the default values of the template.
// @Example
// # Loads the world 'Games', or creates it from the template 'overworld' if it doesn't exist yet.
// - loadworld Games overworld
// -->
@Override
public String getName() {
return "loadworld";
}
@Override
public String getArguments() {
return "<world name> <template>";
}
@Override
public int getMinimumArguments() {
return 1;
}
@Override
public int getMaximumArguments() {
return 2;
}
@Override
public void execute(CommandQueue queue, CommandEntry entry) {
String worldName = entry.getArgumentObject(queue, 0).toString();
Optional<World> world = Sponge.getServer().getWorld(worldName);
if (world.isPresent()) {
if (queue.shouldShowGood()) {
queue.outGood("World '" + ColorSet.emphasis + worldName + ColorSet.good + "' is already loaded!");
}
return;
}
if (queue.shouldShowGood()) {
queue.outGood("Attempting to load world '" + ColorSet.emphasis + worldName + ColorSet.good + "'...");
}
Optional<WorldProperties> properties = Sponge.getServer().getWorldProperties(worldName);
if (properties.isPresent()) {
Sponge.getServer().loadWorld(properties.get());
if (queue.shouldShowGood()) {
queue.outGood("World '" + ColorSet.emphasis + worldName + ColorSet.good + "' was loaded successfully!");
}
return;
}
if (queue.shouldShowGood()) {
queue.outGood("World properties for world '" + ColorSet.emphasis + worldName + ColorSet.good +
"' are missing, creating the world from the specified template instead...");
}
if (entry.arguments.size() < 2) {
queue.handleError(entry, "A template is needed in order to create a new world!");
return;
}
String templateName = entry.getArgumentObject(queue, 1).toString();
Optional<WorldArchetype> template = Sponge.getRegistry().getType(WorldArchetype.class, templateName);
if (!template.isPresent()) {
queue.handleError(entry, "Invalid world template: '" + templateName + "'!");
return;
}
Difficulty difficulty = null;
if (entry.namedArgs.containsKey("difficulty")) {
String difficultyName = entry.getNamedArgumentObject(queue, "difficulty").toString();
Optional<Difficulty> difficultyOpt = Sponge.getRegistry().getType(Difficulty.class, difficultyName);
if (!difficultyOpt.isPresent()) {
queue.handleError(entry, "Invalid difficulty: '" + difficultyName + "'!");
return;
}
difficulty = difficultyOpt.get();
}
GameMode gameMode = null;
if (entry.namedArgs.containsKey("gamemode")) {
String gameModeName = entry.getNamedArgumentObject(queue, "gamemode").toString();
Optional<GameMode> gameModeOpt = Sponge.getRegistry().getType(GameMode.class, gameModeName);
if (!gameModeOpt.isPresent()) {
queue.handleError(entry, "Invalid gamemode: '" + gameModeName + "'!");
return;
}
gameMode = gameModeOpt.get();
}
Collection<WorldGeneratorModifier> modifiers = new ArrayList<>();
if (entry.namedArgs.containsKey("modifiers")) {
List<AbstractTagObject> modifiersList = ListTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "gamemode")).getInternal();
for (AbstractTagObject ato : modifiersList) {
String modifierName = ato.toString();
Optional<WorldGeneratorModifier> modifierOpt
= Sponge.getRegistry().getType(WorldGeneratorModifier.class, modifierName);
if (!modifierOpt.isPresent()) {
queue.handleError(entry, "Invalid generator modifier: '" + modifierName + "'!");
return;
}
modifiers.add(modifierOpt.get());
}
}
GeneratorType generator = null;
if (entry.namedArgs.containsKey("generator")) {
String generatorName = entry.getNamedArgumentObject(queue, "generator").toString();
Optional<GeneratorType> generatorOpt = Sponge.getRegistry().getType(GeneratorType.class, generatorName);
if (!generatorOpt.isPresent()) {
queue.handleError(entry, "Invalid generator type: '" + generatorName + "'!");
return;
}
generator = generatorOpt.get();
}
try {
WorldProperties newProperties = Sponge.getServer().createWorldProperties(worldName, template.get());
if (queue.shouldShowGood()) {
queue.outGood("World '" + ColorSet.emphasis + worldName + ColorSet.good + "' created from template '" +
ColorSet.emphasis + template.get().getId() + ColorSet.good + "', applying properties....");
}
if (difficulty != null) {
newProperties.setDifficulty(difficulty);
}
if (gameMode != null) {
newProperties.setGameMode(gameMode);
}
if (!modifiers.isEmpty()) {
newProperties.setGeneratorModifiers(modifiers);
}
if (generator != null) {
newProperties.setGeneratorType(generator);
}
if (entry.namedArgs.containsKey("commands_allowed")) {
newProperties.setCommandsAllowed(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "commands_allowed")).getInternal());
}
if (entry.namedArgs.containsKey("enabled")) {
newProperties.setEnabled(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "enabled")).getInternal());
}
if (entry.namedArgs.containsKey("generate_spawn_on_load")) {
newProperties.setGenerateSpawnOnLoad(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "generate_spawn_on_load")).getInternal());
}
if (entry.namedArgs.containsKey("hardcore")) {
newProperties.setHardcore(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "hardcore")).getInternal());
}
if (entry.namedArgs.containsKey("keep_spawn_loaded")) {
newProperties.setKeepSpawnLoaded(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "keep_spawn_loaded")).getInternal());
}
if (entry.namedArgs.containsKey("load_on_startup")) {
newProperties.setLoadOnStartup(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "load_on_startup")).getInternal());
}
if (entry.namedArgs.containsKey("map_features")) {
newProperties.setMapFeaturesEnabled(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "map_features")).getInternal());
}
if (entry.namedArgs.containsKey("pvp")) {
newProperties.setPVPEnabled(BooleanTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "pvp")).getInternal());
}
if (entry.namedArgs.containsKey("seed")) {
newProperties.setSeed(IntegerTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "seed")).getInternal());
}
if (entry.namedArgs.containsKey("spawn")) {
newProperties.setSpawnPosition(LocationTag.getFor(queue.error,
entry.getNamedArgumentObject(queue, "spawn")).getInternal().toVector3i());
}
Sponge.getServer().loadWorld(newProperties);
if (queue.shouldShowGood()) {
queue.outGood("World '" + ColorSet.emphasis + worldName + ColorSet.good
+ "' loaded successfully after applying properties!");
}
}
catch (IOException e) {
queue.handleError(entry, "World creation failed!");
Denizen2Core.getImplementation().outputException(e);
}
}
}