diff --git a/CHANGELOG.md b/CHANGELOG.md index b6d4b91..2ea77c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2101.1.3] + +### Added +* Now fires an `EntityTeleportEvent.TeleportCommand` event on NeoForge when any teleportation is done + * Note: There isn't a Fabric API equivalent for this event + +### Fixed +* Fixed problem on SMP where player data (e.g. home location) wasn't always written for the player + * In particular if player disconnected before the server ran a scheduled level save + ## [2101.1.2] ### Fixed diff --git a/common/src/main/java/dev/ftb/mods/ftbessentials/FTBEEventHandler.java b/common/src/main/java/dev/ftb/mods/ftbessentials/FTBEEventHandler.java index 32c0fe6..6c7dab1 100644 --- a/common/src/main/java/dev/ftb/mods/ftbessentials/FTBEEventHandler.java +++ b/common/src/main/java/dev/ftb/mods/ftbessentials/FTBEEventHandler.java @@ -108,7 +108,7 @@ private static void playerLoggedIn(ServerPlayer serverPlayer) { private static void playerLoggedOut(ServerPlayer serverPlayer) { FTBEPlayerData.getOrCreate(serverPlayer).ifPresent(data -> { data.setLastSeenPos(new TeleportPos(serverPlayer)); - data.markDirty(); + data.saveIfChanged(); }); } diff --git a/common/src/main/java/dev/ftb/mods/ftbessentials/util/WarmupCooldownTeleporter.java b/common/src/main/java/dev/ftb/mods/ftbessentials/util/WarmupCooldownTeleporter.java index 51ea2c5..304a34d 100644 --- a/common/src/main/java/dev/ftb/mods/ftbessentials/util/WarmupCooldownTeleporter.java +++ b/common/src/main/java/dev/ftb/mods/ftbessentials/util/WarmupCooldownTeleporter.java @@ -1,6 +1,7 @@ package dev.ftb.mods.ftbessentials.util; import dev.architectury.event.CompoundEventResult; +import dev.architectury.injectables.annotations.ExpectPlatform; import dev.ftb.mods.ftbessentials.api.event.TeleportEvent; import dev.ftb.mods.ftbessentials.config.FTBEConfig; import dev.ftb.mods.ftbessentials.util.TeleportPos.TeleportResult; @@ -49,15 +50,25 @@ public TeleportResult checkCooldown(ServerPlayer player) { return TeleportResult.SUCCESS; } + @ExpectPlatform + private static boolean firePlatformTeleportEvent(ServerPlayer player, Vec3 pos) { + throw new AssertionError(); + } + public TeleportResult teleport(ServerPlayer player, Function positionGetter) { + TeleportResult cooldownResult = checkCooldown(player); + if (!cooldownResult.isSuccess()) { + return cooldownResult; + } + CompoundEventResult result = TeleportEvent.TELEPORT.invoker().teleport(player); if (result.isFalse()) { return TeleportResult.failed(result.object()); } - TeleportResult cooldownResult = checkCooldown(player); - if (!cooldownResult.isSuccess()) { - return cooldownResult; + TeleportPos pos = positionGetter.apply(player); + if (!firePlatformTeleportEvent(player, Vec3.atBottomCenterOf(pos.getPos()))) { + return TeleportResult.failed(Component.translatable("ftbessentials.teleport_prevented")); } int warmupTime = warmupConfig.applyAsInt(player); diff --git a/common/src/main/resources/assets/ftbessentials/lang/en_us.json b/common/src/main/resources/assets/ftbessentials/lang/en_us.json index 2580546..61d92da 100644 --- a/common/src/main/resources/assets/ftbessentials/lang/en_us.json +++ b/common/src/main/resources/assets/ftbessentials/lang/en_us.json @@ -6,5 +6,6 @@ "ftbessentials.chat.status.stop_stream": "is no longer streaming!", "ftbessentials.messages.kick_self": "You kicked yourself!", "ftbessentials.feedback.limit_radius": "Limiting radius to %s", - "ftbessentials.feedback.players_within": "%s player(s) within %sm" + "ftbessentials.feedback.players_within": "%s player(s) within %sm", + "ftbessentials.teleport_prevented": "Teleportation was prevented!" } diff --git a/fabric/src/main/java/dev/ftb/mods/ftbessentials/util/fabric/WarmupCooldownTeleporterImpl.java b/fabric/src/main/java/dev/ftb/mods/ftbessentials/util/fabric/WarmupCooldownTeleporterImpl.java new file mode 100644 index 0000000..99151e8 --- /dev/null +++ b/fabric/src/main/java/dev/ftb/mods/ftbessentials/util/fabric/WarmupCooldownTeleporterImpl.java @@ -0,0 +1,11 @@ +package dev.ftb.mods.ftbessentials.util.fabric; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec3; + +public class WarmupCooldownTeleporterImpl { + public static boolean firePlatformTeleportEvent(ServerPlayer player, Vec3 pos) { + // TODO don't think there's a FAPI event for this; update here if one gets added + return true; + } +} diff --git a/gradle.properties b/gradle.properties index c55c5f8..d454ee6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ archives_base_name=ftb-essentials maven_group=dev.ftb.mods minecraft_version=1.21.1 -mod_version=2101.1.2 +mod_version=2101.1.3 mod_author=FTB Team # Deps diff --git a/neoforge/src/main/java/dev/ftb/mods/ftbessentials/util/neoforge/WarmupCooldownTeleporterImpl.java b/neoforge/src/main/java/dev/ftb/mods/ftbessentials/util/neoforge/WarmupCooldownTeleporterImpl.java new file mode 100644 index 0000000..8036304 --- /dev/null +++ b/neoforge/src/main/java/dev/ftb/mods/ftbessentials/util/neoforge/WarmupCooldownTeleporterImpl.java @@ -0,0 +1,14 @@ +package dev.ftb.mods.ftbessentials.util.neoforge; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.EntityTeleportEvent; + +public class WarmupCooldownTeleporterImpl { + public static boolean firePlatformTeleportEvent(ServerPlayer player, Vec3 pos) { + EntityTeleportEvent.TeleportCommand event = new EntityTeleportEvent.TeleportCommand(player, pos.x, pos.y, pos.z); + NeoForge.EVENT_BUS.post(event); + return !event.isCanceled(); + } +}