Skip to content

Commit 7819438

Browse files
authored
Merge pull request #3411 from Multiverse/feat/enforce-delay
Add configurable delay for gamemode and flight enforcement on world change
2 parents 6152620 + c505da7 commit 7819438

4 files changed

Lines changed: 42 additions & 13 deletions

File tree

src/main/java/org/mvplugins/multiverse/core/config/CoreConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,16 @@ public boolean getEnforceFlight() {
186186
return configHandle.get(configNodes.enforceFlight);
187187
}
188188

189+
@ApiStatus.AvailableSince("5.5")
190+
public Try<Void> setGamemodeAndFlightEnforceDelay(int delayTicks) {
191+
return configHandle.set(configNodes.gamemodeAndFlightEnforceDelay, delayTicks);
192+
}
193+
194+
@ApiStatus.AvailableSince("5.5")
195+
public int getGamemodeAndFlightEnforceDelay() {
196+
return configHandle.get(configNodes.gamemodeAndFlightEnforceDelay);
197+
}
198+
189199
@ApiStatus.AvailableSince("5.3")
190200
public Try<Void> setApplyEntitySpawnRate(boolean applyEntitySpawnRate) {
191201
return configHandle.set(configNodes.applyEntitySpawnRate, applyEntitySpawnRate);

src/main/java/org/mvplugins/multiverse/core/config/CoreConfigNodes.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,16 @@ private <N extends Node> N node(N node) {
135135
.name("enforce-flight")
136136
.build());
137137

138+
final ConfigNode<Integer> gamemodeAndFlightEnforceDelay = node(ConfigNode.builder("world.gamemode-and-flight-enforce-delay", Integer.class)
139+
.comment("")
140+
.comment("Sets the delay in ticks before Multiverse enforces gamemode and flight ability on world change.")
141+
.comment("Increase this value if you are experiencing issues with other plugins overriding gamemode or flight ability.")
142+
.comment("Or set to 0 to enforce immediately during world change event.")
143+
.defaultValue(1)
144+
.name("gamemode-and-flight-enforce-delay")
145+
.suggester((sender -> List.of("0", "1", "2", "5", "10")))
146+
.build());
147+
138148
final ConfigNode<Boolean> applyEntitySpawnRate = node(ConfigNode.builder("world.apply-entity-spawn-rate", Boolean.class)
139149
.comment("")
140150
.comment("Sets whether Multiverse will apply the world's entity `tick-rate` config in worlds.yml.")

src/main/java/org/mvplugins/multiverse/core/listeners/MVPlayerListener.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77

88
package org.mvplugins.multiverse.core.listeners;
99

10-
import java.util.Map;
1110
import java.util.Objects;
12-
import java.util.concurrent.ConcurrentHashMap;
1311

1412
import com.dumptruckman.minecraft.util.Logging;
1513
import io.vavr.control.Option;
@@ -402,21 +400,31 @@ void playerPortal(PlayerPortalEvent event) {
402400
}
403401

404402
/**
405-
* Handles the gamemode for the specified {@link Player}.
403+
* Handles the gamemode for the specified {@link Player}. Delays the enforcement if configured to do so
404+
* to ensure multiverse has final say over other plugins changing gamemodes.
406405
*
407406
* @param player The {@link Player}.
408407
* @param world The {@link World} the player is supposed to be in.
409408
*/
410409
private void handleGameModeAndFlight(final Player player, World world) {
411-
// We perform this task one tick later to MAKE SURE that the player actually reaches the
412-
// destination world, otherwise we'd be changing the player mode if they havent moved anywhere.
413-
this.server.getScheduler().runTaskLater(this.plugin, () -> {
414-
if (!player.isOnline() || !player.getWorld().equals(world)) {
415-
return;
416-
}
417-
Logging.finer("Handling gamemode and flight for player %s in world '%s'", player.getName(), world.getName());
418-
enforcementHandler.handleFlightEnforcement(player);
419-
enforcementHandler.handleGameModeEnforcement(player);
420-
}, 1L);
410+
if (config.getGamemodeAndFlightEnforceDelay() <= 0) {
411+
doGameModeAndFlightEnforcement(player, world);
412+
return;
413+
}
414+
server.getScheduler().runTaskLater(
415+
this.plugin,
416+
() -> doGameModeAndFlightEnforcement(player, world),
417+
config.getGamemodeAndFlightEnforceDelay()
418+
);
419+
}
420+
421+
private void doGameModeAndFlightEnforcement(Player player, World world) {
422+
if (!player.isOnline() || !player.getWorld().equals(world)) {
423+
Logging.finer("Player %s is no longer online or not in the expected world '%s'", player.getName(), world.getName());
424+
return;
425+
}
426+
Logging.finer("Handling gamemode and flight for player %s in world '%s'", player.getName(), world.getName());
427+
enforcementHandler.handleFlightEnforcement(player);
428+
enforcementHandler.handleGameModeEnforcement(player);
421429
}
422430
}

src/test/resources/configs/fresh_config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ world:
44
enforce-access: false
55
enforce-gamemode: true
66
enforce-flight: true
7+
gamemode-and-flight-enforce-delay: 1
78
apply-entity-spawn-rate: true
89
apply-entity-spawn-limit: true
910
auto-purge-entities: false

0 commit comments

Comments
 (0)