Skip to content

Commit 87798c6

Browse files
Merge pull request #9 from OneLiteFeatherNET/rework/setup
Overhaul code base from the setup
2 parents 4fed06b + cb20765 commit 87798c6

36 files changed

+920
-273
lines changed

setup/src/main/java/net/theevilreaper/tamias/setup/TamiasSetup.java

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44
import de.icevizion.aves.file.GsonFileHandler;
55
import de.icevizion.aves.util.functional.PlayerConsumer;
66
import net.kyori.adventure.text.Component;
7+
import net.kyori.adventure.text.format.NamedTextColor;
78
import net.minestom.server.MinecraftServer;
89
import net.minestom.server.command.CommandManager;
10+
import net.minestom.server.entity.Player;
911
import net.minestom.server.event.GlobalEventHandler;
1012
import net.minestom.server.event.instance.AddEntityToInstanceEvent;
13+
import net.minestom.server.event.item.ItemDropEvent;
14+
import net.minestom.server.event.item.PickupItemEvent;
1115
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
16+
import net.minestom.server.event.player.PlayerChatEvent;
1217
import net.minestom.server.event.player.PlayerDisconnectEvent;
1318
import net.minestom.server.event.player.PlayerSpawnEvent;
1419
import net.minestom.server.event.player.PlayerUseItemEvent;
@@ -17,44 +22,50 @@
1722
import net.minestom.server.tag.Tag;
1823
import net.theevilreaper.tamias.common.gson.GsonUtil;
1924
import net.theevilreaper.tamias.common.map.MapProvider;
25+
import net.theevilreaper.tamias.common.util.MapFilter;
2026
import net.theevilreaper.tamias.setup.commands.SetupCommand;
2127
import net.theevilreaper.tamias.setup.data.SetupDataService;
2228
import net.theevilreaper.tamias.setup.event.MapSetupFinishEvent;
2329
import net.theevilreaper.tamias.setup.event.MapSetupSelectEvent;
24-
import net.theevilreaper.tamias.setup.inventory.InventoryProvider;
30+
import net.theevilreaper.tamias.setup.inventory.MapSetupInventory;
31+
import net.theevilreaper.tamias.setup.listener.PlayerChatListener;
2532
import net.theevilreaper.tamias.setup.listener.PlayerConfigurationListener;
2633
import net.theevilreaper.tamias.setup.listener.PlayerDisconnectListener;
2734
import net.theevilreaper.tamias.setup.listener.PlayerSpawnListener;
28-
import net.theevilreaper.tamias.setup.listener.PlayerUseItemListener;
35+
import net.theevilreaper.tamias.setup.listener.item.PlayerDropItemListener;
36+
import net.theevilreaper.tamias.setup.listener.item.PlayerPickupItemListener;
37+
import net.theevilreaper.tamias.setup.listener.item.PlayerUseItemListener;
2938
import net.theevilreaper.tamias.setup.listener.entity.EntityAddToInstanceListener;
3039
import net.theevilreaper.tamias.setup.listener.map.MapSetupFinishListener;
3140
import net.theevilreaper.tamias.setup.listener.map.MapSetupSelectListener;
3241
import net.theevilreaper.tamias.setup.map.SetupMapProvider;
3342
import net.theevilreaper.tamias.setup.util.SetupItems;
43+
import org.jetbrains.annotations.NotNull;
3444

3545
import java.util.function.Supplier;
3646

