Skip to content

Commit 74c134c

Browse files
committed
Add default world support
1 parent 0b9cb1a commit 74c134c

File tree

10 files changed

+101
-9
lines changed

10 files changed

+101
-9
lines changed

API/src/main/java/me/ifydev/dimensify/api/DimensifyConstants.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ public class DimensifyConstants {
7878
public static final String PORTAL_LIST_FORMAT = "&2&l<NAME> - &9&lX: <X>, Y: <Y>, Z: <Z> - &e&lDimension: <DIMENSION> - &3&lDestination: <DESTINATION>";
7979
public static final String DIMENSION_LIST_FORMAT = "&2&l<NAME> - Type: <TYPE> - Default?: <DEFAULT>";
8080
public static final String THERE_ARE_NONE = DIMENSIFY_PREFIX + "&2&lThere are no <ITEM>!";
81+
public static final String DEFAULT_WORLD_FORMAT = DIMENSIFY_PREFIX + "&2&lDefault world: <WORLD>";
82+
public static final String DEFAULT_WORLD_SET = DIMENSIFY_PREFIX + "&2&lDefault world set to: <WORLD>!";
83+
public static final String COULD_NOT_SET_DEFAULT_WORLD = DIMENSIFY_PREFIX + "&2&lCould not set default world.";
8184

8285
// Help response
8386
// TODO: This should automatically paginate.
@@ -91,7 +94,8 @@ public class DimensifyConstants {
9194
"&a&l/dimensify delete <world_name>",
9295
"&a&l/dimensify default [world_name]",
9396
"&a&l/dimensify list",
94-
"&a&l/dimensify link <source_portal> <destination_dimension>"
97+
"&a&l/dimensify link <source_portal> <destination_dimension>",
98+
"&a&l/dimensify portal <list|link|create|remove> [args...]"
9599
)
96100
);
97101
}

API/src/main/java/me/ifydev/dimensify/api/backend/AbstractDataHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,7 @@ public abstract class AbstractDataHandler {
5353

5454
public abstract Optional<Dimension> getDimension(String name);
5555
public abstract Optional<PortalMeta> getPortal(String name);
56-
public abstract Optional<String> getDestinationForPortal(String portalName);
56+
57+
public abstract boolean setDefaultDimension(String name);
58+
public abstract String getDefaultDimension(boolean skipCache);
5759
}

