2222import com .djrapitops .plan .settings .config .WorldAliasSettings ;
2323import com .djrapitops .plan .storage .database .DBSystem ;
2424import com .djrapitops .plan .storage .database .transactions .events .StoreWorldNameTransaction ;
25- import com .djrapitops .plan .utilities .logging .ErrorContext ;
2625import com .djrapitops .plan .utilities .logging .ErrorLogger ;
27- import net .minecraft .world .entity .player .Player ;
28- import net .minecraft .world .level .GameType ;
29- import org .spongepowered .api .ResourceKey ;
3026import org .spongepowered .api .Sponge ;
27+ import org .spongepowered .api .data .DataTransactionResult ;
28+ import org .spongepowered .api .data .Keys ;
29+ import org .spongepowered .api .data .value .Value ;
3130import org .spongepowered .api .entity .living .player .gamemode .GameMode ;
32- import org .spongepowered .api .entity .living .player .gamemode .GameModes ;
3331import org .spongepowered .api .entity .living .player .server .ServerPlayer ;
32+ import org .spongepowered .api .event .Listener ;
33+ import org .spongepowered .api .event .Order ;
34+ import org .spongepowered .api .event .data .ChangeDataHolderEvent ;
3435import org .spongepowered .api .registry .RegistryTypes ;
3536
3637import javax .inject .Inject ;
37- import java .util .ArrayList ;
38- import java .util .List ;
3938import java .util .Optional ;
4039import java .util .UUID ;
41- import java .util .function .Consumer ;
4240
4341/**
4442 * Listener for GameMode change on Sponge.
4745 */
4846public class SpongeGMChangeListener {
4947
50- public static final List <Consumer <Event >> EVENT_CONSUMERS = new ArrayList <>(); // Available to the mixin
51-
5248 private final WorldAliasSettings worldAliasSettings ;
5349 private final ServerInfo serverInfo ;
5450 private final DBSystem dbSystem ;
@@ -65,65 +61,31 @@ public SpongeGMChangeListener(
6561 this .serverInfo = serverInfo ;
6662 this .dbSystem = dbSystem ;
6763 this .errorLogger = errorLogger ;
68- EVENT_CONSUMERS .add (this ::onMixin );
6964 }
7065
71- public static class Event {
72- private final Player player ;
73- private final GameType gameType ;
74-
75- public Event (Player player , GameType gameType ) {
76- this .player = player ;
77- this .gameType = gameType ;
66+ @ Listener (order = Order .POST )
67+ public void onGMChange (ChangeDataHolderEvent .ValueChange event ) {
68+ ServerPlayer player = event .targetHolder () instanceof ServerPlayer serverPlayer ? serverPlayer : null ;
69+ if (player == null ) {
70+ return ;
7871 }
79- }
8072
81- private void onMixin (Event event ) {
82- ServerPlayer serverPlayer = Sponge .game ().server ()
83- .player (event .player .getUUID ())
84- .orElse (null );
85- if (serverPlayer == null ) {
86- // uh oh
87- errorLogger .error (
88- new RuntimeException ("GameMode changed for player but no ServerPlayer was found" ),
89- ErrorContext .builder ()
90- .related (event .player , event .player .getGameProfile ().getName ())
91- .whatToDo ("Report this, the gamemode change mixin might be broken" )
92- .build ()
93- );
73+ DataTransactionResult result = event .endResult ();
74+ Optional <Value .Immutable <GameMode >> gameModeValue = result .successfulValue (Keys .GAME_MODE );
75+ if (gameModeValue .isEmpty ()) {
9476 return ;
9577 }
9678
97- GameMode gameMode = GameModes . registry ().value ( ResourceKey . sponge ( event . gameType . getName ()) );
98- actOnGMChangeEvent (serverPlayer , gameMode );
79+ GameMode newMode = gameModeValue . get ().get ( );
80+ actOnGMChangeEvent (player , newMode );
9981 }
10082
101- // This listener can replace the mixin if this pr is merged:
102- // https://github.com/SpongePowered/Sponge/pull/3563
103-
104- // @Listener(order = Order.POST)
105- // public void onGMChange(ChangeDataHolderEvent.ValueChange event) {
106- // ServerPlayer player = event.targetHolder() instanceof ServerPlayer ? (ServerPlayer) event.targetHolder() : null;
107- // if (player == null) {
108- // return;
109- // }
110- //
111- // DataTransactionResult result = event.endResult();
112- // Optional<Value.Immutable<GameMode>> gameModeValue = result.successfulValue(Keys.GAME_MODE);
113- // if (gameModeValue.isEmpty()) {
114- // return;
115- // }
116- //
117- // GameMode newMode = gameModeValue.get().get();
118- // actOnGMChangeEvent(player, newMode);
119- // }
120-
12183 private void actOnGMChangeEvent (ServerPlayer player , GameMode gameMode ) {
12284 UUID uuid = player .uniqueId ();
12385 long time = System .currentTimeMillis ();
12486
12587 String gameModeText = gameMode .key (RegistryTypes .GAME_MODE ).value ().toUpperCase ();
126- String worldName = Sponge .game ().server ().worldManager ().worldDirectory (player .world ().key ())
88+ String worldName = Optional . ofNullable ( Sponge .game ().server ().worldManager ().worldDirectory (player .world ().key () ))
12789 .map (path -> path .getFileName ().toString ()).orElse ("Unknown" );
12890
12991 dbSystem .getDatabase ().executeTransaction (new StoreWorldNameTransaction (serverInfo .getServerUUID (), worldName ));
0 commit comments