diff --git a/bukkit/src/main/java/net/william278/huskhomes/BukkitHuskHomes.java b/bukkit/src/main/java/net/william278/huskhomes/BukkitHuskHomes.java index b6ffac62..087d6dd1 100644 --- a/bukkit/src/main/java/net/william278/huskhomes/BukkitHuskHomes.java +++ b/bukkit/src/main/java/net/william278/huskhomes/BukkitHuskHomes.java @@ -98,6 +98,7 @@ public class BukkitHuskHomes extends JavaPlugin implements HuskHomes, BukkitTask private final Set savedUsers = Sets.newHashSet(); private final Map> globalPlayerList = Maps.newConcurrentMap(); private final Set currentlyOnWarmup = Sets.newConcurrentHashSet(); + private final Set currentlyInvulnerable = Sets.newConcurrentHashSet(); private Settings settings; private Locales locales; diff --git a/bukkit/src/main/java/net/william278/huskhomes/user/BukkitUser.java b/bukkit/src/main/java/net/william278/huskhomes/user/BukkitUser.java index af27e633..88c2802e 100644 --- a/bukkit/src/main/java/net/william278/huskhomes/user/BukkitUser.java +++ b/bukkit/src/main/java/net/william278/huskhomes/user/BukkitUser.java @@ -154,4 +154,11 @@ public void handleInvulnerability() { plugin.runSyncDelayed(() -> player.setInvulnerable(false), this, invulnerabilityTimeInTicks); } + @Override + public void removeInvulnerabilityIfPermitted() { + if (plugin.isInvulnerable(this.getUuid())) { + player.setInvulnerable(false); + } + } + } diff --git a/common/src/main/java/net/william278/huskhomes/HuskHomes.java b/common/src/main/java/net/william278/huskhomes/HuskHomes.java index ed6f48d6..0564e6a4 100644 --- a/common/src/main/java/net/william278/huskhomes/HuskHomes.java +++ b/common/src/main/java/net/william278/huskhomes/HuskHomes.java @@ -370,6 +370,19 @@ default boolean isWarmingUp(@NotNull UUID userUuid) { return this.getCurrentlyOnWarmup().contains(userUuid); } + @NotNull + Set getCurrentlyInvulnerable(); + + /** + * Returns if the given user is currently invulnerable and if it should be removed. + * + * @param uuid the user to check. + * @return if the user is currently invulnerable. + */ + default boolean isInvulnerable(@NotNull UUID uuid) { + return this.getCurrentlyInvulnerable().contains(uuid); + } + @NotNull default UpdateChecker getUpdateChecker() { return UpdateChecker.builder() diff --git a/common/src/main/java/net/william278/huskhomes/listener/EventListener.java b/common/src/main/java/net/william278/huskhomes/listener/EventListener.java index b0da3859..43b826e4 100644 --- a/common/src/main/java/net/william278/huskhomes/listener/EventListener.java +++ b/common/src/main/java/net/william278/huskhomes/listener/EventListener.java @@ -101,6 +101,7 @@ protected final void handlePlayerJoin(@NotNull OnlineUser onlineUser) { * @param onlineUser the leaving {@link OnlineUser} */ protected final void handlePlayerLeave(@NotNull OnlineUser onlineUser) { + onlineUser.removeInvulnerabilityIfPermitted(); plugin.runAsync(() -> { // Set offline position plugin.getDatabase().setOfflinePosition(onlineUser, onlineUser.getPosition()); diff --git a/common/src/main/java/net/william278/huskhomes/user/OnlineUser.java b/common/src/main/java/net/william278/huskhomes/user/OnlineUser.java index e5af1687..81a9a2b9 100644 --- a/common/src/main/java/net/william278/huskhomes/user/OnlineUser.java +++ b/common/src/main/java/net/william278/huskhomes/user/OnlineUser.java @@ -220,6 +220,8 @@ public Audience getAudience() { */ public abstract void handleInvulnerability(); + public abstract void removeInvulnerabilityIfPermitted(); + /** * Get the maximum number of homes this user may set. * diff --git a/fabric/src/main/java/net/william278/huskhomes/FabricHuskHomes.java b/fabric/src/main/java/net/william278/huskhomes/FabricHuskHomes.java index 14568016..d2ffb689 100644 --- a/fabric/src/main/java/net/william278/huskhomes/FabricHuskHomes.java +++ b/fabric/src/main/java/net/william278/huskhomes/FabricHuskHomes.java @@ -106,6 +106,7 @@ public class FabricHuskHomes implements DedicatedServerModInitializer, HuskHomes private final Set savedUsers = Sets.newHashSet(); private final ConcurrentMap> globalPlayerList = Maps.newConcurrentMap(); private final Set currentlyOnWarmup = Sets.newHashSet(); + private final Set currentlyInvulnerable = Sets.newHashSet(); private MinecraftServer minecraftServer; private Settings settings; diff --git a/fabric/src/main/java/net/william278/huskhomes/user/FabricUser.java b/fabric/src/main/java/net/william278/huskhomes/user/FabricUser.java index 69db231e..40c99e4d 100644 --- a/fabric/src/main/java/net/william278/huskhomes/user/FabricUser.java +++ b/fabric/src/main/java/net/william278/huskhomes/user/FabricUser.java @@ -177,6 +177,13 @@ public void handleInvulnerability() { plugin.runSyncDelayed(() -> player.setInvulnerable(false), this, invulnerabilityTimeInTicks); } + @Override + public void removeInvulnerabilityIfPermitted() { + if (plugin.isInvulnerable(this.getUuid())) { + player.setInvulnerable(false); + } + } + @NotNull public ServerPlayerEntity getPlayer() { return player; diff --git a/sponge/src/main/java/net/william278/huskhomes/SpongeHuskHomes.java b/sponge/src/main/java/net/william278/huskhomes/SpongeHuskHomes.java index d5cefc57..a71bce03 100644 --- a/sponge/src/main/java/net/william278/huskhomes/SpongeHuskHomes.java +++ b/sponge/src/main/java/net/william278/huskhomes/SpongeHuskHomes.java @@ -103,6 +103,7 @@ public class SpongeHuskHomes implements HuskHomes, SpongeTask.Supplier, SpongeSa private final Set savedUsers = Sets.newHashSet(); private final Map> globalPlayerList = Maps.newConcurrentMap(); private final Set currentlyOnWarmup = Sets.newHashSet(); + private final Set currentlyInvulnerable = Sets.newHashSet(); @Inject @ConfigDir(sharedRoot = false) diff --git a/sponge/src/main/java/net/william278/huskhomes/user/SpongeUser.java b/sponge/src/main/java/net/william278/huskhomes/user/SpongeUser.java index c6cd2a7f..68099095 100644 --- a/sponge/src/main/java/net/william278/huskhomes/user/SpongeUser.java +++ b/sponge/src/main/java/net/william278/huskhomes/user/SpongeUser.java @@ -147,9 +147,15 @@ public void handleInvulnerability() { return; } long invulnerabilityTimeInTicks = 20L * plugin.getSettings().getGeneral().getTeleportInvulnerabilityTime(); - player.invulnerable().set(false); + player.invulnerable().set(true); // Remove the invulnerability - plugin.runSyncDelayed(() -> player.invulnerable().set(true), this, invulnerabilityTimeInTicks); + plugin.runSyncDelayed(() -> player.invulnerable().set(false), this, invulnerabilityTimeInTicks); } + @Override + public void removeInvulnerabilityIfPermitted() { + if (plugin.isInvulnerable(this.getUuid())) { + player.invulnerable().set(false); + } + } }