Skip to content

Commit

Permalink
Update to 1.20.1
Browse files Browse the repository at this point in the history
  • Loading branch information
Pyrofab committed Jun 27, 2023
1 parent b2de5ef commit 8488f79
Show file tree
Hide file tree
Showing 17 changed files with 81 additions and 53 deletions.
21 changes: 15 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## **The Ladysnake maven is moving!**

**As Jfrog is ending their free service for OSS projects, we have to move the maven repository before the 1st of July 2023.
See below for the new maven instructions - you will have to update your buildscripts with the new URL before the cutoff date to avoid dependency resolution failures.**


# Impersonate

[![Curseforge](https://curse.nikky.moe/api/img/360333?logo)](https://www.curseforge.com/projects/360333) [![](https://jitpack.io/v/Ladysnake/Impersonate.svg)](https://jitpack.io/#Ladysnake/Impersonate)
Expand Down Expand Up @@ -43,24 +49,27 @@ If you only grant `impersonate.command.disguise.self`, players will only be able

### Gamerules
- `impersonate:fakeCapes` : Whether impersonators should get the cape and elytra of impersonated players. Defaults to `false`.
- If [Illuminations](https://github.com/Ladysnake/Illuminations) is installed, this option also controls whether a player's cosmetics are mimicked during impersonation
- If [Effective](https://github.com/Ladysnake/Effective) is installed, this option also controls whether a player's cosmetics are mimicked during impersonation
- `impersonate:opRevealImpersonations` : Whether ongoing impersonations should be revealed to online server operators. Defaults to `true`.
- `impersonate:logRevealImpersonations` : Whether ongoing impersonations should be revealed in the server logs. Defaults to `true`.

## Adding Impersonate to your project

You can add the library by inserting the following in your `build.gradle` :

**Note: since MC 1.17 builds, the Impersonate dependency must be lowercase.**
**Note 1: since MC 1.17 builds, the Impersonate dependency must be lowercase.**
**Note 2: since MC 1.20.1 builds (1.14.0), the maven group changed from `io.github.ladysnake` to `org.ladysnake`.**
**Note 3: since June 2023, the maven url changed from `ladysnake.jfrog.io/artifactory/mods` to `maven.ladysnake.org/releases`.**

```gradle
repositories {
maven {
name = "Ladysnake Mods"
url = "https://ladysnake.jfrog.io/artifactory/mods"
url = "https://maven.ladysnake.org/releases"
content {
includeGroup 'io.github.ladysnake'
includeGroupByRegex '(dev|io\\.github)\\.onyxstudios\\..*'
includeGroup 'org.ladysnake'
includeGroupByRegex 'dev\\.onyxstudios\\..*'
}
}
maven {
Expand All @@ -70,8 +79,8 @@ repositories {
}
dependencies {
modImplementation "io.github.ladysnake:impersonate:${impersonate_version}"
include "io.github.ladysnake:impersonate:${impersonate_version}"
modImplementation "org.ladysnake:impersonate:${impersonate_version}"
include "org.ladysnake:impersonate:${impersonate_version}"
// Impersonate dependencies
include "me.lucko:fabric-permissions-api:${fpa_version}"
include "dev.onyxstudios.cardinal-components-api:cardinal-components-base:${cca_version}"
Expand Down
39 changes: 24 additions & 15 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import net.fabricmc.loom.task.RemapJarTask

plugins {
id 'fabric-loom' version '1.+'
id 'io.github.ladysnake.chenille' version '0.10.0'
id 'io.github.ladysnake.chenille' version '0.11.3'
id 'io.github.juuxel.loom-quiltflower' version "1.6.0"
}

Expand Down Expand Up @@ -38,10 +38,11 @@ dependencies {
modIncludeImplementation libs.fpa
modIncludeApi libs.cca.base
modIncludeImplementation libs.cca.entity
// TODO make it work with effective once released
modCompileOnly (compatLibs.illuminations) {
exclude group: 'me.shedaniel.cloth'

modCompileOnly (compatLibs.effective) {
transitive = false
}

modLocalImplementation libs.elmendorf

api "org.jetbrains:annotations:${jb_annotations_version}"
Expand All @@ -62,9 +63,11 @@ processResources {
}
}

task testmodJar(type: Jar, dependsOn: testmodClasses) {
archiveBaseName = 'ImpersonateTest'
archiveClassifier = 'dev'
var testmodJar = tasks.register('testmodJar', Jar) {
dependsOn testmodClasses

archiveBaseName.set('ImpersonateTest')
archiveClassifier.set('dev')
from(sourceSets.testmod.output) {
include 'fabric.mod.json'
expand 'version': project.version
Expand All @@ -74,9 +77,11 @@ task testmodJar(type: Jar, dependsOn: testmodClasses) {
}
}

task remapTestmodJar(type: RemapJarTask, dependsOn: project.testmodJar) {
archiveBaseName = 'ImpersonateTest'
inputFile = testmodJar.archiveFile
var remapTestmodJar = tasks.register('remapTestmodJar', RemapJarTask) {
dependsOn project.testmodJar

archiveBaseName.set('ImpersonateTest')
inputFile.set(testmodJar.get().archiveFile)
addNestedDependencies = false
}

Expand All @@ -86,23 +91,27 @@ remapJar {
addNestedDependencies.set(false)
}

task standaloneJar(type: Jar, dependsOn: project.classes) {
var standaloneJar = tasks.register('standaloneJar', Jar) {
dependsOn project.classes

from sourceSets.main.output
archiveClassifier.set('standalone-dev')
}

task remapStandaloneJar(type: RemapJarTask, dependsOn: project.standaloneJar) {
var remapStandaloneJar = tasks.register('remapStandaloneJar', RemapJarTask) {
dependsOn standaloneJar

archiveClassifier.set('standalone')
inputFile.set(standaloneJar.archiveFile)
inputFile.set(standaloneJar.get().archiveFile)
addNestedDependencies.set(true)
}

assemble.dependsOn(remapStandaloneJar)

chenille {
configurePublishing {
mainArtifact = remapStandaloneJar.archiveFile
withArtifactory()
mainArtifact = remapStandaloneJar.get().archiveFile
withLadysnakeMaven()
withCurseforgeRelease()
withGithubRelease()
withModrinthRelease()
Expand Down
8 changes: 8 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
------------------------------------------------------
Version 2.10.0
------------------------------------------------------
Updated to MC 1.20.1

- Now compatible with Effective cosmetics (as a replacement for Illuminations')
- Will need to be tested again once Effective is out for MC 1.20

------------------------------------------------------
Version 2.9.0
------------------------------------------------------
Expand Down
14 changes: 7 additions & 7 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ org.gradle.jvmargs=-Xmx2G

# Fabric Properties
# check these on https://fabricmc.net/use
minecraft_version=1.19.3
yarn_mappings=1.19.3+build.5
loader_version=0.14.14
fabric_version=0.75.1+1.19.3
minecraft_version=1.20.1
yarn_mappings=1.20.1+build.8
loader_version=0.14.21
fabric_version=0.84.0+1.20.1

# Other Dependencies
jb_annotations_version = 23.0.0
apiguardian_version = 1.1.2

# Mod Properties
mod_version = 2.9.0
maven_group = io.github.ladysnake
mod_version = 2.10.0
maven_group = org.ladysnake
archives_base_name = impersonate

# Publishing
Expand All @@ -24,7 +24,7 @@ license_header = LGPL
gpl_version = 3
modrinth_id = xBZuWXoj
curseforge_id = 360333
curseforge_versions = 1.19.3
curseforge_versions = 1.20; 1.20.1
cf_requirements = fabric-api
cf_embeddeds = cardinal-components
release_type = release
4 changes: 2 additions & 2 deletions gradle/compat-libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[versions]
illuminations = "1.10.9"
effective = "2.1+1.19.2"

[libraries]
illuminations = { module = "io.github.ladysnake:Illuminations", version.ref = "illuminations" }
effective = { module = "io.github.ladysnake:Effective", version.ref = "effective" }
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[versions]
cca = "5.1.0"
cca = "5.2.1"
fpa = "0.2-SNAPSHOT"
elmendorf = "0.9.1"
elmendorf = "0.11.0"

[libraries]
cca-base = { module = "dev.onyxstudios.cardinal-components-api:cardinal-components-base", version.ref = "cca" }
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-rc-2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,9 @@ private static int stopImpersonation(ServerCommandSource source, Collection<Serv

private static void sendImpersonationFeedback(ServerCommandSource source, ServerPlayerEntity player, String command, Object arg) {
if (source.getEntity() == player) {
source.sendFeedback(Text.translatable("impersonate:commands.disguise." + command + ".success.self", arg), true);
source.sendFeedback(() -> Text.translatable("impersonate:commands.disguise." + command + ".success.self", arg), true);
} else {
source.sendFeedback(Text.translatable("impersonate:commands.disguise." + command + ".success.other", player.getDisplayName(), arg), true);
source.sendFeedback(() -> Text.translatable("impersonate:commands.disguise." + command + ".success.other", player.getDisplayName(), arg), true);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
public List<String> getMixins() {
List<String> additionalMixins = new ArrayList<>();
FabricLoader loader = FabricLoader.getInstance();
if (loader.isModLoaded("illuminations")) {
additionalMixins.add("compat.IlluminationsMixin");
if (loader.isModLoaded("effective")) {
additionalMixins.add("compat.EffectiveCosmeticsMixin");
}
return additionalMixins;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public boolean isRevealed() {

public static boolean shouldBeRevealedBy(PlayerEntity player) {
return player instanceof ServerPlayerEntity
&& player.world.getGameRules().getBoolean(ImpersonateGamerules.OP_REVEAL_IMPERSONATIONS)
&& player.getWorld().getGameRules().getBoolean(ImpersonateGamerules.OP_REVEAL_IMPERSONATIONS)
&& ((ServerPlayerEntity) player).server.getPlayerManager().isOperator(player.getGameProfile());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
import io.github.ladysnake.impersonate.impl.mixin.PlayerListS2CPacketEntryAccessor;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.Packet;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.message.MessageType;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket;
import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket;
import net.minecraft.server.network.ServerPlayerEntity;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtHelper;
import net.minecraft.nbt.NbtList;
import net.minecraft.network.Packet;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.listener.ClientPlayPacketListener;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket;
import net.minecraft.network.packet.s2c.play.PlayerRemoveS2CPacket;
import net.minecraft.server.PlayerManager;
Expand Down Expand Up @@ -115,7 +115,7 @@ private void applyCapeGamerule(ServerPlayerEntity player, GameProfile impersonat
}

private void updatePlayerLists(Packet<ClientPlayPacketListener> packet) {
if (!player.world.isClient) {
if (!player.getWorld().isClient) {
PlayerManager playerManager = ((ServerPlayerEntity) player).server.getPlayerManager();
if (isAloneOnServer(playerManager)) {
playerManager.sendToAll(packet);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ public static synchronized void setSkin(@NotNull ServerPlayerEntity player, Game
return Pair.of(null, null);
});
// we wait for the previous skin fetching to complete, to avoid setting skins in the wrong order
currentSkinTask.thenAcceptBothAsync(previousSkinTask, (pair, o) -> setPlayerSkin(player, pair.getFirst(), pair.getSecond()), player.world.getServer());
currentSkinTask.thenAcceptBothAsync(previousSkinTask, (pair, o) -> setPlayerSkin(player, pair.getFirst(), pair.getSecond()), player.getWorld().getServer());
}

/**
Expand Down Expand Up @@ -145,7 +145,7 @@ private static void reloadSkin(ServerPlayerEntity player) {
other.networkHandler.sendPacket(new PlayerListS2CPacket(PlayerListS2CPacket.Action.ADD_PLAYER, player));
}

ChunkManager manager = player.world.getChunkManager();
ChunkManager manager = player.getWorld().getChunkManager();
assert manager instanceof ServerChunkManager;
ThreadedAnvilChunkStorage storage = ((ServerChunkManager) manager).threadedAnvilChunkStorage;
EntityTrackerAccessor trackerEntry = ((ThreadedAnvilChunkStorageAccessor) storage).getEntityTrackers().get(player.getId());
Expand All @@ -163,7 +163,7 @@ private static void reloadSkin(ServerPlayerEntity player) {

private static void reloadSkinVanilla(ServerPlayerEntity player) {
// need to change the player entity on the client
ServerWorld targetWorld = (ServerWorld) player.world;
ServerWorld targetWorld = (ServerWorld) player.getWorld();
player.networkHandler.sendPacket(new PlayerRespawnS2CPacket(
targetWorld.getDimensionKey(),
targetWorld.getRegistryKey(),
Expand All @@ -173,7 +173,8 @@ private static void reloadSkinVanilla(ServerPlayerEntity player) {
targetWorld.isDebugWorld(),
targetWorld.isFlat(),
PlayerRespawnS2CPacket.KEEP_ATTRIBUTES,
player.getLastDeathPos()
player.getLastDeathPos(),
player.getPortalCooldown()
));
player.networkHandler.requestTeleport(player.getX(), player.getY(), player.getZ(), player.getYaw(), player.getPitch());
player.server.getPlayerManager().sendCommandTree(player);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ private void fakeName(CallbackInfoReturnable<Text> cir) {
PlayerEntity self = ((PlayerEntity) (Object) this);
if (Impersonator.get(self).isImpersonating()) {
// if the client is aware that there is an impersonation, they should display it
cir.setReturnValue(MutableText.of(ImpersonateTextContent.get(self, world.isClient)));
cir.setReturnValue(MutableText.of(ImpersonateTextContent.get(self, getWorld().isClient)));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import io.github.ladysnake.impersonate.Impersonator;
import io.github.ladysnake.impersonate.impl.PacketMeddling;
import io.github.ladysnake.impersonate.impl.RecipientAwareText;
import net.minecraft.network.Packet;
import net.minecraft.network.packet.Packet;
import net.minecraft.network.packet.s2c.play.ChatMessageS2CPacket;
import net.minecraft.network.packet.s2c.play.GameMessageS2CPacket;
import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket;
Expand All @@ -38,7 +38,7 @@ public abstract class ServerPlayNetworkHandlerMixin {
@Shadow
public ServerPlayerEntity player;

@ModifyArg(method = "sendPacket(Lnet/minecraft/network/Packet;Lnet/minecraft/network/PacketCallbacks;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ClientConnection;send(Lnet/minecraft/network/Packet;Lnet/minecraft/network/PacketCallbacks;)V"))
@ModifyArg(method = "sendPacket(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/ClientConnection;send(Lnet/minecraft/network/packet/Packet;Lnet/minecraft/network/PacketCallbacks;)V"))
private Packet<?> resolveFakeTextsInPackets(Packet<?> packet) {
if (packet instanceof ChatMessageS2CPacket chatPacket) {
if (this.existsImpersonator()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile

@Inject(method = "setClientSettings", at = @At("RETURN"))
private void removeCapeIfDisallowed(ClientSettingsC2SPacket clientSettingsC2SPacket, CallbackInfo ci) {
if (Impersonator.get(this).isImpersonating() && !this.world.getGameRules().getBoolean(ImpersonateGamerules.FAKE_CAPES)) {
if (Impersonator.get(this).isImpersonating() && !this.getWorld().getGameRules().getBoolean(ImpersonateGamerules.FAKE_CAPES)) {
this.impersonate_disableCape();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@

import com.mojang.authlib.GameProfile;
import io.github.ladysnake.impersonate.Impersonator;
import ladysnake.illuminations.client.Illuminations;
import ladysnake.illuminations.client.data.PlayerCosmeticData;
import ladysnake.effective.cosmetics.EffectiveCosmetics;
import ladysnake.effective.cosmetics.data.PlayerCosmeticData;
import net.minecraft.client.render.entity.PlayerModelPart;
import net.minecraft.entity.player.PlayerEntity;
import org.jetbrains.annotations.Nullable;
Expand All @@ -33,11 +33,12 @@
import java.util.Map;
import java.util.UUID;

@Mixin(Illuminations.class)
public abstract class IlluminationsMixin {
@Mixin(EffectiveCosmetics.class)
public abstract class EffectiveCosmeticsMixin {
@Shadow
private static Map<UUID, PlayerCosmeticData> PLAYER_COSMETICS;

@SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference", "InvalidInjectorMethodSignature"})
@Inject(method = "getCosmeticData", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getUuid()Ljava/util/UUID;"), cancellable = true, require = 0)
private static void spoofUuid(PlayerEntity player, CallbackInfoReturnable<@Nullable PlayerCosmeticData> cir) {
GameProfile impersonatedProfile = Impersonator.get(player).getImpersonatedProfile();
Expand Down

0 comments on commit 8488f79

Please sign in to comment.