API/src/main/java/me/ifydev/dimensify/api/backend/impl/SQLHandler.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ private Optional<Connection> getConnection() {
5353
@Override
5454
public void initialize(String defaultWorld) {
5555
this.dimensions = new ArrayList<>();
56-
this.defaultWorld = defaultWorld;
5756

5857
try {
5958
Optional<Connection> connection = getConnection();
@@ -83,6 +82,10 @@ public void initialize(String defaultWorld) {
8382
} catch (SQLException e) {
8483
e.printStackTrace();
8584
}
85+
86+
this.defaultWorld = defaultWorld;
87+
String defaultDimension = this.getDefaultDimension(true);
88+
if (!defaultDimension.equals("")) this.defaultWorld = defaultDimension;
8689
}
8790

8891
@Override
@@ -242,8 +245,38 @@ public Optional<PortalMeta> getPortal(String name) {
242245
}
243246

244247
@Override
245-
public Optional<String> getDestinationForPortal(String portalName) {
246-
return Optional.ofNullable(this.destinations.getOrDefault(portalName, null));
248+
public boolean setDefaultDimension(String name) {
249+
this.dimensions.stream().filter(Dimension::isDefault).findFirst().ifPresent(dim -> dim.setDefault(false));
250+
251+
Optional<Dimension> dimension = dimensions.stream().filter(d -> d.getName().equalsIgnoreCase(name)).findFirst();
252+
if (!dimension.isPresent()) return false;
253+
254+
dimension.get().setDefault(true);
255+
this.defaultWorld = dimension.get().getName();
256+
257+
Optional<Connection> connection = getConnection();
258+
if (!connection.isPresent()) return false;
259+
try {
260+
PreparedStatement removeCurrent = connection.get().prepareStatement("UPDATE dimensions SET `default`=0 WHERE `default`=1");
261+
removeCurrent.execute();
262+
removeCurrent.close();
263+
264+
PreparedStatement update = connection.get().prepareStatement("UPDATE dimensions SET `default`=1 WHERE `name`=?");
265+
update.setString(1, dimension.get().getName());
266+
update.execute();
267+
update.close();
268+
connection.get().close();
269+
} catch (SQLException e) {
270+
e.printStackTrace();
271+
}
272+
return true;
273+
}
274+
275+
@Override
276+
public String getDefaultDimension(boolean skipCache) {
277+
if (skipCache)
278+
for (Dimension dimension : this.getDimensions()) if (dimension.isDefault()) return dimension.getName();
279+
return defaultWorld;
247280
}
248281

249282
@Override

API/src/main/java/me/ifydev/dimensify/api/dimensions/Dimension.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import lombok.AllArgsConstructor;
44
import lombok.Getter;
5+
import lombok.Setter;
56

67
import java.util.Optional;
78

@@ -16,5 +17,5 @@ public class Dimension {
1617
private String name;
1718
private String type;
1819
private Optional<String> meta;
19-
private boolean isDefault;
20+
@Setter private boolean isDefault;
2021
}

DimensifySpigot/src/main/java/me/ifydev/dimensifyspigot/DimensifyMain.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public class DimensifyMain extends JavaPlugin {
5757

5858
@Getter private boolean allowEntryByDefault = true;
5959
@Getter private boolean permissionRestrictDimensions = false;
60+
@Getter private boolean sendPlayersToDefaultWorldOnLogin = false;
6061

6162
@Override
6263
public void onEnable() {
@@ -87,6 +88,7 @@ public void onEnable() {
8788
preloadWorlds = getConfig().getBoolean("preload_worlds", true);
8889
allowEntryByDefault = getConfig().getBoolean("default_dimension_restriction", true);
8990
permissionRestrictDimensions= getConfig().getBoolean("permission_restrict_dimensions", false);
91+
sendPlayersToDefaultWorldOnLogin = getConfig().getBoolean("send_players_to_default_world_on_login", false);
9092

9193
if (preloadWorlds)
9294
getConfig().getStringList("world_preload").forEach(name -> worldController.loadWorld(new DimensifyWorld(name, this)));

DimensifySpigot/src/main/java/me/ifydev/dimensifyspigot/backend/SpigotFlatFileHandler.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@ private void saveStorage() {
4747
public void initialize(String defaultWorld) {
4848
DimensifyMain plugin = DimensifyMain.get();
4949
File data = plugin.getDataFolder();
50+
5051
this.defaultWorld = defaultWorld;
52+
String defaultDimension = this.getDefaultDimension(true);
53+
if (!defaultDimension.equals("")) this.defaultWorld = defaultDimension;
5154

5255
// Ensure the files exist
5356
storageFile = new File(data, plugin.getConfig().getString("connection.file", "storage.yml"));
@@ -239,7 +242,22 @@ public Optional<PortalMeta> getPortal(String name) {
239242
}
240243

241244
@Override
242-
public Optional<String> getDestinationForPortal(String portalName) {
243-
return Optional.ofNullable(destinations.getOrDefault(portalName, null));
245+
public boolean setDefaultDimension(String name) {
246+
this.dimensions.stream().filter(Dimension::isDefault).findFirst().ifPresent(dim -> dim.setDefault(false));
247+
248+
dimensions.stream().filter(d -> d.getName().equalsIgnoreCase(name)).findFirst().ifPresent(dim -> {
249+
dim.setDefault(true);
250+
this.defaultWorld = dim.getName();
251+
252+
storage.set("dimensions." + dim.getName() + ".default", true);
253+
});
254+
return true;
255+
}
256+
257+
@Override
258+
public String getDefaultDimension(boolean skipCache) {
259+
if (skipCache)
260+
for (Dimension dimension : this.getDimensions()) if (dimension.isDefault()) return dimension.getName();
261+
return defaultWorld;
244262
}
245263
}

DimensifySpigot/src/main/java/me/ifydev/dimensifyspigot/commands/DimensifyCommand.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.Collections;
1919
import java.util.List;
20+
import java.util.Optional;
2021
import java.util.stream.Collectors;
2122

2223
/**
@@ -159,6 +160,11 @@ public boolean onCommand(CommandSender sender, Command command, String s, String
159160
}
160161
response.stream().map(ColorUtil::makeReadable).forEach(sender::sendMessage);
161162
return;
163+
} else if (args[0].equalsIgnoreCase("default")) {
164+
String response = BasicHandler.setOrGetDefaultWorld(args.length >= 2 ? Optional.of(args[1]) :Optional.empty());
165+
response = ColorUtil.makeReadable(response);
166+
sender.sendMessage(response);
167+
return;
162168
}
163169
// Send help
164170
sender.sendMessage(ColorUtil.makeReadable(DimensifyConstants.DIMENSIFY_HELP_HEADER));

DimensifySpigot/src/main/java/me/ifydev/dimensifyspigot/commands/handlers/BasicHandler.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,4 +144,17 @@ public static List<String> listWorlds() {
144144
.replace("<DEFAULT>", String.valueOf(dim.isDefault())))
145145
.collect(Collectors.toList());
146146
}
147+
148+
public static String setOrGetDefaultWorld(Optional<String> world) {
149+
DimensifyMain plugin = DimensifyMain.get();
150+
Optional<AbstractDataHandler> db = plugin.getApi().getDatabaseHandler();
151+
if (!db.isPresent()) return DimensifyConstants.COULD_NOT_CONNECT_TO_DATABASE;
152+
153+
if (!world.isPresent()) {
154+
String defaultDimension = db.get().getDefaultDimension(false);
155+
return DimensifyConstants.DEFAULT_WORLD_FORMAT.replace("<WORLD>", defaultDimension);
156+
}
157+
boolean result = db.get().setDefaultDimension(world.get());
158+
return result ? DimensifyConstants.DEFAULT_WORLD_SET.replace("<WORLD>", world.get()) : DimensifyConstants.COULD_NOT_SET_DEFAULT_WORLD;
159+
}
147160
}

DimensifySpigot/src/main/java/me/ifydev/dimensifyspigot/events/PlayerJoin.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package me.ifydev.dimensifyspigot.events;
22

3+
import me.ifydev.dimensifyspigot.DimensifyMain;
4+
import org.bukkit.World;
35
import org.bukkit.entity.Player;
46
import org.bukkit.event.EventHandler;
57
import org.bukkit.event.Listener;
@@ -15,6 +17,15 @@ public class PlayerJoin implements Listener {
1517
public void onPlayerJoinEvent(PlayerJoinEvent e) {
1618
Player player = e.getPlayer();
1719
if (player == null) return;
18-
// TODO: Support player home worlds
20+
21+
DimensifyMain plugin = DimensifyMain.get();
22+
if (plugin.isSendPlayersToDefaultWorldOnLogin()) {
23+
plugin.getApi().getDatabaseHandler().ifPresent(db -> {
24+
String dimension = db.getDefaultDimension(false);
25+
26+
World world = plugin.getWorldController().getWorld(dimension);
27+
player.teleport(world.getSpawnLocation());
28+
});
29+
}
1930
}
2031
}

DimensifySpigot/src/main/resources/config.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ connection:
1313
password: magicalpassword
1414
file: dimensify
1515

16+
send_players_to_default_world_on_login: false
17+
1618
# Setting `permission_restrict_dimensions` to `true` will make all dimensions require permissions in
1719
# the following format: `dimension.<dimension_name>.allow` or `dimension.<dimension_name>.deny`.
1820
# If the permission is not present on the player, then we'll use the value from `default_dimension_restriction`.

0 commit comments

Comments
 (0)