37-
public class TamiasSetup extends Extension {
47+
public final class TamiasSetup extends Extension {
3848

39-
public static final Tag<Byte> SETUP_TAG = Tag.Byte("setup");
49+
public static final Tag<Byte> SETUP_TAG = Tag.Transient("setup");
4050
public static final Tag<Boolean> DELETE_TAG = Tag.Boolean("delete").defaultValue(false);
41-
public static final Component SELECT_MAP_FIRST = Component.text("<red>Please select a map first!");
51+
public static final Component SELECT_MAP_FIRST = Component.text("Please select a map first!", NamedTextColor.RED);
52+
4253
private final FileHandler fileHandler;
4354
private final MapProvider mapProvider;
4455
private final SetupDataService setupDataService;
4556
private final SetupItems setupItems;
46-
private InventoryProvider inventoryProvider;
57+
private final MapSetupInventory mapSetupInventory;
4758

4859
public TamiasSetup() {
4960
this.fileHandler = new GsonFileHandler(GsonUtil.GSON);
50-
this.mapProvider = new SetupMapProvider(this.fileHandler);
61+
this.mapProvider = new SetupMapProvider(MapFilter.ROOT_FOLDER, this.fileHandler);
5162
this.setupDataService = new SetupDataService();
5263
this.setupItems = new SetupItems();
64+
this.mapSetupInventory = new MapSetupInventory(this.mapProvider::getEntries);
5365
}
5466

5567
@Override
5668
public void initialize() {
57-
this.inventoryProvider = new InventoryProvider(this.mapProvider::getEntries);
5869
this.registerListener();
5970
this.registerCommands();
6071
}
@@ -76,13 +87,27 @@ private void registerListener() {
7687
setupMapProvider.teleportToSpawn(player, true);
7788
setupItems.setOverViewItem(player);
7889
};
79-
manager.addListener(PlayerUseItemEvent.class, new PlayerUseItemListener(inventoryProvider::openMapSetupInventory, setupDataService::getSetupData));
80-
manager.addListener(PlayerDisconnectEvent.class, new PlayerDisconnectListener(setupDataService::getSetupData));
90+
manager.addListener(PlayerDisconnectEvent.class, new PlayerDisconnectListener(setupDataService::removeSetupData));
8191
manager.addListener(AsyncPlayerConfigurationEvent.class, new PlayerConfigurationListener(instanceSupplier));
8292
manager.addListener(PlayerSpawnEvent.class, new PlayerSpawnListener(initialSpawnSupplier));
8393
manager.addListener(AddEntityToInstanceEvent.class, new EntityAddToInstanceListener(instanceSupplier, setupItems));
8494
manager.addListener(MapSetupSelectEvent.class, new MapSetupSelectListener(this.fileHandler, this.setupDataService));
8595
manager.addListener(MapSetupFinishEvent.class, new MapSetupFinishListener(this.mapProvider::saveMap, instanceSwitcher));
96+
manager.addListener(PlayerChatEvent.class, new PlayerChatListener(this.setupDataService));
97+
98+
// Item listener
99+
manager.addListener(PlayerUseItemEvent.class, new PlayerUseItemListener(this::updateMapInventory, setupDataService::getSetupData));
100+
manager.addListener(ItemDropEvent.class, new PlayerDropItemListener());
101+
manager.addListener(PickupItemEvent.class, new PlayerPickupItemListener());
102+
}
103+
104+
/**
105+
* Open the map inventory for the given player.
106+
*
107+
* @param player the player to open the inventory
108+
*/
109+
private void updateMapInventory(@NotNull Player player) {
110+
this.mapSetupInventory.open(player);
86111
}
87112

88113
/**

setup/src/main/java/net/theevilreaper/tamias/setup/commands/parts/SetupAreaCommand.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,14 @@
1313
import net.minestom.server.coordinate.Vec;
1414
import net.minestom.server.entity.Player;
1515
import net.minestom.server.utils.Direction;
16-
import net.minestom.server.utils.MathUtils;
17-
import net.theevilreaper.tamias.common.util.DirectionFaceHelper;
1816
import net.theevilreaper.tamias.common.util.Messages;
1917
import net.theevilreaper.tamias.setup.TamiasSetup;
2018
import net.theevilreaper.tamias.setup.data.GameData;
2119
import net.theevilreaper.tamias.setup.data.SetupData;
22-
import net.theevilreaper.tamias.setup.util.SetupMessages;
20+
import net.theevilreaper.tamias.setup.util.DirectionUtil;
2321
import org.jetbrains.annotations.NotNull;
2422

23+
import java.util.Optional;
2524
import java.util.function.Function;
2625

2726
import static net.theevilreaper.tamias.setup.TamiasSetup.SELECT_MAP_FIRST;
@@ -99,19 +98,12 @@ private void handlePositionSet(@NotNull CommandSender sender, @NotNull CommandCo
9998
}
10099

101100
private void setLeftCorner(@NotNull Player player, @NotNull SetupData setupData) {
102-
Direction direction = MathUtils.getHorizontalDirection(player.getPosition().yaw());
101+
Optional<Direction> directionOptional = DirectionUtil.parseDirection(player);
102+
if (directionOptional.isEmpty()) return;
103103

104-
Vec dir = player.getPosition().direction();
105-
106-
double directionPitch = Math.toDegrees(-Math.atan2(dir.y(), Math.sqrt(dir.x() * dir.x() + dir.z() * dir.z())));
107-
108-
if (!DirectionFaceHelper.isValidFace(directionPitch)) {
109-
String indirectDirection = DirectionFaceHelper.getInvalidDirection(directionPitch).name();
110-
player.sendMessage(SetupMessages.getInvalidFace(indirectDirection));
111-
return;
112-
}
113104
Vec vec = Vec.fromPoint(player.getPosition()).sub(0, -1,0);
114105

106+
Direction direction = directionOptional.get();
115107
GameData gameData = ((GameData) setupData);
116108

117109
gameData.setLeftCorner(vec);

setup/src/main/java/net/theevilreaper/tamias/setup/commands/parts/SetupPositionCommand.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@
2222
import net.theevilreaper.tamias.setup.TamiasSetup;
2323
import net.theevilreaper.tamias.setup.commands.type.SpawnType;
2424
import net.theevilreaper.tamias.setup.data.SetupData;
25-
import net.theevilreaper.tamias.setup.util.SetupMessages;
25+
import net.theevilreaper.tamias.setup.util.DirectionUtil;
2626
import org.jetbrains.annotations.NotNull;
2727

28+
import java.util.Optional;
2829
import java.util.function.Function;
2930

3031
import static net.theevilreaper.tamias.setup.TamiasSetup.SELECT_MAP_FIRST;
@@ -72,7 +73,7 @@ private void handleSpawnSet(@NotNull CommandSender sender, @NotNull CommandConte
7273
}
7374
Component posAsComponent = Components.convertPoint(Pos.fromPoint(player.getPosition()));
7475
Component argComponent = Component.text(type, NamedTextColor.GREEN);
75-
Component message = Messages.withPrefix(Component.text("The ")
76+
Component message = Messages.withPrefix(Component.text("The ", NamedTextColor.GRAY)
7677
.append(argComponent)
7778
.append(Component.space())
7879
.append(Component.text("position of the map is now located at: ", NamedTextColor.GRAY))
@@ -98,19 +99,12 @@ private void handleGameSpawnSet(@NotNull Player sender, @NotNull GameMap gameMap
9899
* @param gameMap the map to set the spawn
99100
*/
100101
private void handleSurvivorSpawnSet(@NotNull Player player, @NotNull GameMap gameMap) {
101-
Direction direction = MathUtils.getHorizontalDirection(player.getPosition().yaw());
102+
Optional<Direction> determinedDirection = DirectionUtil.parseDirection(player);
102103

103-
Vec dir = player.getPosition().direction();
104-
105-
double directionPitch = Math.toDegrees(-Math.atan2(dir.y(), Math.sqrt(dir.x() * dir.x() + dir.z() * dir.z())));
106-
107-
if (!DirectionFaceHelper.isValidFace(directionPitch)) {
108-
String indirectDirection = DirectionFaceHelper.getInvalidDirection(directionPitch).name();
109-
player.sendMessage(SetupMessages.getInvalidFace(indirectDirection));
110-
return;
111-
}
104+
if (determinedDirection.isEmpty()) return;
112105

113106
Pos pos = Pos.fromPoint(player.getPosition());
107+
Direction direction = determinedDirection.get();
114108

115109
gameMap.setLeftSurvivorSpawn(pos, direction);
116110

setup/src/main/java/net/theevilreaper/tamias/setup/data/GameData.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,30 @@
22

33
import de.icevizion.aves.map.BaseMap;
44
import de.icevizion.aves.map.MapEntry;
5+
import net.kyori.adventure.text.Component;
6+
import net.kyori.adventure.text.format.NamedTextColor;
57
import net.minestom.server.coordinate.Vec;
68
import net.minestom.server.entity.Player;
79
import net.minestom.server.utils.Direction;
810
import net.theevilreaper.tamias.common.map.GameMap;
911
import net.theevilreaper.tamias.common.map.layer.GameAreaData;
1012
import net.theevilreaper.tamias.setup.inventory.LobbyViewInventory;
11-
import net.theevilreaper.tamias.setup.state.SetupState;
1213
import org.jetbrains.annotations.NotNull;
1314

1415
public final class GameData extends SetupDataImpl {
1516

1617
private GameAreaData.Builder areaDataBuilder;
1718
private final LobbyViewInventory inventory;
1819

19-
GameData(@NotNull Player player, @NotNull MapEntry mapEntry, @NotNull SetupState mode, @NotNull BaseMap baseMap) {
20-
super(player, mapEntry, mode, baseMap);
20+
private boolean areaMode;
21+
22+
GameData(@NotNull Player player, @NotNull MapEntry mapEntry, @NotNull BaseMap baseMap) {
23+
super(player, mapEntry, baseMap);
2124
this.inventory = new LobbyViewInventory(baseMap);
25+
this.title = Component.text("Setup mode: ", NamedTextColor.GRAY)
26+
.append(Component.text("Game", NamedTextColor.LIGHT_PURPLE))
27+
.append(Component.text(", Map: ", NamedTextColor.GRAY))
28+
.append(Component.text(mapEntry.getDirectoryRoot().getFileName().toString(), NamedTextColor.LIGHT_PURPLE));
2229
}
2330

2431
@Override
@@ -27,20 +34,35 @@ public void swapAreaMode() {
2734

2835
if (this.areaMode) {
2936
this.areaDataBuilder = GameAreaData.builder();
30-
} else {
31-
GameMap gameMap = (GameMap) this.baseMap;
32-
gameMap.setGameAreaData(this.areaDataBuilder.build());
37+
return;
3338
}
39+
GameMap gameMap = (GameMap) this.baseMap;
40+
gameMap.setGameAreaData(this.areaDataBuilder.build());
3441
}
3542

43+
/**
44+
* Sets the left corner of the area.
45+
*
46+
* @param vec the left corner
47+
*/
3648
public void setLeftCorner(@NotNull Vec vec) {
3749
this.areaDataBuilder.lowerCorner(vec);
3850
}
3951

52+
/**
53+
* Sets the direction of the area.
54+
*
55+
* @param direction the direction of the area
56+
*/
4057
public void setDirection(@NotNull Direction direction) {
4158
this.areaDataBuilder.facing(direction);
4259
}
4360

61+
/**
62+
* Sets the right corner of the area.
63+
*
64+
* @param vec the right corner
65+
*/
4466
public void setRightCorner(@NotNull Vec vec) {
4567
this.areaDataBuilder.upperCorner(vec);
4668
}
@@ -60,4 +82,9 @@ public void reset() {
6082
super.reset();
6183
this.inventory.unregister();
6284
}
85+
86+
@Override
87+
public boolean hasAreaMode() {
88+
return this.areaMode;
89+
}
6390
}

setup/src/main/java/net/theevilreaper/tamias/setup/data/LobbyData.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,29 @@
22

33
import de.icevizion.aves.map.BaseMap;
44
import de.icevizion.aves.map.MapEntry;
5+
import net.kyori.adventure.text.Component;
6+
import net.kyori.adventure.text.format.NamedTextColor;
57
import net.minestom.server.entity.Player;
68
import net.theevilreaper.tamias.setup.inventory.LobbyViewInventory;
7-
import net.theevilreaper.tamias.setup.state.SetupState;
89
import org.jetbrains.annotations.NotNull;
910

1011
public final class LobbyData extends SetupDataImpl {
1112

1213
private final LobbyViewInventory inventory;
1314

14-
LobbyData(@NotNull Player player, @NotNull MapEntry mapEntry, @NotNull SetupState mode, @NotNull BaseMap baseMap) {
15-
super(player, mapEntry, mode, baseMap);
15+
LobbyData(@NotNull Player player, @NotNull MapEntry mapEntry, @NotNull BaseMap baseMap) {
16+
super(player, mapEntry, baseMap);
1617
this.inventory = new LobbyViewInventory(baseMap);
18+
19+
this.title = Component.text("Setup mode: ", NamedTextColor.GRAY)
20+
.append(Component.text("Lobby", NamedTextColor.LIGHT_PURPLE))
21+
.append(Component.text(", Map: ", NamedTextColor.GRAY))
22+
.append(Component.text(mapEntry.getDirectoryRoot().getFileName().toString(), NamedTextColor.LIGHT_PURPLE));
23+
}
24+
25+
@Override
26+
public void swapAreaMode() {
27+
throw new UnsupportedOperationException("A LobbyData can't swap the area mode");
1728
}
1829

1930
@Override
@@ -31,4 +42,9 @@ public void reset() {
3142
super.reset();
3243
this.inventory.unregister();
3344
}
45+
46+
@Override
47+
public boolean hasAreaMode() {
48+
return false;
49+
}
3450
}

setup/src/main/java/net/theevilreaper/tamias/setup/data/SetupData.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import de.icevizion.aves.map.BaseMap;
44
import de.icevizion.aves.map.MapEntry;
55
import net.minestom.server.entity.Player;
6-
import net.theevilreaper.tamias.setup.state.SetupState;
76
import org.jetbrains.annotations.Contract;
87
import org.jetbrains.annotations.NotNull;
98

@@ -95,13 +94,6 @@ public sealed interface SetupData permits SetupDataImpl {
9594
*/
9695
@NotNull MapEntry getMapEntry();
9796

98-
/**
99-
* Returns the setup mode of the setup data.
100-
*
101-
* @return the given mode
102-
*/
103-
@NotNull SetupState getSetupState();
104-
10597
/**
10698
* Returns the player of the setup data.
10799
*
@@ -134,14 +126,6 @@ sealed interface Builder permits SetupDataBuilder {
134126
*/
135127
@NotNull Builder mapEntry(@NotNull MapEntry mapEntry);
136128

137-
/**
138-
* Sets the mode for the setup data.
139-
*
140-
* @param mode the mode for the setup data
141-
* @return the builder instance
142-
*/
143-
@NotNull Builder state(@NotNull SetupState mode);
144-
145129
/**
146130
* Sets the player for the setup data.
147131
*

setup/src/main/java/net/theevilreaper/tamias/setup/data/SetupDataBuilder.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import de.icevizion.aves.map.BaseMap;
44
import de.icevizion.aves.map.MapEntry;
55
import net.minestom.server.entity.Player;
6-
import net.theevilreaper.tamias.setup.state.SetupState;
6+
import net.theevilreaper.tamias.common.map.GameMap;
77
import org.jetbrains.annotations.NotNull;
88

99
/**
@@ -20,7 +20,6 @@
2020
public final class SetupDataBuilder implements SetupData.Builder {
2121

2222
private MapEntry mapEntry;
23-
private SetupState mode;
2423
private Player player;
2524
private BaseMap baseMap;
2625

@@ -45,12 +44,6 @@ public SetupDataBuilder(@NotNull SetupData setupData) {
4544
return this;
4645
}
4746

48-
@Override
49-
public SetupData.@NotNull Builder state(@NotNull SetupState mode) {
50-
this.mode = mode;
51-
return this;
52-
}
53-
5447
@Override
5548
public SetupData.@NotNull Builder player(@NotNull Player player) {
5649
this.player = player;
@@ -65,9 +58,9 @@ public SetupDataBuilder(@NotNull SetupData setupData) {
6558

6659
@Override
6760
public @NotNull SetupData build() {
68-
return switch (mode) {
69-
case LOBBY -> new LobbyData(this.player, this.mapEntry, this.mode, this.baseMap);
70-
case GAME -> new GameData(this.player, this.mapEntry, this.mode, this.baseMap);
71-
};
61+
if (this.baseMap instanceof GameMap) {
62+
return new GameData(this.player, this.mapEntry, this.baseMap);
63+
}
64+
return new LobbyData(this.player, this.mapEntry, this.baseMap);
7265
}
7366
}

0 commit comments

Comments
 (0)