Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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/
path: build/libs/
25 changes: 18 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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 {
Expand All @@ -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}" }
}
Expand All @@ -77,6 +87,7 @@ jar {
publishing {
publications {
mavenJava(MavenPublication) {
artifactId = project.archives_base_name
from components.java
}
}
Expand Down
7 changes: 4 additions & 3 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
4 changes: 3 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
7 changes: 3 additions & 4 deletions src/main/java/me/drex/vanish/VanishMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Entity> ACTIVE_ENTITY = ThreadLocal.withInitial(() -> null);
public static final Predicate<Entity> NO_SPECTATORS_AND_NO_VANISH = EntitySelector.NO_SPECTATORS.and(entity -> !VanishAPI.isVanished(entity));
public static final Predicate<Entity> 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) {
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/me/drex/vanish/api/VanishEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -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:
* <br></br>
* - {@link TriState#TRUE} to indicate that the player should be forced to be vanished
* <br></br>
* - {@link TriState#FALSE} to indicate that the player should be forced to be un-vanished
* <br></br>
* - {@link TriState#DEFAULT} to keep previous behaviour.
*
* @since 1.5.14
*/
public static final Event<JoinEvent> 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
*/
Expand Down Expand Up @@ -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);
}
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/me/drex/vanish/compat/ModCompat.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
Expand All @@ -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) {
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/me/drex/vanish/compat/Pl3xmapCompat.java
Original file line number Diff line number Diff line change
@@ -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));
});
}

}
4 changes: 4 additions & 0 deletions src/main/java/me/drex/vanish/config/VanishConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

}

}
35 changes: 35 additions & 0 deletions src/main/java/me/drex/vanish/mixin/AbstractVillagerMixin.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
24 changes: 24 additions & 0 deletions src/main/java/me/drex/vanish/mixin/AllayAiMixin.java
Original file line number Diff line number Diff line change
@@ -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<Boolean> original) {
return original.call(instance, entity, distance) && !VanishAPI.isVanished(instance);
}
}
28 changes: 28 additions & 0 deletions src/main/java/me/drex/vanish/mixin/ContainerOpenersCountMixin.java
Original file line number Diff line number Diff line change
@@ -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<? super Player> vanish_excludeVanished(Predicate<? super Player> original) {
// Keep vanilla's isOwnContainer() checks and just add "not vanished"
return original.and(player -> !VanishAPI.isVanished((Entity) player));
}
}
Loading
Loading