diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b11a718..d614367 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,19 +10,20 @@ jobs: runs-on: ubuntu-latest steps: - name: checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: validate gradle wrapper - uses: gradle/wrapper-validation-action@v1 + uses: gradle/actions/wrapper-validation@v3 - name: setup jdk 17 - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: java-version: 17 + distribution: 'microsoft' - name: make gradle wrapper executable run: chmod +x ./gradlew - name: build run: ./gradlew build - name: capture build artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: Vanish - path: build/libs/ \ No newline at end of file + path: build/libs/ diff --git a/build.gradle b/build.gradle index f55f1e7..1484990 100644 --- a/build.gradle +++ b/build.gradle @@ -1,13 +1,11 @@ plugins { - id 'fabric-loom' version '1.6-SNAPSHOT' - id 'io.github.goooler.shadow' version '8.1.7' + id 'fabric-loom' version '1.10-SNAPSHOT' + id 'com.gradleup.shadow' version '9.1.0' id 'maven-publish' } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 -archivesBaseName = project.archives_base_name + version = project.mod_version + "+" + project.minecraft_version group = project.maven_group @@ -31,13 +29,20 @@ dependencies { modImplementation include("eu.pb4:placeholder-api:${project.placeholder_api_version}") modImplementation include("eu.pb4:player-data-api:${project.player_data_api_version}") modImplementation include("xyz.nucleoid:server-translations-api:${project.translations_version}") - implementation shadow("org.spongepowered:configurate-hocon:${project.configurate_hocon_version}") + shadow("org.spongepowered:configurate-hocon:${project.configurate_hocon_version}") + modImplementation include("org.spongepowered:configurate-hocon:4.1.2") + modImplementation include("org.spongepowered:configurate-core:4.1.2") + + modImplementation include("com.typesafe:config:1.4.2") + modImplementation include("io.leangen.geantyref:geantyref:1.3.13") + // Mod compat modCompileOnly "maven.modrinth:styled-chat:${project.styled_chat_version}" compileOnly "com.github.BlueMap-Minecraft:BlueMapAPI:${project.bluemap_api_version}" compileOnly "us.dynmap:DynmapCoreAPI:${project.dynmap_api_version}" compileOnly("xyz.jpenilla:squaremap-api:${project.squaremap_api}") + compileOnly ("maven.modrinth:pl3xmap:${project.pl3xmap_version}") } shadowJar { @@ -62,12 +67,17 @@ processResources { tasks.withType(JavaCompile).configureEach { it.options.release.set(17) } - +base { + archivesName = project.archives_base_name +} java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 withSourcesJar() } jar { + inputs.property "archivesName", project.base.archivesName from("LICENSE") { rename { "${it}_${project.archivesBaseName}" } } @@ -77,6 +87,7 @@ jar { publishing { publications { mavenJava(MavenPublication) { + artifactId = project.archives_base_name from components.java } } diff --git a/gradle.properties b/gradle.properties index ecf730c..e4c21ca 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,13 +3,13 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.20.1 -loader_version=0.15.10 +loader_version=0.17.2 # Mod Properties -mod_version=1.5.5 +mod_version=1.5.20 maven_group=me.drex archives_base_name=vanish # Dependencies -fabric_version=0.92.1+1.20.1 +fabric_version=0.92.6+1.20.1 permission_api_version=0.3.1 placeholder_api_version=2.1.3+1.20.1 player_data_api_version=0.2.2+1.19.3 @@ -20,3 +20,4 @@ bluemap_api_version=v2.5.1 styled_chat_version=2.2.3+1.20.1 dynmap_api_version=3.5 squaremap_api=1.2.3 +pl3xmap_version=1.20.1-SNAPSHOT \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180..1b33c55 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 48c0a02..ff23a68 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/me/drex/vanish/VanishMod.java b/src/main/java/me/drex/vanish/VanishMod.java index 08423e1..d25fc21 100644 --- a/src/main/java/me/drex/vanish/VanishMod.java +++ b/src/main/java/me/drex/vanish/VanishMod.java @@ -6,7 +6,7 @@ import me.drex.vanish.config.ConfigManager; import me.drex.vanish.util.VanishManager; import me.drex.vanish.util.VanishPlaceHolders; -import net.fabricmc.api.DedicatedServerModInitializer; +import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntitySelector; @@ -15,17 +15,16 @@ import java.util.function.Predicate; -public class VanishMod implements DedicatedServerModInitializer { +public class VanishMod implements ModInitializer { public static final String MOD_ID = "vanish"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - public static final ThreadLocal ACTIVE_ENTITY = ThreadLocal.withInitial(() -> null); public static final Predicate NO_SPECTATORS_AND_NO_VANISH = EntitySelector.NO_SPECTATORS.and(entity -> !VanishAPI.isVanished(entity)); public static final Predicate CAN_BE_COLLIDED_WITH_AND_NO_VANISH = NO_SPECTATORS_AND_NO_VANISH.and(Entity::canBeCollidedWith); @Override - public void onInitializeServer() { + public void onInitialize() { try { ConfigManager.load(); } catch (Exception e) { diff --git a/src/main/java/me/drex/vanish/api/VanishEvents.java b/src/main/java/me/drex/vanish/api/VanishEvents.java index e713665..d200bd6 100644 --- a/src/main/java/me/drex/vanish/api/VanishEvents.java +++ b/src/main/java/me/drex/vanish/api/VanishEvents.java @@ -2,11 +2,35 @@ import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; +import net.fabricmc.fabric.api.util.TriState; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; public class VanishEvents { + /** + * This event is invoked when a player joins, but is not yet registered to the player list. + * You can return: + *

+ * - {@link TriState#TRUE} to indicate that the player should be forced to be vanished + *

+ * - {@link TriState#FALSE} to indicate that the player should be forced to be un-vanished + *

+ * - {@link TriState#DEFAULT} to keep previous behaviour. + * + * @since 1.5.14 + */ + public static final Event JOIN_EVENT = EventFactory.createArrayBacked(JoinEvent.class, callbacks -> (player) -> { + for (var callback : callbacks) { + TriState result = callback.onJoin(player); + if (result != TriState.DEFAULT) { + return result; + } + } + return TriState.DEFAULT; + }); + + /** * This event is invoked everytime a players vanish status changes */ @@ -40,6 +64,11 @@ public class VanishEvents { return result; }); + public interface JoinEvent { + TriState onJoin(ServerPlayer player); + } + + public interface VanishEvent { void onVanish(ServerPlayer player, boolean vanish); } diff --git a/src/main/java/me/drex/vanish/compat/ModCompat.java b/src/main/java/me/drex/vanish/compat/ModCompat.java index af6d05a..c0557e8 100644 --- a/src/main/java/me/drex/vanish/compat/ModCompat.java +++ b/src/main/java/me/drex/vanish/compat/ModCompat.java @@ -2,10 +2,15 @@ import de.bluecolored.bluemap.api.BlueMapAPI; import eu.pb4.styledchat.StyledChatStyles; +import me.drex.vanish.VanishMod; import me.drex.vanish.api.VanishEvents; +import me.lucko.fabric.api.permissions.v0.Options; +import net.fabricmc.fabric.api.event.Event; +import net.fabricmc.fabric.api.util.TriState; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import xyz.jpenilla.squaremap.api.*; public class ModCompat { @@ -14,12 +19,19 @@ public class ModCompat { public static final boolean BLUEMAP = FabricLoader.getInstance().isModLoaded("bluemap"); public static final boolean DYNMAP = FabricLoader.getInstance().isModLoaded("dynmap"); public static final boolean SQUAREMAP = FabricLoader.getInstance().isModLoaded("squaremap"); + public static final boolean PL3XMAP = FabricLoader.getInstance().isModLoaded("pl3xmap"); + public static final ResourceLocation VANISH_ON_JOIN = new ResourceLocation(VanishMod.MOD_ID, "vanish_on_join"); public static boolean blueMapEventsRegistered = false; public static void init() { // Vanilla VanishEvents.VANISH_MESSAGE_EVENT.register(serverPlayer -> Component.translatable("multiplayer.player.left", serverPlayer.getDisplayName()).withStyle(ChatFormatting.YELLOW)); VanishEvents.UN_VANISH_MESSAGE_EVENT.register(serverPlayer -> Component.translatable("multiplayer.player.joined", serverPlayer.getDisplayName()).withStyle(ChatFormatting.YELLOW)); + // Util + // Allow mods to use the default phase to (conditionally) overwrite this feature + VanishEvents.JOIN_EVENT.addPhaseOrdering(Event.DEFAULT_PHASE, VANISH_ON_JOIN); + VanishEvents.JOIN_EVENT.register(VANISH_ON_JOIN, player -> Options.get(player, "vanish_on_join", Boolean::valueOf).map(TriState::of).orElse(TriState.DEFAULT)); + // Styled Chat if (STYLED_CHAT) { VanishEvents.UN_VANISH_MESSAGE_EVENT.register(StyledChatStyles::getJoin); @@ -40,6 +52,9 @@ public static void init() { if (DYNMAP) { DynmapCompat.init(); } + if (PL3XMAP) { + Pl3xmapCompat.init(); + } if (SQUAREMAP) { VanishEvents.VANISH_EVENT.register((player, vanish) -> { if (vanish) { diff --git a/src/main/java/me/drex/vanish/compat/Pl3xmapCompat.java b/src/main/java/me/drex/vanish/compat/Pl3xmapCompat.java new file mode 100644 index 0000000..c1003ad --- /dev/null +++ b/src/main/java/me/drex/vanish/compat/Pl3xmapCompat.java @@ -0,0 +1,16 @@ +package me.drex.vanish.compat; + +import me.drex.vanish.api.VanishEvents; +import net.pl3x.map.core.Pl3xMap; + +public class Pl3xmapCompat { + + public static void init() { + VanishEvents.VANISH_EVENT.register((player, vanish) -> { + Pl3xMap.api().getPlayerRegistry() + .optional(player.getUUID()) + .ifPresent(playerRegistry -> playerRegistry.setHidden(vanish, true)); + }); + } + +} \ No newline at end of file diff --git a/src/main/java/me/drex/vanish/config/VanishConfig.java b/src/main/java/me/drex/vanish/config/VanishConfig.java index e91ade8..9a5eb50 100644 --- a/src/main/java/me/drex/vanish/config/VanishConfig.java +++ b/src/main/java/me/drex/vanish/config/VanishConfig.java @@ -21,6 +21,7 @@ public class VanishConfig { @Comment("Hide vanished players from entities, prevents hostile entities from targeting players, and more") public boolean hideFromEntities = true; + @Comment("Make vanished players invulnerable (Prevent deaths from tnt or other unforeseen accidents)") public boolean invulnerable = false; @@ -51,6 +52,9 @@ public static class Interaction { @Comment("Prevent entity pickups (arrows, experience orbs, items and tridents)") public boolean entityPickup = true; + @Comment("Prevent progressing advancements") + public boolean advancementProgress = false; + } } diff --git a/src/main/java/me/drex/vanish/mixin/AbstractVillagerMixin.java b/src/main/java/me/drex/vanish/mixin/AbstractVillagerMixin.java new file mode 100644 index 0000000..6f3765b --- /dev/null +++ b/src/main/java/me/drex/vanish/mixin/AbstractVillagerMixin.java @@ -0,0 +1,35 @@ +package me.drex.vanish.mixin; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import me.drex.vanish.api.VanishAPI; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(AbstractVillager.class) +public class AbstractVillagerMixin { + @Shadow + private @Nullable Player tradingPlayer; + + @ModifyReturnValue(method = "isTrading", at = @At("RETURN")) + private boolean vanish_allowTradingIfVanished(boolean original) { + if (original) { + assert this.tradingPlayer != null; + return !VanishAPI.isVanished(this.tradingPlayer); + } + return false; + } + + @Inject(method = "setTradingPlayer", at = @At("HEAD")) + private void vanish_closeVanishedPlayerTradeScreen(Player player, CallbackInfo ci) { + if (player != null && player != this.tradingPlayer && this.tradingPlayer instanceof ServerPlayer serverPlayer) { + serverPlayer.closeContainer(); + } + } +} \ No newline at end of file diff --git a/src/main/java/me/drex/vanish/mixin/AllayAiMixin.java b/src/main/java/me/drex/vanish/mixin/AllayAiMixin.java new file mode 100644 index 0000000..d1cfe9a --- /dev/null +++ b/src/main/java/me/drex/vanish/mixin/AllayAiMixin.java @@ -0,0 +1,24 @@ +package me.drex.vanish.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import me.drex.vanish.api.VanishAPI; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.animal.allay.AllayAi; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(AllayAi.class) +public abstract class AllayAiMixin { + @WrapOperation( + method = "getLikedPlayer", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/level/ServerPlayer;closerThan(Lnet/minecraft/world/entity/Entity;D)Z" + ) + ) + private static boolean excludeVanished(ServerPlayer instance, Entity entity, double distance, Operation original) { + return original.call(instance, entity, distance) && !VanishAPI.isVanished(instance); + } +} \ No newline at end of file diff --git a/src/main/java/me/drex/vanish/mixin/ContainerOpenersCountMixin.java b/src/main/java/me/drex/vanish/mixin/ContainerOpenersCountMixin.java new file mode 100644 index 0000000..2832863 --- /dev/null +++ b/src/main/java/me/drex/vanish/mixin/ContainerOpenersCountMixin.java @@ -0,0 +1,28 @@ +package me.drex.vanish.mixin; + +import me.drex.vanish.api.VanishAPI; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.entity.ContainerOpenersCounter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +import java.util.function.Predicate; + +@Mixin(ContainerOpenersCounter.class) +public class ContainerOpenersCountMixin { + + @ModifyArg( + method = "getOpenCount(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)I", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/Level;getEntities(Lnet/minecraft/world/level/entity/EntityTypeTest;Lnet/minecraft/world/phys/AABB;Ljava/util/function/Predicate;)Ljava/util/List;" + ), + index = 2 + ) + private Predicate vanish_excludeVanished(Predicate original) { + // Keep vanilla's isOwnContainer() checks and just add "not vanished" + return original.and(player -> !VanishAPI.isVanished((Entity) player)); + } +} diff --git a/src/main/java/me/drex/vanish/mixin/PlayerListMixin.java b/src/main/java/me/drex/vanish/mixin/PlayerListMixin.java index ea30fa6..eb18ecb 100644 --- a/src/main/java/me/drex/vanish/mixin/PlayerListMixin.java +++ b/src/main/java/me/drex/vanish/mixin/PlayerListMixin.java @@ -4,11 +4,13 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import eu.pb4.playerdata.api.PlayerDataApi; -import me.drex.vanish.VanishMod; +import me.drex.vanish.util.Arguments; import me.drex.vanish.api.VanishAPI; +import me.drex.vanish.api.VanishEvents; import me.drex.vanish.util.VanishData; import me.drex.vanish.util.VanishedEntity; import me.lucko.fabric.api.permissions.v0.Options; +import net.fabricmc.fabric.api.util.TriState; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.Packet; @@ -40,11 +42,11 @@ public abstract class PlayerListMixin { ) ) private void vanish_vanishOnJoin(Connection connection, ServerPlayer actor, CallbackInfo ci) { - Boolean vanishOnJoin = Options.get(actor, "vanish_on_join", Boolean::valueOf).orElse(false); - if (vanishOnJoin) { + TriState result = VanishEvents.JOIN_EVENT.invoker().onJoin(actor); + if (result != TriState.DEFAULT) { VanishData data = PlayerDataApi.getCustomDataFor(actor.server, actor.getUUID(), VANISH_DATA_STORAGE); if (data == null) data = new VanishData(); - data.vanished = true; + data.vanished = result.get(); PlayerDataApi.setCustomDataFor(actor.server, actor.getUUID(), VANISH_DATA_STORAGE, data); ((VanishedEntity) actor).vanish$setDirty(); } @@ -77,7 +79,7 @@ public boolean vanish_hideGameEvents(ServerGamePacketListenerImpl packetListener if (player instanceof ServerPlayer serverPlayer) { entity = serverPlayer; } else { - entity = VanishMod.ACTIVE_ENTITY.get(); + entity = Arguments.ACTIVE_ENTITY.get(); } if (entity instanceof TraceableEntity traceableEntity && traceableEntity.getOwner() instanceof ServerPlayer owner) { entity = owner; diff --git a/src/main/java/me/drex/vanish/mixin/PlayerMixin.java b/src/main/java/me/drex/vanish/mixin/PlayerMixin.java index e23c055..a8bea02 100644 --- a/src/main/java/me/drex/vanish/mixin/PlayerMixin.java +++ b/src/main/java/me/drex/vanish/mixin/PlayerMixin.java @@ -1,15 +1,24 @@ package me.drex.vanish.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import me.drex.vanish.api.VanishAPI; import me.drex.vanish.config.ConfigManager; +import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Player.class) public abstract class PlayerMixin { + @Unique + private Component vanish_cachedDisplayName = null; + @ModifyReturnValue(method = "isInvulnerableTo", at = @At("RETURN")) private boolean vanish_invulnerablePlayers(boolean original) { if (ConfigManager.vanish().invulnerable && VanishAPI.isVanished((Player) (Object) this)) { @@ -18,4 +27,17 @@ private boolean vanish_invulnerablePlayers(boolean original) { return original; } -} + @WrapMethod(method = "getDisplayName") + public Component vanish_cacheDisplayName(Operation original) { + if (vanish_cachedDisplayName == null) { + vanish_cachedDisplayName = original.call(); + } + return vanish_cachedDisplayName; + } + + @Inject(method = "tick", at = @At("HEAD")) + public void vanish_invalidateCache(CallbackInfo ci) { + vanish_cachedDisplayName = null; + } + +} \ No newline at end of file diff --git a/src/main/java/me/drex/vanish/mixin/ServerCommonPacketListenerImplMixin.java b/src/main/java/me/drex/vanish/mixin/ServerCommonPacketListenerImplMixin.java index 747fb32..8ac42b3 100644 --- a/src/main/java/me/drex/vanish/mixin/ServerCommonPacketListenerImplMixin.java +++ b/src/main/java/me/drex/vanish/mixin/ServerCommonPacketListenerImplMixin.java @@ -3,6 +3,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import me.drex.vanish.api.VanishAPI; import net.minecraft.network.PacketSendListener; +import me.drex.vanish.util.Arguments; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket; import net.minecraft.network.protocol.game.ClientboundRemoveEntitiesPacket; @@ -42,6 +43,8 @@ public void vanish_modifyPackets(Packet packet, PacketSendListener packetSend ci.cancel(); } } else if (packet instanceof ClientboundPlayerInfoUpdatePacket playerInfoPacket) { + // If the packet context is set, this packet was already modified + if (Arguments.PACKET_CONTEXT.get() != null) return; ObjectArrayList modifiedEntries = new ObjectArrayList<>(); int visible = 0; for (ClientboundPlayerInfoUpdatePacket.Entry playerUpdate : playerInfoPacket.entries()) { @@ -51,15 +54,17 @@ public void vanish_modifyPackets(Packet packet, PacketSendListener packetSend if (player != null) modifiedEntries.add(player); } } - if (visible != playerInfoPacket.entries().size()) { - if (!modifiedEntries.isEmpty()) { + if (!modifiedEntries.isEmpty()) { + var prev = Arguments.PACKET_CONTEXT.get(); + try { + Arguments.PACKET_CONTEXT.set(listener.player); this.send(new ClientboundPlayerInfoUpdatePacket(playerInfoPacket.actions(), modifiedEntries)); + } finally { + Arguments.PACKET_CONTEXT.set(prev); } - ci.cancel(); + } + ci.cancel(); } } } } - - -} diff --git a/src/main/java/me/drex/vanish/mixin/ServerGamePacketListenerImplMixin.java b/src/main/java/me/drex/vanish/mixin/ServerGamePacketListenerImplMixin.java index 7050d15..becd26a 100644 --- a/src/main/java/me/drex/vanish/mixin/ServerGamePacketListenerImplMixin.java +++ b/src/main/java/me/drex/vanish/mixin/ServerGamePacketListenerImplMixin.java @@ -2,16 +2,18 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import me.drex.vanish.VanishMod; +import me.drex.vanish.util.Arguments; import me.drex.vanish.api.VanishAPI; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ServerboundInteractPacket; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; import net.minecraft.network.protocol.game.ServerboundUseItemOnPacket; import net.minecraft.network.protocol.game.ServerboundUseItemPacket; +import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.server.players.PlayerList; +import net.minecraft.world.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -39,6 +41,21 @@ public void vanish_hideLeaveMessage(PlayerList playerList, Component component, } } + @WrapOperation( + method = "handleInteract", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/network/protocol/game/ServerboundInteractPacket;getTarget(Lnet/minecraft/server/level/ServerLevel;)Lnet/minecraft/world/entity/Entity;" + ) + ) + public Entity vanish_preventInteraction(ServerboundInteractPacket instance, ServerLevel serverLevel, Operation original) { + Entity entity = original.call(instance, serverLevel); + if (entity instanceof ServerPlayer actor && !VanishAPI.canSeePlayer(actor, this.player)) { + return null; + } + return entity; + } + @Inject( method = "handlePlayerAction", at = @At( @@ -47,7 +64,7 @@ public void vanish_hideLeaveMessage(PlayerList playerList, Component component, ) ) public void vanish_beforeHandlePlayerAction(ServerboundPlayerActionPacket serverboundPlayerActionPacket, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.set(this.player); + Arguments.ACTIVE_ENTITY.set(this.player); } @Inject( @@ -58,7 +75,7 @@ public void vanish_beforeHandlePlayerAction(ServerboundPlayerActionPacket server ) ) public void vanish_beforeHandleUseItemOn(ServerboundUseItemOnPacket serverboundUseItemOnPacket, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.set(this.player); + Arguments.ACTIVE_ENTITY.set(this.player); } @Inject( @@ -69,7 +86,7 @@ public void vanish_beforeHandleUseItemOn(ServerboundUseItemOnPacket serverboundU ) ) public void vanish_beforeHandleUseItem(ServerboundUseItemPacket serverboundUseItemPacket, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.set(this.player); + Arguments.ACTIVE_ENTITY.set(this.player); } @Inject( @@ -81,7 +98,7 @@ public void vanish_beforeHandleUseItem(ServerboundUseItemPacket serverboundUseIt ) ) public void vanish_beforeHandleInteract(ServerboundInteractPacket serverboundInteractPacket, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.set(this.player); + Arguments.ACTIVE_ENTITY.set(this.player); } @Inject( @@ -89,17 +106,17 @@ public void vanish_beforeHandleInteract(ServerboundInteractPacket serverboundInt at = @At("RETURN") ) public void vanish_afterPacket(CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.remove(); + Arguments.ACTIVE_ENTITY.remove(); } @Inject(method = "tick", at = @At("HEAD")) public void vanish_beforeTick(CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.set(this.player); + Arguments.ACTIVE_ENTITY.set(this.player); } @Inject(method = "tick", at = @At("RETURN")) public void vanish_afterTick(CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.remove(); + Arguments.ACTIVE_ENTITY.remove(); } } diff --git a/src/main/java/me/drex/vanish/mixin/ServerLevelMixin.java b/src/main/java/me/drex/vanish/mixin/ServerLevelMixin.java index 4f35ad5..27fb7f6 100644 --- a/src/main/java/me/drex/vanish/mixin/ServerLevelMixin.java +++ b/src/main/java/me/drex/vanish/mixin/ServerLevelMixin.java @@ -2,7 +2,7 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import me.drex.vanish.VanishMod; +import me.drex.vanish.util.Arguments; import me.drex.vanish.api.VanishAPI; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientboundBlockDestructionPacket; @@ -46,7 +46,7 @@ public void vanish_hideBlockDestroyProgress(ServerGamePacketListenerImpl packetL ) ) public void vanish_beforeEntityTickNonPassenger(Entity entity, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.set(entity); + Arguments.ACTIVE_ENTITY.set(entity); } @Inject( @@ -58,7 +58,7 @@ public void vanish_beforeEntityTickNonPassenger(Entity entity, CallbackInfo ci) ) ) public void vanish_afterEntityTickNonPassenger(Entity entity, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.remove(); + Arguments.ACTIVE_ENTITY.remove(); } @Inject( @@ -69,7 +69,7 @@ public void vanish_afterEntityTickNonPassenger(Entity entity, CallbackInfo ci) { ) ) public void vanish_beforeEntityTick(Entity entity, Entity entity2, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.set(entity2); + Arguments.ACTIVE_ENTITY.set(entity2); } @Inject( @@ -81,7 +81,7 @@ public void vanish_beforeEntityTick(Entity entity, Entity entity2, CallbackInfo ) ) public void vanish_afterEntityTick(Entity entity, Entity entity2, CallbackInfo ci) { - VanishMod.ACTIVE_ENTITY.remove(); + Arguments.ACTIVE_ENTITY.remove(); } } diff --git a/src/main/java/me/drex/vanish/mixin/interaction/PhantomSpawnerMixin.java b/src/main/java/me/drex/vanish/mixin/interaction/PhantomSpawnerMixin.java new file mode 100644 index 0000000..5279f4f --- /dev/null +++ b/src/main/java/me/drex/vanish/mixin/interaction/PhantomSpawnerMixin.java @@ -0,0 +1,30 @@ +package me.drex.vanish.mixin.interaction; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import me.drex.vanish.api.VanishAPI; +import me.drex.vanish.config.ConfigManager; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.levelgen.PhantomSpawner; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(PhantomSpawner.class) +public abstract class PhantomSpawnerMixin { + + @WrapOperation( + method = "tick", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/level/ServerPlayer;isSpectator()Z" + ) + ) + public boolean preventPhantoms(ServerPlayer serverPlayer, Operation original) { + Boolean isSpectator = original.call(serverPlayer); + if (ConfigManager.vanish().interaction.mobSpawning) { + return isSpectator || VanishAPI.isVanished(serverPlayer); + } + return isSpectator; + } + +} \ No newline at end of file diff --git a/src/main/java/me/drex/vanish/mixin/interaction/SimpleCriterionTriggerMixin.java b/src/main/java/me/drex/vanish/mixin/interaction/SimpleCriterionTriggerMixin.java new file mode 100644 index 0000000..3e00927 --- /dev/null +++ b/src/main/java/me/drex/vanish/mixin/interaction/SimpleCriterionTriggerMixin.java @@ -0,0 +1,24 @@ +package me.drex.vanish.mixin.interaction; + +import me.drex.vanish.api.VanishAPI; +import me.drex.vanish.config.ConfigManager; +import net.minecraft.advancements.critereon.SimpleCriterionTrigger; +import net.minecraft.server.level.ServerPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.function.Predicate; + +@Mixin(SimpleCriterionTrigger.class) +public abstract class SimpleCriterionTriggerMixin { + + @Inject(method = "trigger", at = @At("HEAD"), cancellable = true) + public void vanish_preventAdvancementProgress(ServerPlayer player, Predicate predicate, CallbackInfo ci) { + if (ConfigManager.vanish().interaction.advancementProgress && VanishAPI.isVanished(player)) { + ci.cancel(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/me/drex/vanish/mixin/interaction/VanishEntitySelector.java b/src/main/java/me/drex/vanish/mixin/interaction/VanishEntitySelector.java index f154f8f..d4f77bf 100644 --- a/src/main/java/me/drex/vanish/mixin/interaction/VanishEntitySelector.java +++ b/src/main/java/me/drex/vanish/mixin/interaction/VanishEntitySelector.java @@ -13,6 +13,7 @@ import net.minecraft.world.item.ArmorItem; import net.minecraft.world.level.EntityGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.BasePressurePlateBlock; import net.minecraft.world.level.block.BeehiveBlock; import net.minecraft.world.phys.AABB; import org.spongepowered.asm.mixin.Mixin; @@ -117,7 +118,7 @@ public abstract static class AbstractMinecartMixin { ) ) private List vanish_preventMinecartColision(Level instance, Entity entity, AABB aABB, Operation> original) { - return true ? instance.getEntities(entity, aABB, VanishMod.NO_SPECTATORS_AND_NO_VANISH) : original.call(instance, entity, aABB); + return ConfigManager.vanish().interaction.entityCollisions ? instance.getEntities(entity, aABB, VanishMod.NO_SPECTATORS_AND_NO_VANISH) : original.call(instance, entity, aABB); } } @@ -152,4 +153,19 @@ private List vanish_preventBeeAnger(Level instance, Class vanish_preventPressurePlatePress(Operation> original) { + return ConfigManager.vanish().interaction.blocks ? VanishMod.NO_SPECTATORS_AND_NO_VANISH : original.call(); + } + } + + } diff --git a/src/main/java/me/drex/vanish/util/Arguments.java b/src/main/java/me/drex/vanish/util/Arguments.java new file mode 100644 index 0000000..0cb84be --- /dev/null +++ b/src/main/java/me/drex/vanish/util/Arguments.java @@ -0,0 +1,9 @@ +package me.drex.vanish.util; + +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; + +public class Arguments { + public static final ThreadLocal ACTIVE_ENTITY = ThreadLocal.withInitial(() -> null); + public static final ThreadLocal PACKET_CONTEXT = ThreadLocal.withInitial(() -> null); +} \ No newline at end of file diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 79e8ccd..387f4ad 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,21 +1,21 @@ { "schemaVersion": 1, - "id": "melius-vanish", + "id": "vanish", "version": "${version}", "name": "Vanish", "description": "Completely hide from other players using /vanish", "authors": [ "Drex" ], + "provides": [ + "melius-vanish" + ], "license": "MIT", "icon": "assets/vanish/icon.png", - "environment": "server", + "environment": "*", "entrypoints": { - "server": [ + "main": [ "me.drex.vanish.VanishMod" - ], - "preLaunch": [ - "com.llamalad7.mixinextras.MixinExtrasBootstrap::init" ] }, "custom": { @@ -31,13 +31,12 @@ "vanish.mixins.json" ], "depends": { - "fabricloader": ">=0.15.10", + "fabricloader": ">=0.17.2", "fabric-api": "*", "java": ">=17", "minecraft": ">=1.20 <=1.20.1" }, "breaks": { - "vanish": "*", "styledchat": "<2.0.0" } } diff --git a/src/main/resources/vanish.mixins.json b/src/main/resources/vanish.mixins.json index 9ee5588..338524b 100644 --- a/src/main/resources/vanish.mixins.json +++ b/src/main/resources/vanish.mixins.json @@ -8,8 +8,11 @@ "defaultRequire": 1 }, "mixins": [ + "AbstractVillagerMixin", + "AllayAiMixin", "CommandSourceStackMixin", "ContainerMixin", + "ContainerOpenersCountMixin", "EntityGetterMixin", "EntityMixin", "EntitySelectorMixin", @@ -33,10 +36,13 @@ "interaction.FallOnBlockMixin", "interaction.InsideBlockMixin", "interaction.LivingEntityMixin", + "interaction.PhantomSpawnerMixin", "interaction.PlayerMixin", + "interaction.SimpleCriterionTriggerMixin", "interaction.StepOnBlockMixin", "interaction.VanishEntitySelector$AbstractMinecartMixin", "interaction.VanishEntitySelector$ArmorItemMixin", + "interaction.VanishEntitySelector$BasePressurePlateBlockMixin", "interaction.VanishEntitySelector$BeehiveBlockMixin", "interaction.VanishEntitySelector$EntityGetterMixin", "interaction.VanishEntitySelector$EntitySelectorMixin",