diff --git a/AGENTS.md b/AGENTS.md index 90421da..42324c6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,6 +1,6 @@ # AGENTS -This repository hosts **Identity**, a Minecraft Forge 1.20.1 mod written in Java. +This repository hosts **Identity**, a Minecraft Forge 1.21.1 mod written in Java. ## Coding Guidelines - Use four spaces for indentation. @@ -11,17 +11,17 @@ This repository hosts **Identity**, a Minecraft Forge 1.20.1 mod written in Java - The project uses Gradle. The wrapper is not included, so use the system `gradle` command. - Run `gradle build` from the repository root after any changes. This is the current programmatic check. The build may fail if external dependencies cannot be resolved. - No test suite exists yet. -- Build with **JDK 17**. Ensure the PATH and `java` command reference JDK 17 before running Gradle. +- Build with **JDK 21**. Ensure the PATH and `java` command reference JDK 21 before running Gradle. ## Environment Setup - Install `apt-utils` to prevent debconf warnings: ```bash sudo apt-get update && sudo apt-get install -y apt-utils ``` -- Install the JDK 17 package if it isn't present: +- Install the JDK 21 package if it isn't present: ```bash - sudo apt-get install -y openjdk-17-jdk + sudo apt-get install -y openjdk-21-jdk sudo dpkg --configure -a ``` -- Set `java` and `javac` to the OpenJDK 17 binaries via `update-alternatives` and ensure they appear first in `PATH` when building. + - Set `java` and `javac` to the OpenJDK 21 binaries via `update-alternatives` and ensure they appear first in `PATH` when building. diff --git a/README.md b/README.md index f484e86..028575b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Identity -*Identity* is a mod inspired by [Morph](https://www.curseforge.com/minecraft/mc-mods/morph), built for both Fabric and Forge mod loader. +*Identity* is a Minecraft Forge mod inspired by [Morph](https://www.curseforge.com/minecraft/mc-mods/morph). This version is actively maintained and updated by me, as the original creator seems to have stepped away from further development. @@ -8,15 +8,11 @@ This version is actively maintained and updated by me, as the original creator s **Versions**: -| | Fabric | Forge | -|--------| ----------- | ----------- | -| 1.20.1 | ✅ | ✅ | +| | Forge | +|--------|-------| +| 1.21.1 | ✅ | -**Required Libraries (1.20.1):** - -Fabric => [Architectury API (Fabric)](https://www.curseforge.com/minecraft/mc-mods/architectury-fabric) - -Forge => [Architectury API (Forge)](https://www.curseforge.com/minecraft/mc-mods/architectury-forge) +This project targets Minecraft 1.21.1 on Forge and builds using JDK 21. --- @@ -39,3 +35,4 @@ To unlock an *Identity*, kill a nearby mob. You'll see a notification above your ### License Identity is licensed under MIT. + diff --git a/build.gradle b/build.gradle index d9e8062..81410bf 100644 --- a/build.gradle +++ b/build.gradle @@ -1,83 +1,4 @@ plugins { - id 'java-library' - id 'dev.architectury.loom' version '1.7-SNAPSHOT' apply false - id 'architectury-plugin' version '3.4-SNAPSHOT' - id 'com.github.johnrengelman.shadow' version '8.1.1' apply false + id 'base' } -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} - -architectury { - minecraft = rootProject.minecraft_version -} - -subprojects { - apply plugin: 'dev.architectury.loom' - apply plugin: 'architectury-plugin' - apply plugin: 'maven-publish' - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" - - - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } - } - - archivesBaseName = rootProject.archives_base_name - version = rootProject.mod_version + "-" + rootProject.minecraft_version - group = rootProject.maven_group - - repositories { - // Add repositories to retrieve artifacts from in here. - // You should only use this when depending on other mods because - // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. - // See https://docs.gradle.org/current/userguide/declaring_repositories.html - // for more information about repositories. - maven { - name = "Citadel & Alex's Mobs" - url = "https://dl.cloudsmith.io/public/tslat/systems/maven/" - } - maven { - name = "CurseMaven" - url = "https://cursemaven.com" - } - maven { - url = "https://api.modrinth.com/maven" - } - maven { - name = 'GeckoLib' - url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' - content { - includeGroupByRegex("software\\.bernie.*") - includeGroup("com.eliotlash.mclib") - } - } - maven { url "https://maven.shedaniel.me/" } - flatDir { dir 'libs' } - } - - tasks.withType(JavaCompile) { - options.encoding = "UTF-8" - options.release = 17 - } - - java { - withSourcesJar() - } -} \ No newline at end of file diff --git a/common/.architectury-transformer/debug.log b/common/.architectury-transformer/debug.log deleted file mode 100644 index 8ce6aa0..0000000 --- a/common/.architectury-transformer/debug.log +++ /dev/null @@ -1 +0,0 @@ -[Architectury Transformer DEBUG] Closed File Systems for H:\identyMod\common\build\libs\identity-2.8.1-1.20.1.jar diff --git a/common/build.gradle b/common/build.gradle deleted file mode 100644 index c59cbb7..0000000 --- a/common/build.gradle +++ /dev/null @@ -1,82 +0,0 @@ -plugins { - id 'java-library' - id 'dev.architectury.loom' version '1.7-SNAPSHOT' apply false - id 'architectury-plugin' version '3.4-SNAPSHOT' - id 'com.github.johnrengelman.shadow' version '8.1.1' apply false -} - -java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } -} - -architectury { - minecraft = rootProject.minecraft_version -} - -subprojects { - apply plugin: 'dev.architectury.loom' - apply plugin: 'architectury-plugin' - apply plugin: 'maven-publish' - - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings "net.fabricmc:yarn:${rootProject.yarn_mappings}:v2" - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } - } - - archivesBaseName = rootProject.archives_base_name - version = rootProject.mod_version + "-" + rootProject.minecraft_version - group = rootProject.maven_group - - repositories { - maven { url = 'https://maven.architectury.dev' } - } - - tasks.withType(JavaCompile) { - options.encoding = "UTF-8" - options.release = 17 - } - - java { - withSourcesJar() - } -} - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "dev.architectury:architectury:${rootProject.architectury_version}" -} - -architectury { - common("fabric", "forge") -} - -configurations { - dev -} - -artifacts { - dev(jar) -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.archives_base_name - from components.java - } - } -} diff --git a/common/src/main/java/draylar/identity/Identity.java b/common/src/main/java/draylar/identity/Identity.java deleted file mode 100644 index 02c7d3b..0000000 --- a/common/src/main/java/draylar/identity/Identity.java +++ /dev/null @@ -1,124 +0,0 @@ -package draylar.identity; - -import dev.architectury.event.events.common.LifecycleEvent; -import dev.architectury.event.events.common.PlayerEvent; -import dev.architectury.networking.NetworkManager; -import draylar.identity.ability.AbilityRegistry; -import draylar.identity.api.*; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.network.NetworkHandler; -import draylar.identity.network.ServerNetworking; -import draylar.identity.registry.IdentityCommands; -import draylar.identity.registry.IdentityEntityTags; -import draylar.identity.registry.IdentityEventHandlers; -import io.netty.buffer.Unpooled; -import net.minecraft.advancement.Advancement; -import net.minecraft.advancement.AdvancementProgress; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.GuardianEntity; -import net.minecraft.entity.mob.WaterCreatureEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; - -public class Identity { - - public static final String MODID = "identity"; - public static final Logger LOGGER = LoggerFactory.getLogger(Identity.class); - - public void initialize() { - IdentityEntityTags.init(); - AbilityRegistry.init(); - IdentityEventHandlers.initialize(); - IdentityCommands.init(); - ServerNetworking.initialize(); - ServerNetworking.registerUseAbilityPacketHandler(); - registerJoinSyncPacket(); - IdentityTickHandlers.initialize(); - LifecycleEvent.SERVER_STARTING.register(server -> { - SafeTagManager.loadAll(server); - }); - } - - public static void registerJoinSyncPacket() { - PlayerEvent.PLAYER_JOIN.register(player -> { - // Send config sync packet - PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - packet.writeBoolean(IdentityConfig.getInstance().enableClientSwapMenu()); - packet.writeBoolean(IdentityConfig.getInstance().showPlayerNametag()); - NetworkManager.sendToPlayer(player, NetworkHandler.CONFIG_SYNC, packet); - - // Sync unlocked Identity - PlayerUnlocks.sync(player); - - // Sync favorites - PlayerFavorites.sync(player); - }); - } - - public static Identifier id(String name) { - return new Identifier("identity", name); - } - - public static boolean hasFlyingPermissions(ServerPlayerEntity player) { - boolean hasPermission = false; - LivingEntity identity = PlayerIdentity.getIdentity(player); - if(identity == null) { - return hasPermission; - } - return IdentityConfig.getInstance().enableFlight() && isAbleToFly(identity); - } - - private static boolean isAbleToFly(LivingEntity identity) { - if (identity == null) return false; - - EntityType type = identity.getType(); - Identifier id = EntityType.getId(type); - String idString = id.toString(); - - IdentityConfig config = IdentityConfig.getInstance(); - - if (config.removedFlyingEntities().contains(idString)) return false; - if (config.extraFlyingEntities().contains(idString)) return true; - - // Check both normal and custom flying tags - return type.isIn(IdentityEntityTags.FLYING) || SafeTagManager.isCustomFlying(type); - } - - - - public static boolean identity$isAquatic(LivingEntity identity) { - if (identity == null) { - return false; - } - - EntityType type = identity.getType(); - Identifier id = EntityType.getId(type); - String idString = id.toString(); - - IdentityConfig config = IdentityConfig.getInstance(); - - // REMOVE > ADD > TAG priority - if (config.removedAquaticEntities().contains(idString)) { - return false; // Player requested this mob NOT be aquatic - } - - if (config.extraAquaticEntities().contains(idString)) { - return true; // Player manually added it - } - - // Otherwise, fallback to normal tag detection - return type.isIn(IdentityEntityTags.BREATHE_UNDERWATER)|| SafeTagManager.isCustomBreatheUnderwater(type); - } - - public static int getCooldown(EntityType type) { - String id = Registries.ENTITY_TYPE.getId(type).toString(); - return IdentityConfig.getInstance().getAbilityCooldownMap().getOrDefault(id, 20); - } -} diff --git a/common/src/main/java/draylar/identity/IdentityClient.java b/common/src/main/java/draylar/identity/IdentityClient.java deleted file mode 100644 index 0758635..0000000 --- a/common/src/main/java/draylar/identity/IdentityClient.java +++ /dev/null @@ -1,59 +0,0 @@ -package draylar.identity; - -import dev.architectury.event.events.client.ClientPlayerEvent; -import dev.architectury.event.events.client.ClientTickEvent; -import dev.architectury.registry.client.keymappings.KeyMappingRegistry; -import draylar.identity.ability.AbilityOverlayRenderer; -import draylar.identity.api.ApplicablePacket; -import draylar.identity.api.model.EntityArms; -import draylar.identity.api.model.EntityUpdaters; -import draylar.identity.impl.join.ClientPlayerJoinHandler; -import draylar.identity.impl.tick.AbilityKeyPressHandler; -import draylar.identity.impl.tick.MenuKeyPressHandler; -import draylar.identity.network.ClientNetworking; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; -import org.lwjgl.glfw.GLFW; - -import java.util.HashSet; -import java.util.Set; - -public class IdentityClient { - - public static final KeyBinding MENU_KEY = - new KeyBinding( - "key.identity", - InputUtil.Type.KEYSYM, - GLFW.GLFW_KEY_GRAVE_ACCENT, - "key.categories.identity"); - - public static final KeyBinding ABILITY_KEY = - new KeyBinding( - "key.identity_ability", - InputUtil.Type.KEYSYM, - GLFW.GLFW_KEY_R, - "key.categories.identity"); - - private static final Set SYNC_PACKET_QUEUE = new HashSet<>(); - - public void initialize() { - KeyMappingRegistry.register(MENU_KEY); - KeyMappingRegistry.register(ABILITY_KEY); - - // Register client-side event handlers - EntityUpdaters.init(); - AbilityOverlayRenderer.register(); - EntityArms.init(); - - // Register event handlers - ClientTickEvent.CLIENT_PRE.register(new MenuKeyPressHandler()); - ClientTickEvent.CLIENT_PRE.register(new AbilityKeyPressHandler()); - ClientNetworking.registerPacketHandlers(); - ClientPlayerEvent.CLIENT_PLAYER_JOIN.register(new ClientPlayerJoinHandler()); - } - - // We do this because the Architectury "player log in" network event runs before MinecraftClient#player exists. - public static Set getSyncPacketQueue() { - return SYNC_PACKET_QUEUE; - } -} diff --git a/common/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java b/common/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java deleted file mode 100644 index 8089aa1..0000000 --- a/common/src/main/java/draylar/identity/ability/AbilityOverlayRenderer.java +++ /dev/null @@ -1,124 +0,0 @@ -package draylar.identity.ability; - -import com.mojang.blaze3d.systems.RenderSystem; -import dev.architectury.event.events.client.ClientGuiEvent; -import draylar.identity.api.PlayerAbilities; -import draylar.identity.api.PlayerIdentity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ChatScreen; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.util.Window; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; - -public class AbilityOverlayRenderer { - - private static final int fadingTickRequirement = 0; - private static int lastCooldown = 0; - private static int ticksSinceUpdate = 0; - private static boolean isFading = false; - private static int fadingProgress = 0; - - public static void register() { - ClientGuiEvent.RENDER_HUD.register((matrices, delta) -> { - MinecraftClient client = MinecraftClient.getInstance(); - ClientPlayerEntity player = client.player; - Window window = client.getWindow(); - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity == null) { - return; - } -//TODO make this tick less often - IdentityAbility identityAbility = AbilityRegistry.get(identity.getType()); - - if(identityAbility == null) { - return; - } - - if(client.currentScreen instanceof ChatScreen) { - return; - } - - double d = client.getWindow().getScaleFactor(); - int cd = PlayerAbilities.getCooldown(player); - float lerpedCooldown = MathHelper.lerp(delta, cd - 1, cd); - int max = AbilityRegistry.get(identity.getType()).getCooldown(identity); - float cooldownScale = 1 - cd / (float) max; - - // CD has NOT updated since last tick. It is most likely full. - if(cd == lastCooldown) { - ticksSinceUpdate++; - - // If the CD has not updated, we are above the requirement, and we are not fading, start fading. - if(ticksSinceUpdate > fadingTickRequirement && !isFading) { - isFading = true; - fadingProgress = 0; - } - } - - // CD updated in the last tick, and we are fading. Stop fading. - else if(ticksSinceUpdate > fadingProgress) { - ticksSinceUpdate = 0; - isFading = false; - } - - // Tick fading - if(isFading) { - fadingProgress = Math.min(50, fadingProgress + 1); - } else { - fadingProgress = Math.max(0, fadingProgress - 1); - } - - if(player != null) { - int start = (int) (window.getWidth() / d * .804); - int end = (int) (window.getWidth() / d * .948); - int diff = end - start; - -// DrawableHelper.fill( -// matrices, -// (int) (window.getWidth() / d * .8), -// (int) (window.getHeight() / d * .93), -// (int) (window.getWidth() / d * .95), -// (int) (window.getHeight() / d * .97), -// -1); - - int width = MinecraftClient.getInstance().getWindow().getScaledWidth(); - int height = MinecraftClient.getInstance().getWindow().getScaledHeight(); - int top = 245; - - matrices.getMatrices().push(); - if(cooldownScale != 1) { - RenderSystem.enableScissor( - (int) ((double) 0 * d), - (int) ((double) 0 * d), - (int) ((double) width * d), - (int) ((double) height * (.02 + .055 * cooldownScale) * d)); // min is 0.21, max is 0.76. dif = .55 - } - - // ending pop - if(isFading) { - float fadeScalar = fadingProgress / 50f; // 0f -> 1f, 0 is start, 1 is end - float scale = 1f + (float) Math.sin(fadeScalar * 1.5 * Math.PI) - .25f; - scale = Math.max(scale, 0); - matrices.getMatrices().scale(scale, scale, scale); - } - - // TODO: cache ability stack? -// MinecraftClient.getInstance().getItemRenderer().renderGuiItemIcon(new ItemStack(identityAbility.getIcon()), (int) (width * .95f), (int) (height * .92f)); - ItemStack stack = new ItemStack(identityAbility.getIcon()); -// BakedModel heldItemModel = MinecraftClient.getInstance().getItemRenderer().getHeldItemModel(stack, client.world, player); -// renderGuiItemModel(matrices, stack, (int) (width * .95f), (int) (height * .92f), heldItemModel); - matrices.drawItem(stack, (int) (width * .95f), (int) (height * .92f)); - - RenderSystem.disableScissor(); - matrices.getMatrices().pop(); - } - }); - } - - private AbilityOverlayRenderer() { - // NO-OP - } -} diff --git a/common/src/main/java/draylar/identity/ability/AbilityRegistry.java b/common/src/main/java/draylar/identity/ability/AbilityRegistry.java deleted file mode 100644 index 9131321..0000000 --- a/common/src/main/java/draylar/identity/ability/AbilityRegistry.java +++ /dev/null @@ -1,46 +0,0 @@ -package draylar.identity.ability; - -import draylar.identity.ability.impl.*; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; - -import java.util.HashMap; -import java.util.Map; - -public class AbilityRegistry { - - private static final Map, IdentityAbility> abilities = new HashMap<>(); - - private AbilityRegistry() { - - } - - public static void init() { - register(EntityType.BLAZE, new BlazeAbility()); - register(EntityType.CREEPER, new CreeperAbility()); - register(EntityType.ENDER_DRAGON, new EnderDragonAbility()); - register(EntityType.ENDERMAN, new EndermanAbility()); - register(EntityType.GHAST, new GhastAbility()); - register(EntityType.SNOW_GOLEM, new SnowGolemAbility()); - register(EntityType.WITHER, new WitherEntityAbility()); - register(EntityType.COW, new CowAbility()); - register(EntityType.ENDERMITE, new EndermiteAbility()); - register(EntityType.LLAMA, new LlamaAbility<>()); - register(EntityType.TRADER_LLAMA, new LlamaAbility<>()); - register(EntityType.WITCH, new WitchAbility()); - register(EntityType.EVOKER, new EvokerAbility()); - register(EntityType.WARDEN, new WardenAbility()); - } - - public static IdentityAbility get(EntityType type) { - return abilities.get(type); - } - - public static > void register(T type, IdentityAbility ability) { - abilities.put(type, ability); - } - - public static boolean has(EntityType type) { - return abilities.containsKey(type); - } -} diff --git a/common/src/main/java/draylar/identity/ability/IdentityAbility.java b/common/src/main/java/draylar/identity/ability/IdentityAbility.java deleted file mode 100644 index 364f83b..0000000 --- a/common/src/main/java/draylar/identity/ability/IdentityAbility.java +++ /dev/null @@ -1,23 +0,0 @@ -package draylar.identity.ability; - -import draylar.identity.Identity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public abstract class IdentityAbility { - - /** - * Defines the use action of this ability. Implementers can assume the ability checks, such as cool-downs, have successfully passed. - */ - public abstract void onUse(PlayerEntity player, E identity, World world); - - /** - * @return cooldown of this ability, in ticks, after it is used. - */ - public int getCooldown(E entity) { - return Identity.getCooldown(null); // workaround: or refactor later - } - - public abstract Item getIcon(); -} diff --git a/common/src/main/java/draylar/identity/ability/impl/BlazeAbility.java b/common/src/main/java/draylar/identity/ability/impl/BlazeAbility.java deleted file mode 100644 index c5a41e2..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/BlazeAbility.java +++ /dev/null @@ -1,36 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.mob.BlazeEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.SmallFireballEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.world.World; - -public class BlazeAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, BlazeEntity identity, World world) { - SmallFireballEntity smallFireball = new SmallFireballEntity( - world, - player.getX(), - player.getEyeY(), - player.getZ(), - player.getRotationVector().x, - player.getRotationVector().y, - player.getRotationVector().z - ); - - smallFireball.setOwner(player); - world.spawnEntity(smallFireball); - world.playSoundFromEntity(null, player, SoundEvents.ENTITY_BLAZE_SHOOT, SoundCategory.HOSTILE, 2.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F); - } - - @Override - public Item getIcon() { - return Items.BLAZE_POWDER; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/CowAbility.java b/common/src/main/java/draylar/identity/ability/impl/CowAbility.java deleted file mode 100644 index ba2ee90..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/CowAbility.java +++ /dev/null @@ -1,24 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.passive.CowEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.world.World; - -public class CowAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, CowEntity identity, World world) { - player.clearStatusEffects(); - world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_GENERIC_DRINK, SoundCategory.PLAYERS, 1.0F, 1.0F); - } - - @Override - public Item getIcon() { - return Items.MILK_BUCKET; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/CreeperAbility.java b/common/src/main/java/draylar/identity/ability/impl/CreeperAbility.java deleted file mode 100644 index 1e0a4c7..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/CreeperAbility.java +++ /dev/null @@ -1,22 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.mob.CreeperEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.world.World; -import net.minecraft.world.explosion.Explosion; - -public class CreeperAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, CreeperEntity identity, World world) { - world.createExplosion(player, player.getX(), player.getY(), player.getZ(), 3.0f, World.ExplosionSourceType.NONE); - } - - @Override - public Item getIcon() { - return Items.TNT; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/EnderDragonAbility.java b/common/src/main/java/draylar/identity/ability/impl/EnderDragonAbility.java deleted file mode 100644 index 8a7309c..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/EnderDragonAbility.java +++ /dev/null @@ -1,31 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.boss.dragon.EnderDragonEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.DragonFireballEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.world.World; - -public class EnderDragonAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, EnderDragonEntity identity, World world) { - DragonFireballEntity dragonFireball = new DragonFireballEntity( - world, - player, - player.getRotationVector().x, - player.getRotationVector().y, - player.getRotationVector().z - ); - - dragonFireball.setOwner(player); - world.spawnEntity(dragonFireball); - } - - @Override - public Item getIcon() { - return Items.DRAGON_BREATH; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/EndermanAbility.java b/common/src/main/java/draylar/identity/ability/impl/EndermanAbility.java deleted file mode 100644 index eee63a0..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/EndermanAbility.java +++ /dev/null @@ -1,27 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.api.platform.IdentityConfig; -import net.minecraft.entity.mob.EndermanEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.hit.HitResult; -import net.minecraft.world.World; - -public class EndermanAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, EndermanEntity identity, World world) { - HitResult lookingAt = player.raycast(IdentityConfig.getInstance().endermanAbilityTeleportDistance(), 0, true); - player.requestTeleport(lookingAt.getPos().x, lookingAt.getPos().y, lookingAt.getPos().z); - player.playSound(SoundEvents.ENTITY_ENDERMAN_TELEPORT, SoundCategory.PLAYERS, 1, 1); - } - - @Override - public Item getIcon() { - return Items.ENDER_PEARL; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/EndermiteAbility.java b/common/src/main/java/draylar/identity/ability/impl/EndermiteAbility.java deleted file mode 100644 index 1f45b68..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/EndermiteAbility.java +++ /dev/null @@ -1,47 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.mob.EndermiteEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; - -public class EndermiteAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, EndermiteEntity identity, World world) { - double x = player.getX(); - double y = player.getY(); - double z = player.getZ(); - - for(int i = 0; i < 16; ++i) { - // Pick a random location nearby to teleport to. - double g = player.getX() + (player.getRandom().nextDouble() - 0.5D) * 16.0D; - double h = MathHelper.clamp(player.getY() + (double)(player.getRandom().nextInt(16) - 8), 0.0D, world.getHeight() - 1); - double j = player.getZ() + (player.getRandom().nextDouble() - 0.5D) * 16.0D; - - // Cancel vehicle/riding mechanics. - if (player.hasVehicle()) { - player.stopRiding(); - } - - // Teleport the player and play sound FX if it succeeds. - if (player.teleport(g, h, j, true)) { - SoundEvent soundEvent = SoundEvents.ITEM_CHORUS_FRUIT_TELEPORT; - world.playSound(null, x, y, z, soundEvent, SoundCategory.PLAYERS, 1.0F, 1.0F); - player.playSound(soundEvent, 1.0F, 1.0F); - break; - } - } - } - - @Override - public Item getIcon() { - return Items.CHORUS_FRUIT; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/EvokerAbility.java b/common/src/main/java/draylar/identity/ability/impl/EvokerAbility.java deleted file mode 100644 index d2c1eeb..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/EvokerAbility.java +++ /dev/null @@ -1,68 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.block.BlockState; -import net.minecraft.entity.mob.EvokerEntity; -import net.minecraft.entity.mob.EvokerFangsEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -public class EvokerAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, EvokerEntity identity, World world) { - // Spawn 8 Evoker Fangs out from the player. - Vec3d origin = player.getPos(); - Vec3d facing = player.getRotationVector().multiply(1, 0, 1); // fangs should not go up/down based on pitch - - // Iterate out 5 blocks - for(int blockOut = 0; blockOut < 8; blockOut++) { - origin = origin.add(facing); // we add at the start -- no need to put a fang directly underneath the player! - - // Spawn an Evoker Fang at the given position. - // For each position, we go up or down at most -+1 block per iteration. - // If we cannot go up or down 1 block (or stay at the same level), the chain ends. - - // If the block underneath is solid, we are good to go. - EvokerFangsEntity fangs = new EvokerFangsEntity(world, origin.getX(), origin.getY(), origin.getZ(), player.getYaw(), blockOut * 2, player); - BlockPos underneathPosition = new BlockPos((int) origin.getX(), (int) origin.getY(), (int) origin.getZ()).down(); - BlockState underneath = world.getBlockState(underneathPosition); - if(underneath.isSideSolidFullSquare(world, underneathPosition, Direction.UP) && world.isAir(underneathPosition.up())) { - world.spawnEntity(fangs); - continue; - } - - // Check underneath (2x down) again... - BlockPos underneath2Position = new BlockPos((int) origin.getX(), (int) origin.getY(), (int) origin.getZ()).down(2); - BlockState underneath2 = world.getBlockState(underneath2Position); - if(underneath2.isSideSolidFullSquare(world, underneath2Position, Direction.UP) && world.isAir(underneath2Position.up())) { - fangs.setPos(fangs.getX(), fangs.getY() - 1, fangs.getZ()); - world.spawnEntity(fangs); - origin = origin.add(0, -1, 0); - continue; - } - - // Check above (1x up) - BlockPos upPosition = new BlockPos((int) origin.getX(), (int) origin.getY(), (int) origin.getZ()).up(); - BlockState up = world.getBlockState(underneath2Position); - if(up.isSideSolidFullSquare(world, upPosition, Direction.UP) && world.isAir(upPosition)) { - fangs.setPos(fangs.getX(), fangs.getY() + 1, fangs.getZ()); - world.spawnEntity(fangs); - origin = origin.add(0, 1, 0); - continue; - } - - break; - } - } - - @Override - public Item getIcon() { - return Items.EMERALD; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/GhastAbility.java b/common/src/main/java/draylar/identity/ability/impl/GhastAbility.java deleted file mode 100644 index 9357e7a..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/GhastAbility.java +++ /dev/null @@ -1,37 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.mob.GhastEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.FireballEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.world.World; - -public class GhastAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, GhastEntity identity, World world) { - FireballEntity fireball = new FireballEntity( - world, - player, - player.getRotationVector().x, - player.getRotationVector().y, - player.getRotationVector().z, - 2 - ); - - fireball.refreshPositionAndAngles(fireball.getX(), fireball.getY() + 1.75, fireball.getZ(), fireball.getYaw(), fireball.getPitch()); - fireball.updatePosition(fireball.getX(), fireball.getY(), fireball.getZ()); - world.spawnEntity(fireball); - world.playSoundFromEntity(null, player, SoundEvents.ENTITY_GHAST_SHOOT, SoundCategory.HOSTILE, 10.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F); - world.playSoundFromEntity(null, player, SoundEvents.ENTITY_GHAST_WARN, SoundCategory.HOSTILE, 10.0F, (world.random.nextFloat() - world.random.nextFloat()) * 0.2F + 1.0F); - } - - @Override - public Item getIcon() { - return Items.FIRE_CHARGE; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/LlamaAbility.java b/common/src/main/java/draylar/identity/ability/impl/LlamaAbility.java deleted file mode 100644 index 5d4ce8b..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/LlamaAbility.java +++ /dev/null @@ -1,35 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.LlamaEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.LlamaSpitEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -public class LlamaAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, LlamaEntity identity, World world) { - LlamaSpitEntity spit = new LlamaSpitEntity(EntityType.LLAMA_SPIT, world); - spit.setOwner(player); - Vec3d rotation = player.getRotationVector(); - spit.setVelocity(rotation.x, rotation.y, rotation.z, 1.5F, 10.0F); - spit.updateTrackedPosition(player.getX(), player.getEyeY(), player.getZ()); - spit.updatePosition(player.getX(), player.getEyeY(), player.getZ()); - - // Play SFX - world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_LLAMA_SPIT, player.getSoundCategory(), 1.0F, 1.0F + (world.random.nextFloat() - world.random.nextFloat()) * 0.2F); - - world.spawnEntity(spit); - } - - @Override - public Item getIcon() { - return Items.LEAD; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/SnowGolemAbility.java b/common/src/main/java/draylar/identity/ability/impl/SnowGolemAbility.java deleted file mode 100644 index a389e8f..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/SnowGolemAbility.java +++ /dev/null @@ -1,34 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.passive.SnowGolemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.thrown.SnowballEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.world.World; - -public class SnowGolemAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, SnowGolemEntity identity, World world) { - world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_SNOWBALL_THROW, SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); - - if (!world.isClient) { - for(int i = 0; i < 10; i++) { - SnowballEntity snowballEntity = new SnowballEntity(world, player); - snowballEntity.setItem(new ItemStack(Items.SNOWBALL)); - snowballEntity.setVelocity(player, player.getPitch() + world.random.nextInt(10) - 5, player.getYaw() + world.random.nextInt(10) - 5, 0.0F, 1.5F, 1.0F); - world.spawnEntity(snowballEntity); - } - } - } - - @Override - public Item getIcon() { - return Items.SNOWBALL; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/WardenAbility.java b/common/src/main/java/draylar/identity/ability/impl/WardenAbility.java deleted file mode 100644 index c82cd91..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/WardenAbility.java +++ /dev/null @@ -1,27 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.impl.SonicBoomUser; -import net.minecraft.entity.mob.WardenEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.world.World; - -public class WardenAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, WardenEntity identity, World world) { - ((SonicBoomUser) player).identity$ability_startSonicBoom(); - } - - @Override - public Item getIcon() { - return Items.ECHO_SHARD; - } - - @Override - public int getCooldown(WardenEntity entity) { - return 20 * 10; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/WitchAbility.java b/common/src/main/java/draylar/identity/ability/impl/WitchAbility.java deleted file mode 100644 index e9b35cc..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/WitchAbility.java +++ /dev/null @@ -1,41 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.mob.WitchEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.thrown.PotionEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -import java.util.Arrays; -import java.util.List; - -public class WitchAbility extends IdentityAbility { - - public static final List VALID_POTIONS = Arrays.asList(Potions.HARMING, Potions.POISON, Potions.SLOWNESS, Potions.WEAKNESS); - - @Override - public void onUse(PlayerEntity player, WitchEntity identity, World world) { - PotionEntity potionEntity = new PotionEntity(world, player); - potionEntity.setItem(PotionUtil.setPotion(new ItemStack(Items.SPLASH_POTION), VALID_POTIONS.get(world.random.nextInt(VALID_POTIONS.size())))); - potionEntity.setPitch(-20.0F); - Vec3d rotation = player.getRotationVector(); - potionEntity.setVelocity(rotation.getX(), rotation.getY(), rotation.getZ(), 0.75F, 8.0F); - - world.playSound((PlayerEntity)null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_WITCH_THROW, player.getSoundCategory(), 1.0F, 0.8F + world.random.nextFloat() * 0.4F); - - world.spawnEntity(potionEntity); - } - - @Override - public Item getIcon() { - return Items.POTION; - } -} diff --git a/common/src/main/java/draylar/identity/ability/impl/WitherEntityAbility.java b/common/src/main/java/draylar/identity/ability/impl/WitherEntityAbility.java deleted file mode 100644 index a3afd35..0000000 --- a/common/src/main/java/draylar/identity/ability/impl/WitherEntityAbility.java +++ /dev/null @@ -1,33 +0,0 @@ -package draylar.identity.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.boss.WitherEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.WitherSkullEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -public class WitherEntityAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, WitherEntity identity, World world) { - world.playSound(null, player.getX(), player.getY(), player.getZ(), SoundEvents.ENTITY_WITHER_SHOOT, SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); - - if (!world.isClient) { - Vec3d lookDirection = player.getRotationVector(); - WitherSkullEntity skull = new WitherSkullEntity(world, player, lookDirection.x, lookDirection.y, lookDirection.z); - skull.setPos(player.getX(), player.getY() + 2, player.getZ()); - skull.setVelocity(player, player.getPitch(), player.getYaw(), 0.0F, 1.5F, 1.0F); - world.spawnEntity(skull); - } - } - - @Override - public Item getIcon() { - return Items.WITHER_SKELETON_SKULL; - } -} diff --git a/common/src/main/java/draylar/identity/api/ApplicablePacket.java b/common/src/main/java/draylar/identity/api/ApplicablePacket.java deleted file mode 100644 index 9670679..0000000 --- a/common/src/main/java/draylar/identity/api/ApplicablePacket.java +++ /dev/null @@ -1,8 +0,0 @@ -package draylar.identity.api; - -import net.minecraft.entity.player.PlayerEntity; - -@FunctionalInterface -public interface ApplicablePacket { - void apply(PlayerEntity player); -} diff --git a/common/src/main/java/draylar/identity/api/FlightHelper.java b/common/src/main/java/draylar/identity/api/FlightHelper.java deleted file mode 100644 index ba30a3a..0000000 --- a/common/src/main/java/draylar/identity/api/FlightHelper.java +++ /dev/null @@ -1,22 +0,0 @@ -package draylar.identity.api; - -import net.minecraft.server.network.ServerPlayerEntity; - -public class FlightHelper { - - public static void grantFlightTo(ServerPlayerEntity player) { - player.getAbilities().allowFlying = true; - } - - public static boolean hasFlight(ServerPlayerEntity player) { - return player.getAbilities().allowFlying; - } - - public static void revokeFlight(ServerPlayerEntity player) { - if (!player.isCreative() && !player.isSpectator()) { - player.getAbilities().allowFlying = false; - } - player.getAbilities().flying = false; - player.sendAbilitiesUpdate(); - } -} diff --git a/common/src/main/java/draylar/identity/api/IdentityGranting.java b/common/src/main/java/draylar/identity/api/IdentityGranting.java deleted file mode 100644 index cd8dd69..0000000 --- a/common/src/main/java/draylar/identity/api/IdentityGranting.java +++ /dev/null @@ -1,66 +0,0 @@ -package draylar.identity.api; - -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.api.variant.IdentityType; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.stat.Stats; -import net.minecraft.text.Text; - -public class IdentityGranting { - - public static void grantByAttack(PlayerEntity player, IdentityType granted) { - if(player instanceof ServerPlayerEntity serverPlayerEntity) { - int amountKilled = serverPlayerEntity.getStatHandler().getStat(Stats.KILLED, granted.getEntityType()); - - // If the player has to kill a certain number of mobs before unlocking an Identity, check their statistic for the specific type. - if(IdentityConfig.getInstance().requiresKillsForIdentity()) { - String id = Registries.ENTITY_TYPE.getId(granted.getEntityType()).toString(); - - // Check against a specific count requirement or the default count. - int required = IdentityConfig.getInstance().getRequiredKillsForIdentity(); - if(IdentityConfig.getInstance().getRequiredKillsByType() != null && IdentityConfig.getInstance().getRequiredKillsByType().containsKey(id)) { - required = IdentityConfig.getInstance().getRequiredKillsByType().get(id); - } - - // If the amount currently killed is less than the required amount, do not allow the player to unlock. - if(amountKilled < required) { - return; - } - } - - boolean isNew = false; - boolean hadPreviously = PlayerUnlocks.has(serverPlayerEntity, granted); - boolean result = PlayerUnlocks.unlock(serverPlayerEntity, granted); - - // ensure type has not already been unlocked - if(result && !hadPreviously) { - - // send unlock message to player if they aren't in creative and the config option is on - if(IdentityConfig.getInstance().shouldOverlayIdentityUnlocks() && !player.isCreative()) { - player.sendMessage( - Text.translatable( - "identity.unlock_entity", - Text.translatable(granted.getEntityType().getTranslationKey()) - ), true - ); - } - - isNew = true; - } - - // force-morph player into new type - Entity instanced = granted.create(player.getWorld()); - if(instanced instanceof LivingEntity) { - if(IdentityConfig.getInstance().forceChangeNew() && isNew) { - PlayerIdentity.updateIdentity(serverPlayerEntity, granted, (LivingEntity) instanced); - } else if(IdentityConfig.getInstance().forceChangeAlways()) { - PlayerIdentity.updateIdentity(serverPlayerEntity, granted, (LivingEntity) instanced); - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/api/IdentityTickHandler.java b/common/src/main/java/draylar/identity/api/IdentityTickHandler.java deleted file mode 100644 index c348abc..0000000 --- a/common/src/main/java/draylar/identity/api/IdentityTickHandler.java +++ /dev/null @@ -1,9 +0,0 @@ -package draylar.identity.api; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; - -public interface IdentityTickHandler { - - void tick(PlayerEntity player, Z entity); -} diff --git a/common/src/main/java/draylar/identity/api/IdentityTickHandlers.java b/common/src/main/java/draylar/identity/api/IdentityTickHandlers.java deleted file mode 100644 index 609c568..0000000 --- a/common/src/main/java/draylar/identity/api/IdentityTickHandlers.java +++ /dev/null @@ -1,30 +0,0 @@ -package draylar.identity.api; - -import draylar.identity.impl.tick.identity.FrogTickHandler; -import draylar.identity.impl.tick.identity.JumpBoostTickHandler; -import draylar.identity.impl.tick.identity.WardenTickHandler; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; - -import java.util.HashMap; -import java.util.Map; - -public class IdentityTickHandlers { - - private static final Map, IdentityTickHandler> HANDLERS = new HashMap<>(); - - public static void initialize() { - register(EntityType.WARDEN, new WardenTickHandler()); - register(EntityType.FROG, new FrogTickHandler()); - register(EntityType.RABBIT, new JumpBoostTickHandler<>(1)); - register(EntityType.GOAT, new JumpBoostTickHandler<>(2)); - } - - public static void register(EntityType type, IdentityTickHandler handler) { - HANDLERS.put(type, handler); - } - - public static Map, IdentityTickHandler> getHandlers() { - return HANDLERS; - } -} diff --git a/common/src/main/java/draylar/identity/api/Implements.java b/common/src/main/java/draylar/identity/api/Implements.java deleted file mode 100644 index 71e3291..0000000 --- a/common/src/main/java/draylar/identity/api/Implements.java +++ /dev/null @@ -1,5 +0,0 @@ -package draylar.identity.api; - -public @interface Implements { - Class value(); -} diff --git a/common/src/main/java/draylar/identity/api/PlayerAbilities.java b/common/src/main/java/draylar/identity/api/PlayerAbilities.java deleted file mode 100644 index 3493429..0000000 --- a/common/src/main/java/draylar/identity/api/PlayerAbilities.java +++ /dev/null @@ -1,39 +0,0 @@ -package draylar.identity.api; - -import dev.architectury.networking.NetworkManager; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.NetworkHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; - -public class PlayerAbilities { - - /** - * Returns an integer representing the current ability cooldown of the specified {@link PlayerEntity} in ticks. - * - *

- * A return value of {@code 0} represents no cooldown, while 20 is 1 second. - * - * @param player player to retrieve ability cooldown for - * @return cooldown, in ticks, of the specified player's ability - */ - public static int getCooldown(PlayerEntity player) { - return ((PlayerDataProvider) player).getAbilityCooldown(); - } - - public static boolean canUseAbility(PlayerEntity player) { - return ((PlayerDataProvider) player).getAbilityCooldown() <= 0; - } - - public static void setCooldown(PlayerEntity player, int cooldown) { - ((PlayerDataProvider) player).setAbilityCooldown(cooldown); - } - - public static void sync(ServerPlayerEntity player) { - PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - packet.writeInt(((PlayerDataProvider) player).getAbilityCooldown()); - NetworkManager.sendToPlayer(player, NetworkHandler.ABILITY_SYNC, packet); - } -} diff --git a/common/src/main/java/draylar/identity/api/PlayerFavorites.java b/common/src/main/java/draylar/identity/api/PlayerFavorites.java deleted file mode 100644 index 1c91e02..0000000 --- a/common/src/main/java/draylar/identity/api/PlayerFavorites.java +++ /dev/null @@ -1,43 +0,0 @@ -package draylar.identity.api; - -import draylar.identity.api.variant.IdentityType; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.impl.FavoritePackets; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; - -import java.util.Set; - -public class PlayerFavorites { - - public static boolean has(PlayerEntity player, IdentityType type) { - return type.getEntityType().equals(EntityType.PLAYER) || getFavorites(player).contains(type); - } - - public static void favorite(ServerPlayerEntity player, IdentityType type) { - if(!getFavorites(player).contains(type)) { - getFavorites(player).add(type); - PlayerAbilities.sync(player); - } - - sync(player); - } - - public static void unfavorite(ServerPlayerEntity player, IdentityType type) { - if(getFavorites(player).contains(type)) { - getFavorites(player).remove(type); - PlayerAbilities.sync(player); - } - - sync(player); - } - - public static Set> getFavorites(PlayerEntity player) { - return ((PlayerDataProvider) player).getFavorites(); - } - - public static void sync(ServerPlayerEntity player) { - FavoritePackets.sendFavoriteSync(player); - } -} diff --git a/common/src/main/java/draylar/identity/api/PlayerHostility.java b/common/src/main/java/draylar/identity/api/PlayerHostility.java deleted file mode 100644 index c8086b4..0000000 --- a/common/src/main/java/draylar/identity/api/PlayerHostility.java +++ /dev/null @@ -1,27 +0,0 @@ -package draylar.identity.api; - -import draylar.identity.impl.PlayerDataProvider; -import net.minecraft.entity.player.PlayerEntity; - -public class PlayerHostility { - - /** - * Returns whether the player this component is attached to will be targeted by hostile mobs, regardless of Identity. - * - *

Hostility works on a timer, and is set when the player attacks a hostile mob. - * - * @return whether this component's player will be targeted by hostile mobs, regardless of Identity - */ - public static boolean hasHostility(PlayerEntity player) { - return ((PlayerDataProvider) player).getRemainingHostilityTime() > 0; - } - - /** - * Sets this components' hostility timer to the given time in ticks. - * - * @param hostilityTime time, in ticks, to set hostility timer to - */ - public static void set(PlayerEntity player, int hostilityTime) { - ((PlayerDataProvider) player).setRemainingHostilityTime(hostilityTime); - } -} diff --git a/common/src/main/java/draylar/identity/api/PlayerIdentity.java b/common/src/main/java/draylar/identity/api/PlayerIdentity.java deleted file mode 100644 index 021b4ff..0000000 --- a/common/src/main/java/draylar/identity/api/PlayerIdentity.java +++ /dev/null @@ -1,89 +0,0 @@ -package draylar.identity.api; - -import dev.architectury.networking.NetworkManager; -import draylar.identity.Identity; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.NetworkHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; - -import java.lang.reflect.Method; - -public class PlayerIdentity { - - /** - * Returns the identity associated with the {@link PlayerEntity} this component is attached to. - * - *

Note that this method may return null, which represents "no identity." - * - * @return the current {@link LivingEntity} identity associated with this component's player owner, or null if they have no identity equipped - */ - public static LivingEntity getIdentity(PlayerEntity player) { - return ((PlayerDataProvider) player).getIdentity(); - } - - public static IdentityType getIdentityType(PlayerEntity player) { - return ((PlayerDataProvider) player).getIdentityType(); - } - - /** - * Sets the identity of the specified player. - * - *

Setting a identity refreshes the player's dimensions/hitbox, and toggles flight capabilities depending on the entity. - * To clear this component's identity, pass null. - * - * @param entity {@link LivingEntity} new identity for this component, or null to clear - */ - public static boolean updateIdentity(ServerPlayerEntity player, IdentityType type, LivingEntity entity) { - // Protect against broken dragons from DragonMounts with null breed - if(entity==null) - return ((PlayerDataProvider) player).updateIdentity(entity); - - if (entity.getClass().getName().equals("com.github.kay9.dragonmounts.dragon.TameableDragon")) { - try { - Method getBreed = entity.getClass().getMethod("getBreed"); - Object breed = getBreed.invoke(entity); - if (breed == null) { - player.sendMessage(Text.literal("This dragon identity is broken (no breed). Identity not applied."), false); - return false; - } - } catch (Throwable t) { - Identity.LOGGER.warn("[Identity] Failed to validate DragonMounts dragon breed", t); - return false; - } - } - - // Proceed as usual - return ((PlayerDataProvider) player).updateIdentity(entity); - } - - - - public static void sync(ServerPlayerEntity player) { - sync(player, player); - } - - public static void sync(ServerPlayerEntity changed, ServerPlayerEntity packetTarget) { - PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - NbtCompound entityTag = new NbtCompound(); - - // serialize current identity data to tag if it exists - LivingEntity identity = getIdentity(changed); - if(identity != null) { - identity.writeNbt(entityTag); - } - - // put entity type ID under the key "id", or "minecraft:empty" if no identity is equipped (or the identity entity type is invalid) - packet.writeUuid(changed.getUuid()); - packet.writeString(identity == null ? "minecraft:empty" : Registries.ENTITY_TYPE.getId(identity.getType()).toString()); - packet.writeNbt(entityTag); - NetworkManager.sendToPlayer(packetTarget, NetworkHandler.IDENTITY_SYNC, packet); - } -} diff --git a/common/src/main/java/draylar/identity/api/PlayerUnlocks.java b/common/src/main/java/draylar/identity/api/PlayerUnlocks.java deleted file mode 100644 index 41f33a4..0000000 --- a/common/src/main/java/draylar/identity/api/PlayerUnlocks.java +++ /dev/null @@ -1,46 +0,0 @@ -package draylar.identity.api; - -import dev.architectury.event.EventResult; -import draylar.identity.api.event.UnlockIdentityCallback; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.impl.UnlockPackets; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.ActionResult; - -public class PlayerUnlocks { - - public static boolean unlock(ServerPlayerEntity player, IdentityType granted) { - PlayerDataProvider provider = (PlayerDataProvider) player; - EventResult unlock = UnlockIdentityCallback.EVENT.invoker().unlock(player, granted); - - if(unlock.asMinecraft() != ActionResult.FAIL && !provider.getUnlocked().contains(granted)) { - provider.getUnlocked().add(granted); - sync(player); - PlayerAbilities.sync(player); // TODO: ??? - return true; - } else { - return false; - } - } - - public static boolean has(PlayerEntity player, IdentityType type) { - return type.getEntityType().equals(EntityType.PLAYER) || (((PlayerDataProvider) player)).getUnlocked().contains(type); - } - - public static void revoke(ServerPlayerEntity player, IdentityType type) { - PlayerDataProvider provider = (PlayerDataProvider) player; - - if(provider.getUnlocked().contains(type)) { - provider.getUnlocked().remove(type); - sync(player); - PlayerAbilities.sync(player); // TODO: ??? - } - } - - public static void sync(ServerPlayerEntity player) { - UnlockPackets.sendSyncPacket(player); - } -} diff --git a/common/src/main/java/draylar/identity/api/SafeTagManager.java b/common/src/main/java/draylar/identity/api/SafeTagManager.java deleted file mode 100644 index f7f0996..0000000 --- a/common/src/main/java/draylar/identity/api/SafeTagManager.java +++ /dev/null @@ -1,123 +0,0 @@ -package draylar.identity.api; - -import draylar.identity.registry.IdentityEntityTags; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.server.MinecraftServer; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.tag.TagKey; -import net.minecraft.entity.EntityType; -import net.minecraft.util.Identifier; -import net.minecraft.registry.entry.RegistryEntryList; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -public class SafeTagManager { - - private static final Set CUSTOM_FLYING_ENTITIES = new HashSet<>(); - private static final Set CUSTOM_BREATHE_UNDERWATER_ENTITIES = new HashSet<>(); - private static final Set CUSTOM_FIRE_IMMUNE_ENTITIES = new HashSet<>(); - private static final Set CUSTOM_SLOW_FALLING = new HashSet<>(); - private static final Set CUSTOM_BURNS_IN_DAYLIGHT = new HashSet<>(); - private static final Set CUSTOM_CANT_SWIM = new HashSet<>(); - private static final Set CUSTOM_HURT_BY_HEAT = new HashSet<>(); - private static final Set CUSTOM_LAVA_WALKING = new HashSet<>(); - private static final Set CUSTOM_PIGLIN_FRIENDLY = new HashSet<>(); - private static final Set CUSTOM_RAVAGER_RIDING = new HashSet<>(); - private static final Set CUSTOM_UNDROWNABLE = new HashSet<>(); - private static final Set CUSTOM_WOLF_PREY = new HashSet<>(); - private static final Set CUSTOM_FOX_PREY = new HashSet<>(); - - - public static void loadAll(MinecraftServer server) { - var entityTypeRegistry = server.getRegistryManager().get(RegistryKeys.ENTITY_TYPE); - - // Load all custom sets - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_FLYING), CUSTOM_FLYING_ENTITIES, "custom_flying"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_BREATHE_UNDERWATER), CUSTOM_BREATHE_UNDERWATER_ENTITIES, "custom_breathe_underwater"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_FIRE_IMMUNE), CUSTOM_FIRE_IMMUNE_ENTITIES, "custom_fire_immune"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_SLOW_FALLING), CUSTOM_SLOW_FALLING, "custom_slow_falling"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_BURNS_IN_DAYLIGHT), CUSTOM_BURNS_IN_DAYLIGHT, "custom_burns_in_daylight"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_CANT_SWIM), CUSTOM_CANT_SWIM, "custom_cant_swim"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_HURT_BY_HEAT), CUSTOM_HURT_BY_HEAT, "custom_hurt_by_high_temperature"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_LAVA_WALKING), CUSTOM_LAVA_WALKING, "custom_lava_walking"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_PIGLIN_FRIENDLY), CUSTOM_PIGLIN_FRIENDLY, "custom_piglin_friendly"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_RAVAGER_RIDING), CUSTOM_RAVAGER_RIDING, "custom_ravager_riding"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_UNDROWNABLE), CUSTOM_UNDROWNABLE, "custom_undrownable"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_WOLF_PREY), CUSTOM_WOLF_PREY, "custom_wolf_prey"); - loadTagSafely(entityTypeRegistry.getEntryList(IdentityEntityTags.CUSTOM_FOX_PREY), CUSTOM_FOX_PREY, "custom_fox_prey"); - - } - - private static void loadTagSafely(Optional>> tagListOpt, Set targetSet, String tagName) { - targetSet.clear(); - - if (tagListOpt.isPresent()) { - for (RegistryEntry> entry : tagListOpt.get()) { - Identifier id = EntityType.getId(entry.value()); - if (id != null) { - targetSet.add(id); - } else { - System.out.println("[Identity] Skipping missing entity in " + tagName); - } - } - System.out.println("[Identity] Loaded " + targetSet.size() + " entries into " + tagName); - } else { - System.out.println("[Identity] Warning: Tag not found: " + tagName); - } - } - - // --- API for checking if an entity matches --- - - public static boolean isCustomFlying(EntityType type) { - return CUSTOM_FLYING_ENTITIES.contains(EntityType.getId(type)); - } - - public static boolean isCustomBreatheUnderwater(EntityType type) { - return CUSTOM_BREATHE_UNDERWATER_ENTITIES.contains(EntityType.getId(type)); - } - - public static boolean isCustomFireImmune(EntityType type) { - return CUSTOM_FIRE_IMMUNE_ENTITIES.contains(EntityType.getId(type)); - } - public static boolean isCustomSlowFalling(EntityType type) { - return CUSTOM_SLOW_FALLING.contains(EntityType.getId(type)); - } - - public static boolean isCustomBurnsInDaylight(EntityType type) { - return CUSTOM_BURNS_IN_DAYLIGHT.contains(EntityType.getId(type)); - } - - public static boolean isCustomCantSwim(EntityType type) { - return CUSTOM_CANT_SWIM.contains(EntityType.getId(type)); - } - - public static boolean isCustomHurtByHeat(EntityType type) { - return CUSTOM_HURT_BY_HEAT.contains(EntityType.getId(type)); - } - - public static boolean isCustomLavaWalking(EntityType type) { - return CUSTOM_LAVA_WALKING.contains(EntityType.getId(type)); - } - - public static boolean isCustomPiglinFriendly(EntityType type) { - return CUSTOM_PIGLIN_FRIENDLY.contains(EntityType.getId(type)); - } - - public static boolean isCustomRavagerRiding(EntityType type) { - return CUSTOM_RAVAGER_RIDING.contains(EntityType.getId(type)); - } - - public static boolean isCustomUndrownable(EntityType type) { - return CUSTOM_UNDROWNABLE.contains(EntityType.getId(type)); - } - - public static boolean isCustomWolfPrey(EntityType type) { - return CUSTOM_WOLF_PREY.contains(EntityType.getId(type)); - } - - public static boolean isCustomFoxPrey(EntityType type) { - return CUSTOM_FOX_PREY.contains(EntityType.getId(type)); - } - -} diff --git a/common/src/main/java/draylar/identity/api/event/IdentitySwapCallback.java b/common/src/main/java/draylar/identity/api/event/IdentitySwapCallback.java deleted file mode 100644 index 2a25320..0000000 --- a/common/src/main/java/draylar/identity/api/event/IdentitySwapCallback.java +++ /dev/null @@ -1,14 +0,0 @@ -package draylar.identity.api.event; - -import dev.architectury.event.Event; -import dev.architectury.event.EventFactory; -import dev.architectury.event.EventResult; -import net.minecraft.entity.LivingEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.Nullable; - -public interface IdentitySwapCallback { - Event EVENT = EventFactory.createEventResult(IdentitySwapCallback.class); - - EventResult swap(ServerPlayerEntity player, @Nullable LivingEntity to); -} diff --git a/common/src/main/java/draylar/identity/api/event/PlayerJoinCallback.java b/common/src/main/java/draylar/identity/api/event/PlayerJoinCallback.java deleted file mode 100644 index b060831..0000000 --- a/common/src/main/java/draylar/identity/api/event/PlayerJoinCallback.java +++ /dev/null @@ -1,15 +0,0 @@ -package draylar.identity.api.event; - -import dev.architectury.event.Event; -import dev.architectury.event.EventFactory; -import net.minecraft.server.network.ServerPlayerEntity; - -/** - * This event is called when a player joins the server. - */ -public interface PlayerJoinCallback { - Event EVENT = EventFactory.createLoop(PlayerJoinCallback.class); - - void onPlayerJoin(ServerPlayerEntity player); -} - diff --git a/common/src/main/java/draylar/identity/api/event/UnlockIdentityCallback.java b/common/src/main/java/draylar/identity/api/event/UnlockIdentityCallback.java deleted file mode 100644 index 45afcf8..0000000 --- a/common/src/main/java/draylar/identity/api/event/UnlockIdentityCallback.java +++ /dev/null @@ -1,15 +0,0 @@ -package draylar.identity.api.event; - -import dev.architectury.event.Event; -import dev.architectury.event.EventFactory; -import dev.architectury.event.EventResult; -import draylar.identity.api.variant.IdentityType; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Identifier; - -public interface UnlockIdentityCallback { - Event EVENT = EventFactory.createEventResult(UnlockIdentityCallback.class); - - EventResult unlock(ServerPlayerEntity player, IdentityType type); -} diff --git a/common/src/main/java/draylar/identity/api/model/ArmRenderingManipulator.java b/common/src/main/java/draylar/identity/api/model/ArmRenderingManipulator.java deleted file mode 100644 index 7ba510d..0000000 --- a/common/src/main/java/draylar/identity/api/model/ArmRenderingManipulator.java +++ /dev/null @@ -1,7 +0,0 @@ -package draylar.identity.api.model; - -import net.minecraft.client.util.math.MatrixStack; - -public interface ArmRenderingManipulator { - void run(MatrixStack stack, T model); -} diff --git a/common/src/main/java/draylar/identity/api/model/ClassArmProvider.java b/common/src/main/java/draylar/identity/api/model/ClassArmProvider.java deleted file mode 100644 index 87b8cae..0000000 --- a/common/src/main/java/draylar/identity/api/model/ClassArmProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -package draylar.identity.api.model; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.model.ModelPart; -import net.minecraft.entity.LivingEntity; - -@Environment(EnvType.CLIENT) -public interface ClassArmProvider { - ModelPart getArm(LivingEntity entity, T model); -} diff --git a/common/src/main/java/draylar/identity/api/model/EntityArmProvider.java b/common/src/main/java/draylar/identity/api/model/EntityArmProvider.java deleted file mode 100644 index 15f337d..0000000 --- a/common/src/main/java/draylar/identity/api/model/EntityArmProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.api.model; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.entity.LivingEntity; - -@Environment(EnvType.CLIENT) -public interface EntityArmProvider { - ModelPart getArm(T entity, EntityModel model); -} diff --git a/common/src/main/java/draylar/identity/api/model/EntityArms.java b/common/src/main/java/draylar/identity/api/model/EntityArms.java deleted file mode 100644 index 31c5097..0000000 --- a/common/src/main/java/draylar/identity/api/model/EntityArms.java +++ /dev/null @@ -1,112 +0,0 @@ -package draylar.identity.api.model; - -import draylar.identity.mixin.accessor.*; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.*; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Pair; -import net.minecraft.util.math.RotationAxis; -import org.jetbrains.annotations.Nullable; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Optional; - -@Environment(EnvType.CLIENT) -public class EntityArms { - - private static final Map, Pair, ArmRenderingManipulator>> DIRECT_PROVIDERS = new LinkedHashMap<>(); - private static final Map, Pair, ArmRenderingManipulator>> CLASS_PROVIDERS = new LinkedHashMap<>(); - - public static void register(EntityType type, EntityArmProvider provider, ArmRenderingManipulator> manipulator) { - DIRECT_PROVIDERS.put(type, new Pair<>(provider, manipulator)); - } - - public static void register(Class modelClass, ClassArmProvider provider, ArmRenderingManipulator manipulator) { - CLASS_PROVIDERS.put(modelClass, new Pair<>(provider, manipulator)); - } - - @Nullable - @SuppressWarnings("unchecked") - public static Pair> get(T entity, EntityModel model) { - // done to bypass type issues - Pair, ArmRenderingManipulator> before = DIRECT_PROVIDERS.get(entity.getType()); - - // Direct entity type provider was found, return it now - if(before != null) { - Pair, ArmRenderingManipulator> provider = new Pair<>((EntityArmProvider) before.getLeft(), before.getRight()); - return new Pair<>(provider.getLeft().getArm(entity, model), provider.getRight()); - } else { - Optional, ArmRenderingManipulator>> beforeClassProvider = CLASS_PROVIDERS.entrySet().stream().filter(pair -> { - return pair.getKey().isInstance(model); - }).findFirst().map(entry -> new Pair<>(entry.getValue().getLeft(), entry.getValue().getRight())); - - // fall back to class providers - if(beforeClassProvider.isPresent()) { - Pair, ArmRenderingManipulator>> classProvider = new Pair<>((ClassArmProvider) beforeClassProvider.get().getLeft(), (ArmRenderingManipulator>) beforeClassProvider.get().getRight()); - return new Pair<>(classProvider.getLeft().getArm(entity, model), classProvider.getRight()); - } else { - return null; - } - } - } - - @Nullable - @SuppressWarnings("unchecked") - public static EntityArmProvider get(EntityType type) { - return (EntityArmProvider) DIRECT_PROVIDERS.get(type); - } - - @Nullable - @SuppressWarnings("unchecked") - public static EntityArmProvider get(Class> modelClass) { - return (EntityArmProvider) CLASS_PROVIDERS.get(modelClass); - } - - public static void init() { - // specific - register(LlamaEntityModel.class, (llama, model) -> ((LlamaEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> {}); - register(PandaEntityModel.class, (llama, model) -> ((QuadrupedEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> stack.translate(0, -0.5, 0)); - register(BlazeEntityModel.class, (llama, model) -> ((BlazeEntityModelAccessor) model).getRods()[10], (stack, model) -> { - stack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees(45)); - stack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-15)); - stack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-25)); - stack.translate(0, 0, -.25); - }); - register(OcelotEntityModel.class, (ocelot, model) -> ((OcelotEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> {}); - register(SpiderEntityModel.class, (spider, model) -> ((SpiderEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> { - stack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-15)); - stack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(15)); - stack.translate(0, 0, 0); - }); - register(IronGolemEntityModel.class, (golem, model) -> model.getRightArm(), (stack, model) -> { - stack.translate(0, 0, -.5); - }); - register(PigEntityModel.class, (pig, model) -> ((QuadrupedEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> { - stack.translate(0, 0, .6); - }); - register(PolarBearEntityModel.class, (bear, model) -> ((QuadrupedEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> { - stack.translate(0, 0, .3); - }); - register(RavagerEntityModel.class, (bear, model) -> ((RavagerEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> { }); - register(SquidEntityModel.class, (squid, model) -> ((SquidEntityModelAccessor) model).getTentacles()[0], (stack, model) -> { - - }); - - // generic - register(QuadrupedEntityModel.class, (quad, model) -> ((QuadrupedEntityModelAccessor) model).getRightFrontLeg(), (stack, model) -> {}); - - // types - register(EntityType.PILLAGER, (pillager, model) -> ((IllagerEntityModelAccessor) model).getRightArm(), (stack, model) -> { - stack.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-10)); - stack.translate(0, .5, -.3); - }); - } - - private EntityArms() { - // NO-OP - } -} diff --git a/common/src/main/java/draylar/identity/api/model/EntityUpdater.java b/common/src/main/java/draylar/identity/api/model/EntityUpdater.java deleted file mode 100644 index f6abf78..0000000 --- a/common/src/main/java/draylar/identity/api/model/EntityUpdater.java +++ /dev/null @@ -1,25 +0,0 @@ -package draylar.identity.api.model; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; - -/** - * Implementers should use the provided {@link PlayerEntity} instance to update the provided {@link Entity}'s properties. - * - *

{@link EntityUpdater} instances can be registered and retrieved through {@link EntityUpdaters}. - * - * @param - */ -@FunctionalInterface -public interface EntityUpdater { - - /** - * Updates the given {@link Entity} using properties from the given {@link PlayerEntity}. - * - *

Called once every render update on the client. - * - * @param from {@link PlayerEntity} to copy properties from - * @param to {@link Entity} to copy properties to - */ - void update(PlayerEntity from, Entity to); -} \ No newline at end of file diff --git a/common/src/main/java/draylar/identity/api/model/EntityUpdaters.java b/common/src/main/java/draylar/identity/api/model/EntityUpdaters.java deleted file mode 100644 index e98776c..0000000 --- a/common/src/main/java/draylar/identity/api/model/EntityUpdaters.java +++ /dev/null @@ -1,129 +0,0 @@ -package draylar.identity.api.model; - -import draylar.identity.impl.NearbySongAccessor; -import draylar.identity.mixin.accessor.CreeperEntityAccessor; -import draylar.identity.mixin.accessor.ParrotEntityAccessor; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; - -import java.util.HashMap; -import java.util.Map; - -/** - * Registry class for {@link EntityUpdater} instances. - * - *

{@link EntityUpdater}s are used to apply changes to identity entity instances on the client using information from the player. - * As an example, an {@link EntityUpdater} can be used to tell a identity bat to "stop roosting," which triggers the flight animation. - * {@link EntityUpdater}s are called once every render tick {@link net.minecraft.client.render.entity.EntityRenderer#render(Entity, float, float, MatrixStack, VertexConsumerProvider, int)}. - */ -@Environment(EnvType.CLIENT) -public class EntityUpdaters { - - private static final Map, EntityUpdater> map = new HashMap<>(); - - /** - * Returns a {@link EntityUpdater} if one has been registered for the given {@link EntityType}, or null. - * - * @param entityType entity type key to retrieve a value registered in {@link EntityUpdaters#register(EntityType, EntityUpdater)} - * @param passed in {@link EntityType} generic - * @return registered {@link EntityUpdater} instance for the given {@link EntityType}, or null if one does not exist - */ - public static EntityUpdater getUpdater(EntityType entityType) { - return (EntityUpdater) map.getOrDefault(entityType, null); - } - - /** - * Registers an {@link EntityUpdater} for the given {@link EntityType}. - * - *

Note that a given {@link EntityType} can only have 1 {@link EntityUpdater} associated with it. - * - * @param type entity type key associated with the given {@link EntityUpdater} - * @param entityUpdater {@link EntityUpdater} associated with the given {@link EntityType} - * @param passed in {@link EntityType} generic - */ - public static void register(EntityType type, EntityUpdater entityUpdater) { - map.put(type, entityUpdater); - } - - private EntityUpdaters() { - // NO-OP - } - - public static void init() { - // register specific entity animation handling - EntityUpdaters.register(EntityType.BAT, (player, bat) -> { - if (player.isOnGround()) { - bat.setRoosting(true); - } else { - bat.setRoosting(false); - } - }); - - EntityUpdaters.register(EntityType.PARROT, (player, parrot) -> { - if (player.isOnGround() && ((NearbySongAccessor) player).identity_isNearbySongPlaying()) { - parrot.setNearbySongPlaying(player.getBlockPos(), true); - parrot.setSitting(true); - parrot.setOnGround(true); - } else if (player.isOnGround()) { - parrot.setNearbySongPlaying(player.getBlockPos(), false); - parrot.setSitting(true); - parrot.setOnGround(true); - parrot.prevFlapProgress = 0; - parrot.flapProgress = 0; - parrot.maxWingDeviation = 0; - parrot.prevMaxWingDeviation = 0; - } else { - parrot.setNearbySongPlaying(player.getBlockPos(), false); - parrot.setSitting(false); - parrot.setOnGround(false); - parrot.setInSittingPose(false); - ((ParrotEntityAccessor) parrot).callFlapWings(); - } - }); - - - - EntityUpdaters.register(EntityType.ENDER_DRAGON, (player, dragon) -> { - dragon.wingPosition += 0.01F; - dragon.prevWingPosition = dragon.wingPosition; - - // setting yaw without +180 making tail faces front, for some reason - if (dragon.latestSegment < 0) { - for (int l = 0; l < dragon.segmentCircularBuffer.length; ++l) { - dragon.segmentCircularBuffer[l][0] = (double) player.getYaw() + 180; - dragon.segmentCircularBuffer[l][1] = player.getY(); - } - } - - if (++(dragon).latestSegment == (dragon).segmentCircularBuffer.length) { - (dragon).latestSegment = 0; - } - - dragon.segmentCircularBuffer[dragon.latestSegment][0] = (double) player.getYaw() + 180; - dragon.segmentCircularBuffer[dragon.latestSegment][1] = player.getY(); - }); - - EntityUpdaters.register(EntityType.ENDERMAN, (player, enderman) -> { - ItemStack heldStack = player.getMainHandStack(); - - if (heldStack.getItem() instanceof BlockItem) { - enderman.setCarriedBlock(((BlockItem) heldStack.getItem()).getBlock().getDefaultState()); - } - }); - - // To prevent Creeper Identities from flickering white, we reset currentFuseTime to 0. - // Creepers normally tick their fuse timer in tick(), but: - // 1. Identities do not tick - // 2. The Creeper ability is instant, so we do not need to re-implement ticking - EntityUpdaters.register(EntityType.CREEPER, (player, creeper) -> { - ((CreeperEntityAccessor) creeper).setCurrentFuseTime(0); - }); - } -} diff --git a/common/src/main/java/draylar/identity/api/platform/ConfigReloader.java b/common/src/main/java/draylar/identity/api/platform/ConfigReloader.java deleted file mode 100644 index dd74d5c..0000000 --- a/common/src/main/java/draylar/identity/api/platform/ConfigReloader.java +++ /dev/null @@ -1,5 +0,0 @@ -package draylar.identity.api.platform; - -public interface ConfigReloader { - void reloadConfig(); -} diff --git a/common/src/main/java/draylar/identity/api/platform/IdentityConfig.java b/common/src/main/java/draylar/identity/api/platform/IdentityConfig.java deleted file mode 100644 index 4b594d4..0000000 --- a/common/src/main/java/draylar/identity/api/platform/IdentityConfig.java +++ /dev/null @@ -1,107 +0,0 @@ -package draylar.identity.api.platform; - -import dev.architectury.injectables.annotations.ExpectPlatform; - -import java.util.List; -import java.util.Map; - -public abstract class IdentityConfig { - - @ExpectPlatform - public static IdentityConfig getInstance() { - throw new AssertionError(); - } - - public abstract int getConfigVersion(); - - public abstract boolean enableFlight(); - - public abstract List advancementsRequiredForFlight(); - - public abstract Map getAbilityCooldownMap(); - - public abstract boolean requiresKillsForIdentity(); - - public abstract int getRequiredKillsForIdentity(); - - public abstract Map getRequiredKillsByType(); - - public abstract boolean shouldOverlayIdentityUnlocks(); - - public abstract boolean forceChangeNew(); - - public abstract boolean forceChangeAlways(); - - public abstract boolean logCommands(); - - public abstract boolean enableClientSwapMenu(); - - public abstract boolean wolvesAttackIdentityPrey(); - - public abstract boolean ownedWolvesAttackIdentityPrey(); - - public abstract boolean villagersRunFromIdentities(); - - public abstract boolean revokeIdentityOnDeath(); - - public abstract boolean overlayIdentityRevokes(); - - public abstract float flySpeed(); - - public abstract boolean scalingHealth(); - - public abstract int maxHealth(); - - public abstract boolean identitiesEquipItems(); - - public abstract boolean identitiesEquipArmor(); - - public abstract boolean showPlayerNametag(); - - public abstract boolean shouldRenderOwnNameTag(); - - public abstract boolean foxesAttackIdentityPrey(); - - public abstract boolean hostilesForgetNewHostileIdentityPlayer(); - - public abstract boolean hostilesIgnoreHostileIdentityPlayer(); - - public abstract boolean playAmbientSounds(); - - public abstract boolean useIdentitySounds(); - - public abstract boolean hearSelfAmbient(); - - public abstract double endermanAbilityTeleportDistance(); - - public abstract boolean enableSwaps(); - - /** - * Sets whether all players may swap identities regardless of the whitelist. - * When set to {@code false}, only operators or whitelisted players may swap. - */ - public abstract void setEnableSwaps(boolean enabled); - - /** - * Players listed here may swap identities even when {@link #enableSwaps()} is false. - * Names are compared case-insensitively. - */ - public abstract List allowedSwappers(); - - public abstract int hostilityTime(); - - public abstract boolean wardenIsBlinded(); - - public abstract boolean wardenBlindsNearby(); - - public abstract String getForcedIdentity(); - // Allow players to add entities to aquatic detection manually - public abstract List extraAquaticEntities(); - - public abstract List removedAquaticEntities(); - - public abstract List extraFlyingEntities(); - - public abstract List removedFlyingEntities(); - -} diff --git a/common/src/main/java/draylar/identity/api/platform/IdentityPlatform.java b/common/src/main/java/draylar/identity/api/platform/IdentityPlatform.java deleted file mode 100644 index 93c2283..0000000 --- a/common/src/main/java/draylar/identity/api/platform/IdentityPlatform.java +++ /dev/null @@ -1,22 +0,0 @@ -package draylar.identity.api.platform; - -public class IdentityPlatform { - private static IdentityConfig current; - private static ConfigReloader configReloader; - - public static IdentityConfig getConfig() { - return current; - } - - public static void setConfig(IdentityConfig config) { - current = config; - } - - public static ConfigReloader getReloader() { - return configReloader; - } - - public static void setReloader(ConfigReloader reloader) { - configReloader = reloader; - } -} diff --git a/common/src/main/java/draylar/identity/api/variant/IdentityType.java b/common/src/main/java/draylar/identity/api/variant/IdentityType.java deleted file mode 100644 index 36aaccb..0000000 --- a/common/src/main/java/draylar/identity/api/variant/IdentityType.java +++ /dev/null @@ -1,179 +0,0 @@ -package draylar.identity.api.variant; - -import draylar.identity.impl.variant.*; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -public class IdentityType { - - private static final List> LIVING_TYPE_CASH = new ArrayList<>(); - private static final Map, TypeProvider> VARIANT_BY_TYPE = new LinkedHashMap<>(); - private final EntityType type; - private final int variantData; - - static { - VARIANT_BY_TYPE.put(EntityType.SHEEP, new SheepTypeProvider()); - VARIANT_BY_TYPE.put(EntityType.AXOLOTL, new AxolotlTypeProvider()); - VARIANT_BY_TYPE.put(EntityType.PARROT, new ParrotTypeProvider()); - VARIANT_BY_TYPE.put(EntityType.FOX, new FoxTypeProvider()); - VARIANT_BY_TYPE.put(EntityType.CAT, new CatTypeProvider()); - VARIANT_BY_TYPE.put(EntityType.SLIME, new SlimeTypeProvider()); - VARIANT_BY_TYPE.put(EntityType.FROG, new FrogTypeProvider()); - } - - public IdentityType(EntityType type) { - this.type = type; - variantData = getDefaultVariantData(type); - } - - private int getDefaultVariantData(EntityType type) { - if(VARIANT_BY_TYPE.containsKey(type)) { - return VARIANT_BY_TYPE.get(type).getFallbackData(); - } else { - return -1; - } - } - - public IdentityType(EntityType type, int variantData) { - this.type = type; - this.variantData = variantData; - } - - public IdentityType(T entity) { - this.type = (EntityType) entity.getType(); - - // Discover variant data based on entity NBT data. - @Nullable TypeProvider provider = (TypeProvider) VARIANT_BY_TYPE.get(type); - if(provider != null) { - variantData = provider.getVariantData(entity); - } else { - variantData = getDefaultVariantData(type); - } - } - - @Nullable - public static IdentityType from(Z entity) { - if(entity == null) { - return null; - } - - EntityType type = (EntityType) entity.getType(); - if(VARIANT_BY_TYPE.containsKey(type)) { - TypeProvider typeProvider = (TypeProvider) VARIANT_BY_TYPE.get(type); - return typeProvider.create(type, entity); - } - - return new IdentityType<>((EntityType) entity.getType()); - } - - @Nullable - public static IdentityType from(NbtCompound compound) { - Identifier id = new Identifier(compound.getString("EntityID")); - if(!Registries.ENTITY_TYPE.containsId(id)) { - return null; - } - - return new IdentityType(Registries.ENTITY_TYPE.get(id), compound.contains("Variant") ? compound.getInt("Variant") : -1); - } - - public static List> getAllTypes(World world) { - if(LIVING_TYPE_CASH.isEmpty()) { - for (EntityType type : Registries.ENTITY_TYPE) { - Entity instance = type.create(world); - if(instance instanceof LivingEntity) { - LIVING_TYPE_CASH.add((EntityType) type); - } - } - } - - List> types = new ArrayList<>(); - for (EntityType type : LIVING_TYPE_CASH) { - if(VARIANT_BY_TYPE.containsKey(type)) { - TypeProvider variant = VARIANT_BY_TYPE.get(type); - for (int i = 0; i <= variant.getRange(); i++) { - types.add(new IdentityType(type, i)); - } - } else { - types.add(new IdentityType(type)); - } - } - - return types; - } - - @Nullable - public static IdentityType from(EntityType entityType, int variant) { - if(VARIANT_BY_TYPE.containsKey(entityType)) { - TypeProvider provider = VARIANT_BY_TYPE.get(entityType); - if(variant < -1 || variant > provider.getRange()) { - return null; - } - } - - return new IdentityType<>((EntityType) entityType, variant); - } - - public NbtCompound writeCompound() { - NbtCompound compound = new NbtCompound(); - compound.putString("EntityID", Registries.ENTITY_TYPE.getId(type).toString()); - compound.putInt("Variant", variantData); - return compound; - } - - public EntityType getEntityType() { - return type; - } - - public T create(World world) { - TypeProvider typeProvider = (TypeProvider) VARIANT_BY_TYPE.get(type); - if(typeProvider != null) { - return typeProvider.create(type, world, variantData); - } - - return type.create(world); - } - - public int getVariantData() { - return variantData; - } - - @Override - public boolean equals(Object o) { - if(this == o) return true; - if(o == null || getClass() != o.getClass()) return false; - IdentityType that = (IdentityType) o; - return variantData == that.variantData && type.equals(that.type); - } - - @Override - public int hashCode() { - return Objects.hash(type, variantData); - } - - public void writeEntityNbt(NbtCompound tag) { - NbtCompound inner = writeCompound(); - tag.put("IdentityType", inner); - } - - public static IdentityType fromEntityNbt(NbtCompound tag) { - return from(tag.getCompound("IdentityType")); - } - - public Text createTooltipText(T entity) { - TypeProvider provider = (TypeProvider) VARIANT_BY_TYPE.get(type); - if(provider != null) { - return provider.modifyText(entity, Text.translatable(type.getTranslationKey())); - } - - return Text.translatable(type.getTranslationKey()); - } -} diff --git a/common/src/main/java/draylar/identity/api/variant/TypeProvider.java b/common/src/main/java/draylar/identity/api/variant/TypeProvider.java deleted file mode 100644 index a73e233..0000000 --- a/common/src/main/java/draylar/identity/api/variant/TypeProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package draylar.identity.api.variant; - -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -import java.util.Locale; - -public abstract class TypeProvider { - - public IdentityType create(EntityType type, T entity) { - return new IdentityType((EntityType) entity.getType(), getVariantData(entity)); - } - - public abstract int getVariantData(T entity); - - public abstract T create(EntityType type, World world, int data); - - public abstract int getFallbackData(); - - public abstract int getRange(); - - public abstract Text modifyText(T entity, MutableText text); - - public final String formatTypePrefix(String prefix) { - return String.valueOf(prefix.charAt(0)).toUpperCase(Locale.ROOT) + prefix.substring(1); - } -} diff --git a/common/src/main/java/draylar/identity/command/IdentityCommand.java b/common/src/main/java/draylar/identity/command/IdentityCommand.java deleted file mode 100644 index 019905d..0000000 --- a/common/src/main/java/draylar/identity/command/IdentityCommand.java +++ /dev/null @@ -1,389 +0,0 @@ -package draylar.identity.command; - -import com.mojang.brigadier.arguments.IntegerArgumentType; -import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.tree.LiteralCommandNode; -import dev.architectury.event.events.common.CommandRegistrationEvent; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.PlayerUnlocks; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.screen.widget.EntityWidget; -import net.minecraft.command.argument.EntityArgumentType; -import net.minecraft.command.argument.NbtCompoundArgumentType; -import net.minecraft.command.argument.RegistryEntryArgumentType; -import net.minecraft.command.suggestion.SuggestionProviders; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.server.command.CommandManager; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.Nullable; - -public class IdentityCommand { - - public static void register() { - CommandRegistrationEvent.EVENT.register((dispatcher, registryAccess, b) -> { - LiteralCommandNode rootNode = CommandManager - .literal("identity") - .requires(source -> source.hasPermissionLevel(2)) - .build(); - - /* - Used to give the specified Identity to the specified Player. - */ - LiteralCommandNode grantNode = CommandManager - .literal("grant") - .then(CommandManager.argument("player", EntityArgumentType.players()) - .then(CommandManager.literal("everything") - .executes(context -> { - ServerPlayerEntity player = EntityArgumentType.getPlayer(context, "player"); - for (IdentityType type : IdentityType.getAllTypes(player.getWorld())) { - if(!PlayerUnlocks.has(player, type)) { - PlayerUnlocks.unlock(player, type); - } - } - - return 1; - }) - ) - .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(registryAccess, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) - .executes(context -> { - grant( - context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue(), - null - ); - return 1; - }) - .then(CommandManager.argument("nbt", NbtCompoundArgumentType.nbtCompound()) - .executes(context -> { - NbtCompound nbt = NbtCompoundArgumentType.getNbtCompound(context, "nbt"); - - grant( - context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue(), - nbt - ); - - return 1; - }) - ) - ) - ) - .build(); - - LiteralCommandNode revokeNode = CommandManager - .literal("revoke") - .then(CommandManager.argument("player", EntityArgumentType.players()) - .then(CommandManager.literal("everything") - .executes(context -> { - ServerPlayerEntity player = EntityArgumentType.getPlayer(context, "player"); - for (IdentityType type : IdentityType.getAllTypes(player.getWorld())) { - if(PlayerUnlocks.has(player, type)) { - PlayerUnlocks.revoke(player, type); - } - } - - return 1; - }) - ) - .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(registryAccess, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) - .executes(context -> { - revoke( - context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue(), - null - ); - return 1; - }) - .then(CommandManager.argument("nbt", NbtCompoundArgumentType.nbtCompound()) - .executes(context -> { - NbtCompound nbt = NbtCompoundArgumentType.getNbtCompound(context, "nbt"); - - revoke( - context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue(), - nbt - ); - - return 1; - }) - ) - ) - ) - .build(); - - LiteralCommandNode equip = CommandManager - .literal("equip") - .then(CommandManager.argument("player", EntityArgumentType.players()) - .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(registryAccess, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) - .executes(context -> { - equip(context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue(), - null); - - return 1; - }) - .then(CommandManager.argument("nbt", NbtCompoundArgumentType.nbtCompound()) - .executes(context -> { - NbtCompound nbt = NbtCompoundArgumentType.getNbtCompound(context, "nbt"); - - equip(context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue(), - nbt); - - return 1; - }) - ) - ) - ) - .build(); - - LiteralCommandNode unequip = CommandManager - .literal("unequip") - .then(CommandManager.argument("player", EntityArgumentType.players()) - .executes(context -> { - unequip( - context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player") - ); - return 1; - }) - ) - .build(); - - LiteralCommandNode test = CommandManager - .literal("test") - .then(CommandManager.argument("player", EntityArgumentType.player()) - .then(CommandManager.literal("not") - .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(registryAccess, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) - .executes(context -> { - return testNot( - context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue() - ); - }) - ) - ) - .then(CommandManager.argument("identity", RegistryEntryArgumentType.registryEntry(registryAccess, RegistryKeys.ENTITY_TYPE)).suggests(SuggestionProviders.SUMMONABLE_ENTITIES) - .executes(context -> { - return test( - context.getSource().getPlayer(), - EntityArgumentType.getPlayer(context, "player"), - RegistryEntryArgumentType.getSummonableEntityType(context, "identity").registryKey().getValue() - ); - }) - ) - ) - .build(); - LiteralCommandNode offsetNode = - CommandManager.literal("offset") - .then(CommandManager.argument("value", IntegerArgumentType.integer()) - .executes(ctx -> { - int v = IntegerArgumentType.getInteger(ctx, "value"); - EntityWidget.VERTICAL_OFFSET = v; - ctx.getSource() - .sendFeedback( - ()-> Text.literal("Entity‑grid Y‑offset set to §e" + v + "§r"), - false - ); - return 1; - }) - ).build(); - - LiteralCommandNode whitelistNode = - CommandManager.literal("whitelist") - .then(CommandManager.literal("enable") - .executes(ctx -> { - IdentityConfig.getInstance().setEnableSwaps(false); - if (IdentityConfig.getInstance().logCommands()) { - ctx.getSource().sendFeedback(() -> Text.literal("Enabled identity whitelist"), true); - } - return 1; - })) - .then(CommandManager.literal("disable") - .executes(ctx -> { - IdentityConfig.getInstance().setEnableSwaps(true); - if (IdentityConfig.getInstance().logCommands()) { - ctx.getSource().sendFeedback(() -> Text.literal("Disabled identity whitelist"), true); - } - return 1; - })) - .then(CommandManager.literal("add") - .then(CommandManager.argument("player", StringArgumentType.string()) - .executes(ctx -> { - String name = StringArgumentType.getString(ctx, "player"); - IdentityConfig.getInstance().allowedSwappers().add(name); - if (IdentityConfig.getInstance().logCommands()) { - ctx.getSource().sendFeedback(() -> Text.literal("Added " + name + " to identity whitelist"), true); - } - return 1; - }))) - .then(CommandManager.literal("remove") - .then(CommandManager.argument("player", StringArgumentType.string()) - .executes(ctx -> { - String name = StringArgumentType.getString(ctx, "player"); - IdentityConfig.getInstance().allowedSwappers().removeIf(n -> n.equalsIgnoreCase(name)); - if (IdentityConfig.getInstance().logCommands()) { - ctx.getSource().sendFeedback(() -> Text.literal("Removed " + name + " from identity whitelist"), true); - } - return 1; - }))) - .build(); - - rootNode.addChild(grantNode); - rootNode.addChild(revokeNode); - rootNode.addChild(equip); - rootNode.addChild(unequip); - rootNode.addChild(test); - rootNode.addChild(offsetNode); - rootNode.addChild(whitelistNode); - - dispatcher.getRoot().addChild(rootNode); - }); - } - - private static int test(ServerPlayerEntity source, ServerPlayerEntity player, Identifier identity) { - EntityType type = Registries.ENTITY_TYPE.get(identity); - - if(PlayerIdentity.getIdentity(player) != null && PlayerIdentity.getIdentity(player).getType().equals(type)) { - if(IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.test_positive", player.getDisplayName(), Text.translatable(type.getTranslationKey())), true); - } - - return 1; - } - - if(IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.test_failed", player.getDisplayName(), Text.translatable(type.getTranslationKey())), true); - } - - return 0; - } - - private static int testNot(ServerPlayerEntity source, ServerPlayerEntity player, Identifier identity) { - EntityType type = Registries.ENTITY_TYPE.get(identity); - - if(PlayerIdentity.getIdentity(player) != null && !PlayerIdentity.getIdentity(player).getType().equals(type)) { - if(IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.test_failed", player.getDisplayName(), Text.translatable(type.getTranslationKey())), true); - } - - return 1; - } - - if(IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.test_positive", player.getDisplayName(), Text.translatable(type.getTranslationKey())), true); - } - - return 0; - } - - private static void grant(ServerPlayerEntity source, ServerPlayerEntity player, Identifier id, @Nullable NbtCompound nbt) { - IdentityType type = new IdentityType(Registries.ENTITY_TYPE.get(id)); - Text name = Text.translatable(type.getEntityType().getTranslationKey()); - - // If the specified granting NBT is not null, change the IdentityType to reflect potential variants. - if(nbt != null) { - NbtCompound copy = nbt.copy(); - copy.putString("id", id.toString()); - ServerWorld serverWorld = source.getServerWorld(); - Entity loaded = EntityType.loadEntityWithPassengers(copy, serverWorld, it -> it); - if(loaded instanceof LivingEntity living) { - type = new IdentityType<>(living); - name = type.createTooltipText(living); - } - } - - if(!PlayerUnlocks.has(player, type)) { - boolean result = PlayerUnlocks.unlock(player, type); - - if(result && IdentityConfig.getInstance().logCommands()) { - player.sendMessage(Text.translatable("identity.unlock_entity", name), true); - source.sendMessage(Text.translatable("identity.grant_success", name, player.getDisplayName()), true); - } - } else { - if(IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.already_has", player.getDisplayName(), name), true); - } - } - } - - private static void revoke(ServerPlayerEntity source, ServerPlayerEntity player, Identifier id, @Nullable NbtCompound nbt) { - IdentityType type = new IdentityType(Registries.ENTITY_TYPE.get(id)); - Text name = Text.translatable(type.getEntityType().getTranslationKey()); - - // If the specified granting NBT is not null, change the IdentityType to reflect potential variants. - if(nbt != null) { - NbtCompound copy = nbt.copy(); - copy.putString("id", id.toString()); - ServerWorld serverWorld = source.getServerWorld(); - Entity loaded = EntityType.loadEntityWithPassengers(copy, serverWorld, it -> it); - if(loaded instanceof LivingEntity living) { - type = new IdentityType<>(living); - name = type.createTooltipText(living); - } - } - - if(PlayerUnlocks.has(player, type)) { - PlayerUnlocks.revoke(player, type); - - if(IdentityConfig.getInstance().logCommands()) { - player.sendMessage(Text.translatable("identity.revoke_entity", name), true); - source.sendMessage(Text.translatable("identity.revoke_success", name, player.getDisplayName()), true); - } - } else { - if(IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.does_not_have", player.getDisplayName(), name), true); - } - } - } - - private static void equip(ServerPlayerEntity source, ServerPlayerEntity player, Identifier identity, @Nullable NbtCompound nbt) { - Entity created; - - if(nbt != null) { - NbtCompound copy = nbt.copy(); - copy.putString("id", identity.toString()); - ServerWorld serverWorld = source.getServerWorld(); - created = EntityType.loadEntityWithPassengers(copy, serverWorld, it -> it); - } else { - EntityType entity = Registries.ENTITY_TYPE.get(identity); - created = entity.create(player.getWorld()); - } - - if(created instanceof LivingEntity living) { - @Nullable IdentityType defaultType = IdentityType.from(living); - - if(defaultType != null) { - boolean result = PlayerIdentity.updateIdentity(player, defaultType, (LivingEntity) created); - if(result && IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.equip_success", Text.translatable(created.getType().getTranslationKey()), player.getDisplayName()), true); - } - } - } - } - - private static void unequip(ServerPlayerEntity source, ServerPlayerEntity player) { - boolean result = PlayerIdentity.updateIdentity(player, null, null); - - if(result && IdentityConfig.getInstance().logCommands()) { - source.sendMessage(Text.translatable("identity.unequip_success", player.getDisplayName()), false); - } - } -} diff --git a/common/src/main/java/draylar/identity/compat/LivingEntityCompatAccessor.java b/common/src/main/java/draylar/identity/compat/LivingEntityCompatAccessor.java deleted file mode 100644 index fbabc44..0000000 --- a/common/src/main/java/draylar/identity/compat/LivingEntityCompatAccessor.java +++ /dev/null @@ -1,32 +0,0 @@ -package draylar.identity.compat; - -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.sound.SoundEvent; - -public interface LivingEntityCompatAccessor { - boolean isJumping(); - - SoundEvent callGetHurtSound(DamageSource source); - - SoundEvent callGetDeathSound(); - - void callPlayBlockFallSound(); - - int callComputeFallDamage(float fallDistance, float damageMultiplier); - - float callGetSoundVolume(); - - float callGetSoundPitch(); - - void callSetLivingFlag(int mask, boolean value); - - float callGetEyeHeight(EntityPose pose, EntityDimensions dimensions); - - int identity$getNextAirOnLand(int air); - - float callGetActiveEyeHeight(EntityPose pose, EntityDimensions dimensions); - - void callTickActiveItemStack(); -} diff --git a/common/src/main/java/draylar/identity/impl/DimensionsRefresher.java b/common/src/main/java/draylar/identity/impl/DimensionsRefresher.java deleted file mode 100644 index 4e89c4f..0000000 --- a/common/src/main/java/draylar/identity/impl/DimensionsRefresher.java +++ /dev/null @@ -1,5 +0,0 @@ -package draylar.identity.impl; - -public interface DimensionsRefresher { - void identity_refreshDimensions(); -} diff --git a/common/src/main/java/draylar/identity/impl/NearbySongAccessor.java b/common/src/main/java/draylar/identity/impl/NearbySongAccessor.java deleted file mode 100644 index 2a040c4..0000000 --- a/common/src/main/java/draylar/identity/impl/NearbySongAccessor.java +++ /dev/null @@ -1,8 +0,0 @@ -package draylar.identity.impl; - -/** - * Duck interface for accessing information about nearby playing music in {@link draylar.identity.mixin.PlayerEntityMixin}. - */ -public interface NearbySongAccessor { - boolean identity_isNearbySongPlaying(); -} diff --git a/common/src/main/java/draylar/identity/impl/PlayerDataProvider.java b/common/src/main/java/draylar/identity/impl/PlayerDataProvider.java deleted file mode 100644 index 6ebf8b2..0000000 --- a/common/src/main/java/draylar/identity/impl/PlayerDataProvider.java +++ /dev/null @@ -1,30 +0,0 @@ -package draylar.identity.impl; - -import draylar.identity.api.variant.IdentityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Set; - -public interface PlayerDataProvider { - - Set> getUnlocked(); - void setUnlocked(Set> unlocked); - - Set> getFavorites(); - void setFavorites(Set> favorites); - - int getRemainingHostilityTime(); - void setRemainingHostilityTime(int max); - - int getAbilityCooldown(); - void setAbilityCooldown(int cooldown); - - LivingEntity getIdentity(); - void setIdentity(@Nullable LivingEntity identity); - boolean updateIdentity(@Nullable LivingEntity identity); - - IdentityType getIdentityType(); -} diff --git a/common/src/main/java/draylar/identity/impl/SonicBoomUser.java b/common/src/main/java/draylar/identity/impl/SonicBoomUser.java deleted file mode 100644 index 2d48fe6..0000000 --- a/common/src/main/java/draylar/identity/impl/SonicBoomUser.java +++ /dev/null @@ -1,6 +0,0 @@ -package draylar.identity.impl; - -public interface SonicBoomUser { - - void identity$ability_startSonicBoom(); -} diff --git a/common/src/main/java/draylar/identity/impl/join/ClientPlayerJoinHandler.java b/common/src/main/java/draylar/identity/impl/join/ClientPlayerJoinHandler.java deleted file mode 100644 index 375a3cd..0000000 --- a/common/src/main/java/draylar/identity/impl/join/ClientPlayerJoinHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package draylar.identity.impl.join; - -import dev.architectury.event.events.client.ClientPlayerEvent; -import draylar.identity.IdentityClient; -import draylar.identity.api.ApplicablePacket; -import net.minecraft.client.network.ClientPlayerEntity; - -public class ClientPlayerJoinHandler implements ClientPlayerEvent.ClientPlayerJoin { - - @Override - public void join(ClientPlayerEntity player) { - for (ApplicablePacket packet : IdentityClient.getSyncPacketQueue()) { - packet.apply(player); - } - - IdentityClient.getSyncPacketQueue().clear(); - } -} diff --git a/common/src/main/java/draylar/identity/impl/tick/AbilityKeyPressHandler.java b/common/src/main/java/draylar/identity/impl/tick/AbilityKeyPressHandler.java deleted file mode 100644 index 96f56d5..0000000 --- a/common/src/main/java/draylar/identity/impl/tick/AbilityKeyPressHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package draylar.identity.impl.tick; - -import dev.architectury.event.events.client.ClientTickEvent; -import draylar.identity.IdentityClient; -import draylar.identity.ability.AbilityRegistry; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.network.ClientNetworking; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.LivingEntity; - -public class AbilityKeyPressHandler implements ClientTickEvent.Client { - - @Override - public void tick(MinecraftClient client) { - assert client.player != null; - - if(IdentityClient.ABILITY_KEY.wasPressed()) { - // TODO: maybe the check should be on the server to allow for ability extension mods? - // Only send the ability packet if the identity equipped by the player has one - LivingEntity identity = PlayerIdentity.getIdentity(client.player); - - if(identity != null) { - if(AbilityRegistry.has(identity.getType())) { - ClientNetworking.sendAbilityRequest(); - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/impl/tick/MenuKeyPressHandler.java b/common/src/main/java/draylar/identity/impl/tick/MenuKeyPressHandler.java deleted file mode 100644 index 98a80ee..0000000 --- a/common/src/main/java/draylar/identity/impl/tick/MenuKeyPressHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package draylar.identity.impl.tick; - -import dev.architectury.event.events.client.ClientTickEvent; -import draylar.identity.IdentityClient; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.screen.IdentityScreen; -import net.minecraft.client.MinecraftClient; - -public class MenuKeyPressHandler implements ClientTickEvent.Client { - - @Override - public void tick(MinecraftClient client) { - assert client.player != null; - - if(IdentityClient.MENU_KEY.wasPressed()) { - if(IdentityConfig.getInstance().enableClientSwapMenu() || - client.player.hasPermissionLevel(3) || - IdentityConfig.getInstance().allowedSwappers().stream() - .anyMatch(p -> p.equalsIgnoreCase(client.player.getGameProfile().getName()))) { - MinecraftClient.getInstance().setScreen(new IdentityScreen()); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/impl/tick/identity/FrogTickHandler.java b/common/src/main/java/draylar/identity/impl/tick/identity/FrogTickHandler.java deleted file mode 100644 index d18f46a..0000000 --- a/common/src/main/java/draylar/identity/impl/tick/identity/FrogTickHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package draylar.identity.impl.tick.identity; - -import draylar.identity.api.IdentityTickHandler; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.passive.FrogEntity; -import net.minecraft.entity.player.PlayerEntity; - -public class FrogTickHandler implements IdentityTickHandler { - - @Override - public void tick(PlayerEntity player, FrogEntity frog) { - if(player.getWorld().isClient) { - boolean walk = player.isOnGround() && player.getVelocity().horizontalLengthSquared() > 1.0E-6 && !player.isInsideWaterOrBubbleColumn(); - boolean swim = player.getVelocity().horizontalLengthSquared() > 1.0E-6 && player.isInsideWaterOrBubbleColumn(); - - // Walking implementation - if (walk) { -// frog.limbAnimator.startIfNotRunning(frog.age); - } else { -// frog.walkingAnimationState.stop(); - } - - // Jumping - if(!player.isOnGround() && !swim && !walk && !player.isInsideWaterOrBubbleColumn()) { - frog.longJumpingAnimationState.startIfNotRunning(frog.age); - } else { - frog.longJumpingAnimationState.stop(); - } - - // Swimming - if (swim) { - frog.idlingInWaterAnimationState.stop(); -// frog.swimmingAnimationState.startIfNotRunning(frog.age); - } else if (player.isInsideWaterOrBubbleColumn()) { -// frog.swimmingAnimationState.stop(); - frog.idlingInWaterAnimationState.startIfNotRunning(frog.age); - } else { -// frog.swimmingAnimationState.stop(); - frog.idlingInWaterAnimationState.stop(); - } - - // Random croaking - if(player.getWorld().random.nextDouble() <= 0.001) { - frog.croakingAnimationState.start(player.age); - } - - // Tongue - if(player.handSwinging) { - frog.usingTongueAnimationState.startIfNotRunning(player.age); - } else { - frog.usingTongueAnimationState.stop(); - } - } else { - // Buffs - jump boost - player.addStatusEffect(new StatusEffectInstance(StatusEffects.JUMP_BOOST, 20 * 2, 2, true, false)); - } - } -} diff --git a/common/src/main/java/draylar/identity/impl/tick/identity/JumpBoostTickHandler.java b/common/src/main/java/draylar/identity/impl/tick/identity/JumpBoostTickHandler.java deleted file mode 100644 index e2deb1d..0000000 --- a/common/src/main/java/draylar/identity/impl/tick/identity/JumpBoostTickHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package draylar.identity.impl.tick.identity; - -import draylar.identity.api.IdentityTickHandler; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; - -public class JumpBoostTickHandler implements IdentityTickHandler { - - private final int level; - - public JumpBoostTickHandler(int level) { - this.level = level; - } - - @Override - public void tick(PlayerEntity player, LivingEntity entity) { - if(!player.getWorld().isClient) { - if(player.age % 5 == 0) { - player.addStatusEffect(new StatusEffectInstance(StatusEffects.JUMP_BOOST, 20 * 2, level, true, false)); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/impl/tick/identity/WardenTickHandler.java b/common/src/main/java/draylar/identity/impl/tick/identity/WardenTickHandler.java deleted file mode 100644 index 383a2a4..0000000 --- a/common/src/main/java/draylar/identity/impl/tick/identity/WardenTickHandler.java +++ /dev/null @@ -1,33 +0,0 @@ -package draylar.identity.impl.tick.identity; - -import draylar.identity.api.IdentityTickHandler; -import draylar.identity.api.platform.IdentityConfig; -import net.minecraft.entity.ai.TargetPredicate; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.WardenEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.Box; - -public class WardenTickHandler implements IdentityTickHandler { - - @Override - public void tick(PlayerEntity player, WardenEntity entity) { - if(!player.getWorld().isClient) { - if(player.age % 20 == 0) { - - // Blind the Warden Identity player. - if(IdentityConfig.getInstance().wardenIsBlinded()) { - player.addStatusEffect(new StatusEffectInstance(StatusEffects.DARKNESS, 20 * 3, 0, true, false)); - } - - // Blind other players near a player with the Warden Identity. - if(IdentityConfig.getInstance().wardenBlindsNearby()) { - for (PlayerEntity target : player.getWorld().getPlayers(TargetPredicate.DEFAULT, player, new Box(player.getBlockPos()).expand(16))) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.DARKNESS, 20 * 3, 0, true, false)); - } - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/AxolotlTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/AxolotlTypeProvider.java deleted file mode 100644 index 635119d..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/AxolotlTypeProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package draylar.identity.impl.variant; - -import draylar.identity.api.variant.TypeProvider; -import draylar.identity.mixin.accessor.AxolotlEntityAccessor; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.AxolotlEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -public class AxolotlTypeProvider extends TypeProvider { - - @Override - public int getVariantData(AxolotlEntity entity) { - return entity.getVariant().getId(); - } - - @Override - public AxolotlEntity create(EntityType type, World world, int data) { - AxolotlEntity axolotl = new AxolotlEntity(type, world); - ((AxolotlEntityAccessor) axolotl).callSetVariant(AxolotlEntity.Variant.values()[data]); - return axolotl; - } - - @Override - public int getFallbackData() { - return AxolotlEntity.Variant.LUCY.getId(); - } - - @Override - public int getRange() { - return AxolotlEntity.Variant.values().length - 1; - } - - @Override - public Text modifyText(AxolotlEntity entity, MutableText text) { - return Text.literal(formatTypePrefix(AxolotlEntity.Variant.values()[getVariantData(entity)].getName()) + " ").append(text); - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/CatTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/CatTypeProvider.java deleted file mode 100644 index a8fd28a..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/CatTypeProvider.java +++ /dev/null @@ -1,58 +0,0 @@ -package draylar.identity.impl.variant; - -import com.google.common.collect.ImmutableMap; -import draylar.identity.api.variant.TypeProvider; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.CatEntity; -import net.minecraft.registry.Registries; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -import java.util.Map; - -public class CatTypeProvider extends TypeProvider { - - private static final Map PREFIX_BY_ID = ImmutableMap - .builder() - .put(0, "Tabby") - .put(1, "Black") - .put(2, "Red") - .put(3, "Siamese") - .put(4, "British Shorthair") - .put(5, "Calico") - .put(6, "Persian") - .put(7, "Ragdoll") - .put(8, "White") - .put(9, "Jellie") - .put(10, "Black") - .build(); - - @Override - public int getVariantData(CatEntity entity) { - return Registries.CAT_VARIANT.getRawId(entity.getVariant()); - } - - @Override - public CatEntity create(EntityType type, World world, int data) { - CatEntity cat = new CatEntity(type, world); - cat.setVariant(Registries.CAT_VARIANT.get(data)); - return cat; - } - - @Override - public int getFallbackData() { - return 0; - } - - @Override - public int getRange() { - return 10; - } - - @Override - public Text modifyText(CatEntity cat, MutableText text) { - int variant = getVariantData(cat); - return Text.literal(PREFIX_BY_ID.containsKey(variant) ? PREFIX_BY_ID.get(variant) + " " : "").append(text); - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/FoxTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/FoxTypeProvider.java deleted file mode 100644 index c5e75d6..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/FoxTypeProvider.java +++ /dev/null @@ -1,38 +0,0 @@ -package draylar.identity.impl.variant; - -import draylar.identity.api.variant.TypeProvider; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.FoxEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -public class FoxTypeProvider extends TypeProvider { - - @Override - public int getVariantData(FoxEntity entity) { - return entity.getVariant().getId(); - } - - @Override - public FoxEntity create(EntityType type, World world, int data) { - FoxEntity fox = new FoxEntity(type, world); - fox.setVariant(FoxEntity.Type.fromId(data)); - return fox; - } - - @Override - public int getFallbackData() { - return FoxEntity.Type.RED.getId(); - } - - @Override - public int getRange() { - return FoxEntity.Type.values().length - 1; - } - - @Override - public Text modifyText(FoxEntity entity, MutableText text) { - return Text.literal(formatTypePrefix(FoxEntity.Type.fromId(getVariantData(entity)).asString()) + " ").append(text); - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/FrogTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/FrogTypeProvider.java deleted file mode 100644 index 6d24b8d..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/FrogTypeProvider.java +++ /dev/null @@ -1,50 +0,0 @@ -package draylar.identity.impl.variant; - -import com.google.common.collect.ImmutableMap; -import draylar.identity.api.variant.TypeProvider; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.FrogEntity; -import net.minecraft.registry.Registries; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -import java.util.Map; - -public class FrogTypeProvider extends TypeProvider { - - private static final Map PREFIX_BY_ID = ImmutableMap - .builder() - .put(0, "Temperate") - .put(1, "Warm") - .put(2, "Cold") - .build(); - - @Override - public int getVariantData(FrogEntity entity) { - return Registries.FROG_VARIANT.getRawId(entity.getVariant()); - } - - @Override - public FrogEntity create(EntityType type, World world, int data) { - FrogEntity frog = new FrogEntity(type, world); - frog.setVariant(Registries.FROG_VARIANT.get(data)); - return frog; - } - - @Override - public int getFallbackData() { - return 0; - } - - @Override - public int getRange() { - return 2; - } - - @Override - public Text modifyText(FrogEntity frog, MutableText text) { - int variant = getVariantData(frog); - return Text.literal(PREFIX_BY_ID.containsKey(variant) ? PREFIX_BY_ID.get(variant) + " " : "").append(text); - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/ParrotTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/ParrotTypeProvider.java deleted file mode 100644 index f292d4b..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/ParrotTypeProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -package draylar.identity.impl.variant; - -import com.google.common.collect.ImmutableMap; -import draylar.identity.api.variant.TypeProvider; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.ParrotEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -public class ParrotTypeProvider extends TypeProvider { - - private static final ImmutableMap PREFIX_BY_ID = ImmutableMap - .builder() - .put(0, "Red Blue") - .put(1, "Blue") - .put(2, "Green") - .put(3, "Yellow Blue") - .put(4, "Gray") - .build(); - - @Override - public int getVariantData(ParrotEntity entity) { - return entity.getVariant().getId(); - } - - @Override - public ParrotEntity create(EntityType type, World world, int data) { - ParrotEntity parrot = new ParrotEntity(type, world); - parrot.setVariant(ParrotEntity.Variant.byIndex(data)); - return parrot; - } - - @Override - public int getFallbackData() { - return 0; - } - - @Override - public int getRange() { - return 4; - } - - @Override - public Text modifyText(ParrotEntity parrot, MutableText text) { - int variant = getVariantData(parrot); - return Text.literal(PREFIX_BY_ID.containsKey(variant) ? PREFIX_BY_ID.get(variant) + " " : "").append(text); - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/SheepTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/SheepTypeProvider.java deleted file mode 100644 index 4ec4724..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/SheepTypeProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package draylar.identity.impl.variant; - -import draylar.identity.api.variant.TypeProvider; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.SheepEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.DyeColor; -import net.minecraft.world.World; - -public class SheepTypeProvider extends TypeProvider { - - @Override - public int getVariantData(SheepEntity entity) { - return entity.getColor().ordinal(); - } - - @Override - public SheepEntity create(EntityType type, World world, int data) { - SheepEntity sheep = new SheepEntity(type, world); - sheep.setColor(DyeColor.byId(data)); - return sheep; - } - - @Override - public int getFallbackData() { - return DyeColor.WHITE.getId(); - } - - @Override - public int getRange() { - return DyeColor.BLACK.getId(); - } - - @Override - public Text modifyText(SheepEntity sheep, MutableText text) { - return Text.literal(formatTypePrefix(DyeColor.byId(getVariantData(sheep)).getName()) + " ").append(text); - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/SlimeTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/SlimeTypeProvider.java deleted file mode 100644 index dad3151..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/SlimeTypeProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package draylar.identity.impl.variant; - -import draylar.identity.api.variant.TypeProvider; -import draylar.identity.mixin.accessor.SlimeEntityAccessor; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -public class SlimeTypeProvider extends TypeProvider { - - @Override - public int getVariantData(SlimeEntity entity) { - return entity.getSize(); - } - - @Override - public SlimeEntity create(EntityType type, World world, int data) { - SlimeEntity slime = new SlimeEntity(type, world); - ((SlimeEntityAccessor) slime).callSetSize(data + 1, true); - return slime; - } - - @Override - public int getFallbackData() { - return 0; - } - - @Override - public int getRange() { - return 4; - } - - @Override - public Text modifyText(SlimeEntity entity, MutableText text) { - return Text.literal(String.format("Size %d ", entity.getSize())).append(text); - } -} diff --git a/common/src/main/java/draylar/identity/impl/variant/TropicalFishTypeProvider.java b/common/src/main/java/draylar/identity/impl/variant/TropicalFishTypeProvider.java deleted file mode 100644 index 688d115..0000000 --- a/common/src/main/java/draylar/identity/impl/variant/TropicalFishTypeProvider.java +++ /dev/null @@ -1,39 +0,0 @@ -package draylar.identity.impl.variant; - -import draylar.identity.api.variant.TypeProvider; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.TropicalFishEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.world.World; - -// TODO: do we want to add this? There will be a boat-load of fish... -public class TropicalFishTypeProvider extends TypeProvider { - - @Override - public int getVariantData(TropicalFishEntity entity) { - return entity.getVariant().getId(); - } - - @Override - public TropicalFishEntity create(EntityType type, World world, int data) { - TropicalFishEntity fish = new TropicalFishEntity(type, world); - fish.setVariant(TropicalFishEntity.Variety.fromId(data)); - return fish; - } - - @Override - public int getFallbackData() { - return 0; - } - - @Override - public int getRange() { - return 0; - } - - @Override - public Text modifyText(TropicalFishEntity entity, MutableText text) { - return null; - } -} diff --git a/common/src/main/java/draylar/identity/mixin/ActiveTargetGoalMixin.java b/common/src/main/java/draylar/identity/mixin/ActiveTargetGoalMixin.java deleted file mode 100644 index 798558e..0000000 --- a/common/src/main/java/draylar/identity/mixin/ActiveTargetGoalMixin.java +++ /dev/null @@ -1,92 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerHostility; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.platform.IdentityConfig; -import net.minecraft.entity.EntityGroup; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.ActiveTargetGoal; -import net.minecraft.entity.boss.WitherEntity; -import net.minecraft.entity.mob.CreeperEntity; -import net.minecraft.entity.mob.Monster; -import net.minecraft.entity.player.PlayerEntity; -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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(ActiveTargetGoal.class) -public abstract class ActiveTargetGoalMixin extends TrackTargetGoalMixin { - - @Shadow protected LivingEntity targetEntity; - - @Inject( - method = "start", - at = @At("HEAD"), - cancellable = true - ) - private void ignoreMorphedPlayers(CallbackInfo ci) { - if (IdentityConfig.getInstance().hostilesIgnoreHostileIdentityPlayer() && this.mob instanceof Monster && this.targetEntity instanceof PlayerEntity) { - PlayerEntity player = (PlayerEntity) this.targetEntity; - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null) { - boolean hasHostility = PlayerHostility.hasHostility(player); - - // only cancel if the player does not have hostility - if (!hasHostility) { - // creepers should ignore cats - if (this.mob instanceof CreeperEntity && identity.getType().equals(EntityType.OCELOT)) { - this.stop(); - ci.cancel(); - } - - // withers should ignore undead - else if (this.mob instanceof WitherEntity && identity.getGroup().equals(EntityGroup.UNDEAD)) { - this.stop(); - ci.cancel(); - } - - // hostile mobs (besides wither) should not target players morphed as hostile mobs - else if (!(this.mob instanceof WitherEntity) && identity instanceof Monster) { - this.stop(); - ci.cancel(); - } - } - } - } - } - - @Override - protected void identity_shouldContinue(CallbackInfoReturnable cir) { - // check cancelling for hostiles - if(IdentityConfig.getInstance().hostilesIgnoreHostileIdentityPlayer() && IdentityConfig.getInstance().hostilesForgetNewHostileIdentityPlayer() && this.mob instanceof Monster && this.targetEntity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null) { - boolean hasHostility = PlayerHostility.hasHostility(player); - - // only cancel if the player does not have hostility - if (!hasHostility) { - // creepers should ignore cats - if (this.mob instanceof CreeperEntity && identity.getType().equals(EntityType.OCELOT)) { - cir.setReturnValue(false); - } - - // withers should ignore undead - else if (this.mob instanceof WitherEntity && identity.getGroup().equals(EntityGroup.UNDEAD)) { - cir.setReturnValue(false); - } - - // hostile mobs (besides wither) should not target players morphed as hostile mobs - else if (!(this.mob instanceof WitherEntity) && identity instanceof Monster) { - cir.setReturnValue(false); - } - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/BipedEntityModelMixin.java b/common/src/main/java/draylar/identity/mixin/BipedEntityModelMixin.java deleted file mode 100644 index cb4beb8..0000000 --- a/common/src/main/java/draylar/identity/mixin/BipedEntityModelMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package draylar.identity.mixin; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.BipedEntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.MobEntityRenderer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.mob.MobEntity; -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; - -@Mixin(MobEntityRenderer.class) -public abstract class BipedEntityModelMixin extends LivingEntityRenderer { - - private BipedEntityModelMixin(EntityRendererFactory.Context ctx, EntityModel model, float shadowRadius) { - super(ctx, model, shadowRadius); - } - - @Inject( - method = "render", - at = @At("HEAD")) - private void onRender(MobEntity mobEntity, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, CallbackInfo ci) { - // Only apply to Biped Entities - if (!((Object) this instanceof BipedEntityRenderer)) { - return; - } - - BipedEntityModel model = (BipedEntityModel) getModel(); - - if (model != null) { - model.sneaking = mobEntity.isInSneakingPose(); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/ClientLivingEntityMixin.java b/common/src/main/java/draylar/identity/mixin/ClientLivingEntityMixin.java deleted file mode 100644 index 5c65434..0000000 --- a/common/src/main/java/draylar/identity/mixin/ClientLivingEntityMixin.java +++ /dev/null @@ -1,73 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.Vec3d; -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; - -// ClientLivingEntityMixin.java -@Environment(EnvType.CLIENT) -@Mixin(LivingEntity.class) -public abstract class ClientLivingEntityMixin { - @Unique - private boolean identity$isAquatic(LivingEntity identity) { - if (identity == null) return false; - - SpawnGroup group = identity.getType().getSpawnGroup(); - - return switch (group) { - case WATER_CREATURE, WATER_AMBIENT, UNDERGROUND_WATER_CREATURE -> true; - default -> false; - }; - } - - @Inject(method = "travel", at = @At("HEAD")) - private void identity$handleAquaticMovement(Vec3d movementInput, CallbackInfo ci) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null && identity$isAquatic(identity)) { - boolean inWater = player.isTouchingWater(); - boolean inBubbleColumn = player.getWorld().getBlockState(player.getBlockPos()).isOf(Blocks.BUBBLE_COLUMN); - - if (inWater || inBubbleColumn) { - double speedMultiplier = identity.getType() == EntityType.DOLPHIN ? 0.4 : 0.25; - - Vec3d input = movementInput; - - if (MinecraftClient.getInstance().options.jumpKey.isPressed()) { - input = input.add(0, -1.0, 0); - } - if (MinecraftClient.getInstance().options.sneakKey.isPressed()) { - input = input.add(0, 1.0, 0); - } - - Vec3d look = player.getRotationVec(1.0F); - Vec3d up = new Vec3d(0, 1, 0); - Vec3d right = up.crossProduct(look).normalize(); - Vec3d adjustedUp = right.crossProduct(look).normalize(); - Vec3d worldInput = - right.multiply(input.x) - .add(adjustedUp.multiply(input.y)) - .add(look.multiply(input.z)); - - if (worldInput.lengthSquared() > 0.0001) { - player.setVelocity(worldInput.normalize().multiply(speedMultiplier)); - } - } - } - } - } -} - diff --git a/common/src/main/java/draylar/identity/mixin/ClientPlayerDebugMixin.java b/common/src/main/java/draylar/identity/mixin/ClientPlayerDebugMixin.java deleted file mode 100644 index d41facf..0000000 --- a/common/src/main/java/draylar/identity/mixin/ClientPlayerDebugMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.util.PlayerDebugUtils; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.Box; -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; - -@Mixin(ClientPlayerEntity.class) -public class ClientPlayerDebugMixin { - -// @Inject(method = "tick", at = @At("TAIL")) -// private void onClientTick(CallbackInfo ci) { -// PlayerDebugUtils.logPlayerDebug((PlayerEntity)(Object)this, "client"); -// } -} \ No newline at end of file diff --git a/common/src/main/java/draylar/identity/mixin/CreeperEntityMixin.java b/common/src/main/java/draylar/identity/mixin/CreeperEntityMixin.java deleted file mode 100644 index 365d09d..0000000 --- a/common/src/main/java/draylar/identity/mixin/CreeperEntityMixin.java +++ /dev/null @@ -1,45 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.FleeEntityGoal; -import net.minecraft.entity.mob.CreeperEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.World; -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; - -@Mixin(CreeperEntity.class) -public abstract class CreeperEntityMixin extends HostileEntity { - - private CreeperEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - @Inject( - method = "initGoals", - at = @At("RETURN") - ) - private void addCustomGoals(CallbackInfo ci) { - this.goalSelector.add(3, new FleeEntityGoal<>( - this, - PlayerEntity.class, - entity -> { - if (entity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - return identity != null && identity.getType().equals(EntityType.OCELOT); - } - - return true; - }, - 6.0F, - 1.0D, - 1.2D, - player -> true - )); - } -} diff --git a/common/src/main/java/draylar/identity/mixin/DrownedOverlayMixin.java b/common/src/main/java/draylar/identity/mixin/DrownedOverlayMixin.java deleted file mode 100644 index 17fb9ca..0000000 --- a/common/src/main/java/draylar/identity/mixin/DrownedOverlayMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package draylar.identity.mixin; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.DrownedOverlayFeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.DrownedEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.mob.DrownedEntity; -import org.spongepowered.asm.mixin.Final; -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(DrownedOverlayFeatureRenderer.class) -public abstract class DrownedOverlayMixin extends FeatureRenderer> { - - @Shadow @Final private DrownedEntityModel model; - - public DrownedOverlayMixin(FeatureRendererContext> context) { - super(context); - } - - @Inject( - method = "render", - at = @At("HEAD")) - private void onRender(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, DrownedEntity drownedEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { - DrownedEntityModel model = getContextModel(); - - if (model != null) { - model.copyBipedStateTo(this.model); - model.sneaking = drownedEntity.isSneaking(); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/EntityMixin.java b/common/src/main/java/draylar/identity/mixin/EntityMixin.java deleted file mode 100644 index 39321fc..0000000 --- a/common/src/main/java/draylar/identity/mixin/EntityMixin.java +++ /dev/null @@ -1,127 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.impl.DimensionsRefresher; -import net.minecraft.entity.*; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -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.CallbackInfoReturnable; - -@Mixin(Entity.class) -public abstract class EntityMixin implements DimensionsRefresher { - - @Shadow private EntityDimensions dimensions; - - @Shadow - public abstract EntityPose getPose(); - - @Shadow - public abstract EntityDimensions getDimensions(EntityPose pose); - - @Shadow - public abstract Box getBoundingBox(); - - @Shadow - public abstract void setBoundingBox(Box boundingBox); - - @Shadow protected boolean firstUpdate; - @Shadow public World world; - - @Shadow - public abstract void move(MovementType type, Vec3d movement); - - @Shadow private float standingEyeHeight; - - @Shadow - protected abstract float getEyeHeight(EntityPose pose, EntityDimensions dimensions); - - @Inject( - method = "getWidth", - at = @At("HEAD"), - cancellable = true - ) - private void getWidth(CallbackInfoReturnable cir) { - if((Object) this instanceof PlayerEntity player) { - LivingEntity Identity = PlayerIdentity.getIdentity(player); - - if(Identity != null) { - cir.setReturnValue(Identity.getWidth()); - } - } - } - - @Inject( - method = "getHeight", - at = @At("HEAD"), - cancellable = true - ) - private void getHeight(CallbackInfoReturnable cir) { - if((Object) this instanceof PlayerEntity player) { - LivingEntity Identity = PlayerIdentity.getIdentity(player); - - if(Identity != null) { - cir.setReturnValue(Identity.getHeight()); - } - } - } - - @Override - public void identity_refreshDimensions() { - EntityDimensions currentDimensions = this.dimensions; - EntityPose entityPose = this.getPose(); - EntityDimensions newDimensions = this.getDimensions(entityPose); - - this.dimensions = newDimensions; - this.standingEyeHeight = this.getEyeHeight(entityPose, newDimensions); - - Box box = this.getBoundingBox(); - this.setBoundingBox(new Box(box.minX, box.minY, box.minZ, box.minX + (double) newDimensions.width, box.minY + (double) newDimensions.height, box.minZ + (double) newDimensions.width)); - - if(!this.firstUpdate) { - float f = currentDimensions.width - newDimensions.width; - this.move(MovementType.SELF, new Vec3d(f, 0.0D, f)); - } - } - - @Inject(at = @At("HEAD"), method = "getStandingEyeHeight", cancellable = true) - public void getStandingEyeHeight(CallbackInfoReturnable cir) { - if((Entity) (Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null) { - cir.setReturnValue(identity.getStandingEyeHeight()); - } - } - } - - @Inject( - method = "isFireImmune", - at = @At("HEAD"), - cancellable = true - ) - private void isFireImmune(CallbackInfoReturnable cir) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null) { - EntityType type = identity.getType(); - boolean vanillaFireImmune = type.isFireImmune(); - boolean customFireImmune = SafeTagManager.isCustomFireImmune(type); - - if (vanillaFireImmune || customFireImmune) { - cir.setReturnValue(true); - } else { - cir.setReturnValue(false); - } - } - } - } - -} diff --git a/common/src/main/java/draylar/identity/mixin/EntityTrackerAccessor.java b/common/src/main/java/draylar/identity/mixin/EntityTrackerAccessor.java deleted file mode 100644 index e06678d..0000000 --- a/common/src/main/java/draylar/identity/mixin/EntityTrackerAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package draylar.identity.mixin; - -import net.minecraft.server.world.EntityTrackingListener; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.Set; - -@Mixin(targets = "net.minecraft.server.world.ThreadedAnvilChunkStorage$EntityTracker") -public interface EntityTrackerAccessor { - @Accessor - Set getListeners(); -} diff --git a/common/src/main/java/draylar/identity/mixin/FoxEntityMixin.java b/common/src/main/java/draylar/identity/mixin/FoxEntityMixin.java deleted file mode 100644 index 657b116..0000000 --- a/common/src/main/java/draylar/identity/mixin/FoxEntityMixin.java +++ /dev/null @@ -1,73 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.registry.IdentityEntityTags; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.ActiveTargetGoal; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.FishEntity; -import net.minecraft.entity.passive.FoxEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.world.World; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -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; - -import java.util.function.Predicate; - -@Mixin(FoxEntity.class) -public abstract class FoxEntityMixin extends AnimalEntity { - - @Shadow @Final @Mutable - private static Predicate NOTICEABLE_PLAYER_FILTER; - - private FoxEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - // Change the default "flee from player," predicate to ignore players disguised as Foxes. - // Hopefully nobody else needs to modify fox fleeing behavior. - static { - NOTICEABLE_PLAYER_FILTER = entity -> { - boolean isIdentityPlayer = false; - - if(entity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - if(identity instanceof FoxEntity) { - isIdentityPlayer = true; - } - } - - return !entity.isSneaky() && EntityPredicates.EXCEPT_CREATIVE_OR_SPECTATOR.test(entity) && !isIdentityPlayer; - }; - } - - @Inject( - method = "initGoals", - at = @At("RETURN") - ) - private void addPlayerTarget(CallbackInfo ci) { - this.targetSelector.add(7, new ActiveTargetGoal<>(this, PlayerEntity.class, 10, false, false, player -> { - // ensure foxes can attack players with an identity similar to their normal prey - if(!IdentityConfig.getInstance().foxesAttackIdentityPrey()) { - return false; - } - - // foxes can target players if their identity is in the fox_prey tag, or if they are an entity that extends FishEntity - // todo: add baby turtle targeting - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) player); - return identity != null && ( - identity.getType().isIn(IdentityEntityTags.FOX_PREY) || - SafeTagManager.isCustomFoxPrey(identity.getType())) || identity instanceof FishEntity; - })); - } -} diff --git a/common/src/main/java/draylar/identity/mixin/HoglinBrainMixin.java b/common/src/main/java/draylar/identity/mixin/HoglinBrainMixin.java deleted file mode 100644 index 6ca7d59..0000000 --- a/common/src/main/java/draylar/identity/mixin/HoglinBrainMixin.java +++ /dev/null @@ -1,40 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.HoglinBrain; -import net.minecraft.entity.mob.HoglinEntity; -import net.minecraft.entity.player.PlayerEntity; -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.CallbackInfoReturnable; - -import java.util.Optional; - -@Mixin(HoglinBrain.class) -public class HoglinBrainMixin { - - @Inject( - method = "getNearestVisibleTargetablePlayer", - at = @At("RETURN"), - cancellable = true) - private static void getNearestVisibleTargetablePlayer(HoglinEntity hoglin, CallbackInfoReturnable> cir) { - Optional ret = cir.getReturnValue(); - if(ret.isPresent()) { - LivingEntity target = ret.get(); - - // Check if Hoglin target is player - if(target instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // Ensure player identity is valid - if(identity != null) { - if(identity instanceof HoglinEntity) { - cir.setReturnValue(Optional.empty()); - } - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/InGameHudMixin.java b/common/src/main/java/draylar/identity/mixin/InGameHudMixin.java deleted file mode 100644 index 1f6b065..0000000 --- a/common/src/main/java/draylar/identity/mixin/InGameHudMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.Identity; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.registry.IdentityEntityTags; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.registry.tag.TagKey; -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.ModifyArg; - -@Mixin(InGameHud.class) -public abstract class InGameHudMixin { - - @Shadow protected abstract PlayerEntity getCameraPlayer(); - - @ModifyArg( - method = "renderStatusBars", - at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isSubmergedIn(Lnet/minecraft/registry/tag/TagKey;)Z") - ) - private TagKey shouldRenderBreath(TagKey tag) { - PlayerEntity player = this.getCameraPlayer(); - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null) { - if(Identity.identity$isAquatic(identity) || (identity.getType().isIn(IdentityEntityTags.UNDROWNABLE) || SafeTagManager.isCustomUndrownable(identity.getType())) && player.isSubmergedIn(FluidTags.WATER)) { - return FluidTags.LAVA; // will cause isSubmergedIn to return false, preventing air render - } - } - - return tag; - } -} diff --git a/common/src/main/java/draylar/identity/mixin/LimbAnimatorAccessor.java b/common/src/main/java/draylar/identity/mixin/LimbAnimatorAccessor.java deleted file mode 100644 index 1e1fca1..0000000 --- a/common/src/main/java/draylar/identity/mixin/LimbAnimatorAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -package draylar.identity.mixin; - -import net.minecraft.entity.LimbAnimator; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(LimbAnimator.class) -public interface LimbAnimatorAccessor { - - @Accessor - float getPrevSpeed(); - - @Accessor - void setPrevSpeed(float prevSpeed); - - @Accessor - float getSpeed(); - - @Accessor - void setSpeed(float speed); - - @Accessor - float getPos(); - - @Accessor - void setPos(float pos); -} diff --git a/common/src/main/java/draylar/identity/mixin/LivingEntityFoodMixin.java b/common/src/main/java/draylar/identity/mixin/LivingEntityFoodMixin.java deleted file mode 100644 index 41b04dc..0000000 --- a/common/src/main/java/draylar/identity/mixin/LivingEntityFoodMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.passive.WolfEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.FoodComponent; -import net.minecraft.item.FoodComponents; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Lazy; -import net.minecraft.world.World; -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; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.Arrays; -import java.util.List; - -@Mixin(LivingEntity.class) -public abstract class LivingEntityFoodMixin extends Entity { - - @Unique - private static final Lazy> WOLVES_IGNORE = new Lazy<>(() -> Arrays.asList(FoodComponents.CHICKEN, FoodComponents.PUFFERFISH, FoodComponents.ROTTEN_FLESH)); - - public LivingEntityFoodMixin(EntityType type, World world) { - super(type, world); - } - - @Inject( - method = "applyFoodEffects", - at = @At(value = "INVOKE", target = "Ljava/util/Iterator;hasNext()Z"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) - private void removeFleshHungerForWolves(ItemStack stack, World world, LivingEntity targetEntity, CallbackInfo ci, Item item) { - if((LivingEntity) (Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // If this player is a Wolf and the item they are eating is an item wolves are immune to, cancel the method. - if(identity instanceof WolfEntity) { - if(WOLVES_IGNORE.get().contains(item.getFoodComponent())) { - ci.cancel(); - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/LivingEntityMixin.java b/common/src/main/java/draylar/identity/mixin/LivingEntityMixin.java deleted file mode 100644 index 3ed792f..0000000 --- a/common/src/main/java/draylar/identity/mixin/LivingEntityMixin.java +++ /dev/null @@ -1,324 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.IdentityGranting; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.impl.NearbySongAccessor; -import draylar.identity.compat.LivingEntityCompatAccessor; -import draylar.identity.registry.IdentityEntityTags; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.*; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.SpiderEntity; -import net.minecraft.entity.passive.BatEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import static draylar.identity.Identity.identity$isAquatic; - -@Mixin(LivingEntity.class) -public abstract class LivingEntityMixin extends Entity implements NearbySongAccessor { - - @Shadow - protected abstract int getNextAirOnLand(int air); - - @Shadow - public abstract boolean hasStatusEffect(StatusEffect effect); - - protected LivingEntityMixin(EntityType type, World world) { - super(type, world); - } - - @Inject( - method = "onDeath", - at = @At("RETURN") - ) - private void onDeath(DamageSource source, CallbackInfo ci) { - Entity attacker = source.getAttacker(); - @Nullable IdentityType thisType = IdentityType.from((LivingEntity) (Object) this); - - // check if attacker is a player to grant identity - if (attacker instanceof PlayerEntity && thisType != null) { - IdentityGranting.grantByAttack((PlayerEntity) attacker, thisType); - } - } - - @Inject(method = "baseTick", at = @At("HEAD")) - private void identity$preventAirRegenForAquatic(CallbackInfo ci) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - if (identity$isAquatic(identity) && !player.isSubmergedInWater()) { - // Prevent air regen here if needed - player.setAir(Math.min(player.getAir(), player.getMaxAir())); - } - } - } - - - - - - - - @Redirect( - method = "travel", - at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;hasStatusEffect(Lnet/minecraft/entity/effect/StatusEffect;)Z", ordinal = 0) - ) - private boolean slowFall(LivingEntity livingEntity, StatusEffect effect) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null) { - if (!this.isSneaking()) { - EntityType type = identity.getType(); - if (type.isIn(IdentityEntityTags.SLOW_FALLING) || SafeTagManager.isCustomSlowFalling(type)) { - return true; - } - } - } - } - - return this.hasStatusEffect(StatusEffects.SLOW_FALLING); - } - -// @Unique -// private boolean identity$isAquatic(LivingEntity identity) { -// return identity != null && identity.getType().isIn(IdentityEntityTags.BREATHE_UNDERWATER); -// } - - - - @Inject(method = "baseTick", at = @At("HEAD")) - private void identity$suffocateAquaticIdentities(CallbackInfo ci) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity$isAquatic(identity)) { - boolean inWater = player.isTouchingWater(); - boolean inBubbleColumn = player.getWorld().getBlockState(player.getBlockPos()).isOf(Blocks.BUBBLE_COLUMN); - - int air = player.getAir(); - - if (!inWater && !inBubbleColumn) { - if (player.age % 40 == 0) { // reduce air every 10 ticks (0.5 sec) - if (air > 0) { - player.setAir(Math.max(air - 15, 0)); // drop by 15 to deplete in ~200 ticks - } else { - player.setAir(-1); // prevent re-damage spam - player.damage(player.getDamageSources().drown(), 2.0F); - } - } - } else { - if (air < player.getMaxAir()) { - player.setAir(player.getMaxAir()); - } - } - } - } - - } - @Redirect( - method = "baseTick", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/entity/LivingEntity;getNextAirOnLand(I)I" - ) - ) - private int identity$cancelAirRegenOnLand(LivingEntity instance, int air) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity$isAquatic(identity) - && !player.isTouchingWater() - && !player.getWorld().getBlockState(player.getBlockPos()).isOf(Blocks.BUBBLE_COLUMN)) { - - return air; - } - } - - - return ((LivingEntityCompatAccessor) instance).identity$getNextAirOnLand(air); - } - - - @Inject( - method = "handleFallDamage", - at = @At(value = "HEAD"), - cancellable = true - ) - private void handleFallDamage(float fallDistance, float damageMultiplier, DamageSource damageSource, CallbackInfoReturnable cir) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null) { - boolean takesFallDamage = identity.handleFallDamage(fallDistance, damageMultiplier, damageSource); - int damageAmount = ((LivingEntityCompatAccessor) identity).callComputeFallDamage(fallDistance, damageMultiplier); - - if (takesFallDamage && damageAmount > 0) { - LivingEntity.FallSounds fallSounds = identity.getFallSounds(); - this.playSound(damageAmount > 4 ? fallSounds.big() : fallSounds.small(), 1.0F, 1.0F); - ((LivingEntityCompatAccessor) identity).callPlayBlockFallSound(); - this.damage(getDamageSources().fall(), (float) damageAmount); - cir.setReturnValue(true); - } else { - cir.setReturnValue(false); - } - } - } - } - - @Inject( - method = "hasStatusEffect", - at = @At("HEAD"), - cancellable = true - ) - private void returnHasNightVision(StatusEffect effect, CallbackInfoReturnable cir) { - if ((Object) this instanceof PlayerEntity player) { - if (effect.equals(StatusEffects.NIGHT_VISION)) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // Apply 'Night Vision' status effect to player if they are a Bat - if (identity instanceof BatEntity) { - cir.setReturnValue(true); - } - } - } - } - - @Inject( - method = "getStatusEffect", - at = @At("HEAD"), - cancellable = true - ) - private void returnNightVisionInstance(StatusEffect effect, CallbackInfoReturnable cir) { - if ((Object) this instanceof PlayerEntity player) { - if (effect.equals(StatusEffects.NIGHT_VISION)) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // Apply 'Night Vision' status effect to player if they are a Bat - if (identity instanceof BatEntity) { - cir.setReturnValue(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 100000, 0, false, false)); - } - } - } - } - - @Inject(at = @At("HEAD"), method = "getEyeHeight", cancellable = true) - public void getEyeHeight(EntityPose pose, EntityDimensions dimensions, CallbackInfoReturnable cir) { - if((LivingEntity) (Object) this instanceof PlayerEntity player) { - - // this is cursed - try { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null) { - cir.setReturnValue(((LivingEntityCompatAccessor) identity).callGetEyeHeight(pose, dimensions)); - } - } catch (Exception ignored) {} - } - } - - @Inject(method = "hurtByWater", at = @At("HEAD"), cancellable = true) - protected void identity_hurtByWater(CallbackInfoReturnable cir) { - if((LivingEntity) (Object) this instanceof PlayerEntity player) { - LivingEntity entity = PlayerIdentity.getIdentity(player); - - if (entity != null) { - cir.setReturnValue(entity.hurtByWater()); - } - } - } - - @Inject(method = "canBreatheInWater", at = @At("HEAD"), cancellable = true) - private void identity_canBreatheInWater(CallbackInfoReturnable cir) { - if ((Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null) { - if (identity$isAquatic(identity)) { - cir.setReturnValue(true); - } else if (identity.getType().isIn(IdentityEntityTags.UNDROWNABLE) || SafeTagManager.isCustomUndrownable(identity.getType())) { - cir.setReturnValue(true); - } else { - cir.setReturnValue(false); - } - } - } - } - - - - - @Unique - private boolean nearbySongPlaying = false; - - @Environment(EnvType.CLIENT) - @Inject(method = "setNearbySongPlaying", at = @At("RETURN")) - protected void identity_setNearbySongPlaying(BlockPos songPosition, boolean playing, CallbackInfo ci) { - if((LivingEntity) (Object) this instanceof PlayerEntity player) { - nearbySongPlaying = playing; - } - } - - @Override - public boolean identity_isNearbySongPlaying() { - return nearbySongPlaying; - } - - @Inject(method = "isUndead", at = @At("HEAD"), cancellable = true) - protected void identity_isUndead(CallbackInfoReturnable cir) { - if((LivingEntity) (Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null) { - cir.setReturnValue(identity.isUndead()); - } - } - } - - @Inject(method = "canWalkOnFluid", at = @At("HEAD"), cancellable = true) - protected void identity_canWalkOnFluid(FluidState state, CallbackInfoReturnable cir) { - if((LivingEntity) (Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null && identity.getType().isIn(IdentityEntityTags.LAVA_WALKING) && state.isIn(FluidTags.LAVA)) { - cir.setReturnValue(true); - } - } - } - - @Inject( - method = "isClimbing", - at = @At("HEAD"), - cancellable = true - ) - protected void identity_allowSpiderClimbing(CallbackInfoReturnable cir) { - if((LivingEntity) (Object) this instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity instanceof SpiderEntity) { - cir.setReturnValue(this.horizontalCollision); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PiglinBrainMixin.java b/common/src/main/java/draylar/identity/mixin/PiglinBrainMixin.java deleted file mode 100644 index c852650..0000000 --- a/common/src/main/java/draylar/identity/mixin/PiglinBrainMixin.java +++ /dev/null @@ -1,54 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerHostility; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.registry.IdentityEntityTags; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.Monster; -import net.minecraft.entity.mob.PiglinBrain; -import net.minecraft.entity.mob.PiglinEntity; -import net.minecraft.entity.player.PlayerEntity; -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.CallbackInfoReturnable; - -@Mixin(PiglinBrain.class) -public class PiglinBrainMixin { - - @Inject( - method = "isPreferredAttackTarget", - at = @At("RETURN"), - cancellable = true - ) - private static void shouldAttackIdentity(PiglinEntity piglin, LivingEntity target, CallbackInfoReturnable cir) { - boolean shouldAttack = cir.getReturnValue(); - - if(shouldAttack && target instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - boolean hasHostility = PlayerHostility.hasHostility(player); - - if(identity != null) { - // Piglins should not attack Piglins or Piglin Brutes, unless they have hostility - if (identity.getType().isIn(IdentityEntityTags.PIGLIN_FRIENDLY) || SafeTagManager.isCustomPiglinFriendly(identity.getType())) { - cir.setReturnValue(false); - } - - // Player has an Identity but is not a piglin, check config for what to do - else { - if (IdentityConfig.getInstance().hostilesIgnoreHostileIdentityPlayer() && identity instanceof Monster) { - - // Check hostility for aggro on non-piglin hostiles - if(!hasHostility) { - cir.setReturnValue(false); - } else { - cir.setReturnValue(true); - } - } - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java b/common/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java deleted file mode 100644 index 0628e24..0000000 --- a/common/src/main/java/draylar/identity/mixin/PiglinBruteBrainMixin.java +++ /dev/null @@ -1,34 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.boss.WitherEntity; -import net.minecraft.entity.mob.AbstractPiglinEntity; -import net.minecraft.entity.mob.PiglinBruteBrain; -import net.minecraft.entity.mob.WitherSkeletonEntity; -import net.minecraft.entity.player.PlayerEntity; -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.CallbackInfoReturnable; - -@Mixin(PiglinBruteBrain.class) -public class PiglinBruteBrainMixin { - - /** - * @author Draylar - * - * @reason method_30255 is the desugared lambda used by method_30249 that searches for a nearby player to aggro on. - * This mixin modifies the search logic to exclude players disguised as anything besides a Wither Skeleton or Wither. - */ - @Inject( method = "method_30255", at = @At("HEAD"), expect = 0, cancellable = true) - private static void identity$method_30249FilterLambdaIntermediary(AbstractPiglinEntity abstractPiglinEntity, LivingEntity livingEntity, CallbackInfoReturnable cir) { - if(livingEntity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null && !(identity instanceof WitherSkeletonEntity) && !(identity instanceof WitherEntity)) { - cir.setReturnValue(false); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerAdvancementTrackerMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerAdvancementTrackerMixin.java deleted file mode 100644 index 713bf6f..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerAdvancementTrackerMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.Identity; -import draylar.identity.api.FlightHelper; -import draylar.identity.api.platform.IdentityConfig; -import net.minecraft.advancement.Advancement; -import net.minecraft.advancement.PlayerAdvancementTracker; -import net.minecraft.server.network.ServerPlayerEntity; -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.CallbackInfoReturnable; - -@Mixin(PlayerAdvancementTracker.class) -public class PlayerAdvancementTrackerMixin { - - @Shadow private ServerPlayerEntity owner; - - @Inject( - method = "grantCriterion", - at = @At(value = "INVOKE", target = "Lnet/minecraft/advancement/AdvancementRewards;apply(Lnet/minecraft/server/network/ServerPlayerEntity;)V") - ) - private void refreshFlight(Advancement advancement, String criterionName, CallbackInfoReturnable cir) { - if(Identity.hasFlyingPermissions(owner)) { - FlightHelper.grantFlightTo(owner); - owner.getAbilities().setFlySpeed(IdentityConfig.getInstance().flySpeed()); - owner.sendAbilitiesUpdate(); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerByteStatusMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerByteStatusMixin.java deleted file mode 100644 index 2d4d25e..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerByteStatusMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import org.jetbrains.annotations.Nullable; -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; - -@SuppressWarnings("ConstantConditions") -@Mixin(PlayerEntity.class) -public class PlayerByteStatusMixin { - - // When a player receives a handleStatus byte, pass it on to their Identity. - @Inject(method = "handleStatus", at = @At("RETURN")) - private void identity$passByteStatus(byte status, CallbackInfo ci) { - @Nullable LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - if(identity != null) { - identity.handleStatus(status); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerEntityAttackMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerEntityAttackMixin.java deleted file mode 100644 index 6ee93f3..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerEntityAttackMixin.java +++ /dev/null @@ -1,46 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.IdentityGranting; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.variant.IdentityType; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.World; -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; - -@Mixin(PlayerEntity.class) -public abstract class PlayerEntityAttackMixin extends LivingEntity { - - private PlayerEntityAttackMixin(EntityType entityType, World world) { - super(entityType, world); - } - - @Inject( - method = "attack", - at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;handleAttack(Lnet/minecraft/entity/Entity;)Z"), cancellable = true) - private void identityAttack(Entity target, CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity != null) { - if(getMainHandStack().isEmpty()) { - try { - identity.tryAttack(target); - ci.cancel(); - - // If the target died, grant identity - if(!target.isAlive() && target instanceof LivingEntity living) { - IdentityGranting.grantByAttack((PlayerEntity) (Object) this, IdentityType.from(living)); - } - } catch (Exception e) { - // FALL BACK TO DEFAULT BEHAVIOR. - // Some mobs do not override, so it defaults to attack damage attribute, but the identity does not have any - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java deleted file mode 100644 index 81f0b0b..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java +++ /dev/null @@ -1,392 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.Identity; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.compat.LivingEntityCompatAccessor; -import draylar.identity.mixin.accessor.*; -import draylar.identity.registry.IdentityEntityTags; -import draylar.identity.util.AttributeSync; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.*; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.mob.RavagerEntity; -import net.minecraft.entity.mob.WardenEntity; -import net.minecraft.entity.passive.IronGolemEntity; -import net.minecraft.entity.passive.TameableEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(PlayerEntity.class) -public abstract class PlayerEntityMixin extends LivingEntityMixin { - - @Shadow public abstract boolean isSpectator(); - @Shadow public abstract EntityDimensions getDimensions(EntityPose pose); - @Shadow public abstract boolean isSwimming(); - - private PlayerEntityMixin(EntityType type, World world) { - super(type, world); - } - - @Inject(method = "tick", at = @At("HEAD")) - private void identity$loadForcedIdentity(CallbackInfo ci) { - if((Object) this instanceof ServerPlayerEntity serverPlayerEntity) { - @Nullable LivingEntity active = PlayerIdentity.getIdentity(serverPlayerEntity); - if(active == null) { - @Nullable String forced = IdentityConfig.getInstance().getForcedIdentity(); - if(forced != null) { - EntityType foundType = Registries.ENTITY_TYPE.get(new Identifier(forced)); - if(foundType != null) { - PlayerIdentity.updateIdentity(serverPlayerEntity, new IdentityType( - foundType - ), (LivingEntity) foundType.create(getWorld())); - } - } - } - } - } - - @Inject(method = "getDimensions", at = @At("HEAD"), cancellable = true) - private void getDimensions(EntityPose pose, CallbackInfoReturnable cir) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if (identity != null) { - // Récupère les dimensions dynamiques de l'identité, selon la pose actuelle du joueur - cir.setReturnValue(identity.getDimensions(pose)); - } - } - - /** - * When a player turns into an Aquatic identity, they lose breath outside water. - * - * @param ci mixin callback info - */ - @Inject( - method = "tick", - at = @At("HEAD") - ) - private void tickAquaticBreathingOutsideWater(CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity != null) { - if(Identity.identity$isAquatic(identity)) { - int air = this.getAir(); - - // copy of WaterCreatureEntity#tickWaterBreathingAir - if(this.isAlive() && !this.isInsideWaterOrBubbleColumn()) { - int i = EnchantmentHelper.getRespiration((LivingEntity) (Object) this); - - // If the player has respiration, 50% chance to not consume air - if(i > 0) { - if(random.nextInt(i + 1) <= 0) { - this.setAir(air - 1); - } - } - - // No respiration, decrease air as normal - else { - this.setAir(air - 1); - } - - // Air has ran out, start drowning - if(this.getAir() == -20) { - this.setAir(0); - this.damage(getDamageSources().drown(), 2.0F); - } - } else { - this.setAir(300); - } - } - } - } - - @Inject(method = "getActiveEyeHeight", at = @At("HEAD"), cancellable = true) - private void identity_getActiveEyeHeight(EntityPose pose, EntityDimensions dimensions, CallbackInfoReturnable cir) { - PlayerEntity playerEntity = (PlayerEntity) (Object) this; - - // cursed - try { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity != null) { - cir.setReturnValue(((LivingEntityCompatAccessor) identity).callGetActiveEyeHeight(getPose(), getDimensions(getPose()))); - } - } catch (Exception ignored) { - - } - } - - @Environment(EnvType.CLIENT) - @Override - public float getEyeHeight(EntityPose pose) { - PlayerEntity playerEntity = (PlayerEntity) (Object) this; - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity != null) { - return identity.getEyeHeight(pose); - } else { - return this.getEyeHeight(pose, this.getDimensions(pose)); - } - } - - @Inject( - method = "getHurtSound", - at = @At("HEAD"), - cancellable = true - ) - private void getHurtSound(DamageSource source, CallbackInfoReturnable cir) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(IdentityConfig.getInstance().useIdentitySounds() && identity != null) { - cir.setReturnValue(((LivingEntityCompatAccessor) identity).callGetHurtSound(source)); - } - } - - - // todo: separate mixin for ambient sounds - private int identity_ambientSoundChance = 0; - - @Inject( - method = "tick", - at = @At("HEAD") - ) - private void tickAmbientSounds(CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(!getWorld().isClient && IdentityConfig.getInstance().playAmbientSounds() && identity instanceof MobEntity) { - MobEntity mobIdentity = (MobEntity) identity; - - if(this.isAlive() && this.random.nextInt(1000) < this.identity_ambientSoundChance++) { - // reset sound delay - this.identity_ambientSoundChance = -mobIdentity.getMinAmbientSoundDelay(); - - // play ambient sound - SoundEvent sound = ((MobEntityAccessor) mobIdentity).callGetAmbientSound(); - if(sound != null) { - float volume = ((LivingEntityCompatAccessor) mobIdentity).callGetSoundVolume(); - float pitch = ((LivingEntityCompatAccessor) mobIdentity).callGetSoundPitch(); - - // By default, players can not hear their own ambient noises. - // This is because ambient noises can be very annoying. - if(IdentityConfig.getInstance().hearSelfAmbient()) { - this.getWorld().playSound(null, this.getX(), this.getY(), this.getZ(), sound, this.getSoundCategory(), volume, pitch); - } else { - this.getWorld().playSound((PlayerEntity) (Object) this, this.getX(), this.getY(), this.getZ(), sound, this.getSoundCategory(), volume, pitch); - } - } - } - } - } - - @Inject( - method = "getDeathSound", - at = @At("HEAD"), - cancellable = true - ) - private void getDeathSound(CallbackInfoReturnable cir) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(IdentityConfig.getInstance().useIdentitySounds() && identity != null) { - cir.setReturnValue(((LivingEntityCompatAccessor) identity).callGetDeathSound()); - } - } - - @Inject( - method = "getFallSounds", - at = @At("HEAD"), - cancellable = true - ) - private void getFallSounds(CallbackInfoReturnable cir) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(IdentityConfig.getInstance().useIdentitySounds() && identity != null) { - cir.setReturnValue(identity.getFallSounds()); - } - } - - @Inject(method = "attack", at = @At("HEAD")) - protected void identity_tryAttack(Entity target, CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity instanceof IronGolemEntity golem) { - ((IronGolemEntityAccessor) golem).setAttackTicksLeft(10); - } - - if(identity instanceof WardenEntity warden) { - warden.attackingAnimationState.start(age); - } - - if(identity instanceof RavagerEntity ravager) { - ((RavagerEntityAccessor) ravager).setAttackTick(10); - } - } - - @Inject(method = "tick", at = @At("HEAD")) - private void tickGolemAttackTicks(CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity instanceof IronGolemEntity golem) { - IronGolemEntityAccessor accessor = (IronGolemEntityAccessor) golem; - if(accessor.getAttackTicksLeft() > 0) { - accessor.setAttackTicksLeft(accessor.getAttackTicksLeft() - 1); - } - } - } - - @Inject(method = "tick", at = @At("HEAD")) - private void tickRavagerAttackTicks(CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity instanceof RavagerEntity ravager) { - RavagerEntityAccessor accessor = (RavagerEntityAccessor) ravager; - if(accessor.getAttackTick() > 0) { - accessor.setAttackTick(accessor.getAttackTick() - 1); - } - } - } - - @Inject(method = "tick", at = @At("HEAD")) - private void tickWardenSneakingAnimation(CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - - if(identity instanceof WardenEntity warden) { - if(isSneaking()) { - if(!warden.sniffingAnimationState.isRunning()) { - warden.sniffingAnimationState.start(age); - } - } else { - warden.sniffingAnimationState.stop(); - } - } - } - - @Inject(method = "tick", at = @At("HEAD")) - private void tickFire(CallbackInfo ci) { - PlayerEntity player = (PlayerEntity) (Object) this; - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (!player.getWorld().isClient && !player.isCreative() && !player.isSpectator()) { - if (identity != null) { - EntityType type = identity.getType(); - - if (type.isIn(IdentityEntityTags.BURNS_IN_DAYLIGHT) || SafeTagManager.isCustomBurnsInDaylight(type)) { - boolean bl = this.isInDaylight(); - - if (bl) { - if (player.getWorld().isRaining()) return; - - ItemStack helmet = player.getEquippedStack(EquipmentSlot.HEAD); - if (!helmet.isEmpty() && helmet.isDamageable()) { - helmet.setDamage(helmet.getDamage() + player.getRandom().nextInt(2)); - if (helmet.getDamage() >= helmet.getMaxDamage()) { - player.sendEquipmentBreakStatus(EquipmentSlot.HEAD); - player.equipStack(EquipmentSlot.HEAD, ItemStack.EMPTY); - } - - bl = false; - } - - if (bl) { - player.setOnFireFor(8); - } - } - } - } - } - } - - - @Unique - private boolean isInDaylight() { - if(getWorld().isDay() && !getWorld().isClient) { - float brightnessAtEyes = getBrightnessAtEyes(); - BlockPos daylightTestPosition = new BlockPos((int) getX(), (int) Math.round(getY()), (int) getZ()); - - // move test position up one block for boats - if(getVehicle() instanceof BoatEntity) { - daylightTestPosition = daylightTestPosition.up(); - } - - return brightnessAtEyes > 0.5F && random.nextFloat() * 30.0F < (brightnessAtEyes - 0.4F) * 2.0F && getWorld().isSkyVisible(daylightTestPosition); - } - - return false; - } - - @Inject(method = "tick", at = @At("HEAD")) - private void tickTemperature(CallbackInfo ci) { - PlayerEntity player = (PlayerEntity) (Object) this; - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(!player.isCreative() && !player.isSpectator()) { - // check if the player is identity - if(identity != null) { - EntityType type = identity.getType(); - - // damage player if they are an identity that gets hurt by high temps (eg. snow golem in nether) - if(type.isIn(IdentityEntityTags.HURT_BY_HIGH_TEMPERATURE) || SafeTagManager.isCustomHurtByHeat(type)) { - Biome biome = getWorld().getBiome(getBlockPos()).value(); - if (!biome.isCold(getBlockPos())) { - player.damage(getDamageSources().onFire(), 1.0f); - } - } - } - } - } - - @Inject(method = "tick", at = @At("HEAD")) - private void tickIdentity(CallbackInfo ci) { - if(!getWorld().isClient) { - PlayerEntity player = (PlayerEntity) (Object) this; - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // assign basic data to entity from player on server; most data transferring occurs on client - if(identity != null) { - identity.setPos(player.getX(), player.getY(), player.getZ()); - identity.setHeadYaw(player.getHeadYaw()); - identity.setJumping(((LivingEntityCompatAccessor) player).isJumping()); - identity.setSprinting(player.isSprinting()); - identity.setStuckArrowCount(player.getStuckArrowCount()); - identity.setInvulnerable(true); - identity.setNoGravity(true); - identity.setSneaking(player.isSneaking()); - identity.setSwimming(player.isSwimming()); - identity.setCurrentHand(player.getActiveHand()); - identity.setPose(player.getPose()); - - if(identity instanceof TameableEntity) { - ((TameableEntity) identity).setInSittingPose(player.isSneaking()); - ((TameableEntity) identity).setSitting(player.isSneaking()); - } - - ((EntityAccessor) identity).identity_callSetFlag(7, player.isFallFlying()); - - ((LivingEntityCompatAccessor) identity).callTickActiveItemStack(); - PlayerIdentity.sync((ServerPlayerEntity) player); // safe cast - context is server world - AttributeSync.syncMaxHealth((ServerPlayerEntity) player); - - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java deleted file mode 100644 index 4bdc8ec..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerEntityRendererMixin.java +++ /dev/null @@ -1,255 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.model.ArmRenderingManipulator; -import draylar.identity.api.model.EntityArms; -import draylar.identity.api.model.EntityUpdater; -import draylar.identity.api.model.EntityUpdaters; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.mixin.accessor.EntityAccessor; -import draylar.identity.compat.LivingEntityCompatAccessor; -import draylar.identity.mixin.accessor.LivingEntityRendererAccessor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.*; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.mob.PhantomEntity; -import net.minecraft.entity.passive.TameableEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Arm; -import net.minecraft.util.Hand; -import net.minecraft.util.Pair; -import net.minecraft.util.math.Vec3d; -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.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - - -@Mixin(PlayerEntityRenderer.class) -public abstract class PlayerEntityRendererMixin extends LivingEntityRenderer> { - - @Shadow - protected static BipedEntityModel.ArmPose getArmPose(AbstractClientPlayerEntity player, Hand hand) { - return null; - } - - private PlayerEntityRendererMixin(EntityRendererFactory.Context ctx, PlayerEntityModel model, float shadowRadius) { - super(ctx, model, shadowRadius); - } - - @Inject( - method = "render", - at = @At("HEAD"), - cancellable = true - ) - private void onRenderInject(AbstractClientPlayerEntity player, float f, float g, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int light, CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if (identity != null) { - // === SYNC player → identity === - LimbAnimatorAccessor target = (LimbAnimatorAccessor) identity.limbAnimator; - LimbAnimatorAccessor source = (LimbAnimatorAccessor) player.limbAnimator; - - target.setPrevSpeed(source.getPrevSpeed()); - target.setSpeed(source.getSpeed()); - target.setPos(source.getPos()); - - identity.handSwinging = player.handSwinging; - identity.handSwingTicks = player.handSwingTicks; - identity.lastHandSwingProgress = player.lastHandSwingProgress; - identity.handSwingProgress = player.handSwingProgress; - identity.bodyYaw = player.bodyYaw; - identity.prevBodyYaw = player.prevBodyYaw; - identity.headYaw = player.headYaw; - identity.prevHeadYaw = player.prevHeadYaw; - identity.age = player.age; - identity.preferredHand = player.preferredHand; - identity.setOnGround(player.isOnGround()); - identity.setVelocity(player.getVelocity()); - - ((EntityAccessor) identity).setVehicle(player.getVehicle()); - ((EntityAccessor) identity).setTouchingWater(player.isTouchingWater()); - - if (identity instanceof PhantomEntity) { - identity.setPitch(-player.getPitch()); - identity.prevPitch = -player.prevPitch; - } else { - identity.setPitch(player.getPitch()); - identity.prevPitch = player.prevPitch; - } - - if (IdentityConfig.getInstance().identitiesEquipItems()) { - identity.equipStack(EquipmentSlot.MAINHAND, player.getEquippedStack(EquipmentSlot.MAINHAND)); - identity.equipStack(EquipmentSlot.OFFHAND, player.getEquippedStack(EquipmentSlot.OFFHAND)); - } - - if (IdentityConfig.getInstance().identitiesEquipArmor()) { - identity.equipStack(EquipmentSlot.HEAD, player.getEquippedStack(EquipmentSlot.HEAD)); - identity.equipStack(EquipmentSlot.CHEST, player.getEquippedStack(EquipmentSlot.CHEST)); - identity.equipStack(EquipmentSlot.LEGS, player.getEquippedStack(EquipmentSlot.LEGS)); - identity.equipStack(EquipmentSlot.FEET, player.getEquippedStack(EquipmentSlot.FEET)); - } - - if (identity instanceof MobEntity) { - ((MobEntity) identity).setAttacking(player.isUsingItem()); - } - - identity.setPose(player.getPose()); - identity.setCurrentHand(player.getActiveHand() == null ? Hand.MAIN_HAND : player.getActiveHand()); - ((LivingEntityCompatAccessor) identity).callSetLivingFlag(1, player.isUsingItem()); - identity.getItemUseTime(); - ((LivingEntityCompatAccessor) identity).callTickActiveItemStack(); - - EntityUpdater updater = EntityUpdaters.getUpdater((EntityType) identity.getType()); - if (updater != null) { - updater.update(player, identity); - } - - // === RENDER === - @SuppressWarnings("unchecked") - EntityRenderer renderer = - (EntityRenderer) MinecraftClient.getInstance() - .getEntityRenderDispatcher().getRenderer(identity); - - - if (renderer instanceof LivingEntityRenderer livingRenderer) { - identity_setBipedIdentityModelPose(player, identity, livingRenderer); - } - - - renderer.render(identity, f, g, matrixStack, vertexConsumerProvider, light); - - - - if (IdentityConfig.getInstance().showPlayerNametag() && (player != MinecraftClient.getInstance().player || IdentityConfig.getInstance().shouldRenderOwnNameTag())) { - renderLabelIfPresent(player, player.getDisplayName(), matrixStack, vertexConsumerProvider, light); - } - - // ⛔ Prevent vanilla render from running - ci.cancel(); - } - } - - - - - - - - - - private void identity_setBipedIdentityModelPose(AbstractClientPlayerEntity player, LivingEntity identity, LivingEntityRenderer identityRenderer) { - if (!(identityRenderer.getModel() instanceof BipedEntityModel identityBipedModel)) { - return; // Don't crash on non-humanoid models like CodModel - } - - if (identity.isSpectator()) { - identityBipedModel.setVisible(false); - identityBipedModel.head.visible = true; - identityBipedModel.hat.visible = true; - } else { - identityBipedModel.setVisible(true); - identityBipedModel.hat.visible = player.isPartVisible(PlayerModelPart.HAT); - identityBipedModel.sneaking = identity.isInSneakingPose(); - - BipedEntityModel.ArmPose mainHandPose = getArmPose(player, Hand.MAIN_HAND); - BipedEntityModel.ArmPose offHandPose = getArmPose(player, Hand.OFF_HAND); - - if (mainHandPose.isTwoHanded()) { - offHandPose = identity.getOffHandStack().isEmpty() ? BipedEntityModel.ArmPose.EMPTY : BipedEntityModel.ArmPose.ITEM; - } - - if (identity.getMainArm() == Arm.RIGHT) { - identityBipedModel.rightArmPose = mainHandPose; - identityBipedModel.leftArmPose = offHandPose; - } else { - identityBipedModel.rightArmPose = offHandPose; - identityBipedModel.leftArmPose = mainHandPose; - } - } - } - - @Inject( - method = "getPositionOffset", - at = @At("HEAD"), - cancellable = true - ) - private void modifyPositionOffset(AbstractClientPlayerEntity player, float f, CallbackInfoReturnable cir) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null) { - if(identity instanceof TameableEntity) { - cir.setReturnValue(super.getPositionOffset(player, f)); - } - } - } - - @Inject( - method = "renderArm", - at = @At("HEAD"), cancellable = true) - private void onRenderArm(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, AbstractClientPlayerEntity player, ModelPart arm, ModelPart sleeve, CallbackInfo ci) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // sync player data to identity identity - if(identity != null) { - EntityRenderer renderer = MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(identity); - - if(renderer instanceof LivingEntityRenderer) { - LivingEntityRenderer rendererCasted = (LivingEntityRenderer) renderer; - EntityModel model = ((LivingEntityRenderer) renderer).getModel(); - - // re-assign arm & sleeve models - arm = null; - sleeve = null; - - if(model instanceof PlayerEntityModel) { - arm = ((PlayerEntityModel) model).rightArm; - sleeve = ((PlayerEntityModel) model).rightSleeve; - } else if(model instanceof BipedEntityModel) { - arm = ((BipedEntityModel) model).rightArm; - sleeve = null; - } else { - Pair> pair = EntityArms.get(identity, model); - if(pair != null) { - arm = pair.getLeft(); - pair.getRight().run(matrices, model); - matrices.translate(0, -.35, .5); - } - } - - // assign model properties - model.handSwingProgress = 0.0F; -// model.sneaking = false; -// model.leaningPitch = 0.0F; - model.setAngles(identity, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F); - - // render - if(arm != null) { - arm.pitch = 0.0F; - arm.render(matrices, vertexConsumers.getBuffer(((LivingEntityRendererAccessor) rendererCasted).callGetRenderLayer(identity, true, false, true)), light, OverlayTexture.DEFAULT_UV); - } - - if(sleeve != null) { - sleeve.pitch = 0.0F; - sleeve.render(matrices, vertexConsumers.getBuffer(((LivingEntityRendererAccessor) rendererCasted).callGetRenderLayer(identity, true, false, true)), light, OverlayTexture.DEFAULT_UV); - } - - ci.cancel(); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java deleted file mode 100644 index 3953b22..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerManagerMixin.java +++ /dev/null @@ -1,51 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.event.PlayerJoinCallback; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.impl.DimensionsRefresher; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.network.ClientConnection; -import net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayerEntity; -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 org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(PlayerManager.class) -public class PlayerManagerMixin { - - @Inject(at = @At( - value = "INVOKE", - target = "Lnet/minecraft/server/network/ServerPlayNetworkHandler;sendPacket(Lnet/minecraft/network/packet/Packet;)V", - ordinal = 0 - ), method = "onPlayerConnect") - private void connect(ClientConnection connection, ServerPlayerEntity player, CallbackInfo ci) { - PlayerJoinCallback.EVENT.invoker().onPlayerJoin(player); - } - - @Inject( - method = "respawnPlayer", - at = @At("RETURN") - ) - private void onRespawn(ServerPlayerEntity player, boolean alive, CallbackInfoReturnable cir) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // refresh entity hitbox dimensions after death - ((DimensionsRefresher) player).identity_refreshDimensions(); - - // Re-sync max health for identity - if(identity != null && IdentityConfig.getInstance().scalingHealth()) { - float prevMax = player.getMaxHealth(); - float ratio = prevMax <= 0 ? 1.0F : player.getHealth() / prevMax; - float newMax = Math.min(IdentityConfig.getInstance().maxHealth(), identity.getMaxHealth()); - player.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH).setBaseValue(newMax); - player.setHealth(Math.max(1.0F, ratio * newMax)); - player.networkHandler.sendPacket(new EntityAttributesS2CPacket(player.getId(), player.getAttributes().getAttributesToSend())); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerSonicBoomMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerSonicBoomMixin.java deleted file mode 100644 index 5481997..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerSonicBoomMixin.java +++ /dev/null @@ -1,98 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.impl.SonicBoomUser; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityStatuses; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.mob.WardenEntity; -import net.minecraft.entity.passive.WolfEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -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; - -import java.util.HashSet; -import java.util.Set; - -@SuppressWarnings("ConstantConditions") -@Mixin(PlayerEntity.class) -public abstract class PlayerSonicBoomMixin extends LivingEntity implements SonicBoomUser { - - @Unique - private int identity$ability_wardenBoomDelay = -1; - - private PlayerSonicBoomMixin(EntityType type, World world) { - super(type, world); - } - - @Override - public void identity$ability_startSonicBoom() { - @Nullable LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - if(identity instanceof WardenEntity) { - getWorld().sendEntityStatus(this, EntityStatuses.SONIC_BOOM); - identity$ability_wardenBoomDelay = 40; - - // SFX - getWorld().playSound(null, getX(), getY(), getZ(), SoundEvents.ENTITY_WARDEN_SONIC_CHARGE, SoundCategory.PLAYERS, 3.0f, 1.0f); - } - } - - @Inject(method = "tick", at = @At("HEAD")) - private void tickSonicBoom(CallbackInfo ci) { - if(!getWorld().isClient) { - identity$ability_wardenBoomDelay = Math.max(-1, identity$ability_wardenBoomDelay - 1); - if(identity$ability_wardenBoomDelay == 0) { - - // SFX - getWorld().playSound(null, getX(), getY(), getZ(), SoundEvents.ENTITY_WARDEN_SONIC_BOOM, SoundCategory.PLAYERS, 3.0f, 1.0f); - - // Raycast out for sonic boom effect - float heightOffset = 1.6f; - int distance = 16; - Vec3d target = getPos().add(getRotationVector().multiply(distance)); - Vec3d source = getPos().add(0.0, heightOffset, 0.0); - Vec3d offsetToTarget = target.subtract(source); - Vec3d normalized = offsetToTarget.normalize(); - - // Spawn particles from the source to the target - Set hit = new HashSet<>(); - for (int particleIndex = 1; particleIndex < MathHelper.floor(offsetToTarget.length()) + 7; ++particleIndex) { - Vec3d particlePos = source.add(normalized.multiply(particleIndex)); - ((ServerWorld) getWorld()).spawnParticles(ParticleTypes.SONIC_BOOM, particlePos.x, particlePos.y, particlePos.z, 1, 0.0, 0.0, 0.0, 0.0); - - // Locate entities around the particle location for damage - hit.addAll(getWorld().getEntitiesByClass(LivingEntity.class, new Box(new BlockPos((int) particlePos.getX(), (int) particlePos.getY(), (int) particlePos.getZ())).expand(2), it -> !(it instanceof WolfEntity))); - } - - // Don't hit ourselves - hit.remove((PlayerEntity) (Object) this); - - // Find - for (Entity hitTarget : hit) { - if(hitTarget instanceof LivingEntity living) { - living.damage(getDamageSources().sonicBoom((PlayerEntity) (Object) this), 10.0f); - double vertical = 0.5 * (1.0 - living.getAttributeValue(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)); - double horizontal = 2.5 * (1.0 - living.getAttributeValue(EntityAttributes.GENERIC_KNOCKBACK_RESISTANCE)); - living.addVelocity(normalized.getX() * horizontal, normalized.getY() * vertical, normalized.getZ() * horizontal); - } - } - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/PlayerSwimmingMixin.java b/common/src/main/java/draylar/identity/mixin/PlayerSwimmingMixin.java deleted file mode 100644 index 2bd9be6..0000000 --- a/common/src/main/java/draylar/identity/mixin/PlayerSwimmingMixin.java +++ /dev/null @@ -1,29 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.registry.IdentityEntityTags; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.fluid.Fluid; -import net.minecraft.registry.tag.TagKey; -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; - -@Mixin(LivingEntity.class) -public class PlayerSwimmingMixin { - - @Inject( - method = "swimUpward", at = @At("HEAD"), cancellable = true) - private void onGolemSwimUp(TagKey fluid, CallbackInfo ci) { - LivingEntity thisEntity = (LivingEntity) (Object) this; - if(thisEntity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null && identity.getType().isIn(IdentityEntityTags.CANT_SWIM)) { - ci.cancel(); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java b/common/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java deleted file mode 100644 index 038cd3b..0000000 --- a/common/src/main/java/draylar/identity/mixin/RavagerEntityMixin.java +++ /dev/null @@ -1,67 +0,0 @@ -package draylar.identity.mixin; - -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.mob.RavagerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -@Mixin(RavagerEntity.class) -public abstract class RavagerEntityMixin extends LivingEntity { - - @Shadow @Nullable public abstract LivingEntity getControllingPassenger(); - - private RavagerEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - // todo: move to inject - @Override - public void travel(Vec3d movementInput) { - if (isAlive()) { - - // Ensure Ravager has a passenger - if (hasPassengers()) { - LivingEntity rider = (LivingEntity) getControllingPassenger(); - - // Only players should be able to control Ravager - if (rider instanceof PlayerEntity) { - // Assign rider properties to ravager - this.setYaw(rider.getYaw()); - this.prevYaw = this.getYaw(); - this.setPitch(rider.getPitch() * 0.5F); - this.setRotation(this.getYaw(), this.getPitch()); - this.bodyYaw = this.getYaw(); - this.headYaw = this.bodyYaw; - float sidewaysSpeed = rider.sidewaysSpeed * 0.5F; - float forwardSpeed = rider.forwardSpeed; - - // Going backwards, slow down! - if (forwardSpeed <= 0.0F) { - forwardSpeed *= 0.25F; - } - - // Update movement/velocity - if (this.isLogicalSideForUpdatingMovement()) { - this.setMovementSpeed((float) this.getAttributeValue(EntityAttributes.GENERIC_MOVEMENT_SPEED)); - super.travel(new Vec3d(sidewaysSpeed, movementInput.y, forwardSpeed)); - } else if (rider instanceof PlayerEntity) { - this.setVelocity(Vec3d.ZERO); - } - - // Limb updates for movement - this.updateLimbs(false); - return; - } - } - // Doesn't have a passenger, or passenger is not player, - // but still alive, fall back to default travel logic - super.travel(movementInput); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java b/common/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java deleted file mode 100644 index b6b9f91..0000000 --- a/common/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java +++ /dev/null @@ -1,119 +0,0 @@ -package draylar.identity.mixin; - -import com.mojang.authlib.GameProfile; -import draylar.identity.Identity; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.PlayerUnlocks; -import draylar.identity.api.FlightHelper; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.util.PlayerDebugUtils; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.network.encryption.PlayerPublicKey; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.text.Text; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.GameMode; -import net.minecraft.world.World; -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; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(ServerPlayerEntity.class) -public abstract class ServerPlayerEntityMixin extends PlayerEntity { - - @Shadow public abstract boolean isCreative(); - @Shadow public abstract boolean isSpectator(); - @Shadow public abstract void sendMessage(Text message, boolean actionBar); - - public ServerPlayerEntityMixin(World world, BlockPos pos, float yaw, GameProfile gameProfile) { - super(world, pos, yaw, gameProfile); - } - - @Inject( - method = "onDeath", - at = @At("HEAD") - ) - private void revokeIdentityOnDeath(DamageSource source, CallbackInfo ci) { - if(IdentityConfig.getInstance().revokeIdentityOnDeath() && !this.isCreative() && !this.isSpectator()) { - LivingEntity entity = PlayerIdentity.getIdentity(this); - - // revoke the identity current equipped by the player - if(entity != null) { - EntityType type = entity.getType(); - PlayerUnlocks.revoke((ServerPlayerEntity) (Object) this, PlayerIdentity.getIdentityType(this)); - PlayerIdentity.updateIdentity((ServerPlayerEntity) (Object) this, null,null); - - // todo: this option might be server-only given that this method isn't[?] called on the client - // send revoke message to player if they aren't in creative and the config option is on - if(IdentityConfig.getInstance().overlayIdentityRevokes()) { - sendMessage( - Text.translatable( - "identity.revoke_entity", - type.getTranslationKey() - ), true - ); - } - } - } - } - - @Inject( - method = "onSpawn()V", - at = @At("HEAD") - ) - private void onSpawn(CallbackInfo ci) { - ServerPlayerEntity player = (ServerPlayerEntity) (Object) this; - - // Force dimension recalculation (important!) - this.calculateDimensions(); - - // Réactiver le vol si nécessaire - if (Identity.hasFlyingPermissions(player)) { - if (!FlightHelper.hasFlight(player)) { - FlightHelper.grantFlightTo(player); - getAbilities().setFlySpeed(IdentityConfig.getInstance().flySpeed()); - sendAbilitiesUpdate(); - } - } - } - - @Inject(method = "onDeath", at = @At("RETURN")) - private void identity$handleDeath(DamageSource source, CallbackInfo ci) { - if ((Object) this instanceof ServerPlayerEntity player) { - // Optional: store anything temporarily if needed - } - } - - @Inject(method = "copyFrom", at = @At("RETURN")) - private void identity$restoreAfterRespawn(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo ci) { - PlayerIdentity.sync((ServerPlayerEntity) (Object) this); - } - @Inject(method = "changeGameMode", at = @At("TAIL")) - private void identity$onGameModeChange(GameMode newMode, CallbackInfoReturnable cir) { - ServerPlayerEntity player = (ServerPlayerEntity) (Object) this; - - if (Identity.hasFlyingPermissions(player)) { - FlightHelper.grantFlightTo(player); - getAbilities().setFlySpeed(IdentityConfig.getInstance().flySpeed()); - } else { - if (!player.isCreative() && !player.isSpectator()) { - FlightHelper.revokeFlight(player); - getAbilities().setFlySpeed(0.05f); - } - } - sendAbilitiesUpdate(); - } -// @Inject(method = "tick", at = @At("TAIL")) -// private void onServerTick(CallbackInfo ci) { -// PlayerDebugUtils.logPlayerDebug((PlayerEntity)(Object)this, "server"); -// } - -} diff --git a/common/src/main/java/draylar/identity/mixin/ShadowMixin.java b/common/src/main/java/draylar/identity/mixin/ShadowMixin.java deleted file mode 100644 index 4a15c8c..0000000 --- a/common/src/main/java/draylar/identity/mixin/ShadowMixin.java +++ /dev/null @@ -1,51 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.mixin.accessor.EntityShadowAccessor; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.WorldView; -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.ModifyVariable; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(EntityRenderDispatcher.class) -public abstract class ShadowMixin { - - @Unique - private static Entity identity_shadowEntity; - - @Inject( - method = "renderShadow", - at = @At("HEAD")) - private static void storeContext(MatrixStack matrices, VertexConsumerProvider vertexConsumers, Entity entity, float opacity, float tickDelta, WorldView world, float radius, CallbackInfo ci) { - identity_shadowEntity = entity; - } - - @ModifyVariable( - method = "renderShadow", - at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;lerp(DDD)D", ordinal = 0), index = 7) - private static float adjustShadowSize(float originalSize) { - if(identity_shadowEntity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null) { - EntityRenderer r = MinecraftClient.getInstance().getEntityRenderDispatcher().getRenderer(identity); - float shadowRadius = ((EntityShadowAccessor) r).getShadowRadius(); - float mod = identity.isBaby() ? .5f : 1; - return shadowRadius * mod; - } - } - - return originalSize; - } -} diff --git a/common/src/main/java/draylar/identity/mixin/StrayOverlayMixin.java b/common/src/main/java/draylar/identity/mixin/StrayOverlayMixin.java deleted file mode 100644 index 4bc866b..0000000 --- a/common/src/main/java/draylar/identity/mixin/StrayOverlayMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -package draylar.identity.mixin; - -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.feature.StrayOverlayFeatureRenderer; -import net.minecraft.client.render.entity.model.BipedEntityModel; -import net.minecraft.client.render.entity.model.EntityModel; -import net.minecraft.client.render.entity.model.SkeletonEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.ai.RangedAttackMob; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.mob.StrayEntity; -import org.spongepowered.asm.mixin.Final; -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(StrayOverlayFeatureRenderer.class) -public abstract class StrayOverlayMixin> extends FeatureRenderer { - - @Shadow @Final private SkeletonEntityModel model; - - public StrayOverlayMixin(FeatureRendererContext context) { - super(context); - } - - @Inject( - method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/entity/mob/MobEntity;FFFFFF)V", - at = @At("HEAD")) - private void onRender(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T mobEntity, float f, float g, float h, float j, float k, float l, CallbackInfo ci) { - M model = getContextModel(); - - if (model instanceof BipedEntityModel) { - ((BipedEntityModel) model).copyBipedStateTo(this.model); - ((BipedEntityModel) model).sneaking = mobEntity.isInSneakingPose(); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/SweetBerryBushBlockMixin.java b/common/src/main/java/draylar/identity/mixin/SweetBerryBushBlockMixin.java deleted file mode 100644 index 47cdcc3..0000000 --- a/common/src/main/java/draylar/identity/mixin/SweetBerryBushBlockMixin.java +++ /dev/null @@ -1,36 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.block.BlockState; -import net.minecraft.block.SweetBerryBushBlock; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.passive.BeeEntity; -import net.minecraft.entity.passive.FoxEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -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; - -@Mixin(SweetBerryBushBlock.class) -public class SweetBerryBushBlockMixin { - - @Inject( - method = "onEntityCollision", - at = @At(value = "HEAD"), - cancellable = true - ) - private void onDamage(BlockState state, World world, BlockPos pos, Entity entity, CallbackInfo ci) { - if(entity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // Cancel damage if the player's identity is a fox - if(identity instanceof FoxEntity || identity instanceof BeeEntity) { - ci.cancel(); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/ThreadedAnvilChunkStorageAccessor.java b/common/src/main/java/draylar/identity/mixin/ThreadedAnvilChunkStorageAccessor.java deleted file mode 100644 index ff291cf..0000000 --- a/common/src/main/java/draylar/identity/mixin/ThreadedAnvilChunkStorageAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin; - -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.server.world.ThreadedAnvilChunkStorage; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(ThreadedAnvilChunkStorage.class) -public interface ThreadedAnvilChunkStorageAccessor { - @Accessor - Int2ObjectMap getEntityTrackers(); -} diff --git a/common/src/main/java/draylar/identity/mixin/TrackTargetGoalMixin.java b/common/src/main/java/draylar/identity/mixin/TrackTargetGoalMixin.java deleted file mode 100644 index d464ea7..0000000 --- a/common/src/main/java/draylar/identity/mixin/TrackTargetGoalMixin.java +++ /dev/null @@ -1,22 +0,0 @@ -package draylar.identity.mixin; - -import net.minecraft.entity.ai.goal.TrackTargetGoal; -import net.minecraft.entity.mob.MobEntity; -import org.spongepowered.asm.mixin.Final; -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.CallbackInfoReturnable; - -@Mixin(TrackTargetGoal.class) -public abstract class TrackTargetGoalMixin { - @Shadow @Final protected MobEntity mob; - - @Shadow public abstract void stop(); - - @Inject(method = "shouldContinue", at = @At("RETURN"), cancellable = true) - protected void identity_shouldContinue(CallbackInfoReturnable cir) { - // NO-OP - } -} diff --git a/common/src/main/java/draylar/identity/mixin/VillagerEntityMixin.java b/common/src/main/java/draylar/identity/mixin/VillagerEntityMixin.java deleted file mode 100644 index dca93a4..0000000 --- a/common/src/main/java/draylar/identity/mixin/VillagerEntityMixin.java +++ /dev/null @@ -1,33 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -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.CallbackInfoReturnable; - -@Mixin(VillagerEntity.class) -public abstract class VillagerEntityMixin { - - @Shadow protected abstract void sayNo(); - - @Inject( - method = "interactMob", - at = @At("HEAD"), - cancellable = true - ) - private void onInteract(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - if(identity != null && identity.isUndead()) { - this.sayNo(); - cir.setReturnValue(ActionResult.SUCCESS); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/VillagerHostilesSensorMixin.java b/common/src/main/java/draylar/identity/mixin/VillagerHostilesSensorMixin.java deleted file mode 100644 index 71f74d5..0000000 --- a/common/src/main/java/draylar/identity/mixin/VillagerHostilesSensorMixin.java +++ /dev/null @@ -1,60 +0,0 @@ -package draylar.identity.mixin; - -import com.google.common.collect.ImmutableMap; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.platform.IdentityConfig; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.brain.sensor.VillagerHostilesSensor; -import net.minecraft.entity.player.PlayerEntity; -import org.spongepowered.asm.mixin.Final; -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.CallbackInfoReturnable; - -@Mixin(VillagerHostilesSensor.class) -public class VillagerHostilesSensorMixin { - - @Shadow @Final private static ImmutableMap, Float> SQUARED_DISTANCES_FOR_DANGER; - - @Inject( - method = "isHostile", - at = @At("HEAD"), - cancellable = true - ) - private void checkHostileIdentity(LivingEntity entity, CallbackInfoReturnable cir) { - if(entity instanceof PlayerEntity player) { - // check if we should be performing this from config - if(IdentityConfig.getInstance().villagersRunFromIdentities()) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // check if identity is valid & if it is a type villagers run from - if (identity != null && SQUARED_DISTANCES_FOR_DANGER.containsKey(identity.getType())) { - cir.setReturnValue(true); - } - } - } - } - - @Inject( - method = "isCloseEnoughForDanger", - at = @At("HEAD"), - cancellable = true - ) - private void checkPlayerDanger(LivingEntity villager, LivingEntity potentialPlayer, CallbackInfoReturnable cir) { - // should only be called if the above mixin passes, so we can assume the config option is true - if(potentialPlayer instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // check if identity is valid & if it is a type villagers run from - if (identity != null && SQUARED_DISTANCES_FOR_DANGER.containsKey(identity.getType())) { - float f = SQUARED_DISTANCES_FOR_DANGER.get(identity.getType()); - cir.setReturnValue(potentialPlayer.squaredDistanceTo(villager) <= (double) (f * f)); - } else { - cir.setReturnValue(false); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/WolfEntityMixin.java b/common/src/main/java/draylar/identity/mixin/WolfEntityMixin.java deleted file mode 100644 index 219eff3..0000000 --- a/common/src/main/java/draylar/identity/mixin/WolfEntityMixin.java +++ /dev/null @@ -1,52 +0,0 @@ -package draylar.identity.mixin; - -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.registry.IdentityEntityTags; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.ActiveTargetGoal; -import net.minecraft.entity.passive.TameableEntity; -import net.minecraft.entity.passive.WolfEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.World; -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; - -@Mixin(WolfEntity.class) -public abstract class WolfEntityMixin extends TameableEntity { - - private WolfEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - @Inject( - method = "initGoals", - at = @At("RETURN") - ) - private void addPlayerTarget(CallbackInfo ci) { - this.targetSelector.add(7, new ActiveTargetGoal<>(this, PlayerEntity.class, 10, false, false, player -> { - // ensure wolves can attack players with an identity similar to their normal prey - if(!IdentityConfig.getInstance().wolvesAttackIdentityPrey()) { - return false; - } - - LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) player); - - // wolves should ignore players that look like their prey if they have an owner, - // unless the config option is turned to true - LivingEntity owner = this.getOwner(); - if(owner != null || IdentityConfig.getInstance().ownedWolvesAttackIdentityPrey()) { - return false; - } - - return identity != null && ( - identity.getType().isIn(IdentityEntityTags.WOLF_PREY) || - SafeTagManager.isCustomWolfPrey(identity.getType()) - ); - })); - } -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/AxolotlEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/AxolotlEntityAccessor.java deleted file mode 100644 index a7325ba..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/AxolotlEntityAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.passive.AxolotlEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(AxolotlEntity.class) -public interface AxolotlEntityAccessor { - - @Invoker - void callSetVariant(AxolotlEntity.Variant variant); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/BiomeAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/BiomeAccessor.java deleted file mode 100644 index 0394f9c..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/BiomeAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.biome.Biome; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(Biome.class) -public interface BiomeAccessor { - @Invoker - float callComputeTemperature(BlockPos pos); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/BlazeEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/BlazeEntityModelAccessor.java deleted file mode 100644 index 196e4c4..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/BlazeEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.BlazeEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(BlazeEntityModel.class) -public interface BlazeEntityModelAccessor { - @Accessor - ModelPart[] getRods(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/CreeperEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/CreeperEntityAccessor.java deleted file mode 100644 index e06ff35..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/CreeperEntityAccessor.java +++ /dev/null @@ -1,11 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.mob.CreeperEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(CreeperEntity.class) -public interface CreeperEntityAccessor { - @Accessor - void setCurrentFuseTime(int currentFuseTime); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/EntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/EntityAccessor.java deleted file mode 100644 index c4265e4..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/EntityAccessor.java +++ /dev/null @@ -1,18 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.Entity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(Entity.class) -public interface EntityAccessor { - @Accessor - void setTouchingWater(boolean touchingWater); - - @Accessor - void setVehicle(Entity vehicle); - - @Invoker("setFlag") - void identity_callSetFlag(int index, boolean value); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/EntityShadowAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/EntityShadowAccessor.java deleted file mode 100644 index 174074d..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/EntityShadowAccessor.java +++ /dev/null @@ -1,11 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.render.entity.EntityRenderer; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(EntityRenderer.class) -public interface EntityShadowAccessor { - @Accessor - float getShadowRadius(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/IllagerEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/IllagerEntityModelAccessor.java deleted file mode 100644 index 3f6a4f6..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/IllagerEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.IllagerEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(IllagerEntityModel.class) -public interface IllagerEntityModelAccessor { - @Accessor - ModelPart getRightArm(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/IronGolemEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/IronGolemEntityAccessor.java deleted file mode 100644 index c2371b5..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/IronGolemEntityAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.passive.IronGolemEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(IronGolemEntity.class) -public interface IronGolemEntityAccessor { - @Accessor - int getAttackTicksLeft(); - - @Accessor - void setAttackTicksLeft(int attackTicksLeft); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/LivingEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/LivingEntityAccessor.java deleted file mode 100644 index f4b7ac1..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/LivingEntityAccessor.java +++ /dev/null @@ -1,55 +0,0 @@ -package draylar.identity.mixin.accessor; - -import draylar.identity.compat.LivingEntityCompatAccessor; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.sound.SoundEvent; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(LivingEntity.class) -public interface LivingEntityAccessor extends LivingEntityCompatAccessor { - - - @Accessor - boolean isJumping(); - - @Invoker - float callGetActiveEyeHeight(EntityPose pose, EntityDimensions dimensions); - - @Invoker - void callTickActiveItemStack(); - - @Invoker - SoundEvent callGetHurtSound(DamageSource source); - - @Invoker - SoundEvent callGetDeathSound(); - - @Invoker - void callPlayBlockFallSound(); - - @Invoker - int callComputeFallDamage(float fallDistance, float damageMultiplier); - - @Invoker - float callGetSoundVolume(); - - @Invoker - float callGetSoundPitch(); - - @Invoker - void callSetLivingFlag(int mask, boolean value); - - @Invoker - float callGetEyeHeight(EntityPose pose, EntityDimensions dimensions); - - // 🔥 Add this to access getNextAirOnLand(int) - @Invoker("getNextAirOnLand") - int identity$getNextAirOnLand(int air); - - -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/LivingEntityRendererAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/LivingEntityRendererAccessor.java deleted file mode 100644 index 5c762aa..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/LivingEntityRendererAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.entity.LivingEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(LivingEntityRenderer.class) -public interface LivingEntityRendererAccessor { - @Invoker - RenderLayer callGetRenderLayer(LivingEntity entity, boolean showBody, boolean translucent, boolean showOutline); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/LlamaEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/LlamaEntityModelAccessor.java deleted file mode 100644 index 9f87bbb..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/LlamaEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.LlamaEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(LlamaEntityModel.class) -public interface LlamaEntityModelAccessor { - @Accessor - ModelPart getRightFrontLeg(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/MobEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/MobEntityAccessor.java deleted file mode 100644 index bb2755a..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/MobEntityAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.sound.SoundEvent; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(MobEntity.class) -public interface MobEntityAccessor { - @Invoker - SoundEvent callGetAmbientSound(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/OcelotEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/OcelotEntityModelAccessor.java deleted file mode 100644 index 43ae0a9..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/OcelotEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.OcelotEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(OcelotEntityModel.class) -public interface OcelotEntityModelAccessor { - @Accessor - ModelPart getRightFrontLeg(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/ParrotEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/ParrotEntityAccessor.java deleted file mode 100644 index 6f0a616..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/ParrotEntityAccessor.java +++ /dev/null @@ -1,11 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.passive.ParrotEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(ParrotEntity.class) -public interface ParrotEntityAccessor { - @Invoker - void callFlapWings(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/QuadrupedEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/QuadrupedEntityModelAccessor.java deleted file mode 100644 index a81e2ca..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/QuadrupedEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.QuadrupedEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(QuadrupedEntityModel.class) -public interface QuadrupedEntityModelAccessor { - @Accessor - ModelPart getRightFrontLeg(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/RavagerEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/RavagerEntityAccessor.java deleted file mode 100644 index 6bbdf43..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/RavagerEntityAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.mob.RavagerEntity; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(RavagerEntity.class) -public interface RavagerEntityAccessor { - @Accessor - int getAttackTick(); - - @Accessor - void setAttackTick(int attackTick); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/RavagerEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/RavagerEntityModelAccessor.java deleted file mode 100644 index eee7e55..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/RavagerEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.RavagerEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(RavagerEntityModel.class) -public interface RavagerEntityModelAccessor { - @Accessor - ModelPart getRightFrontLeg(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/ScreenAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/ScreenAccessor.java deleted file mode 100644 index 66204d0..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/ScreenAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.gui.Selectable; -import net.minecraft.client.gui.screen.Screen; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(Screen.class) -public interface ScreenAccessor { - @Accessor - List getSelectables(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/SlimeEntityAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/SlimeEntityAccessor.java deleted file mode 100644 index e5ed017..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/SlimeEntityAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.particle.ParticleEffect; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Invoker; - -@Mixin(SlimeEntity.class) -public interface SlimeEntityAccessor { - - @Invoker - void callSetSize(int size, boolean heal); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/SpiderEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/SpiderEntityModelAccessor.java deleted file mode 100644 index 0bd8c3a..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/SpiderEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.SpiderEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(SpiderEntityModel.class) -public interface SpiderEntityModelAccessor { - @Accessor - ModelPart getRightFrontLeg(); -} diff --git a/common/src/main/java/draylar/identity/mixin/accessor/SquidEntityModelAccessor.java b/common/src/main/java/draylar/identity/mixin/accessor/SquidEntityModelAccessor.java deleted file mode 100644 index 45236eb..0000000 --- a/common/src/main/java/draylar/identity/mixin/accessor/SquidEntityModelAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.mixin.accessor; - -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.entity.model.SquidEntityModel; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(SquidEntityModel.class) -public interface SquidEntityModelAccessor { - @Accessor - ModelPart[] getTentacles(); -} diff --git a/common/src/main/java/draylar/identity/mixin/entity/BowItemMixin.java b/common/src/main/java/draylar/identity/mixin/entity/BowItemMixin.java deleted file mode 100644 index c846b78..0000000 --- a/common/src/main/java/draylar/identity/mixin/entity/BowItemMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package draylar.identity.mixin.entity; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.WitherSkeletonEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.item.ArrowItem; -import net.minecraft.item.BowItem; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; -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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -@Mixin(BowItem.class) -public class BowItemMixin { - - @Inject(method = "onStoppedUsing", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;spawnEntity(Lnet/minecraft/entity/Entity;)Z"), locals = LocalCapture.CAPTURE_FAILHARD) - private void flameArrows(ItemStack stack, World world, LivingEntity user, int remainingUseTicks, CallbackInfo ci, PlayerEntity playerEntity, boolean bl, ItemStack itemStack, int i, float f, boolean bl2, ArrowItem arrowItem, PersistentProjectileEntity arrow) { - if(user instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - if(identity instanceof WitherSkeletonEntity) { - arrow.setOnFireFor(100); - } - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/player/ClientPlayerDataCacheMixin.java b/common/src/main/java/draylar/identity/mixin/player/ClientPlayerDataCacheMixin.java deleted file mode 100644 index 6b1bea2..0000000 --- a/common/src/main/java/draylar/identity/mixin/player/ClientPlayerDataCacheMixin.java +++ /dev/null @@ -1,48 +0,0 @@ -package draylar.identity.mixin.player; - -import draylar.identity.impl.PlayerDataProvider; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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; - -import java.util.HashMap; -import java.util.Map; - -@Environment(EnvType.CLIENT) -@Mixin(ClientPlayNetworkHandler.class) -public class ClientPlayerDataCacheMixin { - - @Shadow @Final private MinecraftClient client; - @Unique private PlayerDataProvider dataCache = null; - - // This inject caches the custom data attached to this client's player before it is reset when changing dimensions. - // For example, switching from The End => Overworld will reset the player's NBT. - @Inject(method = "onPlayerRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;createPlayer(Lnet/minecraft/client/world/ClientWorld;Lnet/minecraft/stat/StatHandler;Lnet/minecraft/client/recipebook/ClientRecipeBook;ZZ)Lnet/minecraft/client/network/ClientPlayerEntity;")) - private void beforePlayerReset(PlayerRespawnS2CPacket packet, CallbackInfo ci) { - dataCache = ((PlayerDataProvider) client.player); - } - - // This inject applies data cached from the previous inject. - // Re-applying on the client will help to prevent sync blips which occur when wiping data and waiting for the server to send a sync packet. - @Inject(method = "onPlayerRespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getRegistryKey()Lnet/minecraft/registry/RegistryKey;", ordinal = 1)) - private void afterPlayerReset(PlayerRespawnS2CPacket packet, CallbackInfo ci) { - if(dataCache != null && client.player != null) { - ((PlayerDataProvider) client.player).setIdentity(dataCache.getIdentity()); - ((PlayerDataProvider) client.player).setUnlocked(dataCache.getUnlocked()); - ((PlayerDataProvider) client.player).setFavorites(dataCache.getFavorites()); - ((PlayerDataProvider) client.player).setAbilityCooldown(dataCache.getAbilityCooldown()); - ((PlayerDataProvider) client.player).setRemainingHostilityTime(dataCache.getRemainingHostilityTime()); - } - - dataCache = null; - } -} diff --git a/common/src/main/java/draylar/identity/mixin/player/PlayerEntityDataMixin.java b/common/src/main/java/draylar/identity/mixin/player/PlayerEntityDataMixin.java deleted file mode 100644 index 73cb4d0..0000000 --- a/common/src/main/java/draylar/identity/mixin/player/PlayerEntityDataMixin.java +++ /dev/null @@ -1,334 +0,0 @@ -package draylar.identity.mixin.player; - -import dev.architectury.event.EventResult; -import draylar.identity.Identity; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.api.event.IdentitySwapCallback; -import draylar.identity.api.FlightHelper; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.impl.DimensionsRefresher; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.mixin.EntityTrackerAccessor; -import draylar.identity.mixin.ThreadedAnvilChunkStorageAccessor; -import draylar.identity.registry.IdentityEntityTags; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.mob.RavagerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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; - -import java.util.*; - -@Mixin(PlayerEntity.class) -public abstract class PlayerEntityDataMixin extends LivingEntity implements PlayerDataProvider { - - @Shadow public abstract void playSound(SoundEvent sound, float volume, float pitch); - @Unique private static final String ABILITY_COOLDOWN_KEY = "AbilityCooldown"; - @Unique private final Set> unlocked = new HashSet<>(); - @Unique private final Set> favorites = new HashSet<>(); - @Unique private int remainingTime = 0; - @Unique private int abilityCooldown = 0; - @Unique private LivingEntity identity = null; - @Unique private IdentityType identityType = null; - - private PlayerEntityDataMixin(EntityType type, World world) { - super(type, world); - } - - @Inject(method = "readCustomDataFromNbt", at = @At("RETURN")) - private void readNbt(NbtCompound tag, CallbackInfo info) { - unlocked.clear(); - - // This tag might exist - it contains old save data for pre-variant Identities. - // Each entry will be a string with an entity registry ID value. - NbtList unlockedIdList = tag.getList("UnlockedMorphs", NbtElement.STRING_TYPE); - unlockedIdList.forEach(entityRegistryID -> { - Identifier id = new Identifier(entityRegistryID.asString()); - if(Registries.ENTITY_TYPE.containsId(id)) { - EntityType type = Registries.ENTITY_TYPE.get(id); - - // The variant added from the UnlockedMorphs list will default to the fallback value if needed (eg. Sheep => White) - // This value will be re-serialize in UnlockedIdentities list, so this is 100% for old save conversions - unlocked.add(new IdentityType(type)); - } else { - // TODO: log reading error here - } - }); - - // This is the new tag for saving Identity unlock information. - // It includes metadata for variants. - NbtList unlockedIdentityList = tag.getList("UnlockedIdentities", NbtElement.COMPOUND_TYPE); - unlockedIdentityList.forEach(compound -> { - IdentityType type = IdentityType.from((NbtCompound) compound); - if(type != null) { - unlocked.add(type); - } else { - // TODO: log reading error here - } - }); - - // Favorites - OLD TAG containing String IDs - favorites.clear(); - NbtList favoriteIdList = tag.getList("FavoriteIdentities", NbtElement.STRING_TYPE); - favoriteIdList.forEach(registryID -> { - Identifier id = new Identifier(registryID.asString()); - if(Registries.ENTITY_TYPE.containsId(id)) { - EntityType type = Registries.ENTITY_TYPE.get(id); - favorites.add(new IdentityType(type)); - } - }); - - // Favorites - NEW TAG for updated variant compound data - NbtList favoriteTypeList = tag.getList("FavoriteIdentitiesV2", NbtElement.STRING_TYPE); - favoriteTypeList.forEach(compound -> { - IdentityType type = IdentityType.from((NbtCompound) compound); - if(type != null) { - favorites.add(type); - } - }); - - // Abilities - abilityCooldown = tag.getInt(ABILITY_COOLDOWN_KEY); - - // Hostility - remainingTime = tag.getInt("RemainingHostilityTime"); - - // Current Identity - readCurrentIdentity(tag.getCompound("CurrentIdentity")); - } - - @Inject(method = "writeCustomDataToNbt", at = @At("RETURN")) - private void writeNbt(NbtCompound tag, CallbackInfo info) { - // Write 'Unlocked' Identity data - { - NbtList idList = new NbtList(); - unlocked.forEach(identity -> idList.add(identity.writeCompound())); - - // This was "UnlockedMorphs" in previous versions, but it has been changed with the introduction of variants. - tag.put("UnlockedIdentities", idList); - } - - // Favorites - { - NbtList idList = new NbtList(); - favorites.forEach(entityId -> idList.add(entityId.writeCompound())); - tag.put("FavoriteIdentitiesV2", idList); - } - - // Abilities - tag.putInt(ABILITY_COOLDOWN_KEY, abilityCooldown); - - // Hostility - tag.putInt("RemainingHostilityTime", remainingTime); - - // Current Identity - tag.put("CurrentIdentity", writeCurrentIdentity(new NbtCompound())); - } - - @Unique - private NbtCompound writeCurrentIdentity(NbtCompound tag) { - NbtCompound entityTag = new NbtCompound(); - - // serialize current identity data to tag if it exists - if(identity != null) { - identity.writeNbt(entityTag); - if(identityType != null) { - identityType.writeEntityNbt(entityTag); - } - } - - // put entity type ID under the key "id", or "minecraft:empty" if no identity is equipped (or the identity entity type is invalid) - tag.putString("id", identity == null ? "minecraft:empty" : Registries.ENTITY_TYPE.getId(identity.getType()).toString()); - tag.put("EntityData", entityTag); - return tag; - } - - @Unique - public void readCurrentIdentity(NbtCompound tag) { - Optional> type = EntityType.fromNbt(tag); - - // set identity to null (no identity) if the entity id is "minecraft:empty" - if(tag.getString("id").equals("minecraft:empty")) { - this.identity = null; - ((DimensionsRefresher) this).identity_refreshDimensions(); - } - - // if entity type was valid, deserialize entity data from tag - else if(type.isPresent()) { - NbtCompound entityTag = tag.getCompound("EntityData"); - - // ensure entity data exists - if(entityTag != null) { - if(identity == null || !type.get().equals(identity.getType())) { - identity = (LivingEntity) type.get().create(getWorld()); - - // refresh player dimensions/hitbox on client - ((DimensionsRefresher) this).identity_refreshDimensions(); - } - - identity.readNbt(entityTag); - identityType = IdentityType.fromEntityNbt(tag); - } - } - } - - @Unique - @Override - public Set> getUnlocked() { - return unlocked; - } - - @Override - public void setUnlocked(Set> unlocked) { - this.unlocked.clear(); - this.unlocked.addAll(unlocked); - } - - @Unique - @Override - public Set> getFavorites() { - return favorites; - } - - @Override - public void setFavorites(Set> favorites) { - this.favorites.clear(); - this.favorites.addAll(favorites); - } - - @Unique - @Override - public int getRemainingHostilityTime() { - return remainingTime; - } - - @Unique - @Override - public void setRemainingHostilityTime(int max) { - remainingTime = max; - } - - @Unique - @Override - public int getAbilityCooldown() { - return abilityCooldown; - } - - @Unique - @Override - public void setAbilityCooldown(int abilityCooldown) { - this.abilityCooldown = abilityCooldown; - } - - @Unique - @Override - public LivingEntity getIdentity() { - return identity; - } - - @Override - public IdentityType getIdentityType() { - return identityType; - } - - @Unique - @Override - public void setIdentity(LivingEntity identity) { - this.identity = identity; - } - - @Unique - @Override - public boolean updateIdentity(@Nullable LivingEntity identity) { - PlayerEntity player = (PlayerEntity) (Object) this; - EventResult result = IdentitySwapCallback.EVENT.invoker().swap((ServerPlayerEntity) player, identity); - if(result.isFalse()) { - return false; - } - - this.identity = identity; - - // refresh entity hitbox dimensions - ((DimensionsRefresher) player).identity_refreshDimensions(); - - // Identity is valid and scaling health is on; set entity's max health and current health to reflect identity. - if (identity != null && IdentityConfig.getInstance().scalingHealth()) { - double oldMax = player.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH).getBaseValue(); - double newMax = Math.min(IdentityConfig.getInstance().maxHealth(), identity.getMaxHealth()); - identity$scaleHealth(player, oldMax, newMax); - } - - - // If the identity is null (going back to player), set the player's base health value to 20 (default) to clear old changes. - if (identity == null && IdentityConfig.getInstance().scalingHealth()) { - double oldMax = player.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH).getBaseValue(); - double newMax = 20.0; - identity$scaleHealth(player, oldMax, newMax); - } - - - // update flight properties on player depending on identity - ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity) player; - if(Identity.hasFlyingPermissions((ServerPlayerEntity) player)) { - FlightHelper.grantFlightTo(serverPlayerEntity); - player.getAbilities().setFlySpeed(IdentityConfig.getInstance().flySpeed()); - player.sendAbilitiesUpdate(); - } else { - FlightHelper.revokeFlight(serverPlayerEntity); - player.getAbilities().setFlySpeed(0.05f); - player.sendAbilitiesUpdate(); - } - - // If the player is riding a Ravager and changes into an Identity that cannot ride Ravagers, kick them off. - if(player.getVehicle() instanceof RavagerEntity) { - if(identity == null) { - player.stopRiding(); - } - else if( !(identity.getType().isIn(IdentityEntityTags.RAVAGER_RIDING)) || SafeTagManager.isCustomRavagerRiding(identity.getType())) - player.stopRiding(); - } - - // sync with client - if(!player.getWorld().isClient) { - PlayerIdentity.sync((ServerPlayerEntity) player); - - Int2ObjectMap trackers = ((ThreadedAnvilChunkStorageAccessor) ((ServerWorld) player.getWorld()).getChunkManager().threadedAnvilChunkStorage).getEntityTrackers(); - Object tracking = trackers.get(player.getId()); - ((EntityTrackerAccessor) tracking).getListeners().forEach(listener -> { - PlayerIdentity.sync((ServerPlayerEntity) player, listener.getPlayer()); - }); - } - - return true; - } - - @Unique - private void identity$scaleHealth(PlayerEntity player, double oldMax, double newMax) { - double currentHealth = player.getHealth(); - - double ratio = (oldMax > 0.0) ? (currentHealth / oldMax) : 1.0; - double scaledHealth = net.minecraft.util.math.MathHelper.clamp(ratio * newMax, 1.0, newMax); - - player.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH).setBaseValue(newMax); - player.setHealth((float) scaledHealth); - } -} diff --git a/common/src/main/java/draylar/identity/mixin/player/PlayerEntityTickMixin.java b/common/src/main/java/draylar/identity/mixin/player/PlayerEntityTickMixin.java deleted file mode 100644 index e711126..0000000 --- a/common/src/main/java/draylar/identity/mixin/player/PlayerEntityTickMixin.java +++ /dev/null @@ -1,53 +0,0 @@ -package draylar.identity.mixin.player; - -import draylar.identity.api.IdentityTickHandler; -import draylar.identity.api.IdentityTickHandlers; -import draylar.identity.api.PlayerAbilities; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.impl.PlayerDataProvider; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -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; - -@Mixin(PlayerEntity.class) -public abstract class PlayerEntityTickMixin extends LivingEntity { - - private PlayerEntityTickMixin(EntityType type, World world) { - super(type, world); - } - - @SuppressWarnings({"unchecked", "rawtypes", "ConstantConditions"}) - @Inject(method = "tick", at = @At("HEAD")) - private void serverTick(CallbackInfo info) { - // Tick IdentityTickHandlers on the client & server. - @Nullable LivingEntity identity = PlayerIdentity.getIdentity((PlayerEntity) (Object) this); - if(identity != null) { - @Nullable IdentityTickHandler handler = IdentityTickHandlers.getHandlers().get(identity.getType()); - if(handler != null) { - handler.tick((PlayerEntity) (Object) this, identity); - } - -// if(getWorld().isClient) { -// identity.tick(); -// } - } - - // Update misc. server-side entity properties for the player. - if(!getWorld().isClient) { - PlayerDataProvider data = (PlayerDataProvider) this; - data.setRemainingHostilityTime(Math.max(0, data.getRemainingHostilityTime() - 1)); - - // Update cooldown & Sync - ServerPlayerEntity player = (ServerPlayerEntity) (Object) this; - PlayerAbilities.setCooldown(player, Math.max(0, data.getAbilityCooldown() - 1)); - PlayerAbilities.sync(player); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/player/PlayerManagerMixin.java b/common/src/main/java/draylar/identity/mixin/player/PlayerManagerMixin.java deleted file mode 100644 index 6944769..0000000 --- a/common/src/main/java/draylar/identity/mixin/player/PlayerManagerMixin.java +++ /dev/null @@ -1,23 +0,0 @@ -package draylar.identity.mixin.player; - -import draylar.identity.api.PlayerFavorites; -import draylar.identity.api.PlayerHostility; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.PlayerUnlocks; -import net.minecraft.server.PlayerManager; -import net.minecraft.server.network.ServerPlayerEntity; -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.CallbackInfoReturnable; - -@Mixin(PlayerManager.class) -public class PlayerManagerMixin { - - @Inject(method = "respawnPlayer", at = @At(value = "RETURN")) - private void sendResyncPacketOnRespawn(ServerPlayerEntity player, boolean alive, CallbackInfoReturnable cir) { - PlayerUnlocks.sync(player); - PlayerFavorites.sync(player); - PlayerIdentity.sync(player); - } -} diff --git a/common/src/main/java/draylar/identity/mixin/player/PlayerTrackingMixin.java b/common/src/main/java/draylar/identity/mixin/player/PlayerTrackingMixin.java deleted file mode 100644 index ad8e1d7..0000000 --- a/common/src/main/java/draylar/identity/mixin/player/PlayerTrackingMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package draylar.identity.mixin.player; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.Entity; -import net.minecraft.server.network.EntityTrackerEntry; -import net.minecraft.server.network.ServerPlayerEntity; -import org.spongepowered.asm.mixin.Final; -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(EntityTrackerEntry.class) -public class PlayerTrackingMixin { - - @Shadow @Final private Entity entity; - - @Inject(method = "startTracking", at = @At("RETURN")) - private void sendTrackingIdentityPackets(ServerPlayerEntity newlyTracked, CallbackInfo ci) { - if(this.entity instanceof ServerPlayerEntity player) { - PlayerIdentity.sync(newlyTracked, player); - PlayerIdentity.sync(player, newlyTracked); - } - } -} diff --git a/common/src/main/java/draylar/identity/mixin/player/RespawnDataCopyMixin.java b/common/src/main/java/draylar/identity/mixin/player/RespawnDataCopyMixin.java deleted file mode 100644 index 10d6d76..0000000 --- a/common/src/main/java/draylar/identity/mixin/player/RespawnDataCopyMixin.java +++ /dev/null @@ -1,28 +0,0 @@ -package draylar.identity.mixin.player; - -import draylar.identity.api.PlayerUnlocks; -import draylar.identity.impl.PlayerDataProvider; -import net.minecraft.server.network.ServerPlayerEntity; -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; - -@Mixin(ServerPlayerEntity.class) -public class RespawnDataCopyMixin { - - @Inject(method = "copyFrom", at = @At("TAIL")) - private void copyIdentityData(ServerPlayerEntity oldPlayer, boolean alive, CallbackInfo ci) { - PlayerDataProvider oldData = ((PlayerDataProvider) oldPlayer); - PlayerDataProvider newData = ((PlayerDataProvider) this); - - // Transfer data from the old ServerPlayerEntity -> new ServerPlayerEntity - newData.setAbilityCooldown(oldData.getAbilityCooldown()); - newData.setRemainingHostilityTime(oldData.getRemainingHostilityTime()); - newData.setIdentity(oldData.getIdentity()); - newData.setUnlocked(oldData.getUnlocked()); - newData.setFavorites(oldData.getFavorites()); - - PlayerUnlocks.sync((ServerPlayerEntity) (Object) this); - } -} diff --git a/common/src/main/java/draylar/identity/network/ClientNetworking.java b/common/src/main/java/draylar/identity/network/ClientNetworking.java deleted file mode 100644 index 3d1122d..0000000 --- a/common/src/main/java/draylar/identity/network/ClientNetworking.java +++ /dev/null @@ -1,127 +0,0 @@ -package draylar.identity.network; - -import dev.architectury.networking.NetworkManager; -import draylar.identity.IdentityClient; -import draylar.identity.api.ApplicablePacket; -import draylar.identity.impl.DimensionsRefresher; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.impl.FavoritePackets; -import draylar.identity.network.impl.UnlockPackets; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; -import org.jetbrains.annotations.Nullable; - -import java.util.Optional; -import java.util.UUID; - -public class ClientNetworking implements NetworkHandler { - - public static void registerPacketHandlers() { - NetworkManager.registerReceiver(NetworkManager.Side.S2C, NetworkHandler.IDENTITY_SYNC, ClientNetworking::handleIdentitySyncPacket); - NetworkManager.registerReceiver(NetworkManager.Side.S2C, NetworkHandler.FAVORITE_SYNC, FavoritePackets::handleFavoriteSyncPacket); - NetworkManager.registerReceiver(NetworkManager.Side.S2C, NetworkHandler.ABILITY_SYNC, ClientNetworking::handleAbilitySyncPacket); - NetworkManager.registerReceiver(NetworkManager.Side.S2C, NetworkHandler.UNLOCK_SYNC, UnlockPackets::handleUnlockSyncPacket); - NetworkManager.registerReceiver(NetworkManager.Side.S2C, NetworkHandler.CONFIG_SYNC, ClientNetworking::handleConfigurationSyncPacket); - } - - public static void runOrQueue(NetworkManager.PacketContext context, ApplicablePacket packet) { - if(context.getPlayer() == null) { - IdentityClient.getSyncPacketQueue().add(packet); - } else { - context.queue(() -> packet.apply(context.getPlayer())); - } - } - - public static void sendAbilityRequest() { - NetworkManager.sendToServer(USE_ABILITY, new PacketByteBuf(Unpooled.buffer())); - } - - public static void handleIdentitySyncPacket(PacketByteBuf packet, NetworkManager.PacketContext context) { - final UUID uuid = packet.readUuid(); - final String id = packet.readString(); - final NbtCompound entityNbt = packet.readNbt(); - - runOrQueue(context, player -> { - @Nullable PlayerEntity syncTarget = player.getEntityWorld().getPlayerByUuid(uuid); - - if(syncTarget != null) { - PlayerDataProvider data = (PlayerDataProvider) syncTarget; - - // set identity to null (no identity) if the entity id is "minecraft:empty" - if(id.equals("minecraft:empty")) { - data.setIdentity(null); - ((DimensionsRefresher) syncTarget).identity_refreshDimensions(); - return; - } - - // If entity type was valid, deserialize entity data from tag/ - if(entityNbt != null) { - entityNbt.putString("id", id); - Optional> type = EntityType.fromNbt(entityNbt); - if(type.isPresent()) { - LivingEntity identity = data.getIdentity(); - - // ensure entity data exists - if(identity == null || !type.get().equals(identity.getType())) { - identity = (LivingEntity) type.get().create(syncTarget.getWorld()); - data.setIdentity(identity); - - // refresh player dimensions/hitbox on client - ((DimensionsRefresher) syncTarget).identity_refreshDimensions(); - syncTarget.setStepHeight(identity.getStepHeight()); // sync stepping ability - syncTarget.setVelocity(syncTarget.getVelocity().multiply(1, 0, 1)); // reset vertical drag if any - syncTarget.fallDistance = 0.0F; // avoid weird midair fall damage - syncTarget.prevX = syncTarget.getX(); // reset motion interpolation - syncTarget.prevY = syncTarget.getY(); - syncTarget.prevZ = syncTarget.getZ(); - syncTarget.velocityDirty = true; // force re-sync of movement state - ensureSafePosition(syncTarget); - syncTarget.calculateDimensions(); // Forces recalculation on client - - } - - if(identity != null) { - identity.readNbt(entityNbt); - } - } - } - } - }); - } - private static void ensureSafePosition(PlayerEntity player) { - if (player.isInsideWall()) { - double safeY = player.getY(); - for (int i = 1; i <= 2; i++) { - if (!player.getWorld().getBlockState(player.getBlockPos().up(i)).isSolidBlock(player.getWorld(), player.getBlockPos().up(i))) { - safeY = player.getY() + i; - break; - } - } - player.setPosition(player.getX(), safeY, player.getZ()); - } - } - - - public static void handleAbilitySyncPacket(PacketByteBuf packet, NetworkManager.PacketContext context) { - int cooldown = packet.readInt(); - runOrQueue(context, player -> ((PlayerDataProvider) player).setAbilityCooldown(cooldown)); - } - - public static void handleConfigurationSyncPacket(PacketByteBuf packet, NetworkManager.PacketContext context) { - boolean enableClientSwapMenu = packet.readBoolean(); - boolean showPlayerNametag = packet.readBoolean(); - - // TODO: re-handle sync packet -// IdentityConfig.getInstance().enableClientSwapMenu() = enableClientSwapMenu; -// IdentityConfig.getInstance().showPlayerNametag() = showPlayerNametag; - // TODO: UNDO THIS WHEN THE PLAYER LEAVES - OMEGA CONFIG HANDLES THIS, BUT OUR BUDGET FORGE IMPLEMENTATION DOES NOT - } - - private ClientNetworking() { - // NO-OP - } -} diff --git a/common/src/main/java/draylar/identity/network/NetworkHandler.java b/common/src/main/java/draylar/identity/network/NetworkHandler.java deleted file mode 100644 index 8d6839c..0000000 --- a/common/src/main/java/draylar/identity/network/NetworkHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package draylar.identity.network; - -import draylar.identity.Identity; -import net.minecraft.util.Identifier; - -public interface NetworkHandler { - Identifier CAN_OPEN_MENU = Identity.id("can_open_menu"); - Identifier IDENTITY_REQUEST = Identity.id("request"); - Identifier FAVORITE_UPDATE = Identity.id("favorite"); - Identifier USE_ABILITY = Identity.id("use_ability"); - Identifier IDENTITY_SYNC = Identity.id("identity_sync"); - Identifier FAVORITE_SYNC = Identity.id("favorite_sync"); - Identifier ABILITY_SYNC = Identity.id("ability_sync"); - Identifier CONFIG_SYNC = Identity.id("config_sync"); - Identifier UNLOCK_SYNC = Identity.id("unlock_sync"); -} diff --git a/common/src/main/java/draylar/identity/network/ServerNetworking.java b/common/src/main/java/draylar/identity/network/ServerNetworking.java deleted file mode 100644 index bccfac2..0000000 --- a/common/src/main/java/draylar/identity/network/ServerNetworking.java +++ /dev/null @@ -1,46 +0,0 @@ -package draylar.identity.network; - -import dev.architectury.networking.NetworkManager; -import draylar.identity.ability.AbilityRegistry; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.PlayerAbilities; -import draylar.identity.network.impl.FavoritePackets; -import draylar.identity.network.impl.SwapPackets; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; - -public class ServerNetworking implements NetworkHandler { - - public static void initialize() { - FavoritePackets.registerFavoriteRequestHandler(); - SwapPackets.registerIdentityRequestPacketHandler(); - SwapPackets.registerIdentityRequestPacketHandler(); - } - - public static void registerUseAbilityPacketHandler() { - NetworkManager.registerReceiver(NetworkManager.Side.C2S, USE_ABILITY, (buf, context) -> { - PlayerEntity player = context.getPlayer(); - - context.getPlayer().getServer().execute(() -> { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // Verify we should use ability for the player's current identity - if(identity != null) { - EntityType identityType = identity.getType(); - - if(AbilityRegistry.has(identityType)) { - - // Check cooldown - if(PlayerAbilities.canUseAbility(player)) { - AbilityRegistry.get(identityType).onUse(player, identity, context.getPlayer().getWorld()); - PlayerAbilities.setCooldown(player, AbilityRegistry.get(identityType).getCooldown(identity)); - PlayerAbilities.sync((ServerPlayerEntity) player); - } - } - } - }); - }); - } -} diff --git a/common/src/main/java/draylar/identity/network/impl/FavoritePackets.java b/common/src/main/java/draylar/identity/network/impl/FavoritePackets.java deleted file mode 100644 index 4779333..0000000 --- a/common/src/main/java/draylar/identity/network/impl/FavoritePackets.java +++ /dev/null @@ -1,75 +0,0 @@ -package draylar.identity.network.impl; - -import dev.architectury.networking.NetworkManager; -import draylar.identity.api.PlayerFavorites; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.ClientNetworking; -import draylar.identity.network.NetworkHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.EntityType; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.Nullable; - -import java.util.Set; - -public class FavoritePackets { - - public static void sendFavoriteRequest(IdentityType type, boolean favorite) { - PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - packet.writeIdentifier(Registries.ENTITY_TYPE.getId(type.getEntityType())); - packet.writeInt(type.getVariantData()); - packet.writeBoolean(favorite); - NetworkManager.sendToServer(ClientNetworking.FAVORITE_UPDATE, packet); - } - - public static void registerFavoriteRequestHandler() { - NetworkManager.registerReceiver(NetworkManager.Side.C2S, NetworkHandler.FAVORITE_UPDATE, (buf, context) -> { - EntityType entityType = Registries.ENTITY_TYPE.get(buf.readIdentifier()); - int variant = buf.readInt(); - boolean favorite = buf.readBoolean(); - ServerPlayerEntity player = (ServerPlayerEntity) context.getPlayer(); - - context.getPlayer().getServer().execute(() -> { - @Nullable IdentityType type = IdentityType.from(entityType, variant); - - if(type != null) { - if(favorite) { - PlayerFavorites.favorite(player, type); - } else { - PlayerFavorites.unfavorite(player, type); - } - } - }); - }); - } - - public static void sendFavoriteSync(ServerPlayerEntity player) { - Set> favorites = ((PlayerDataProvider) player).getFavorites(); - NbtCompound tag = new NbtCompound(); - NbtList idList = new NbtList(); - favorites.forEach(type -> idList.add(type.writeCompound())); - tag.put("FavoriteIdentities", idList); - - // Create & send packet with NBT - PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - packet.writeNbt(tag); - NetworkManager.sendToPlayer(player, NetworkHandler.FAVORITE_SYNC, packet); - } - - public static void handleFavoriteSyncPacket(PacketByteBuf packet, NetworkManager.PacketContext context) { - NbtCompound tag = packet.readNbt(); - - ClientNetworking.runOrQueue(context, player -> { - PlayerDataProvider data = (PlayerDataProvider) player; - data.getFavorites().clear(); - NbtList idList = tag.getList("FavoriteIdentities", NbtElement.COMPOUND_TYPE); - idList.forEach(compound -> data.getFavorites().add(IdentityType.from((NbtCompound) compound))); - }); - } -} diff --git a/common/src/main/java/draylar/identity/network/impl/SwapPackets.java b/common/src/main/java/draylar/identity/network/impl/SwapPackets.java deleted file mode 100644 index 313e2a8..0000000 --- a/common/src/main/java/draylar/identity/network/impl/SwapPackets.java +++ /dev/null @@ -1,73 +0,0 @@ -package draylar.identity.network.impl; - -import dev.architectury.networking.NetworkManager; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.network.ClientNetworking; -import draylar.identity.network.NetworkHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import org.jetbrains.annotations.Nullable; - -public class SwapPackets { - - public static void registerIdentityRequestPacketHandler() { - NetworkManager.registerReceiver(NetworkManager.Side.C2S, NetworkHandler.IDENTITY_REQUEST, (buf, context) -> { - boolean validType = buf.readBoolean(); - if(validType) { - EntityType entityType = Registries.ENTITY_TYPE.get(buf.readIdentifier()); - int variant = buf.readInt(); - - context.getPlayer().getServer().execute(() -> { - // Ensure player has permission to switch identities - if(IdentityConfig.getInstance().enableSwaps() || - context.getPlayer().hasPermissionLevel(3) || - IdentityConfig.getInstance().allowedSwappers().stream() - .anyMatch(p -> p.equalsIgnoreCase(context.getPlayer().getGameProfile().getName()))) { - // player type shouldn't be sent, but we still check regardless - if(entityType.equals(EntityType.PLAYER)) { - PlayerIdentity.updateIdentity((ServerPlayerEntity) context.getPlayer(), null, null); - } else { - @Nullable IdentityType type = IdentityType.from(entityType, variant); - if(type != null) { - PlayerIdentity.updateIdentity((ServerPlayerEntity) context.getPlayer(), type, type.create(context.getPlayer().getWorld())); - } - } - - // Refresh player dimensions - context.getPlayer().calculateDimensions(); - } - }); - } else { - // Swap back to player if server allows it - context.getPlayer().getServer().execute(() -> { - if(IdentityConfig.getInstance().enableSwaps() || - context.getPlayer().hasPermissionLevel(3) || - IdentityConfig.getInstance().allowedSwappers().stream() - .anyMatch(p -> p.equalsIgnoreCase(context.getPlayer().getGameProfile().getName()))) { - PlayerIdentity.updateIdentity((ServerPlayerEntity) context.getPlayer(), null, null); - } - - context.getPlayer().calculateDimensions(); - }); - } - }); - } - - public static void sendSwapRequest(@Nullable IdentityType type) { - PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - - packet.writeBoolean(type != null); - if(type != null) { - packet.writeIdentifier(Registries.ENTITY_TYPE.getId(type.getEntityType())); - packet.writeInt(type.getVariantData()); - } - - NetworkManager.sendToServer(ClientNetworking.IDENTITY_REQUEST, packet); - } -} diff --git a/common/src/main/java/draylar/identity/network/impl/UnlockPackets.java b/common/src/main/java/draylar/identity/network/impl/UnlockPackets.java deleted file mode 100644 index ad40e91..0000000 --- a/common/src/main/java/draylar/identity/network/impl/UnlockPackets.java +++ /dev/null @@ -1,44 +0,0 @@ -package draylar.identity.network.impl; - -import dev.architectury.networking.NetworkManager; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.impl.PlayerDataProvider; -import draylar.identity.network.ClientNetworking; -import draylar.identity.network.NetworkHandler; -import io.netty.buffer.Unpooled; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; - -public class UnlockPackets { - - private static final String UNLOCK_KEY = "UnlockedIdentities"; - - public static void handleUnlockSyncPacket(PacketByteBuf packet, NetworkManager.PacketContext context) { - NbtCompound nbt = packet.readNbt(); - if(nbt != null) { - NbtList list = nbt.getList(UNLOCK_KEY, NbtElement.COMPOUND_TYPE); - - ClientNetworking.runOrQueue(context, player -> { - ((PlayerDataProvider) player).getUnlocked().clear(); - list.forEach(idTag -> ((PlayerDataProvider) player).getUnlocked().add(IdentityType.from((NbtCompound) idTag))); - }); - } - } - - public static void sendSyncPacket(ServerPlayerEntity player) { - PacketByteBuf packet = new PacketByteBuf(Unpooled.buffer()); - - // Serialize unlocked to tag - NbtCompound compound = new NbtCompound(); - NbtList idList = new NbtList(); - ((PlayerDataProvider) player).getUnlocked().forEach(type -> idList.add(type.writeCompound())); - compound.put(UNLOCK_KEY, idList); - packet.writeNbt(compound); - - // Send to client - NetworkManager.sendToPlayer(player, NetworkHandler.UNLOCK_SYNC, packet); - } -} diff --git a/common/src/main/java/draylar/identity/registry/IdentityCommands.java b/common/src/main/java/draylar/identity/registry/IdentityCommands.java deleted file mode 100644 index 252a4ea..0000000 --- a/common/src/main/java/draylar/identity/registry/IdentityCommands.java +++ /dev/null @@ -1,14 +0,0 @@ -package draylar.identity.registry; - -import draylar.identity.command.IdentityCommand; - -public class IdentityCommands { - - public static void init() { - IdentityCommand.register(); - } - - private IdentityCommands() { - - } -} diff --git a/common/src/main/java/draylar/identity/registry/IdentityEntityTags.java b/common/src/main/java/draylar/identity/registry/IdentityEntityTags.java deleted file mode 100644 index 44c9443..0000000 --- a/common/src/main/java/draylar/identity/registry/IdentityEntityTags.java +++ /dev/null @@ -1,48 +0,0 @@ -package draylar.identity.registry; - -import draylar.identity.Identity; -import net.minecraft.entity.EntityType; -import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.tag.TagKey; - -public class IdentityEntityTags { - - public static final TagKey> BURNS_IN_DAYLIGHT = register("burns_in_daylight"); - public static final TagKey> FLYING = register("flying"); - public static final TagKey> SLOW_FALLING = register("slow_falling"); - public static final TagKey> WOLF_PREY = register("wolf_prey"); - public static final TagKey> FOX_PREY = register("fox_prey"); - public static final TagKey> BREATHE_UNDERWATER = register("breathe_underwater"); - public static final TagKey> HURT_BY_HIGH_TEMPERATURE = register("hurt_by_high_temperature"); - public static final TagKey> RAVAGER_RIDING = register("ravager_riding"); - public static final TagKey> PIGLIN_FRIENDLY = register("piglin_friendly"); - public static final TagKey> LAVA_WALKING = register("lava_walking"); - public static final TagKey> CANT_SWIM = register("cant_swim"); - public static final TagKey> UNDROWNABLE = register("undrownable"); - public static final TagKey> CUSTOM_FLYING = register("custom_flying"); - public static final TagKey> CUSTOM_BREATHE_UNDERWATER = register("custom_breathe_underwater"); - public static final TagKey> CUSTOM_FIRE_IMMUNE = register("custom_fire_immune"); - public static final TagKey> CUSTOM_SLOW_FALLING = register("custom_slow_falling"); - public static final TagKey> CUSTOM_BURNS_IN_DAYLIGHT = register("custom_burns_in_daylight"); - public static final TagKey> CUSTOM_CANT_SWIM = register("custom_cant_swim"); - public static final TagKey> CUSTOM_HURT_BY_HEAT = register("custom_hurt_by_high_temperature"); - public static final TagKey> CUSTOM_LAVA_WALKING = register("custom_lava_walking"); - public static final TagKey> CUSTOM_PIGLIN_FRIENDLY = register("custom_piglin_friendly"); - public static final TagKey> CUSTOM_RAVAGER_RIDING = register("custom_ravager_riding"); - public static final TagKey> CUSTOM_UNDROWNABLE = register("custom_undrownable"); - public static final TagKey> CUSTOM_WOLF_PREY = register("custom_wolf_prey"); - public static final TagKey> CUSTOM_FOX_PREY = register("custom_fox_prey"); - - - - private IdentityEntityTags() { } - - public static void init() { - // NO-OP - } - - private static TagKey> register(String id) { - return TagKey.of(RegistryKeys.ENTITY_TYPE, Identity.id(id)); - } -} diff --git a/common/src/main/java/draylar/identity/registry/IdentityEventHandlers.java b/common/src/main/java/draylar/identity/registry/IdentityEventHandlers.java deleted file mode 100644 index c549950..0000000 --- a/common/src/main/java/draylar/identity/registry/IdentityEventHandlers.java +++ /dev/null @@ -1,46 +0,0 @@ -package draylar.identity.registry; - -import dev.architectury.event.EventResult; -import dev.architectury.event.events.common.InteractionEvent; -import draylar.identity.api.PlayerHostility; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.SafeTagManager; -import draylar.identity.api.platform.IdentityConfig; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.mob.RavagerEntity; - -public class IdentityEventHandlers { - - public static void initialize() { - IdentityEventHandlers.registerHostilityUpdateHandler(); - IdentityEventHandlers.registerRavagerRidingHandler(); - } - - public static void registerHostilityUpdateHandler() { - InteractionEvent.INTERACT_ENTITY.register((player, entity, hand) -> { - if(!player.getWorld().isClient && entity instanceof HostileEntity) { - PlayerHostility.set(player, IdentityConfig.getInstance().hostilityTime()); - } - - return EventResult.pass(); - }); - } - - // Players with an equipped Identity inside the `ravager_riding` entity tag should - // be able to ride Ravagers. - public static void registerRavagerRidingHandler() { - InteractionEvent.INTERACT_ENTITY.register((player, entity, hand) -> { - if(entity instanceof RavagerEntity) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - if(identity != null) { - if(identity.getType().isIn(IdentityEntityTags.RAVAGER_RIDING) || SafeTagManager.isCustomRavagerRiding(identity.getType())) { - player.startRiding(entity); - } - } - } - - return EventResult.pass(); - }); - } -} diff --git a/common/src/main/java/draylar/identity/screen/IdentityHelpScreen.java b/common/src/main/java/draylar/identity/screen/IdentityHelpScreen.java deleted file mode 100644 index a9831ff..0000000 --- a/common/src/main/java/draylar/identity/screen/IdentityHelpScreen.java +++ /dev/null @@ -1,59 +0,0 @@ -package draylar.identity.screen; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; - -public class IdentityHelpScreen extends Screen { - - public IdentityHelpScreen() { - super(Text.literal("")); - super.init(MinecraftClient.getInstance(), MinecraftClient.getInstance().getWindow().getScaledWidth(), MinecraftClient.getInstance().getWindow().getScaledHeight()); - } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - renderBackground(context); - - MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.scale(0.75f, 0.75f, 0.75f); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.welcome"), 15, 15, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.credits"), 15, 30, 0xffffff, true); - - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.support_label").formatted(Formatting.BOLD), 15, 60, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.support_description"), 15, 75, 0xffffff, true); - - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.ability_label").formatted(Formatting.BOLD), 15, 100, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.ability_description_1"), 15, 115, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.ability_description_2"), 15, 130, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.ability_description_3"), 15, 145, 0xffffff, true); - - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.config_label").formatted(Formatting.BOLD), 15, 175, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.config_description"), 15, 190, 0xffffff, true); - - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.credits_label").formatted(Formatting.BOLD), 15, 220, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.credits_general"), 15, 235, 0xffffff, true); - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.credits_translators"), 15, 250, 0xffffff, true); - - context.drawText( MinecraftClient.getInstance().textRenderer, Text.translatable("identity.help.return").formatted(Formatting.ITALIC), 15, height + 60, 0xffffff, true); - - matrices.pop(); - - super.render(context, mouseX, mouseY, delta); - } - - @Override - public boolean shouldPause() { - return false; - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - MinecraftClient.getInstance().setScreen(new IdentityScreen()); - return super.keyPressed(keyCode, scanCode, modifiers); - } -} diff --git a/common/src/main/java/draylar/identity/screen/IdentityScreen.java b/common/src/main/java/draylar/identity/screen/IdentityScreen.java deleted file mode 100644 index 9b5dde3..0000000 --- a/common/src/main/java/draylar/identity/screen/IdentityScreen.java +++ /dev/null @@ -1,386 +0,0 @@ -package draylar.identity.screen; - -import com.mojang.blaze3d.systems.RenderSystem; -import draylar.identity.Identity; -import draylar.identity.api.PlayerFavorites; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.api.PlayerUnlocks; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.mixin.accessor.ScreenAccessor; -import draylar.identity.screen.widget.EntityWidget; -import draylar.identity.screen.widget.HelpWidget; -import draylar.identity.screen.widget.PlayerWidget; -import draylar.identity.screen.widget.SearchWidget; -import draylar.identity.util.IdentityCompatUtils; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.util.Window; -import net.minecraft.text.Text; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Identifier; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -public class IdentityScreen extends Screen { - - // == State == - private final List> unlocked = new ArrayList<>(); - private final Map, LivingEntity> renderEntities = new LinkedHashMap<>(); - private final List entityWidgets = new ArrayList<>(); - - // header widgets - private SearchWidget searchBar; - private PlayerWidget playerButton; - private ButtonWidget helpButton; - - private String lastSearch = ""; - private int scrollY = 0; - - public IdentityScreen() { - super(Text.literal("")); - } - public double getScaleFactor(){ - assert client != null; - return client.getWindow().getScaleFactor(); - } - - - @Override - protected void init() { - super.init(); - // 🔥 Fix here: clear old stuff - ((ScreenAccessor) this).getSelectables().removeIf(w -> w instanceof EntityWidget); - children().removeIf(w -> w instanceof EntityWidget); - entityWidgets.clear(); - scrollY = 0; - - // instantiate header widgets - searchBar = createSearchBar(); - playerButton = createPlayerButton(); - helpButton = createHelpButton(); - - addDrawableChild(searchBar); - addDrawableChild(playerButton); - addDrawableChild(helpButton); - - ClientPlayerEntity player = client.player; - if (player == null) { - client.setScreen(null); - return; - } - - // preload entities - for (IdentityType type : IdentityType.getAllTypes(client.world)) { - // Check by type before instantiating - if (IdentityCompatUtils.isBlacklistedEntityType(type.getEntityType())) { - continue; - } - - try { - LivingEntity e = (LivingEntity) type.create(client.world); - renderEntities.put(type, e); - } catch (Exception e) { - Identity.LOGGER.warn("Failed to create identity " + type.getEntityType().getTranslationKey(), e); - } - } - - - - - // filter + sort unlocked - unlocked.addAll(renderEntities.keySet().stream() - .filter(t -> PlayerUnlocks.has(player, t) || player.isCreative()) - .collect(Collectors.toList())); - unlocked.sort((a, b) -> PlayerFavorites.has(player, a) ? -1 : 1); - - populateEntities(player, unlocked); - - searchBar.setChangedListener(text -> { - focusOn(searchBar); - if (!lastSearch.equals(text)) { - ((ScreenAccessor) this).getSelectables().removeIf(w -> w instanceof EntityWidget); - children().removeIf(w -> w instanceof EntityWidget); - entityWidgets.clear(); - - List> filtered = unlocked.stream() - .filter(t -> text.isEmpty() || t.getEntityType().getTranslationKey().contains(text)) - .collect(Collectors.toList()); - - populateEntities(player, filtered); - lastSearch = text; - scrollY = 0; - } - }); - } - - private void populateEntities(ClientPlayerEntity player, List> list) { - final int perRow = 7; - final int marginX = 15; - final int startY = 0; - Window win = client.getWindow(); - float cellW = (win.getScaledWidth() - marginX * 2f) / perRow; - float cellH = win.getScaledHeight() / 5f; - - IdentityType current = IdentityType.from(PlayerIdentity.getIdentity(player)); - - List> invalid = new ArrayList<>(); - - for (int i = 0; i < list.size(); i++) { - IdentityType type = list.get(i); - int xIdx = i % perRow, yIdx = i / perRow; - int x = marginX + Math.round(cellW * xIdx); - int y = startY + Math.round(cellH * yIdx); - - boolean isCurr = current != null && current.equals(type); - boolean fav = PlayerFavorites.has(player, type); - - try { - EntityWidget widget = new EntityWidget( - x, y, - Math.round(cellW), Math.round(cellH), - type, - renderEntities.get(type), - this, - fav, - isCurr - ); - - addDrawableChild(widget); - entityWidgets.add(widget); - } catch (Exception e) { - Identity.LOGGER.warn("Failed to add identity " + type.getEntityType().getTranslationKey(), e); - invalid.add(type); - } - } - - if (!invalid.isEmpty()) { - unlocked.removeAll(invalid); - renderEntities.keySet().removeAll(invalid); - } - } - - private int getHeaderHeight() { - return (int)(searchBar.getY() + searchBar.getHeight() + 5); - } - - @Override - public void render(DrawContext ctx, int mx, int my, float delta) { - renderBackground(ctx); - renderEntityGrid(ctx, mx, my, delta); - - if (unlocked.isEmpty()) { - String hint = Text.translatable("identity.menu_hint").getString(); - int w = client.textRenderer.getWidth(hint); - int x = (client.getWindow().getWidth() - w) / 2; - int y = client.getWindow().getHeight() / 2; - ctx.drawText(client.textRenderer, hint, x, y, 0xFFFFFF, true); - } - - // header on top - searchBar.render(ctx, mx, my, delta); - playerButton.render(ctx, mx, my, delta); - helpButton.render(ctx, mx, my, delta); - } - - private void renderEntityGrid(DrawContext ctx, int mx, int my, float delta) { - double sf = client.getWindow().getScaleFactor(); - int headerH = getHeaderHeight(); - int viewH = this.height - headerH; - int scrollTop= scrollY; - int scrollBot= scrollY + viewH; - - // 1) Clip below the header - RenderSystem.enableScissor( - 0, - (int)(headerH * sf), - (int)(width * sf), - (int)(viewH * sf) - ); - - // 2) Push & translate into scroll‑space - ctx.getMatrices().push(); - ctx.getMatrices().translate(0, headerH - scrollY, 0); - - // 3) Draw only visible widgets - for(EntityWidget w : entityWidgets) { - int wy = w.getY(), wh = w.getHeight(); - if(wy + wh < scrollTop || wy > scrollBot) continue; - w.render(ctx, mx, my + scrollY - headerH, delta); - } - - ctx.getMatrices().pop(); - RenderSystem.disableScissor(); - - // 4) **Draw tooltip** at the **raw** mouse coords - // (we test against the **adjusted** Y, but render at the real Y) - for(EntityWidget w : entityWidgets) { - if(w.isMouseOver(mx, my + scrollY - headerH)) { - ctx.drawTooltip( - client.textRenderer, - w.getHoverName(), - mx, my - ); - break; - } - } - } - // somewhere in your IdentityScreen (you already have getGuiScale() and getScaleFactor()): - public double getEffectiveGuiScale() { - int raw = client.options.getGuiScale().getValue(); - // 0 means “Auto” → use the window’s computed scaleFactor - return raw == 0 - ? client.getWindow().getScaleFactor() - : raw; - } - - - - - - - - @Override - public boolean mouseScrolled(double mx, double my, double amount) { - if (entityWidgets.isEmpty()) return false; - - int rowH = entityWidgets.get(0).getHeight(); - int rows = (int)Math.ceil(unlocked.size() / 7f); - int totalH = rows * rowH; - int viewH = this.height - getHeaderHeight(); - // allow 10px of “empty” space at the bottom - int bottomPadding = 10; - int maxY = Math.max(0, totalH - viewH + bottomPadding); - - - scrollY = Math.max(0, Math.min(scrollY - (int)(amount * rowH), maxY)); - return true; - } - @Override - public void resize(MinecraftClient client, int width, int height) { - super.resize(client, width, height); - - clearChildren(); - scrollY = 0; - - ClientPlayerEntity player = client.player; - if (player != null) { - // FULL FIX HERE: - renderEntities.clear(); // 🔥 Clear old render entities! - for (IdentityType type : IdentityType.getAllTypes(client.world)) { - if (IdentityCompatUtils.isBlacklistedEntityType(type.getEntityType())) { - continue; - } - try { - LivingEntity e = (LivingEntity) type.create(client.world); - renderEntities.put(type, e); - } catch (Exception e) { - Identity.LOGGER.warn("Failed to create identity " + type.getEntityType().getTranslationKey(), e); - } - } - - unlocked.clear(); - unlocked.addAll(renderEntities.keySet().stream() - .filter(t -> PlayerUnlocks.has(player, t) || player.isCreative()) - .collect(Collectors.toList())); - unlocked.sort((a, b) -> PlayerFavorites.has(player, a) ? -1 : 1); - - populateEntities(player, unlocked); - } - } - - - - - @Override - public boolean mouseClicked(double mx, double my, int button) { - int hh = getHeaderHeight(); - // if we clicked below the header, first try our scrolled widgets: - if (my >= hh) { - double adjY = my + scrollY - hh; - for (EntityWidget w : entityWidgets) { - if (w.mouseClicked(mx, adjY, button)) { - return true; - } - } - } - - // otherwise fall back to header buttons or default - if (my < hh) { - return searchBar.mouseClicked(mx, my, button) - || playerButton.mouseClicked(mx, my, button) - || helpButton.mouseClicked(mx, my, button); - } - return super.mouseClicked(mx, my, button); - } - - - @Override - public void close() { - entityWidgets.forEach( - EntityWidget::dispose); - super.close(); - } - - @Override - public void clearChildren() { - // only remove our EntityWidgets, keep other important buttons - ((ScreenAccessor) this).getSelectables().removeIf(w -> w instanceof EntityWidget); - children().removeIf(w -> w instanceof EntityWidget); - entityWidgets.clear(); - scrollY = 0; - } - - - @Override - public boolean shouldPause() { - return false; - } - - public void disableAll() { - for (EntityWidget w : entityWidgets) { - w.setActive(false); - } - } - - // -- Header Factory Methods -- - - private SearchWidget createSearchBar() { - assert client != null; - float w = client.getWindow().getScaledWidth() / 4f; - return new SearchWidget( - client.getWindow().getScaledWidth() / 2f - (w / 2f), - 5, w, 20f - ); - } - - private PlayerWidget createPlayerButton() { - assert client != null; - float cx = client.getWindow().getScaledWidth() / 2f; - return new PlayerWidget( - cx + (client.getWindow().getScaledWidth() / 8f) + 5, - 7, 15, 15, - this - ); - } - - private ButtonWidget createHelpButton() { - assert client != null; - float cx = client.getWindow().getScaledWidth() / 2f; - return new HelpWidget( - (int)(cx - (client.getWindow().getScaledWidth() / 8f) - 5) - 30, - 5, 20, 20 - ); - } - - public int getGuiScale() { - assert client != null; - return client.options.getGuiScale().getValue(); - } -} diff --git a/common/src/main/java/draylar/identity/screen/widget/EntityWidget.java b/common/src/main/java/draylar/identity/screen/widget/EntityWidget.java deleted file mode 100644 index 0ec1076..0000000 --- a/common/src/main/java/draylar/identity/screen/widget/EntityWidget.java +++ /dev/null @@ -1,161 +0,0 @@ -package draylar.identity.screen.widget; - -import com.mojang.blaze3d.systems.RenderSystem; -import draylar.identity.Identity; -import draylar.identity.api.variant.IdentityType; -import draylar.identity.network.impl.FavoritePackets; -import draylar.identity.network.impl.SwapPackets; -import draylar.identity.screen.IdentityScreen; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.PressableWidget; -import net.minecraft.entity.LivingEntity; -import net.minecraft.text.Text; - -public class EntityWidget extends PressableWidget { - public static int VERTICAL_OFFSET = 30; - private static int BASE_Y_OFFSET = 10; - private IdentityType type; - private T entity; - private int size; - private boolean active; - private boolean starred; - private IdentityScreen parent; - - public EntityWidget( - int x, int y, int width, int height, - IdentityType type, - T entity, - IdentityScreen parent, - boolean starred, - boolean current - ) { - super(x, y, width, height, Text.of("")); - this.type = type; - this.entity = entity; - this.parent = parent; - this.starred = starred; - this.active = current; - - // ---- new GUI‑scale–aware sizing ---- - // baseSizeFactor ≃ 25 pixels “zoom” per block‑unit - float baseSizeFactor = (float)(25F / Math.max(entity.getWidth(), entity.getHeight())); - double scaleFactor = parent.getScaleFactor(); - int guiScale = parent.getGuiScale(); - double finalScale = scaleFactor / (guiScale == 0 ? 1 : guiScale); - this.size = Math.max(1, (int)(baseSizeFactor * finalScale)); - // ------------------------------------ - - entity.setGlowing(true); - setTooltip(Tooltip.of(type.createTooltipText(entity))); - } - - @Override - protected void appendClickableNarrations(NarrationMessageBuilder builder) { } - - @Override - public boolean mouseClicked(double mx, double my, int button) { - boolean hit = mx >= getX() && mx < getX() + getWidth() - && my >= getY() && my < getY() + getHeight(); - - if (hit) { - if (button == 0) { - SwapPackets.sendSwapRequest(type); - parent.disableAll(); - active = true; - } else if (button == 1) { - starred = !starred; - FavoritePackets.sendFavoriteRequest(type, starred); - } - } - return super.mouseClicked(mx, my, button); - } - // in EntityWidget - public Text getHoverName() { - return type.createTooltipText(entity); - } - - - @Override - public void render(DrawContext ctx, int mouseX, int mouseY, float delta) { - // 1) transparent background, no super.render() - - // 2) clamp GUI‑scale to [1..5], default Auto→3 - int rawGui = parent.getGuiScale(); // 0 == Auto, otherwise 1–5 - int clampedGui = (rawGui == 0) ? 3 : Math.min(rawGui, 5); - - // 3) compute how “big” a block unit is in pixels - float baseSizePerBlock = 25F / Math.max(entity.getWidth(), entity.getHeight()); - - // 4) apply inverse scaling by GUI‑scale - double windowScale = parent.getScaleFactor(); - double effectiveScale = windowScale / clampedGui; - - // 5) final pixel size for our model - int size = Math.max(1, (int)(baseSizePerBlock * effectiveScale)); - - // 6) figure out its pixel‐height and vertical center - int pixelHeight = (int)(entity.getHeight() * size); - int slotCX = getX() + getWidth() / 2; - int slotCY = getY() + getHeight() / 2; - int bottomY = slotCY + (pixelHeight / 2); - - // 7) draw it (with your -10, -10 offsets) - try { - InventoryScreen.drawEntity( - ctx, - slotCX, - bottomY, - size, - -10, -10, - entity - ); - } catch (Exception e) { - Identity.LOGGER.warn("Failed to render " + type.getEntityType().getTranslationKey(), e); - } - - // 8) star & outline on top - if (starred) { - ctx.drawTexture( - Identity.id("textures/gui/star.png"), - getX(), getY(), 0, 0, 15, 15, 15, 15 - ); - } - if (active) { - ctx.drawTexture( - Identity.id("textures/gui/selected.png"), - getX(), getY(), getWidth(), getHeight(), - 0, 0, 48, 32, 48, 32 - ); - } - } - - - // completely suppress the default pressable background: - @Override - protected void renderButton(DrawContext ctx, int mouseX, int mouseY, float delta) { } - - @Override - public void onPress() { /* no-op */ } - - public void setActive(boolean a) { - this.active = a; - } - - - public void dispose() { - if (entity != null) { - try { - entity.discard(); - } catch (Exception ignored) { } - entity = null; - } - type = null; - parent = null; - } - - -} diff --git a/common/src/main/java/draylar/identity/screen/widget/HelpWidget.java b/common/src/main/java/draylar/identity/screen/widget/HelpWidget.java deleted file mode 100644 index 4048b09..0000000 --- a/common/src/main/java/draylar/identity/screen/widget/HelpWidget.java +++ /dev/null @@ -1,23 +0,0 @@ -package draylar.identity.screen.widget; - -import draylar.identity.screen.IdentityHelpScreen; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.Tooltip; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.text.Text; - -import java.util.Collections; -import java.util.function.Supplier; - -public class HelpWidget extends ButtonWidget { - - public HelpWidget(int x, int y, int width, int height) { - super(x, y, width, height, Text.of("?"), (widget) -> { - MinecraftClient.getInstance().setScreen(new IdentityHelpScreen()); - }, Supplier::get); - - setTooltip(Tooltip.of(Text.translatable("identity.help"))); - } -} diff --git a/common/src/main/java/draylar/identity/screen/widget/PlayerWidget.java b/common/src/main/java/draylar/identity/screen/widget/PlayerWidget.java deleted file mode 100644 index 2946d52..0000000 --- a/common/src/main/java/draylar/identity/screen/widget/PlayerWidget.java +++ /dev/null @@ -1,52 +0,0 @@ -package draylar.identity.screen.widget; - -import draylar.identity.Identity; -import draylar.identity.network.impl.SwapPackets; -import draylar.identity.screen.IdentityScreen; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; -import net.minecraft.client.gui.widget.PressableWidget; -import net.minecraft.text.Text; - -public class PlayerWidget extends PressableWidget { - - private final IdentityScreen parent; - - public PlayerWidget(float x, float y, float width, float height, IdentityScreen parent) { - super((int) x, (int) y, (int) width, (int) height, Text.of("")); // int x, int y, int width, int height, message - this.parent = parent; - } - - @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { -// float x = MouseUtilities.mouseX; -// float y = MouseUtilities.mouseY; -// -// if(getX() <= x && getX() + getWidth() >= x) { -// if(getY() <= y && getY() + getHeight() >= y) { -// drawTooltip(matrices, provider); -// } -// } -// - - context.drawTexture(Identity.id("textures/gui/player.png"), getX(), getY(), 16, 16, 0, 0, 8, 8, 8, 8); - - super.render(context, mouseX, mouseY, delta); - } - - @Override - protected void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { - - } - - @Override - protected void appendClickableNarrations(NarrationMessageBuilder builder) { - - } - - @Override - public void onPress() { - SwapPackets.sendSwapRequest(null); - parent.disableAll(); - } -} diff --git a/common/src/main/java/draylar/identity/screen/widget/SearchWidget.java b/common/src/main/java/draylar/identity/screen/widget/SearchWidget.java deleted file mode 100644 index 727b581..0000000 --- a/common/src/main/java/draylar/identity/screen/widget/SearchWidget.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.screen.widget; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.widget.TextFieldWidget; -import net.minecraft.text.Text; - -public class SearchWidget extends TextFieldWidget { - - public SearchWidget(float x, float y, float width, float height) { - super(MinecraftClient.getInstance().textRenderer, (int) x, (int) y, (int) width, (int) height, Text.of("")); - } -} diff --git a/common/src/main/java/draylar/identity/skin/SkinLocation.java b/common/src/main/java/draylar/identity/skin/SkinLocation.java deleted file mode 100644 index 7dbec28..0000000 --- a/common/src/main/java/draylar/identity/skin/SkinLocation.java +++ /dev/null @@ -1,38 +0,0 @@ -package draylar.identity.skin; - -import java.util.Objects; - -public class SkinLocation { - private final String namespace; - private final String path; - - public SkinLocation(String namespace, String path) { - this.namespace = namespace; - this.path = path; - } - - public String getNamespace() { - return namespace; - } - - public String getPath() { - return path; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof SkinLocation other)) return false; - return namespace.equals(other.namespace) && path.equals(other.path); - } - - @Override - public int hashCode() { - return Objects.hash(namespace, path); - } - - @Override - public String toString() { - return namespace + ":" + path; - } -} diff --git a/common/src/main/java/draylar/identity/util/AbilityUtils.java b/common/src/main/java/draylar/identity/util/AbilityUtils.java deleted file mode 100644 index 260cf4f..0000000 --- a/common/src/main/java/draylar/identity/util/AbilityUtils.java +++ /dev/null @@ -1,188 +0,0 @@ - -package draylar.identity.util; - -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.JukeboxBlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.WorldChunk; - -import java.util.List; -import java.util.Random; - -public class AbilityUtils { - - public static EntityHitResult raycastEntities(PlayerEntity player, double maxDistance) { - Vec3d eyePosition = player.getEyePos(); - Vec3d viewVector = player.getRotationVec(1.0F); - Vec3d targetPosition = eyePosition.add(viewVector.multiply(maxDistance)); - - HitResult blockHit = player.getWorld().raycast(new RaycastContext(eyePosition, targetPosition, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, player)); - double blockDistance = blockHit.getType() == HitResult.Type.BLOCK ? eyePosition.distanceTo(blockHit.getPos()) : maxDistance; - - EntityHitResult closestEntityHit = null; - double closestDistance = blockDistance; - - Box searchBox = player.getBoundingBox().stretch(viewVector.multiply(maxDistance)).expand(1.0D); - List entities = player.getWorld().getOtherEntities(player, searchBox, (entity) -> entity.isAttackable() && entity instanceof LivingEntity); - - for (Entity entity : entities) { - Box entityBox = entity.getBoundingBox().expand(entity.getTargetingMargin()); - Vec3d intersection = entityBox.raycast(eyePosition, targetPosition).orElse(null); - - if (intersection != null) { - double entityDistance = eyePosition.distanceTo(intersection); - if (entityDistance < closestDistance) { - closestEntityHit = new EntityHitResult(entity, intersection); - closestDistance = entityDistance; - } - } - } - - return closestEntityHit; - } - public static List raycastNearbyEntities(PlayerEntity player, double maxDistance) { - Vec3d eyePosition = player.getEyePos(); - Vec3d viewVector = player.getRotationVec(1.0F); - Box box = player.getBoundingBox().stretch(viewVector.multiply(maxDistance)).expand(1.5D); - - return player.getWorld().getEntitiesByClass(LivingEntity.class, box, - entity -> entity != player && entity.isAttackable()); - } - - - public static void knockbackNearbyEntities(PlayerEntity player, float radius, double strength) { - World world = player.getWorld(); - for (LivingEntity livingEntity : world.getEntitiesByClass(LivingEntity.class, player.getBoundingBox().expand(radius), entity -> entity != player)) { - double dx = livingEntity.getX() - player.getX(); - double dz = livingEntity.getZ() - player.getZ(); - double distance = Math.max(Math.sqrt(dx * dx + dz * dz), 0.001D); - livingEntity.addVelocity(dx / distance * strength, 0.1D, dz / distance * strength); - } - } - - public static void dashForward(PlayerEntity player, double distance) { - Vec3d look = player.getRotationVec(1.0F); - player.setVelocity(look.x * distance, player.getVelocity().y, look.z * distance); - player.velocityModified = true; - } - - - public static void dropRandomItemFromInventory(PlayerEntity player) { - if (!player.getInventory().isEmpty()) { - Random random = new Random(); - int slot = random.nextInt(player.getInventory().size() - 1); - if (!player.getInventory().getStack(slot).isEmpty()) { - player.dropItem(player.getInventory().getStack(slot).getItem(), 1); - player.getInventory().removeStack(slot, 1); - } - } - } - - public static void healNearbyPlayers(PlayerEntity player, float radius, float healAmount) { - World world = player.getWorld(); - for (LivingEntity livingEntity : world.getEntitiesByClass(LivingEntity.class, player.getBoundingBox().expand(radius), entity -> entity instanceof PlayerEntity)) { - livingEntity.heal(healAmount); - } - } - public static void randomMorphNearby(PlayerEntity player) { - // (Placeholder) would select a nearby entity and morph into it - System.out.println("Morphing into a nearby entity..."); - } - - public static void constrictNearby(PlayerEntity player, float radius) { - World world = player.getWorld(); - List entities = world.getEntitiesByClass(LivingEntity.class, player.getBoundingBox().expand(radius), entity -> entity != player); - - for (LivingEntity living : entities) { - living.setVelocity(Vec3d.ZERO); - living.velocityModified = true; - living.setNoDrag(true); // Optional: reduces inertia - } - } - - public static void dashUpward(PlayerEntity player, double power) { - Vec3d current = player.getVelocity(); - player.setVelocity(current.x, power, current.z); - player.velocityModified = true; - } - - - public static void waterDash(PlayerEntity player, double power) { - if (player.isTouchingWater()) { - Vec3d look = player.getRotationVec(1.0F); - Vec3d current = player.getVelocity(); - Vec3d added = new Vec3d(look.x * power, look.y * 0.5D, look.z * power); - - player.setVelocity(current.add(added)); - player.velocityModified = true; - } - } - - - public static void shortTeleportForward(PlayerEntity player, double distance) { - Vec3d look = player.getRotationVec(1.0F); - Vec3d target = player.getPos().add(look.multiply(distance)); - player.requestTeleport(target.x, target.y, target.z); - } - - - public static void pullEntityTowardPlayer(PlayerEntity player, LivingEntity target, double strength) { - Vec3d direction = player.getPos().subtract(target.getPos()).normalize(); - target.setVelocity(direction.x * strength, 0.2D, direction.z * strength); - target.velocityModified = true; - } - - public static void poisonNearbyEnemies(PlayerEntity player, float radius, int durationTicks, int amplifier) { - World world = player.getWorld(); - for (LivingEntity entity : world.getEntitiesByClass(LivingEntity.class, player.getBoundingBox().expand(radius), e -> e != player)) { - entity.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, durationTicks, amplifier)); - } - } - /** - * Finds the first JukeboxBlockEntity near the origin using a 3.46-block Euclidean radius, - * matching the behavior used in Alex's Mobs. - * - * @param world The world to search in - * @param origin The central position (e.g., player or mob) - * @return A nearby JukeboxBlockEntity or null if none are found - */ - public static BlockPos findNearbyJukebox(World world, BlockPos origin) { - double radius = 3.46; - int blockRadius = (int) Math.ceil(radius); // search cube of size 4 - - int originChunkX = origin.getX() >> 4; - int originChunkZ = origin.getZ() >> 4; - int chunkRadius = (blockRadius >> 4) + 1; - - for (int dx = -chunkRadius; dx <= chunkRadius; dx++) { - for (int dz = -chunkRadius; dz <= chunkRadius; dz++) { - Chunk chunk = world.getChunk(originChunkX + dx, originChunkZ + dz); - - if (chunk instanceof WorldChunk worldChunk) { - for (BlockEntity be : worldChunk.getBlockEntities().values()) { - if (be instanceof JukeboxBlockEntity jukebox) { - if (jukebox.getPos().isWithinDistance(origin, radius)) { - return jukebox.getPos(); - } - } - } - } - } - } - - return null; // None found - } - -} diff --git a/common/src/main/java/draylar/identity/util/AttributeSync.java b/common/src/main/java/draylar/identity/util/AttributeSync.java deleted file mode 100644 index 3657862..0000000 --- a/common/src/main/java/draylar/identity/util/AttributeSync.java +++ /dev/null @@ -1,24 +0,0 @@ -package draylar.identity.util; - -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.network.packet.s2c.play.EntityAttributesS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; - -import java.util.List; - -public class AttributeSync { - public static void syncMaxHealth(ServerPlayerEntity player) { - if (player == null) return; - - double max = player.getAttributeValue(EntityAttributes.GENERIC_MAX_HEALTH); - player.setHealth(Math.min(player.getHealth(), (float) max)); - - EntityAttributesS2CPacket packet = new EntityAttributesS2CPacket( - player.getId(), - List.of(player.getAttributes().getCustomInstance(EntityAttributes.GENERIC_MAX_HEALTH)) - ); - - ((ServerWorld) player.getWorld()).getChunkManager().sendToNearbyPlayers(player, packet); - } -} diff --git a/common/src/main/java/draylar/identity/util/IdentityCompatUtils.java b/common/src/main/java/draylar/identity/util/IdentityCompatUtils.java deleted file mode 100644 index be60065..0000000 --- a/common/src/main/java/draylar/identity/util/IdentityCompatUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package draylar.identity.util; - -import dev.architectury.platform.Platform; -import draylar.identity.Identity; -import net.minecraft.entity.EntityType; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; - -public class IdentityCompatUtils { - - public static boolean isBlacklistedEntityType(EntityType type) { - Identifier id = Registries.ENTITY_TYPE.getId(type); - - // DEBUG TEMP - // Identity.LOGGER.info("Checking identity: " + id); - - // Blacklist le dragon de Dragon Mounts - return id.getNamespace().equals("dragonmounts") && - id.getPath().equals("dragon"); - } - public static boolean isAlexsMobsLoaded() { -// for(var d:Platform.getMods()) -// { -// Identity.LOGGER.info(d.getName()+" "+d.getModId()); -// } - return Platform.isModLoaded("alexsmobs"); - } - public static boolean isNaturalistLoaded() { - return Platform.isModLoaded("naturalist"); - } -} diff --git a/common/src/main/java/draylar/identity/util/PlayerDebugUtils.java b/common/src/main/java/draylar/identity/util/PlayerDebugUtils.java deleted file mode 100644 index ea88acb..0000000 --- a/common/src/main/java/draylar/identity/util/PlayerDebugUtils.java +++ /dev/null @@ -1,18 +0,0 @@ -package draylar.identity.util; - -import net.minecraft.entity.player.PlayerEntity; - -public class PlayerDebugUtils { - - public static void logPlayerDebug(PlayerEntity player, String side) { - var bb = player.getBoundingBox(); - var dim = player.getDimensions(player.getPose()); - - System.out.println("[" + side.toUpperCase() + "] Pose: " + player.getPose()); - System.out.println("[" + side.toUpperCase() + "] Sneaking: " + player.isSneaking()); - System.out.println("[" + side.toUpperCase() + "] Dimensions: " + dim.width + " x " + dim.height); - System.out.println("[" + side.toUpperCase() + "] BoundingBox: " + bb.minX + ", " + bb.minY + ", " + bb.minZ + " -> " + bb.maxX + ", " + bb.maxY + ", " + bb.maxZ); - System.out.println("[" + side.toUpperCase() + "] Position: " + player.getX() + ", " + player.getY() + ", " + player.getZ()); - System.out.println("------------------------------------"); - } -} \ No newline at end of file diff --git a/common/src/main/resources/icon.png b/common/src/main/resources/icon.png deleted file mode 100644 index 95e68f1..0000000 Binary files a/common/src/main/resources/icon.png and /dev/null differ diff --git a/common/src/main/resources/identity.mixins.json b/common/src/main/resources/identity.mixins.json deleted file mode 100644 index 20bad1f..0000000 --- a/common/src/main/resources/identity.mixins.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "draylar.identity.mixin", - "compatibilityLevel": "JAVA_16", - "mixins": [ - "ActiveTargetGoalMixin", - "CreeperEntityMixin", - "EntityMixin", - "EntityTrackerAccessor", - "FoxEntityMixin", - "HoglinBrainMixin", - "LimbAnimatorAccessor", - "LivingEntityFoodMixin", - "LivingEntityMixin", - "PiglinBrainMixin", - "PiglinBruteBrainMixin", - "PlayerAdvancementTrackerMixin", - "PlayerByteStatusMixin", - "PlayerEntityAttackMixin", - "PlayerEntityMixin", - "PlayerManagerMixin", - "PlayerSonicBoomMixin", - "PlayerSwimmingMixin", - "RavagerEntityMixin", - "ServerPlayerEntityMixin", - "SweetBerryBushBlockMixin", - "ThreadedAnvilChunkStorageAccessor", - "TrackTargetGoalMixin", - "VillagerEntityMixin", - "VillagerHostilesSensorMixin", - "WolfEntityMixin", - "accessor.AxolotlEntityAccessor", - "accessor.BiomeAccessor", - "accessor.CreeperEntityAccessor", - "accessor.EntityAccessor", - "accessor.IronGolemEntityAccessor", - "accessor.LivingEntityAccessor", - "accessor.MobEntityAccessor", - "accessor.ParrotEntityAccessor", - "accessor.RavagerEntityAccessor", - "accessor.SlimeEntityAccessor", - "entity.BowItemMixin", - "player.PlayerEntityDataMixin", - "player.PlayerEntityTickMixin", - "player.PlayerManagerMixin", - "player.PlayerTrackingMixin", - "player.RespawnDataCopyMixin" - ], - "client": [ - "BipedEntityModelMixin", - "ClientLivingEntityMixin", - "ClientPlayerDebugMixin", - "DrownedOverlayMixin", - "InGameHudMixin", - "PlayerEntityRendererMixin", - "ShadowMixin", - "StrayOverlayMixin", - "accessor.BlazeEntityModelAccessor", - "accessor.EntityShadowAccessor", - "accessor.IllagerEntityModelAccessor", - "accessor.LivingEntityRendererAccessor", - "accessor.LlamaEntityModelAccessor", - "accessor.OcelotEntityModelAccessor", - "accessor.QuadrupedEntityModelAccessor", - "accessor.RavagerEntityModelAccessor", - "accessor.ScreenAccessor", - "accessor.SpiderEntityModelAccessor", - "accessor.SquidEntityModelAccessor", - "player.ClientPlayerDataCacheMixin" - ], - "injectors": { - "defaultRequire": 1 - } - -} diff --git a/fabric/build.gradle b/fabric/build.gradle deleted file mode 100644 index 1996144..0000000 --- a/fabric/build.gradle +++ /dev/null @@ -1,92 +0,0 @@ -plugins { - id "com.github.johnrengelman.shadow" -} - -architectury { - platformSetupLoomIde() - fabric() -} - -configurations { - common - shadowCommon - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentFabric.extendsFrom common -} - -repositories { - maven { - url "https://maven.draylar.dev/releases" - } - -} - - -dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modApi "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" - modApi "dev.architectury:architectury-fabric:${rootProject.architectury_version}" - - modImplementation fernflowerDecompilerClasspath("curse.maven:minecraft-comes-alive-reborn-535291:6805928") - - common(project(path: ":common", configuration: "namedElements")) { transitive = false } - shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive = false } - - // config - modImplementation include ("dev.draylar.omega-config:omega-config-base:1.4.0+1.20.1") { - exclude group: "net.fabricmc.fabric-api" - } -} - -processResources { - inputs.property "version", project.version - - filesMatching("fabric.mod.json") { - expand "version": project.version - } - - from 'LICENSE' -} - -shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier = "dev-shadow" -} - -remapJar { - input.set shadowJar.archiveFile - dependsOn shadowJar - archiveClassifier = "fabric" -} - -jar { - archiveClassifier = "dev" -} - -sourcesJar { - duplicatesStrategy 'exclude' - def commonSources = project(":common").sourcesJar - dependsOn commonSources - from commonSources.archiveFile.map { zipTree(it) } -} - -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } -} - -publishing { - publications { - mavenFabric(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - } -} diff --git a/fabric/gradle.properties b/fabric/gradle.properties deleted file mode 100644 index c7ccccc..0000000 --- a/fabric/gradle.properties +++ /dev/null @@ -1,15 +0,0 @@ -# Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx4G - -# Fabric Properties -# check these on https://fabricmc.net/use -minecraft_version=1.20.1 -yarn_mappings=1.20.1+build.8 -loader_version=0.14.21 - -# Dependencies -# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api -fabric_version=0.84.0+1.20.1 - - - diff --git a/fabric/src/main/java/draylar/identity/api/platform/fabric/IdentityConfigImpl.java b/fabric/src/main/java/draylar/identity/api/platform/fabric/IdentityConfigImpl.java deleted file mode 100644 index 16bcb32..0000000 --- a/fabric/src/main/java/draylar/identity/api/platform/fabric/IdentityConfigImpl.java +++ /dev/null @@ -1,11 +0,0 @@ -package draylar.identity.api.platform.fabric; - -import draylar.identity.fabric.IdentityFabric; -import draylar.identity.api.platform.IdentityConfig; - -public class IdentityConfigImpl { - - public static IdentityConfig getInstance() { - return IdentityFabric.CONFIG; - } -} diff --git a/fabric/src/main/java/draylar/identity/fabric/IdentityFabric.java b/fabric/src/main/java/draylar/identity/fabric/IdentityFabric.java deleted file mode 100644 index c2e4482..0000000 --- a/fabric/src/main/java/draylar/identity/fabric/IdentityFabric.java +++ /dev/null @@ -1,22 +0,0 @@ -package draylar.identity.fabric; - -import draylar.identity.Identity; -import draylar.identity.api.platform.IdentityPlatform; -import draylar.identity.fabric.config.FabricConfigReloader; -import draylar.identity.fabric.config.IdentityFabricConfig; -import draylar.omegaconfig.OmegaConfig; -import net.fabricmc.api.ModInitializer; - -public class IdentityFabric implements ModInitializer { - - public static final int CONFIG_VERSION = 2; - public static IdentityFabricConfig CONFIG = OmegaConfig.register(IdentityFabricConfig.class); - - @Override - public void onInitialize() { - IdentityFabric.CONFIG = OmegaConfig.register(IdentityFabricConfig.class); - IdentityPlatform.setConfig(CONFIG); - IdentityPlatform.setReloader(new FabricConfigReloader()); - new Identity().initialize(); - } -} diff --git a/fabric/src/main/java/draylar/identity/fabric/IdentityFabricClient.java b/fabric/src/main/java/draylar/identity/fabric/IdentityFabricClient.java deleted file mode 100644 index 55ca065..0000000 --- a/fabric/src/main/java/draylar/identity/fabric/IdentityFabricClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package draylar.identity.fabric; - -import draylar.identity.IdentityClient; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - -@Environment(EnvType.CLIENT) -public class IdentityFabricClient implements ClientModInitializer { - - @Override - public void onInitializeClient() { - new IdentityClient().initialize(); - } -} diff --git a/fabric/src/main/java/draylar/identity/fabric/config/FabricConfigReloader.java b/fabric/src/main/java/draylar/identity/fabric/config/FabricConfigReloader.java deleted file mode 100644 index 8f6676c..0000000 --- a/fabric/src/main/java/draylar/identity/fabric/config/FabricConfigReloader.java +++ /dev/null @@ -1,18 +0,0 @@ -package draylar.identity.fabric.config; - -import draylar.identity.api.platform.ConfigReloader; -import draylar.identity.api.platform.IdentityPlatform; -import draylar.identity.fabric.IdentityFabric; -import draylar.omegaconfig.OmegaConfig; - -public class FabricConfigReloader implements ConfigReloader { - @Override - public void reloadConfig() { - // Use the Forge-compatible config loader (shared class) - IdentityFabric.CONFIG = OmegaConfig.register(IdentityFabricConfig.class); - IdentityPlatform.setConfig(IdentityFabric.CONFIG); - - - System.out.println("[Identity] Fabric config reloaded."); - } -} diff --git a/fabric/src/main/java/draylar/identity/fabric/config/IdentityFabricConfig.java b/fabric/src/main/java/draylar/identity/fabric/config/IdentityFabricConfig.java deleted file mode 100644 index acb5c68..0000000 --- a/fabric/src/main/java/draylar/identity/fabric/config/IdentityFabricConfig.java +++ /dev/null @@ -1,373 +0,0 @@ -package draylar.identity.fabric.config; - -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.fabric.IdentityFabric; -import draylar.omegaconfig.api.Comment; -import draylar.omegaconfig.api.Config; -import draylar.omegaconfig.api.Syncing; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class IdentityFabricConfig extends IdentityConfig implements Config { - - - @Comment(value = "Whether an overlay message appears above the hotbar when a new identity is unlocked.") - public boolean overlayIdentityUnlocks = true; - - @Comment(value = "Whether an overlay message appears above the hotbar when a new identity is revoked.") - public boolean overlayIdentityRevokes = true; - - @Comment(value = "Whether a player's equipped identity is revoked on death.") - public boolean revokeIdentityOnDeath = false; - - @Comment(value = "Whether identities equip the items (swords, items, tools) held by the underlying player.") - public boolean identitiesEquipItems = true; - - @Comment(value = "Whether identities equip the armor (chestplate, leggings, elytra) worn by the underlying player.") - public boolean identitiesEquipArmor = true; - - @Comment(value = "Whether hostile mobs ignore players with hostile mob identities.") - public boolean hostilesIgnoreHostileIdentityPlayer = true; - - @Comment(value = "Whether a hostile mob will stop targeting you after switching to a hostile mob identity.") - public boolean hostilesForgetNewHostileIdentityPlayer = false; - - @Comment(value = "Whether Wolves will attack Players with an identity that the Wolf would normally hunt (Sheep, Fox, Skeleton).") - public boolean wolvesAttackIdentityPrey = true; - - @Comment(value = "Whether owned Wolves will attack Players with an identity that the Wolf would normally hunt (Sheep, Fox, Skeleton).") - public boolean ownedWolvesAttackIdentityPrey = false; - - @Comment(value = "Whether Villagers will run from Players morphed as identities villagers normally run from (Zombies).") - public boolean villagersRunFromIdentities = true; - - @Comment(value = "Whether Foxes will attack Players with an identity that the Fox would normally hunt (Fish, Chicken).") - public boolean foxesAttackIdentityPrey = true; - - @Comment(value = "Whether Identity sounds take priority over Player Sounds (eg. Blaze hurt sound when hit).") - public boolean useIdentitySounds = true; - - @Comment(value = "Whether disguised players should randomly emit the ambient sound of their Identity.") - public boolean playAmbientSounds = true; - - @Comment(value = "Whether disguised players should hear their own ambient sounds (only if playAmbientSounds is true).") - public boolean hearSelfAmbient = false; - - @Comment(value = "Whether mobs in the flying entity tag can fly.") - public boolean enableFlight = true; - - @Comment(value = "How long hostility lasts for players morphed as hostile mobs (think: Pigman aggression") - public int hostilityTime = 20 * 15; - - @Comment(value = "A list of Advancements required before the player can fly using an Identity.") - public List advancementsRequiredForFlight = new ArrayList<>(); - - @Comment(value = "Whether Identities modify your max health value based on their max health value.") - public boolean scalingHealth = true; - - @Comment(value = "The maximum value of scaling health. Useful for not giving players 300 HP when they turn into a wither.") - public int maxHealth = 40; - - @Syncing - @Comment(value = "If set to false, only operators can switch identities through the ` menu. Note that this config option is synced from S2C when a client joins the game, but a client can still open the menu if they have a modified version of Identity.") - public boolean enableClientSwapMenu = true; - - @Comment(value = "If set to false, only operators can switch identities. Used on the server; guaranteed to be authoritative.") - public boolean enableSwaps = true; - - @Comment(value = "List of player names allowed to swap identities when swaps are disabled.") - public List allowedSwappers = new ArrayList<>(); - - @Comment(value = "In blocks, how far can the Enderman ability teleport?") - public int endermanAbilityTeleportDistance = 32; - - @Syncing - @Comment(value = "Should player nametags render above players disguised with an identity? Note that the server is the authority for this config option.") - public boolean showPlayerNametag = false; - - @Comment(value = "If true, a player with an active Identity can see their own nametag in third person.") - public boolean renderOwnNametag = false; - - @Comment(value = "If true, players that gain a NEW Identity will be forcibly changed into it on kill.") - public boolean forceChangeNew = false; - - @Comment(value = "If true, players will be forcibly changed into any entity they kill. The above option, forceChangeNew, only applies to new unlocks.") - public boolean forceChangeAlways = false; - - @Comment(value = "If true, /identity commands will send feedback in the action bar.") - public boolean logCommands = true; - - public float flySpeed = 0.05f; - - @Comment(value = "If true, the player has to kill a certain number of entities before unlocking an Identity.") - public boolean killForIdentity = false; - - @Comment(value = "Number of kills required to unlock an Identity if killsForIdentity is true.") - public int requiredKillsForIdentity = 50; - - @Comment(value = "If true, players with the Warden Identity will have a shorter view range with the darkness effect.") - public boolean wardenIsBlinded = true; - - @Comment(value = "If true, players with the Warden Identity will blind other nearby players.") - public boolean wardenBlindsNearby = true; - - @Comment(value = "The Identity type that is forced on all players") - public String forcedIdentity = null; - @Comment(value = "List of additional entities considered aquatic even if not tagged.") - public List extraAquaticEntities = new ArrayList<>(); - - @Comment(value = "List of entities to forcibly exclude from being considered aquatic.") - public List removedAquaticEntities = new ArrayList<>(); - - @Comment(value = "List of entities to forcibly exclude from being considered flying.") - public List removedFlyingEntities = new ArrayList<>(); - @Comment(value = "List of entities to forcibly include as flying.") - public List extraFlyingEntities = new ArrayList<>(); - - @Override - public List extraAquaticEntities() { - return extraAquaticEntities; - } - - @Override - public List removedAquaticEntities() { - return removedAquaticEntities; - } - - @Override - public List extraFlyingEntities() { - return extraFlyingEntities; - } - - @Override - public List removedFlyingEntities() { - return removedFlyingEntities; - } - - - @Comment(value = "An override map for requiredKillsForIdentity for specific entity types.") - public Map requiredKillsByType = new HashMap<>() { - { - put("minecraft:ender_dragon", 1); - put("minecraft:elder_guardian", 1); - put("minecraft:wither", 1); - } - }; - - public Map abilityCooldownMap = new HashMap<>() { - { - put("minecraft:ghast", 60); - put("minecraft:blaze", 20); - put("minecraft:ender_dragon", 20); - put("minecraft:enderman", 100); - put("minecraft:creeper", 100); - put("minecraft:wither", 200); - put("minecraft:snow_golem", 10); - put("minecraft:witch", 200); - put("minecraft:evoker", 10); - } - }; - - @Override - public String getName() { - return "identity"; - } - - @Override - public String getExtension() { - return "json5"; - } - - @Override - public int getConfigVersion() { - return IdentityFabric.CONFIG_VERSION; - } - - @Override - public boolean enableFlight() { - return enableFlight; - } - - @Override - public List advancementsRequiredForFlight() { - return advancementsRequiredForFlight; - } - - @Override - public Map getAbilityCooldownMap() { - return abilityCooldownMap; - } - - @Override - public boolean requiresKillsForIdentity() { - return killForIdentity; - } - - @Override - public int getRequiredKillsForIdentity() { - return requiredKillsForIdentity; - } - - @Override - public Map getRequiredKillsByType() { - return requiredKillsByType; - } - - @Override - public boolean shouldOverlayIdentityUnlocks() { - return overlayIdentityUnlocks; - } - - @Override - public boolean forceChangeNew() { - return forceChangeNew; - } - - @Override - public boolean forceChangeAlways() { - return forceChangeAlways; - } - - @Override - public boolean logCommands() { - return logCommands; - } - - @Override - public boolean enableClientSwapMenu() { - return enableClientSwapMenu; - } - - @Override - public boolean wolvesAttackIdentityPrey() { - return wolvesAttackIdentityPrey; - } - - @Override - public boolean ownedWolvesAttackIdentityPrey() { - return ownedWolvesAttackIdentityPrey; - } - - @Override - public boolean villagersRunFromIdentities() { - return villagersRunFromIdentities; - } - - @Override - public boolean revokeIdentityOnDeath() { - return revokeIdentityOnDeath; - } - - @Override - public boolean overlayIdentityRevokes() { - return overlayIdentityRevokes; - } - - @Override - public float flySpeed() { - return flySpeed; - } - - @Override - public boolean scalingHealth() { - return scalingHealth; - } - - @Override - public int maxHealth() { - return maxHealth; - } - - @Override - public boolean identitiesEquipItems() { - return identitiesEquipItems; - } - - @Override - public boolean identitiesEquipArmor() { - return identitiesEquipArmor; - } - - @Override - public boolean showPlayerNametag() { - return showPlayerNametag; - } - - @Override - public boolean shouldRenderOwnNameTag() { - return renderOwnNametag; - } - - @Override - public boolean foxesAttackIdentityPrey() { - return foxesAttackIdentityPrey; - } - - @Override - public boolean hostilesForgetNewHostileIdentityPlayer() { - return hostilesForgetNewHostileIdentityPlayer; - } - - @Override - public boolean hostilesIgnoreHostileIdentityPlayer() { - return hostilesIgnoreHostileIdentityPlayer; - } - - @Override - public boolean playAmbientSounds() { - return playAmbientSounds; - } - - @Override - public boolean useIdentitySounds() { - return useIdentitySounds; - } - - @Override - public boolean hearSelfAmbient() { - return hearSelfAmbient; - } - - @Override - public double endermanAbilityTeleportDistance() { - return endermanAbilityTeleportDistance; - } - - @Override - public boolean enableSwaps() { - return enableSwaps; - } - - @Override - public void setEnableSwaps(boolean enabled) { - this.enableSwaps = enabled; - } - - @Override - public List allowedSwappers() { - return allowedSwappers; - } - - @Override - public int hostilityTime() { - return hostilityTime; - } - - @Override - public boolean wardenIsBlinded() { - return wardenIsBlinded; - } - - @Override - public boolean wardenBlindsNearby() { - return wardenBlindsNearby; - } - - @Override - public String getForcedIdentity() { - return null; - } -} diff --git a/fabric/src/main/java/draylar/identity/fabric/mixin/LivingEntityAccessorMixin.java b/fabric/src/main/java/draylar/identity/fabric/mixin/LivingEntityAccessorMixin.java deleted file mode 100644 index 4a39c88..0000000 --- a/fabric/src/main/java/draylar/identity/fabric/mixin/LivingEntityAccessorMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package draylar.identity.fabric.mixin; - -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.EntityPose; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.sound.SoundEvent; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.gen.Invoker; - - -public interface LivingEntityAccessorMixin { -// @Accessor("jumping") boolean isJumping(); -// -// @Invoker("getActiveEyeHeight") float callGetActiveEyeHeight(EntityPose pose, EntityDimensions dimensions); -// @Invoker("tickActiveItemStack") void callTickActiveItemStack(); -// @Invoker("getHurtSound") SoundEvent callGetHurtSound(DamageSource source); -// @Invoker("getDeathSound") SoundEvent callGetDeathSound(); -// @Invoker("playBlockFallSound") void callPlayBlockFallSound(); -// @Invoker("computeFallDamage") int callComputeFallDamage(float fallDistance, float damageMultiplier); -// @Invoker("getSoundVolume") float callGetSoundVolume(); -// @Invoker("getSoundPitch") float callGetSoundPitch(); -// @Invoker("setLivingFlag") void callSetLivingFlag(int mask, boolean value); -// @Invoker("getEyeHeight") float callGetEyeHeight(EntityPose pose, EntityDimensions dimensions); -} diff --git a/fabric/src/main/java/draylar/identity/fabric/mixin/WitherEntityMixin.java b/fabric/src/main/java/draylar/identity/fabric/mixin/WitherEntityMixin.java deleted file mode 100644 index 2641b8a..0000000 --- a/fabric/src/main/java/draylar/identity/fabric/mixin/WitherEntityMixin.java +++ /dev/null @@ -1,54 +0,0 @@ -package draylar.identity.fabric.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.boss.WitherEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.World; -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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.ArrayList; -import java.util.List; - -@Mixin(WitherEntity.class) -public abstract class WitherEntityMixin extends HostileEntity { - - private WitherEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - @Inject( - method = "mobTick", - at = @At(value = "INVOKE", target = "Ljava/util/List;isEmpty()Z"), - locals = LocalCapture.CAPTURE_FAILHARD - ) - private void removeInvalidPlayerTargets(CallbackInfo ci, int j, List list) { - List toRemove = new ArrayList<>(); - - list.forEach(entity -> { - if(entity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // potentially ignore undead identity players - if(identity != null && identity.isUndead()) { - if(this.getTarget() != null) { - // if this wither's target is not equal to the current entity - if(!this.getTarget().getUuid().equals(entity.getUuid())) { - toRemove.add(entity); - } - } else { - toRemove.add(entity); - } - } - } - }); - - list.removeAll(toRemove); - } -} diff --git a/fabric/src/main/java/draylar/identity/fabric/skin/FabricSkinProvider.java b/fabric/src/main/java/draylar/identity/fabric/skin/FabricSkinProvider.java deleted file mode 100644 index 1174f41..0000000 --- a/fabric/src/main/java/draylar/identity/fabric/skin/FabricSkinProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -//package draylar.identity.fabric.skin; -// -//import com.mojang.authlib.GameProfile; -//import draylar.identity.skin.SkinLocation; -//import draylar.identity.skin.SkinProvider; -//import net.minecraft.client.MinecraftClient; -//import net.minecraft.client.network.AbstractClientPlayerEntity; -//import net.minecraft.client.texture.PlayerSkinProvider; -//import net.minecraft.util.Identifier; -// -//import java.util.Map; -//import java.util.UUID; -//import java.util.concurrent.ConcurrentHashMap; -// -//public class FabricSkinProvider implements SkinProvider { -// private final Map skinCache = new ConcurrentHashMap<>(); -// -// @Override -// public void requestSkin(GameProfile profile) { -// MinecraftClient.getInstance().getSkinProvider().loadSkin(profile, (type, identifier, model) -> { -// if (type == PlayerSkinProvider.SkinType.SKIN) { -// skinCache.put(profile.getId(), identifier); -// } -// }, true); -// } -// -// @Override -// public SkinLocation getSkin(GameProfile profile) { -// Identifier id = skinCache.getOrDefault(profile.getId(), -// AbstractClientPlayerEntity.getSkinId(profile.getName())); -// return new SkinLocation(id.getNamespace(), id.getPath()); -// } -// -//} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json deleted file mode 100644 index a381fc6..0000000 --- a/fabric/src/main/resources/fabric.mod.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "schemaVersion": 1, - "id": "identity", - "version": "${version}", - "name": "Identity", - "description": "Play as your favorite entities!", - "authors": [ - "Draylar", - "Gaboouu" - ], - "contributors": [ - "James103", - "Pyrofab", - "AllanChain" - ], - "license": "MIT", - "icon": "assets/identity/icon.png", - "environment": "*", - "entrypoints": { - "main": [ - "draylar.identity.fabric.IdentityFabric" - ], - "client": [ - "draylar.identity.fabric.IdentityFabricClient" - ] - }, - "mixins": [ - "identity.mixins.json", - "identity-fabric.mixins.json" - ], - "depends": { - "fabricloader": ">=0.8.7+build.201", - "fabric": "*", - "architectury": "*" - } -} diff --git a/fabric/src/main/resources/identity-fabric.mixins.json b/fabric/src/main/resources/identity-fabric.mixins.json deleted file mode 100644 index f5c3129..0000000 --- a/fabric/src/main/resources/identity-fabric.mixins.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package": "draylar.identity.fabric.mixin", - "compatibilityLevel": "JAVA_16", - "mixins": [ - "WitherEntityMixin" - ], - "client": [ - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/forge/build.gradle b/forge/build.gradle index 8285dd6..b7ba7c0 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,97 +1,36 @@ plugins { - id 'com.github.johnrengelman.shadow' + id 'java' + id 'net.minecraftforge.gradle' version '6.0+' + id 'maven-publish' } -loom { - forge { - mixinConfigs = [ - "identity-forge.mixins.json", - "identity.mixins.json", - "identity.alexsmobs.mixins.json" - ] - } -} - -architectury { - platformSetupLoomIde() - forge() -} - -configurations { - common - shadowCommon - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - developmentForge.extendsFrom common +group = rootProject.maven_group +version = rootProject.mod_version +base { + archivesName = rootProject.archives_base_name } -dependencies { - forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" - modApi "dev.architectury:architectury-forge:${rootProject.architectury_version}" - - // Forge-only optional dependencies for compilation - modCompileOnly "curse.maven:alexs-mobs-426558:5698791" - modCompileOnly "curse.maven:citadel-331936:5633260" - - // Forge-only runtime dependencies for development - modRuntimeOnly "curse.maven:alexs-mobs-426558:5698791" - modRuntimeOnly "curse.maven:citadel-331936:5633260" - -// modCompileOnly "curse.maven:naturalist-627986:6509918" -// modRuntimeOnly "curse.maven:naturalist-627986:6509918" - modCompileOnly("com.starfish_studios:naturalist-5.0pre4+forge-1.20.1") - modRuntimeOnly("com.starfish_studios:naturalist-5.0pre4+forge-1.20.1") - modRuntimeOnly("software.bernie.geckolib:geckolib-forge-${minecraft_version}:${geckolib_version}") - modCompileOnly("software.bernie.geckolib:geckolib-forge-${minecraft_version}:${geckolib_version}") - modImplementation include ("maven.modrinth:midnightlib:${project.midnightlib_forge_version}-forge") - forgeRuntimeLibrary("com.eliotlash.mclib:mclib:20") - - common(project(path: ":common", configuration: "namedElements")) { transitive = false } - shadowCommon(project(path: ":common", configuration: "transformProductionForge")) { transitive = false } -} - -processResources { - inputs.property "version", project.version.toString() - - filesMatching("META-INF/mods.toml") { - expand("version": project.version.toString()) +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) } + withSourcesJar() } -shadowJar { - configurations = [project.configurations.shadowCommon] - archiveClassifier.set("dev-shadow") - exclude("fabric.mod.json") -} - -remapJar { - input.set(shadowJar.archiveFile) - dependsOn(shadowJar) - archiveClassifier.set("forge") +minecraft { + mappings channel: 'official', version: rootProject.minecraft_version } -jar { - archiveClassifier.set("dev") +repositories { + maven { url = 'https://maven.minecraftforge.net/' } + mavenCentral() } -sourcesJar { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - def commonSources = project(":common").sourcesJar - dependsOn(commonSources) - from(commonSources.archiveFile.map { zipTree(it) }) +dependencies { + minecraft "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" } -components.java { - withVariantsFromConfiguration(project.configurations.shadowRuntimeElements) { - skip() - } +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' } -publishing { - publications { - mavenForge(MavenPublication) { - artifactId = rootProject.archives_base_name + "-" + project.name - from components.java - } - } -} diff --git a/forge/src/main/java/draylar/identity/Identity.java b/forge/src/main/java/draylar/identity/Identity.java new file mode 100644 index 0000000..7fe7440 --- /dev/null +++ b/forge/src/main/java/draylar/identity/Identity.java @@ -0,0 +1,20 @@ +package draylar.identity; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Core entry point for shared Identity logic. + */ +public final class Identity { + public static final String MODID = "identity"; + public static final Logger LOGGER = LoggerFactory.getLogger(Identity.class); + + private Identity() { + } + + public static void init() { + LOGGER.info("Initializing Identity core module"); + } +} + diff --git a/forge/src/main/java/draylar/identity/IdentityForge.java b/forge/src/main/java/draylar/identity/IdentityForge.java new file mode 100644 index 0000000..9054e32 --- /dev/null +++ b/forge/src/main/java/draylar/identity/IdentityForge.java @@ -0,0 +1,10 @@ +package draylar.identity; + +import net.minecraftforge.fml.common.Mod; + +@Mod("identity") +public class IdentityForge { + public IdentityForge() { + Identity.init(); + } +} diff --git a/forge/src/main/java/draylar/identity/api/PlayerIdentity.java b/forge/src/main/java/draylar/identity/api/PlayerIdentity.java new file mode 100644 index 0000000..d0cef9d --- /dev/null +++ b/forge/src/main/java/draylar/identity/api/PlayerIdentity.java @@ -0,0 +1,29 @@ +package draylar.identity.api; + +import draylar.identity.api.variant.IdentityType; +import draylar.identity.impl.PlayerDataProvider; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; + +public final class PlayerIdentity { + private PlayerIdentity() { + } + + public static LivingEntity getIdentity(Player player) { + return ((PlayerDataProvider) player).getIdentity(); + } + + public static IdentityType getIdentityType(Player player) { + return ((PlayerDataProvider) player).getIdentityType(); + } + + public static boolean updateIdentity(ServerPlayer player, IdentityType type, LivingEntity entity) { + return ((PlayerDataProvider) player).updateIdentity(type, entity); + } + + public static void sync(ServerPlayer player) { + // TODO: networking sync will be implemented later + } +} + diff --git a/forge/src/main/java/draylar/identity/api/model/forge/EntityUpdaterForge.java b/forge/src/main/java/draylar/identity/api/model/forge/EntityUpdaterForge.java deleted file mode 100644 index 47c448a..0000000 --- a/forge/src/main/java/draylar/identity/api/model/forge/EntityUpdaterForge.java +++ /dev/null @@ -1,31 +0,0 @@ -package draylar.identity.api.model.forge; - -import draylar.identity.api.model.EntityUpdaters; -import draylar.identity.forge.IdentityForge; -import draylar.identity.impl.NearbySongAccessor; - -public class EntityUpdaterForge { - - private EntityUpdaterForge() {} - public static void init() { - if (!IdentityForge.isAlexsMobsLoaded) { - return; - } - System.out.println("Registering entity updaters for Alex's Mobs!"); -// EntityUpdaters.register(AMEntityRegistry.COCKROACH.get(), (player, cockroach) -> { -// if (player.isOnGround() && ((NearbySongAccessor) player).identity_isNearbySongPlaying()) { -// -// cockroach.setNearbySongPlaying(player.getBlockPos(), true); -// cockroach.setDancing(true); -// player.handleStatus((byte) 67); -// System.out.println("Playing nearby song!"); -// -// } else { -// cockroach.setNearbySongPlaying(player.getBlockPos(), false); -// cockroach.setDancing(false); -// System.out.println("Stopping nearby song!"); -// } -// }); - - } -} diff --git a/forge/src/main/java/draylar/identity/api/platform/forge/IdentityConfigImpl.java b/forge/src/main/java/draylar/identity/api/platform/forge/IdentityConfigImpl.java deleted file mode 100644 index 57fd842..0000000 --- a/forge/src/main/java/draylar/identity/api/platform/forge/IdentityConfigImpl.java +++ /dev/null @@ -1,11 +0,0 @@ -package draylar.identity.api.platform.forge; - -import draylar.identity.forge.IdentityForge; -import draylar.identity.api.platform.IdentityConfig; - -public class IdentityConfigImpl { - - public static IdentityConfig getInstance() { - return IdentityForge.CONFIG; - } -} diff --git a/forge/src/main/java/draylar/identity/api/variant/IdentityType.java b/forge/src/main/java/draylar/identity/api/variant/IdentityType.java new file mode 100644 index 0000000..9ef6966 --- /dev/null +++ b/forge/src/main/java/draylar/identity/api/variant/IdentityType.java @@ -0,0 +1,8 @@ +package draylar.identity.api.variant; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; + +public record IdentityType(EntityType type) { +} + diff --git a/forge/src/main/java/draylar/identity/client/ForgeClientEvents.java b/forge/src/main/java/draylar/identity/client/ForgeClientEvents.java deleted file mode 100644 index e087cc8..0000000 --- a/forge/src/main/java/draylar/identity/client/ForgeClientEvents.java +++ /dev/null @@ -1,27 +0,0 @@ -package draylar.identity.client; - -import draylar.identity.Identity; -import draylar.identity.api.PlayerIdentity; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderGuiOverlayEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; - -@Mod.EventBusSubscriber(modid = "identity", value = Dist.CLIENT) -public class ForgeClientEvents { - - @SubscribeEvent - public static void onRenderOverlay(RenderGuiOverlayEvent.Pre event) { - if ("air_level".equals(event.getOverlay().id().getPath())) { - MinecraftClient mc = MinecraftClient.getInstance(); - PlayerEntity player = mc.player; - if(player == null) return ; - - if (player.isSubmergedInWater() && Identity.identity$isAquatic(PlayerIdentity.getIdentity(player))) { - event.setCanceled(true); - } - } - } -} diff --git a/forge/src/main/java/draylar/identity/forge/IdentityForge.java b/forge/src/main/java/draylar/identity/forge/IdentityForge.java deleted file mode 100644 index a270a87..0000000 --- a/forge/src/main/java/draylar/identity/forge/IdentityForge.java +++ /dev/null @@ -1,51 +0,0 @@ -package draylar.identity.forge; - -import dev.architectury.platform.Platform; -import draylar.identity.Identity; -import draylar.identity.api.platform.IdentityPlatform; -import draylar.identity.forge.ability.AlexsMobsAbilityRegistry; -//import draylar.identity.forge.ability.NaturalistAbilityRegistry; -import draylar.identity.forge.config.ConfigLoader; -import draylar.identity.forge.config.ForgeConfigReloader; -import draylar.identity.forge.config.IdentityForgeConfig; -import draylar.identity.util.IdentityCompatUtils; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; - -@Mod("identity") -public class IdentityForge { - - public static final boolean isAlexsMobsLoaded = IdentityCompatUtils.isAlexsMobsLoaded(); - //public static final boolean isNaturalistLoaded = IdentityCompatUtils.isNaturalistLoaded(); - public static final int CONFIG_VERSION = 5; - public static IdentityForgeConfig CONFIG; - - public IdentityForge() { - CONFIG = ConfigLoader.read(); - new Identity().initialize(); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); - IdentityPlatform.setConfig(CONFIG); - IdentityPlatform.setReloader(new ForgeConfigReloader()); - - -// if (ModList.get().isLoaded("bjornlib")) { -// ForgeLivingEntityCompatProvider.init(); // qui utilise Bjorn -// } - if(Platform.getEnv().isClient()) { - new IdentityForgeClient(); - } - } - - - private void setup(final FMLCommonSetupEvent event) { - event.enqueueWork(() -> { - AlexsMobsAbilityRegistry.init(); -// NaturalistAbilityRegistry.init(); - }); - } - - - -} diff --git a/forge/src/main/java/draylar/identity/forge/IdentityForgeClient.java b/forge/src/main/java/draylar/identity/forge/IdentityForgeClient.java deleted file mode 100644 index db11fc1..0000000 --- a/forge/src/main/java/draylar/identity/forge/IdentityForgeClient.java +++ /dev/null @@ -1,23 +0,0 @@ -package draylar.identity.forge; - -import draylar.identity.IdentityClient; -import draylar.identity.api.model.forge.EntityUpdaterForge; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; - -public class IdentityForgeClient { - - public IdentityForgeClient() { - new IdentityClient().initialize(); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); - - } - private void setup(final FMLCommonSetupEvent event) { - event.enqueueWork(() -> { - if(IdentityForge.isAlexsMobsLoaded) { - EntityUpdaterForge.init(); - } - }); - } - -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/AlexsMobsAbilityRegistry.java b/forge/src/main/java/draylar/identity/forge/ability/AlexsMobsAbilityRegistry.java deleted file mode 100644 index 15cb320..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/AlexsMobsAbilityRegistry.java +++ /dev/null @@ -1,66 +0,0 @@ -package draylar.identity.forge.ability; - -import com.github.alexthe666.alexsmobs.entity.AMEntityRegistry; -import draylar.identity.ability.AbilityRegistry; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.forge.IdentityForge; -import draylar.identity.forge.ability.impl.*; -import draylar.identity.util.IdentityCompatUtils; -//import net.minecraft.entity.EntityType; -import net.minecraft.entity.EntityType; -import net.minecraftforge.registries.RegistryObject; - -import java.util.HashMap; -import java.util.Map; - -public class AlexsMobsAbilityRegistry { - - - - private AlexsMobsAbilityRegistry() {} - - public static void init() { - if (!IdentityForge.isAlexsMobsLoaded) { - return; - } - - // Call .get() at the point of calling AbilityRegistry.register - AbilityRegistry.register(AMEntityRegistry.ANACONDA.get(), new AnacondaAbility()); - AbilityRegistry.register(AMEntityRegistry.BALD_EAGLE.get(), new BaldEagleAbility()); - AbilityRegistry.register(AMEntityRegistry.BONE_SERPENT.get(), new BoneSerpentAbility()); - AbilityRegistry.register(AMEntityRegistry.COCKROACH.get(),new CockRoachAbility()); - AbilityRegistry.register(AMEntityRegistry.CRIMSON_MOSQUITO.get(), new CrimsonMosquitoAbility()); - AbilityRegistry.register(AMEntityRegistry.CROCODILE.get(), new CrocodileAbility()); - AbilityRegistry.register(AMEntityRegistry.CROW.get(), new CrowAbility()); - AbilityRegistry.register(AMEntityRegistry.DROPBEAR.get(), new DropBearAbility()); - AbilityRegistry.register(AMEntityRegistry.ELEPHANT.get(), new ElephantAbility()); - AbilityRegistry.register(AMEntityRegistry.EMU.get(), new EmuAbility()); - AbilityRegistry.register(AMEntityRegistry.ENDERIOPHAGE.get(), new EnderiophageAbility()); - AbilityRegistry.register(AMEntityRegistry.FLY.get(), new FlyAbility()); - AbilityRegistry.register(AMEntityRegistry.GIANT_SQUID.get(), new GiantSquidAbility()); - AbilityRegistry.register(AMEntityRegistry.GORILLA.get(), new GorillaAbility()); - AbilityRegistry.register(AMEntityRegistry.GRIZZLY_BEAR.get(), new GrizzlyBearAbility()); - AbilityRegistry.register(AMEntityRegistry.GUSTER.get(), new GusterAbility()); - AbilityRegistry.register(AMEntityRegistry.HUMMINGBIRD.get(), new HummingbirdAbility()); - AbilityRegistry.register(AMEntityRegistry.KANGAROO.get(), new KangarooAbility()); - AbilityRegistry.register(AMEntityRegistry.KOMODO_DRAGON.get(), new KomodoDragonAbility()); - AbilityRegistry.register(AMEntityRegistry.MIMICUBE.get(), new MimicubeAbility()); - AbilityRegistry.register(AMEntityRegistry.MOOSE.get(), new MooseAbility()); - AbilityRegistry.register(AMEntityRegistry.ORCA.get(), new OrcaAbility()); - AbilityRegistry.register(AMEntityRegistry.RACCOON.get(), new RaccoonAbility()); - AbilityRegistry.register(AMEntityRegistry.RATTLESNAKE.get(), new RattlesnakeAbility()); - AbilityRegistry.register(AMEntityRegistry.ROADRUNNER.get(), new RoadrunnerAbility()); - AbilityRegistry.register(AMEntityRegistry.SKUNK.get(), new SkunkAbility()); - AbilityRegistry.register(AMEntityRegistry.SNOW_LEOPARD.get(), new SnowLeopardAbility()); - AbilityRegistry.register(AMEntityRegistry.SOUL_VULTURE.get(), new SoulVultureAbility()); - AbilityRegistry.register(AMEntityRegistry.SPECTRE.get(), new SpectreAbility()); - AbilityRegistry.register(AMEntityRegistry.SUNBIRD.get(), new SunbirdAbility()); - AbilityRegistry.register(AMEntityRegistry.TARANTULA_HAWK.get(), new TarantulaHawkAbility()); - AbilityRegistry.register(AMEntityRegistry.TASMANIAN_DEVIL.get(), new TasmanianDevilAbility()); - AbilityRegistry.register(AMEntityRegistry.TIGER.get(), new TigerAbility()); - AbilityRegistry.register(AMEntityRegistry.VOID_WORM.get(), new VoidWormAbility()); - AbilityRegistry.register(AMEntityRegistry.WARPED_MOSCO.get(), new WarpedMoscoAbility()); - } - - -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/NaturalistAbilityRegistry.java b/forge/src/main/java/draylar/identity/forge/ability/NaturalistAbilityRegistry.java deleted file mode 100644 index 0e7b18b..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/NaturalistAbilityRegistry.java +++ /dev/null @@ -1,24 +0,0 @@ -package draylar.identity.forge.ability; - -import draylar.identity.ability.AbilityRegistry; -//import draylar.identity.forge.ability.impl.BearAbility; -import draylar.identity.util.IdentityCompatUtils; -import net.minecraft.entity.EntityType; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; - -public class NaturalistAbilityRegistry { - -// private NaturalistAbilityRegistry() {} -// -// public static void init() { -// if (!IdentityCompatUtils.isNaturalistLoaded()) { -// return; -// } -// -// EntityType bear = Registries.ENTITY_TYPE.get(new Identifier("naturalist", "bear")); -// if (bear != null) { -// AbilityRegistry.register(bear, new BearAbility()); -// } -// } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/AnacondaAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/AnacondaAbility.java deleted file mode 100644 index 72392e2..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/AnacondaAbility.java +++ /dev/null @@ -1,23 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityAnaconda; - -import com.github.alexthe666.alexsmobs.entity.EntityAnaconda; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class AnacondaAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityAnaconda identity, World world) { - AbilityUtils.constrictNearby(player, 3.0f); - } - - @Override - public Item getIcon() { - return Items.VINE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/BaldEagleAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/BaldEagleAbility.java deleted file mode 100644 index d6dcd7d..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/BaldEagleAbility.java +++ /dev/null @@ -1,23 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityBaldEagle; - -import com.github.alexthe666.alexsmobs.entity.EntityBaldEagle; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class BaldEagleAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityBaldEagle identity, World world) { - AbilityUtils.dashForward(player, 1.2D); - } - - @Override - public Item getIcon() { - return Items.FEATHER; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/BearAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/BearAbility.java deleted file mode 100644 index fc64761..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/BearAbility.java +++ /dev/null @@ -1,22 +0,0 @@ -package draylar.identity.forge.ability.impl; - -import draylar.identity.ability.IdentityAbility; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.world.World; - -public class BearAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, LivingEntity identity, World world) { - player.addStatusEffect(new StatusEffectInstance(StatusEffects.STRENGTH, 200, 1)); - } - - @Override - public Item getIcon() { - return Items.HONEYCOMB; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/BoneSerpentAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/BoneSerpentAbility.java deleted file mode 100644 index 60e011a..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/BoneSerpentAbility.java +++ /dev/null @@ -1,25 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityBoneSerpent; - -import com.github.alexthe666.alexsmobs.entity.EntityBoneSerpent; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class BoneSerpentAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityBoneSerpent identity, World world) { - if (player.isInLava()) { - AbilityUtils.dashForward(player, 1.8D); - } - } - - @Override - public Item getIcon() { - return Items.MAGMA_CREAM; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/CockRoachAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/CockRoachAbility.java deleted file mode 100644 index ebf9da4..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/CockRoachAbility.java +++ /dev/null @@ -1,29 +0,0 @@ -package draylar.identity.forge.ability.impl; - -import com.github.alexthe666.alexsmobs.entity.EntityCockroach; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.forge.util.CockroachDanceManager; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.world.World; - -public class CockRoachAbility extends IdentityAbility { - - @Override - public void onUse(PlayerEntity player, EntityCockroach identity, World world) { - if (!world.isClient && player instanceof ServerPlayerEntity sp) { - // no longer need debug‐util: just send 67 to kick off the dance - sp.getWorld().sendEntityStatus(player, (byte) 67); - CockroachDanceManager.forceDance(sp, 200); - } - } - - - @Override - public Item getIcon() { - return Items.MUSIC_DISC_CAT; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/CrimsonMosquitoAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/CrimsonMosquitoAbility.java deleted file mode 100644 index 63b1e97..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/CrimsonMosquitoAbility.java +++ /dev/null @@ -1,29 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityCrimsonMosquito; - -import com.github.alexthe666.alexsmobs.entity.EntityCrimsonMosquito; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.world.World; - -public class CrimsonMosquitoAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityCrimsonMosquito identity, World world) { - EntityHitResult hit = AbilityUtils.raycastEntities(player, 2.5D); - if (hit != null && hit.getEntity() instanceof LivingEntity target) { - target.damage(player.getDamageSources().playerAttack(player), 2.0f); - player.heal(1.0f); - } - } - - @Override - public Item getIcon() { - return Items.SPIDER_EYE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/CrocodileAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/CrocodileAbility.java deleted file mode 100644 index cae8b1c..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/CrocodileAbility.java +++ /dev/null @@ -1,28 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityCrocodile; - -import com.github.alexthe666.alexsmobs.entity.EntityCrocodile; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.world.World; - -public class CrocodileAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityCrocodile identity, World world) { - EntityHitResult hit = AbilityUtils.raycastEntities(player, 5.0D); - if (hit != null && hit.getEntity() instanceof LivingEntity target) { - AbilityUtils.pullEntityTowardPlayer(player, target, 1.5D); - } - } - - @Override - public Item getIcon() { - return Items.LEAD; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/CrowAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/CrowAbility.java deleted file mode 100644 index 471ccc6..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/CrowAbility.java +++ /dev/null @@ -1,23 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityCrow; - -import com.github.alexthe666.alexsmobs.entity.EntityCrow; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class CrowAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityCrow identity, World world) { - AbilityUtils.dashUpward(player, 0.5D); - } - - @Override - public Item getIcon() { - return Items.FEATHER; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/DropBearAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/DropBearAbility.java deleted file mode 100644 index 7e4416b..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/DropBearAbility.java +++ /dev/null @@ -1,23 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityDropBear; - -import com.github.alexthe666.alexsmobs.entity.EntityDropBear; -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class DropBearAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityDropBear identity, World world) { - AbilityUtils.dashForward(player, 1.0D); - } - - @Override - public Item getIcon() { - return Items.BONE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/ElephantAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/ElephantAbility.java deleted file mode 100644 index 9c3cf9c..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/ElephantAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityElephant; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class ElephantAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityElephant identity, World world) { - AbilityUtils.knockbackNearbyEntities(player, 4.0f, 2.0D); - } - - @Override - public Item getIcon() { - return Items.HAY_BLOCK; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/EmuAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/EmuAbility.java deleted file mode 100644 index 418d511..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/EmuAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityEmu; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class EmuAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityEmu identity, World world) { - AbilityUtils.dashForward(player, 1.4D); - } - - @Override - public Item getIcon() { - return Items.EGG; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/EnderiophageAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/EnderiophageAbility.java deleted file mode 100644 index 26b4f0e..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/EnderiophageAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityEnderiophage; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class EnderiophageAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityEnderiophage identity, World world) { - AbilityUtils.shortTeleportForward(player, 5.0D); - } - - @Override - public Item getIcon() { - return Items.ENDER_PEARL; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/FlyAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/FlyAbility.java deleted file mode 100644 index 56c121f..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/FlyAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityFly; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class FlyAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityFly identity, World world) { - AbilityUtils.dashForward(player, 0.4D); - } - - @Override - public Item getIcon() { - return Items.SUGAR; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/GiantSquidAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/GiantSquidAbility.java deleted file mode 100644 index 7e68279..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/GiantSquidAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityGiantSquid; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class GiantSquidAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityGiantSquid identity, World world) { - AbilityUtils.waterDash(player, 1.5D); - } - - @Override - public Item getIcon() { - return Items.INK_SAC; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/GorillaAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/GorillaAbility.java deleted file mode 100644 index 0c83d46..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/GorillaAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityGorilla; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class GorillaAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityGorilla identity, World world) { - AbilityUtils.knockbackNearbyEntities(player, 3.0F, 1.5D); - } - - @Override - public Item getIcon() { - return Items.BEEF; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/GrizzlyBearAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/GrizzlyBearAbility.java deleted file mode 100644 index 9b1d36d..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/GrizzlyBearAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityGrizzlyBear; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class GrizzlyBearAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityGrizzlyBear identity, World world) { - AbilityUtils.knockbackNearbyEntities(player, 3.0F, 1.0D); - } - - @Override - public Item getIcon() { - return Items.BEEF; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/GusterAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/GusterAbility.java deleted file mode 100644 index b0fddd0..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/GusterAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityGuster; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class GusterAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityGuster identity, World world) { - AbilityUtils.knockbackNearbyEntities(player, 5.0F, 2.0D); - } - - @Override - public Item getIcon() { - return Items.PHANTOM_MEMBRANE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/HummingbirdAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/HummingbirdAbility.java deleted file mode 100644 index 951ee61..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/HummingbirdAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityHummingbird; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class HummingbirdAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityHummingbird identity, World world) { - AbilityUtils.dashUpward(player, 0.7D); - } - - @Override - public Item getIcon() { - return Items.FEATHER; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/KangarooAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/KangarooAbility.java deleted file mode 100644 index 508e432..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/KangarooAbility.java +++ /dev/null @@ -1,23 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityKangaroo; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class KangarooAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityKangaroo identity, World world) { - AbilityUtils.dashForward(player, 1.2D); - AbilityUtils.dashUpward(player, 0.5D); - } - - @Override - public Item getIcon() { - return Items.RABBIT_FOOT; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/KomodoDragonAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/KomodoDragonAbility.java deleted file mode 100644 index abaf459..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/KomodoDragonAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityKomodoDragon; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class KomodoDragonAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityKomodoDragon identity, World world) { - AbilityUtils.poisonNearbyEnemies(player, 3.0f, 100, 0); - } - - @Override - public Item getIcon() { - return Items.FERMENTED_SPIDER_EYE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/MimicubeAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/MimicubeAbility.java deleted file mode 100644 index 01d3882..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/MimicubeAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityMimicube; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class MimicubeAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityMimicube identity, World world) { - AbilityUtils.randomMorphNearby(player); - } - - @Override - public Item getIcon() { - return Items.SLIME_BALL; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/MooseAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/MooseAbility.java deleted file mode 100644 index be671cb..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/MooseAbility.java +++ /dev/null @@ -1,23 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityMoose; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class MooseAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityMoose identity, World world) { - AbilityUtils.dashForward(player, 1.4D); - AbilityUtils.knockbackNearbyEntities(player, 2.5f, 1.2D); - } - - @Override - public Item getIcon() { - return Items.WHEAT; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/OrcaAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/OrcaAbility.java deleted file mode 100644 index 9b0826e..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/OrcaAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityOrca; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class OrcaAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityOrca identity, World world) { - AbilityUtils.waterDash(player, 1.2D); - } - - @Override - public Item getIcon() { - return Items.PRISMARINE_CRYSTALS; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/RaccoonAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/RaccoonAbility.java deleted file mode 100644 index 9669240..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/RaccoonAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityRaccoon; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class RaccoonAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityRaccoon identity, World world) { - AbilityUtils.dropRandomItemFromInventory(player); - } - - @Override - public Item getIcon() { - return Items.CHEST; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/RattlesnakeAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/RattlesnakeAbility.java deleted file mode 100644 index 370e217..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/RattlesnakeAbility.java +++ /dev/null @@ -1,29 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityRattlesnake; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.world.World; - -public class RattlesnakeAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityRattlesnake identity, World world) { - EntityHitResult hit = AbilityUtils.raycastEntities(player, 2.0D); - if (hit != null && hit.getEntity() instanceof LivingEntity target) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, 60, 0)); - } - } - - @Override - public Item getIcon() { - return Items.BONE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/RoadrunnerAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/RoadrunnerAbility.java deleted file mode 100644 index bd68e6c..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/RoadrunnerAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityRoadrunner; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class RoadrunnerAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityRoadrunner identity, World world) { - AbilityUtils.dashForward(player, 1.8D); - } - - @Override - public Item getIcon() { - return Items.FEATHER; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/SkunkAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/SkunkAbility.java deleted file mode 100644 index a26e0d5..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/SkunkAbility.java +++ /dev/null @@ -1,23 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntitySkunk; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class SkunkAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntitySkunk identity, World world) { - // Skunk: Placeholder to simulate "poison cloud" - AbilityUtils.healNearbyPlayers(player, 2.5f, -2.0f); - } - - @Override - public Item getIcon() { - return Items.ROTTEN_FLESH; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/SnowLeopardAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/SnowLeopardAbility.java deleted file mode 100644 index cedc4ad..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/SnowLeopardAbility.java +++ /dev/null @@ -1,25 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntitySnowLeopard; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class SnowLeopardAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntitySnowLeopard identity, World world) { - if (player.getWorld().getBlockState(player.getBlockPos().down()).isOf(Blocks.SNOW_BLOCK)) { - AbilityUtils.dashForward(player, 1.3D); - } - } - - @Override - public Item getIcon() { - return Items.SNOWBALL; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/SoulVultureAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/SoulVultureAbility.java deleted file mode 100644 index 2f0f52b..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/SoulVultureAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntitySoulVulture; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class SoulVultureAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntitySoulVulture identity, World world) { - AbilityUtils.healNearbyPlayers(player, 4.0F, 4.0F); - } - - @Override - public Item getIcon() { - return Items.GHAST_TEAR; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/SpectreAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/SpectreAbility.java deleted file mode 100644 index e65d87a..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/SpectreAbility.java +++ /dev/null @@ -1,21 +0,0 @@ -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntitySpectre; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class SpectreAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntitySpectre identity, World world) { - AbilityUtils.dashForward(player, 2.0D); - } - - @Override - public Item getIcon() { - return Items.ENDER_PEARL; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/SunbirdAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/SunbirdAbility.java deleted file mode 100644 index a4fde21..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/SunbirdAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntitySunbird; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class SunbirdAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntitySunbird identity, World world) { - AbilityUtils.dashUpward(player, 2.0D); - } - - @Override - public Item getIcon() { - return Items.GOLDEN_APPLE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/TarantulaHawkAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/TarantulaHawkAbility.java deleted file mode 100644 index 15c44c7..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/TarantulaHawkAbility.java +++ /dev/null @@ -1,29 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityTarantulaHawk; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.world.World; - -public class TarantulaHawkAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityTarantulaHawk identity, World world) { - EntityHitResult hit = AbilityUtils.raycastEntities(player, 3.0D); - if (hit != null && hit.getEntity() instanceof LivingEntity target) { - target.addStatusEffect(new StatusEffectInstance(StatusEffects.POISON, 100, 0)); - } - } - - @Override - public Item getIcon() { - return Items.SPIDER_EYE; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/TasmanianDevilAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/TasmanianDevilAbility.java deleted file mode 100644 index aace404..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/TasmanianDevilAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityTasmanianDevil; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class TasmanianDevilAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityTasmanianDevil identity, World world) { - AbilityUtils.dashForward(player, 1.8D); - } - - @Override - public Item getIcon() { - return Items.BEEF; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/TigerAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/TigerAbility.java deleted file mode 100644 index edee939..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/TigerAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityTiger; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class TigerAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityTiger identity, World world) { - AbilityUtils.dashForward(player, 1.5D); - } - - @Override - public Item getIcon() { - return Items.BEEF; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/VoidWormAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/VoidWormAbility.java deleted file mode 100644 index 8b0e3a0..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/VoidWormAbility.java +++ /dev/null @@ -1,22 +0,0 @@ - -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityVoidWorm; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class VoidWormAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityVoidWorm identity, World world) { - AbilityUtils.dashForward(player, 2.5D); - } - - @Override - public Item getIcon() { - return Items.ENDER_PEARL; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/WarpedMoscoAbility.java b/forge/src/main/java/draylar/identity/forge/ability/impl/WarpedMoscoAbility.java deleted file mode 100644 index a382c3a..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/WarpedMoscoAbility.java +++ /dev/null @@ -1,22 +0,0 @@ -package draylar.identity.forge.ability.impl; -import com.github.alexthe666.alexsmobs.entity.EntityWarpedMosco; - -import draylar.identity.ability.IdentityAbility; -import draylar.identity.util.AbilityUtils; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Items; -import net.minecraft.item.Item; -import net.minecraft.world.World; - -public class WarpedMoscoAbility extends IdentityAbility { - @Override - public void onUse(PlayerEntity player, EntityWarpedMosco identity, World world) { - AbilityUtils.dashForward(player, 2.5D); - AbilityUtils.knockbackNearbyEntities(player, 3.0F, 2.5D); - } - - @Override - public Item getIcon() { - return Items.NETHERITE_SCRAP; - } -} diff --git a/forge/src/main/java/draylar/identity/forge/ability/impl/test.py b/forge/src/main/java/draylar/identity/forge/ability/impl/test.py deleted file mode 100644 index 2a4d767..0000000 --- a/forge/src/main/java/draylar/identity/forge/ability/impl/test.py +++ /dev/null @@ -1,33 +0,0 @@ -import os - -def fix_ability_generics_and_imports(): - folder_path = os.path.dirname(os.path.abspath(__file__)) # Automatically use the script's own folder - - for root, dirs, files in os.walk(folder_path): - for file in files: - if file.endswith("Ability.java"): - ability_path = os.path.join(root, file) - entity_base_name = file.replace("Ability.java", "") # Example: DropBear - entity_name = f"Entity{entity_base_name}" # Example: EntityDropBear - - with open(ability_path, "r", encoding="utf-8") as f: - content = f.read() - - # 1. Add import line after package and existing imports - package_line_end = content.find(";\n") + 2 - import_line = f"import com.github.alexthe666.alexsmobs.entity.{entity_name};\n" - content = content[:package_line_end] + import_line + content[package_line_end:] - - # 2. Replace IdentityAbility with IdentityAbility - content = content.replace("IdentityAbility", f"IdentityAbility<{entity_name}>") - - # 3. Replace onUse parameter (Object identity) with (EntityXXX identity) - content = content.replace("Object identity", f"{entity_name} identity") - - with open(ability_path, "w", encoding="utf-8") as f: - f.write(content) - - print(f"Fixed {file} -> uses {entity_name}") - -if __name__ == "__main__": - fix_ability_generics_and_imports() diff --git a/forge/src/main/java/draylar/identity/forge/compat/accessor/ForceDanceAccessor.java b/forge/src/main/java/draylar/identity/forge/compat/accessor/ForceDanceAccessor.java deleted file mode 100644 index 87484e2..0000000 --- a/forge/src/main/java/draylar/identity/forge/compat/accessor/ForceDanceAccessor.java +++ /dev/null @@ -1,12 +0,0 @@ -package draylar.identity.forge.compat.accessor; - -import net.minecraft.entity.data.TrackedData; - -public interface ForceDanceAccessor { - void identity$startForceDance(); - TrackedData identity$getDanceTicksTracker(); - void identity$forceDance(int ticks); - - - -} \ No newline at end of file diff --git a/forge/src/main/java/draylar/identity/forge/config/ConfigLoader.java b/forge/src/main/java/draylar/identity/forge/config/ConfigLoader.java deleted file mode 100644 index 418f899..0000000 --- a/forge/src/main/java/draylar/identity/forge/config/ConfigLoader.java +++ /dev/null @@ -1,69 +0,0 @@ -package draylar.identity.forge.config; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import dev.architectury.platform.Platform; -import draylar.identity.forge.IdentityForge; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -public class ConfigLoader { - - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - - public static IdentityForgeConfig read() { - Path configFolder = Platform.getConfigFolder(); - Path configFile = Paths.get(configFolder.toString(), "identity.json"); - - if (!Files.exists(configFile)) { - IdentityForgeConfig config = new IdentityForgeConfig(); - writeConfigFile(configFile, config); - return config; - } else { - try { - IdentityForgeConfig newConfig = GSON.fromJson(Files.readString(configFile), IdentityForgeConfig.class); - - if (newConfig == null) { - System.err.println("[Identity] Config file corrupted or empty, regenerating default identity.json."); - IdentityForgeConfig config = new IdentityForgeConfig(); - writeConfigFile(configFile, config); - return config; - } - - // Check config version - if (newConfig.getConfigVersion() < IdentityForge.CONFIG_VERSION) { - System.err.println("[Identity] Outdated config version detected (found: " + newConfig.getConfigVersion() + ", expected: " + IdentityForge.CONFIG_VERSION + "). Regenerating identity.json."); - IdentityForgeConfig config = new IdentityForgeConfig(); - writeConfigFile(configFile, config); - return config; - } - - // Config is fine, just update/save any new fields if missing - writeConfigFile(configFile, newConfig); - return newConfig; - } catch (IOException exception) { - System.err.println("[Identity] Failed to read config file! Regenerating default identity.json."); - exception.printStackTrace(); - - IdentityForgeConfig config = new IdentityForgeConfig(); - writeConfigFile(configFile, config); - return config; - } - } - } - - private static void writeConfigFile(Path file, IdentityForgeConfig config) { - try { - if (!Files.exists(file)) { - Files.createFile(file); - } - - Files.writeString(file, GSON.toJson(config)); - } catch (IOException exception) { - exception.printStackTrace(); - } - } -} diff --git a/forge/src/main/java/draylar/identity/forge/config/ForgeConfigReloader.java b/forge/src/main/java/draylar/identity/forge/config/ForgeConfigReloader.java deleted file mode 100644 index 9057b50..0000000 --- a/forge/src/main/java/draylar/identity/forge/config/ForgeConfigReloader.java +++ /dev/null @@ -1,15 +0,0 @@ -package draylar.identity.forge.config; - -import draylar.identity.api.platform.ConfigReloader; -import draylar.identity.api.platform.IdentityPlatform; -import draylar.identity.forge.IdentityForge; - -public class ForgeConfigReloader implements ConfigReloader { - @Override - public void reloadConfig() { - IdentityForge.CONFIG = ConfigLoader.read(); - IdentityPlatform.setConfig(IdentityForge.CONFIG); - - System.out.println("[Identity] Forge config reloaded."); - } -} \ No newline at end of file diff --git a/forge/src/main/java/draylar/identity/forge/config/IdentityForgeConfig.java b/forge/src/main/java/draylar/identity/forge/config/IdentityForgeConfig.java deleted file mode 100644 index 633ff8f..0000000 --- a/forge/src/main/java/draylar/identity/forge/config/IdentityForgeConfig.java +++ /dev/null @@ -1,336 +0,0 @@ -package draylar.identity.forge.config; - - -import draylar.identity.forge.IdentityForge; -import draylar.identity.api.platform.IdentityConfig; -import draylar.identity.registry.IdentityEntityTags; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Identifier; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class IdentityForgeConfig extends IdentityConfig { - private List extraAquaticEntities = new ArrayList<>(); - private List removedAquaticEntities = new ArrayList<>(); - private List extraFlyingEntities = new ArrayList<>(); - private List removedFlyingEntities = new ArrayList<>(); - - - private int configVersion = IdentityForge.CONFIG_VERSION; - - public boolean overlayIdentityUnlocks = true; - public boolean overlayIdentityRevokes = true; - public boolean revokeIdentityOnDeath = false; - public boolean identitiesEquipItems = true; - public boolean identitiesEquipArmor = true; - public boolean renderOwnNameTag = false; - public boolean hostilesIgnoreHostileIdentityPlayer = true; - public boolean hostilesForgetNewHostileIdentityPlayer = false; - public boolean wolvesAttackIdentityPrey = true; - public boolean ownedWolvesAttackIdentityPrey = false; - public boolean villagersRunFromIdentities = true; - public boolean foxesAttackIdentityPrey = true; - public boolean useIdentitySounds = true; - public boolean playAmbientSounds = true; - public boolean hearSelfAmbient = false; - public boolean enableFlight = true; - public int hostilityTime = 20 * 15; - public List advancementsRequiredForFlight = new ArrayList<>(); - public boolean scalingHealth = true; - public int maxHealth = 20; - public boolean enableClientSwapMenu = true; - public boolean enableSwaps = true; - public List allowedSwappers = new ArrayList<>(); - public int endermanAbilityTeleportDistance = 32; - public boolean showPlayerNametag = false; - public boolean forceChangeNew = false; - public boolean forceChangeAlways = false; - public boolean logCommands = true; - public float flySpeed = 0.05f; - public boolean killForIdentity = false; - public int requiredKillsForIdentity = 10; - public boolean wardenIsBlinded = true; - public boolean wardenBlindsNearby = true; - public String forcedIdentity = null; - - public Map requiredKillsByType = new HashMap<>() { - { - put("minecraft:ender_dragon", 1); - put("minecraft:elder_guardian", 1); - put("minecraft:wither", 1); - } - }; - - public Map abilityCooldownMap = new HashMap<>() { - { - put("minecraft:ghast", 60); - put("minecraft:blaze", 20); - put("minecraft:ender_dragon", 20); - put("minecraft:enderman", 100); - put("minecraft:creeper", 100); - put("minecraft:wither", 200); - put("minecraft:snow_golem", 10); - put("minecraft:witch", 200); - put("minecraft:evoker", 10); - if (IdentityForge.isAlexsMobsLoaded) { - put("alexsmobs:grizzly_bear", 20); - put("alexsmobs:guster", 40); - put("alexsmobs:coackroach", 10); - put("alexsmobs:dropbear", 60); - put("alexsmobs:sunbird", 60); - put("alexsmobs:void_worm", 80); - put("alexsmobs:komodo_dragon", 30); - put("alexsmobs:skunk", 100); - put("alexsmobs:crow", 20); - put("alexsmobs:orca", 60); - put("alexsmobs:gorilla", 40); - put("alexsmobs:roadrunner", 30); - put("alexsmobs:soul_vulture", 60); - put("alexsmobs:mimicube", 80); - put("alexsmobs:bald_eagle", 20); - put("alexsmobs:bone_serpent", 40); - put("alexsmobs:crimson_mosquito", 30); - put("alexsmobs:emu", 30); - put("alexsmobs:enderiophage", 60); - put("alexsmobs:fly", 10); - put("alexsmobs:giant_squid", 50); - put("alexsmobs:kangaroo", 30); - put("alexsmobs:raccoon", 100); - put("alexsmobs:rattlesnake", 40); - put("alexsmobs:snow_leopard", 40); - put("alexsmobs:spectre", 50); - put("alexsmobs:tarantula_hawk", 50); - put("alexsmobs:tasmanian_devil", 40); - put("alexsmobs:tiger", 40); - put("alexsmobs:warped_mosco", 70); - put("alexsmobs:elephant", 50); - put("alexsmobs:crocodile", 40); - put("alexsmobs:moose", 50); - put("alexsmobs:hummingbird", 15); - } - - } - }; - - public static IdentityConfig getInstance() { - return IdentityForge.CONFIG; - } - - @Override - public int getConfigVersion() { - return configVersion; - } - - @Override - public boolean enableFlight() { - return enableFlight; - } - - @Override - public List advancementsRequiredForFlight() { - return advancementsRequiredForFlight; - } - - @Override - public Map getAbilityCooldownMap() { - return abilityCooldownMap; - } - - @Override - public boolean requiresKillsForIdentity() { - return killForIdentity; - } - - @Override - public int getRequiredKillsForIdentity() { - return requiredKillsForIdentity; - } - - @Override - public Map getRequiredKillsByType() { - return requiredKillsByType; - } - - @Override - public boolean shouldOverlayIdentityUnlocks() { - return overlayIdentityUnlocks; - } - - @Override - public boolean forceChangeNew() { - return forceChangeNew; - } - - @Override - public boolean forceChangeAlways() { - return forceChangeAlways; - } - - @Override - public boolean logCommands() { - return logCommands; - } - - @Override - public boolean enableClientSwapMenu() { - return enableClientSwapMenu; - } - - @Override - public boolean wolvesAttackIdentityPrey() { - return wolvesAttackIdentityPrey; - } - - @Override - public boolean ownedWolvesAttackIdentityPrey() { - return ownedWolvesAttackIdentityPrey; - } - - @Override - public boolean villagersRunFromIdentities() { - return villagersRunFromIdentities; - } - - @Override - public boolean revokeIdentityOnDeath() { - return revokeIdentityOnDeath; - } - - @Override - public boolean overlayIdentityRevokes() { - return overlayIdentityRevokes; - } - - @Override - public float flySpeed() { - return flySpeed; - } - - @Override - public boolean scalingHealth() { - return scalingHealth; - } - - @Override - public int maxHealth() { - return maxHealth; - } - - @Override - public boolean identitiesEquipItems() { - return identitiesEquipItems; - } - - @Override - public boolean identitiesEquipArmor() { - return identitiesEquipArmor; - } - - @Override - public boolean shouldRenderOwnNameTag() { - return renderOwnNameTag; - } - - @Override - public boolean showPlayerNametag() { - return showPlayerNametag; - } - - @Override - public boolean foxesAttackIdentityPrey() { - return foxesAttackIdentityPrey; - } - - @Override - public boolean hostilesForgetNewHostileIdentityPlayer() { - return hostilesForgetNewHostileIdentityPlayer; - } - - @Override - public boolean hostilesIgnoreHostileIdentityPlayer() { - return hostilesIgnoreHostileIdentityPlayer; - } - - @Override - public boolean playAmbientSounds() { - return playAmbientSounds; - } - - @Override - public boolean useIdentitySounds() { - return useIdentitySounds; - } - - @Override - public boolean hearSelfAmbient() { - return hearSelfAmbient; - } - - @Override - public double endermanAbilityTeleportDistance() { - return endermanAbilityTeleportDistance; - } - - @Override - public boolean enableSwaps() { - return enableSwaps; - } - - @Override - public void setEnableSwaps(boolean enabled) { - this.enableSwaps = enabled; - } - - @Override - public List allowedSwappers() { - return allowedSwappers; - } - - @Override - public int hostilityTime() { - return hostilityTime; - } - - @Override - public boolean wardenIsBlinded() { - return wardenIsBlinded; - } - - @Override - public boolean wardenBlindsNearby() { - return wardenBlindsNearby; - } - - @Override - public String getForcedIdentity() { - return forcedIdentity; - } - - - - @Override - public List extraAquaticEntities() { - return extraAquaticEntities; - } - - @Override - public List removedAquaticEntities() { - return removedAquaticEntities; - } - - @Override - public List extraFlyingEntities() { - return extraFlyingEntities; - } - - @Override - public List removedFlyingEntities() { - return removedFlyingEntities; - } - - -} diff --git a/forge/src/main/java/draylar/identity/forge/mixin/BjornCompatMixin.java b/forge/src/main/java/draylar/identity/forge/mixin/BjornCompatMixin.java deleted file mode 100644 index aaaec96..0000000 --- a/forge/src/main/java/draylar/identity/forge/mixin/BjornCompatMixin.java +++ /dev/null @@ -1,9 +0,0 @@ -package draylar.identity.forge.mixin; -import draylar.identity.compat.LivingEntityCompatAccessor; -import net.minecraft.entity.LivingEntity; -import org.spongepowered.asm.mixin.Mixin; - -@Mixin(value = LivingEntity.class) -public interface BjornCompatMixin extends LivingEntityCompatAccessor { - -} diff --git a/forge/src/main/java/draylar/identity/forge/mixin/ClientPlayerEntityMixin.java b/forge/src/main/java/draylar/identity/forge/mixin/ClientPlayerEntityMixin.java deleted file mode 100644 index c7a9283..0000000 --- a/forge/src/main/java/draylar/identity/forge/mixin/ClientPlayerEntityMixin.java +++ /dev/null @@ -1,109 +0,0 @@ -package draylar.identity.forge.mixin; - -import com.github.alexthe666.alexsmobs.AlexsMobs; -import com.github.alexthe666.alexsmobs.entity.EntityCockroach; -import com.mojang.authlib.GameProfile; -import draylar.identity.api.PlayerIdentity; -import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.util.math.Box; -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; - -/** - * Listens for entity‐status bytes 67 (start) and 68 (stop) - * on the CLIENT’s player, then runs your debugForceDance logic. - */ -@Mixin(ClientPlayerEntity.class) -public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity { - - @Unique - private boolean identity$forceDanceActive = false; - - public ClientPlayerEntityMixin(ClientWorld world, GameProfile profile) { - super(world, profile); - } - - - // This is the method that gets called when the server sends a status byte to the client. - @Inject(method = "handleStatus", at = @At("HEAD")) - private void identity$onHandleStatus(byte status, CallbackInfo ci) { - ClientPlayerEntity player = (ClientPlayerEntity) (Object) this; - if (PlayerIdentity.getIdentity(player) instanceof EntityCockroach cockroach) { - if (status == 67) { - identity$forceDanceActive = true; - } else if (status == 68) { - - - identity$forceDanceActive = false; - cockroach.setMaracas(false); - cockroach.setNearestMusician(null); - - - } else if (status == 69) { - cockroach.setMaracas(true); - AlexsMobs.PROXY.onEntityStatus(cockroach, (byte) 67); - for(EntityCockroach roach : this.getWorld().getEntitiesByClass(EntityCockroach.class, identity$getMusicianDistance(), EntityPredicates.EXCEPT_SPECTATOR)) { - if (!roach.hasMaracas()) { - roach.setNearestMusician(this.getUuid()); - } - } - - - } - } - } - @Unique - private Box identity$getMusicianDistance() { - return this.getBoundingBox().expand((double)10.0F, (double)10.0F, (double)10.0F); - } - - // Once per tick, if armed, do the dance and consume the flag - @Inject(method = "tick", at = @At("HEAD")) - private void identity$tickDance(CallbackInfo ci) { - ClientPlayerEntity player = (ClientPlayerEntity) (Object) this; - var morph = PlayerIdentity.getIdentity(player); - if (!(morph instanceof EntityCockroach cockroach)) { - return; - } - - boolean dancing = identity$forceDanceActive; - - // If we're neither dancing nor fading out, skip entirely: - if (!dancing && cockroach.danceProgress == 0) { - cockroach.setDancing(false); - cockroach.setNearbySongPlaying(player.getBlockPos(), false); -// identity$hasMaracas = false; - } else { - // 1) flip the flags so vanilla code knows we're dancing: - cockroach.setDancing(dancing); - cockroach.setNearbySongPlaying(player.getBlockPos(), dancing); - } - if (cockroach.hasMaracas()) - cockroach.setNearestMusician(player.getUuid()); - else { - cockroach.setNearestMusician(null); - cockroach.setMaracas(false); - identity$tellOtherCockroachesToStopDancing(cockroach,player); - } - // 2) now *run the real EntityCockroach.tick()* so it plays out - // its own dance logic exactly as in Alex's Mobs. - cockroach.tick(); - } - - @Unique - private void identity$tellOtherCockroachesToStopDancing(EntityCockroach cockroach,ClientPlayerEntity player) { - for(EntityCockroach roach : this.getWorld().getEntitiesByClass(EntityCockroach.class, identity$getMusicianDistance(), EntityPredicates.EXCEPT_SPECTATOR)) { - if (roach != cockroach && roach.hasMaracas() && roach.getNearestMusician().getUuid() == player.getUuid()) { - roach.setMaracas(false); - roach.setDancing(false); - roach.setNearbySongPlaying(player.getBlockPos(), false); - } - } - } -} diff --git a/forge/src/main/java/draylar/identity/forge/mixin/IdentityMixinPlugin.java b/forge/src/main/java/draylar/identity/forge/mixin/IdentityMixinPlugin.java deleted file mode 100644 index b2add03..0000000 --- a/forge/src/main/java/draylar/identity/forge/mixin/IdentityMixinPlugin.java +++ /dev/null @@ -1,87 +0,0 @@ -package draylar.identity.forge.mixin; - -import draylar.identity.Identity; -import draylar.identity.forge.IdentityForge; -import org.objectweb.asm.tree.ClassNode; -import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; -import org.spongepowered.asm.mixin.extensibility.IMixinInfo; - -import java.util.List; -import java.util.Set; - -public class IdentityMixinPlugin implements IMixinConfigPlugin { - - private static Boolean bjornLoaded = null; - private static Boolean alexLoaded = null; - - private boolean isBjornLibLoaded() { - if (bjornLoaded != null) return bjornLoaded; - - try { - // Check via class existence instead of ModList to avoid early crash - Class.forName("com.furiusmax.bjornlib.BjornLib", false, getClass().getClassLoader()); - bjornLoaded = true; - } catch (ClassNotFoundException e) { - bjornLoaded = false; - } - System.out.println("[Identity] BjornLib detected: " + bjornLoaded); - return bjornLoaded; - } - - private boolean isAlexLoaded() { - if (alexLoaded != null) return alexLoaded; - - try { - // Safer to check for a known class rather than the base package - Class.forName("com.github.alexthe666.alexsmobs.AlexsMobs", false, getClass().getClassLoader()); - alexLoaded = true; - } catch (ClassNotFoundException e) { - alexLoaded = false; - } - - System.out.println("[Identity] Alex's Mobs detected: " + alexLoaded); - return alexLoaded; - } - - - - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - - if (mixinClassName.endsWith("LivingEntityAccessor") && isBjornLibLoaded()) { - return false; - } - - - if(mixinClassName.endsWith("ServerPlayerEntityMixin") && !isAlexLoaded() ) { - return false; - } - - if(mixinClassName.endsWith("ClientPlayerEntityMixin") && !isAlexLoaded() ) { - return false; - } - if (mixinClassName.endsWith("PlayerEntityRendererMixin") && isBjornLibLoaded()) { - return false; - } - if (mixinClassName.endsWith("BjornCompatMixin") && !isBjornLibLoaded()) { - return false; - } - - return true; - } - - @Override public void onLoad(String mixinPackage) {} - @Override public String getRefMapperConfig() { return null; } - @Override public void acceptTargets(Set myTargets, Set otherTargets) {} - @Override public List getMixins() { return null; } - - @Override - public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { - - } - - @Override - public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) { - - } -} diff --git a/forge/src/main/java/draylar/identity/forge/mixin/ServerPlayerEntityMixin.java b/forge/src/main/java/draylar/identity/forge/mixin/ServerPlayerEntityMixin.java deleted file mode 100644 index bc214f1..0000000 --- a/forge/src/main/java/draylar/identity/forge/mixin/ServerPlayerEntityMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package draylar.identity.forge.mixin; - -import com.github.alexthe666.alexsmobs.entity.EntityCockroach; -import draylar.identity.api.PlayerIdentity; -import draylar.identity.forge.util.CockroachDanceManager; -import net.minecraft.block.Blocks; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -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; - -@Mixin(ServerPlayerEntity.class) -public abstract class ServerPlayerEntityMixin { - - // on every server tick, advance or stop any cockroach‐dance for this player - @Inject(method="tick", at=@At("HEAD")) - private void identity$tickCockroachDance(CallbackInfo ci) { - CockroachDanceManager.tick((ServerPlayerEntity)(Object)this); - } - @Inject(method = "onSpawn", at = @At("RETURN")) - private void identity$onSpawn(CallbackInfo ci) { - ServerPlayerEntity player = (ServerPlayerEntity)(Object)this; - - if (PlayerIdentity.getIdentity(player) instanceof EntityCockroach cockroach) { - cockroach.getWorld().sendEntityStatus(player,(byte) 68); - } - } -} diff --git a/forge/src/main/java/draylar/identity/forge/mixin/WitherEntityMixin.java b/forge/src/main/java/draylar/identity/forge/mixin/WitherEntityMixin.java deleted file mode 100644 index 8fa508b..0000000 --- a/forge/src/main/java/draylar/identity/forge/mixin/WitherEntityMixin.java +++ /dev/null @@ -1,55 +0,0 @@ -package draylar.identity.forge.mixin; - -import draylar.identity.api.PlayerIdentity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.boss.WitherEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.world.World; -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 org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -import java.util.ArrayList; -import java.util.List; - -@Mixin(WitherEntity.class) -public abstract class WitherEntityMixin extends HostileEntity { - - private WitherEntityMixin(EntityType entityType, World world) { - super(entityType, world); - } - - // There's a de-compilation difference between Forge & Fabric which requires a tweaked mixin on both sides. - @Inject( - method = "mobTick", - at = @At(value = "INVOKE", target = "Ljava/util/List;isEmpty()Z"), - locals = LocalCapture.CAPTURE_FAILHARD - ) - private void removeInvalidPlayerTargets(CallbackInfo ci, int j, int b, List list) { - List toRemove = new ArrayList<>(); - - list.forEach(entity -> { - if(entity instanceof PlayerEntity player) { - LivingEntity identity = PlayerIdentity.getIdentity(player); - - // potentially ignore undead identity players - if(identity != null && identity.isUndead()) { - if(this.getTarget() != null) { - // if this wither's target is not equal to the current entity - if(!this.getTarget().getUuid().equals(entity.getUuid())) { - toRemove.add(entity); - } - } else { - toRemove.add(entity); - } - } - } - }); - - list.removeAll(toRemove); - } -} diff --git a/forge/src/main/java/draylar/identity/forge/util/CockroachDanceManager.java b/forge/src/main/java/draylar/identity/forge/util/CockroachDanceManager.java deleted file mode 100644 index 37cf8c3..0000000 --- a/forge/src/main/java/draylar/identity/forge/util/CockroachDanceManager.java +++ /dev/null @@ -1,122 +0,0 @@ -package draylar.identity.forge.util; - -import com.github.alexthe666.alexsmobs.entity.EntityCockroach; -import com.github.alexthe666.alexsmobs.item.ItemMaraca; -import draylar.identity.api.PlayerIdentity; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.Box; -import org.spongepowered.asm.mixin.Unique; - -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; - -public class CockroachDanceManager { - private static final Map DANCE_TICKS = new HashMap<>(); - - /** - * Forces a player to dance for a specified number of ticks. - * - * @param player The player to force to dance. - * @param ticks The number of ticks to force the player to dance for. - */ - - public static void forceDance(ServerPlayerEntity player, int ticks) { - DANCE_TICKS.put(player.getUuid(), ticks); - } - - - public static void tick(ServerPlayerEntity player) { - var identity = PlayerIdentity.getIdentity(player); - if (!(identity instanceof EntityCockroach cockroach)) { - DANCE_TICKS.remove(player.getUuid()); - return; - } - - UUID id = player.getUuid(); - int remaining = DANCE_TICKS.getOrDefault(id, 0); - - // If you stand near a jukebox, reset to 200: - if (player.getWorld().getBlockState(player.getBlockPos().down()).isOf(Blocks.JUKEBOX)) { - remaining = 200; - } - - ServerWorld world = (ServerWorld) cockroach.getWorld(); - if (remaining > 0) { - // count down - DANCE_TICKS.put(id, remaining - 1); - - // tell clients “start/continue dancing” - if (player.getMainHandStack().getItem() instanceof ItemMaraca || - player.getOffHandStack().getItem() instanceof ItemMaraca) { - world.sendEntityStatus(player, (byte) 69); - cockroach.setMaracas(true); - tellOthersImPlayingLaCucaracha(player); - } - else{ - world.sendEntityStatus(player, (byte) 67); - cockroach.setMaracas(false); - identity$tellOtherCockroachesToStopDancing(cockroach, player); - - } - // server‐side animate hitbox & physics - cockroach.setDancing(true); - cockroach.prevDanceProgress = cockroach.danceProgress; - if (cockroach.danceProgress < 5.0F) cockroach.danceProgress++; - if (!cockroach.isOnGround() || cockroach.getRandom().nextInt(200) == 0) { - cockroach.randomWingFlapTick = 5 + cockroach.getRandom().nextInt(15); - } - if (cockroach.randomWingFlapTick > 0) cockroach.randomWingFlapTick--; - cockroach.tick(); - } else if (DANCE_TICKS.containsKey(id)) { - // dance just ended - DANCE_TICKS.remove(id); - - // tell clients “stop dancing” - world.sendEntityStatus(player, (byte) 68); - cockroach.setNearestMusician(null); - cockroach.setMaracas(false); - identity$tellOtherCockroachesToStopDancing(cockroach, player); - - // server‐side final cleanup - cockroach.setDancing(false); - cockroach.prevDanceProgress = cockroach.danceProgress; - if (cockroach.danceProgress > 0.0F) cockroach.danceProgress--; - } - } - private static void tellOthersImPlayingLaCucaracha(ServerPlayerEntity identity) { - for(EntityCockroach roach : identity.getWorld().getEntitiesByClass(EntityCockroach.class, getMusicianDistance(identity), EntityPredicates.EXCEPT_SPECTATOR)) { - if (!roach.hasMaracas()) { - roach.setNearestMusician(identity.getUuid()); - } - } - - } - private static Box getMusicianDistance(ServerPlayerEntity identity) { - return identity.getBoundingBox().expand((double)10.0F, (double)10.0F, (double)10.0F); - } - @Unique - private static void identity$tellOtherCockroachesToStopDancing(EntityCockroach cockroach, ServerPlayerEntity player) { - for(EntityCockroach roach : player.getWorld().getEntitiesByClass(EntityCockroach.class, getMusicianDistance(player), EntityPredicates.VALID_ENTITY)) { - if(roach != cockroach){ - try{ - if (roach.hasMaracas() && roach.getNearestMusician().getUuid() == player.getUuid()) { - roach.setMaracas(false); - roach.setDancing(false); - roach.setNearbySongPlaying(player.getBlockPos(), false); - } - } - catch (NullPointerException e) { - roach.setDancing(false); - roach.setNearbySongPlaying(player.getBlockPos(), false); - } - } - - - } - } -} diff --git a/forge/src/main/java/draylar/identity/impl/PlayerDataProvider.java b/forge/src/main/java/draylar/identity/impl/PlayerDataProvider.java new file mode 100644 index 0000000..cfb829b --- /dev/null +++ b/forge/src/main/java/draylar/identity/impl/PlayerDataProvider.java @@ -0,0 +1,11 @@ +package draylar.identity.impl; + +import draylar.identity.api.variant.IdentityType; +import net.minecraft.world.entity.LivingEntity; + +public interface PlayerDataProvider { + LivingEntity getIdentity(); + IdentityType getIdentityType(); + boolean updateIdentity(IdentityType type, LivingEntity entity); +} + diff --git a/forge/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java b/forge/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java new file mode 100644 index 0000000..46f3d04 --- /dev/null +++ b/forge/src/main/java/draylar/identity/mixin/PlayerEntityMixin.java @@ -0,0 +1,39 @@ +package draylar.identity.mixin; + +import draylar.identity.api.variant.IdentityType; +import draylar.identity.impl.PlayerDataProvider; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +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; + +@Mixin(Player.class) +public class PlayerEntityMixin implements PlayerDataProvider { + private LivingEntity identity$current; + private IdentityType identity$currentType; + + @Override + public LivingEntity getIdentity() { + return identity$current; + } + + @Override + public IdentityType getIdentityType() { + return identity$currentType; + } + + @Override + public boolean updateIdentity(IdentityType type, LivingEntity entity) { + identity$current = entity; + identity$currentType = type; + return true; + } + + @Inject(method = "tick", at = @At("HEAD")) + private void identity$onTick(CallbackInfo ci) { + // Future identity behavior will hook here. + } +} + diff --git a/forge/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java b/forge/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java new file mode 100644 index 0000000..3fdd643 --- /dev/null +++ b/forge/src/main/java/draylar/identity/mixin/ServerPlayerEntityMixin.java @@ -0,0 +1,23 @@ +package draylar.identity.mixin; + +import draylar.identity.api.PlayerIdentity; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.damagesource.DamageSource; +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; + +@Mixin(ServerPlayer.class) +public class ServerPlayerEntityMixin { + @Inject(method = "die", at = @At("HEAD")) + private void identity$clearOnDeath(DamageSource source, CallbackInfo ci) { + PlayerIdentity.updateIdentity((ServerPlayer) (Object) this, null, null); + } + + @Inject(method = "restoreFrom", at = @At("RETURN")) + private void identity$syncAfterRespawn(ServerPlayer oldPlayer, boolean alive, CallbackInfo ci) { + PlayerIdentity.sync((ServerPlayer) (Object) this); + } +} + diff --git a/forge/src/main/resources/META-INF/mods.toml b/forge/src/main/resources/META-INF/mods.toml index a84346d..f6003d0 100644 --- a/forge/src/main/resources/META-INF/mods.toml +++ b/forge/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[47,)" +loaderVersion = "[52,)" license = "Custom" [[mods]] @@ -16,29 +16,17 @@ No more crashes !!! [[dependencies.identity]] modId = "forge" mandatory = true -versionRange = "[47,)" +versionRange = "[52,)" ordering = "NONE" side = "BOTH" [[dependencies.identity]] modId = "minecraft" mandatory = true -versionRange = "[1.20.1,)" +versionRange = "[1.21.1,)" ordering = "NONE" side = "BOTH" -[[dependencies.identity]] -modId = "architectury" -mandatory = true -versionRange = "[9.2.14,)" -ordering = "AFTER" -side = "BOTH" [[mixins]] config = "identity.mixins.json" - -[[mixins]] -config = "identity-forge.mixins.json" - -[[mixins]] -config = "identity.alexsmobs.mixins.json" diff --git a/common/src/main/resources/assets/identity/lang/en_us.json b/forge/src/main/resources/assets/identity/lang/en_us.json similarity index 100% rename from common/src/main/resources/assets/identity/lang/en_us.json rename to forge/src/main/resources/assets/identity/lang/en_us.json diff --git a/common/src/main/resources/assets/identity/lang/fi_fi.json b/forge/src/main/resources/assets/identity/lang/fi_fi.json similarity index 100% rename from common/src/main/resources/assets/identity/lang/fi_fi.json rename to forge/src/main/resources/assets/identity/lang/fi_fi.json diff --git a/common/src/main/resources/assets/identity/lang/fr_fr.json b/forge/src/main/resources/assets/identity/lang/fr_fr.json similarity index 100% rename from common/src/main/resources/assets/identity/lang/fr_fr.json rename to forge/src/main/resources/assets/identity/lang/fr_fr.json diff --git a/common/src/main/resources/assets/identity/lang/pt_br.json b/forge/src/main/resources/assets/identity/lang/pt_br.json similarity index 100% rename from common/src/main/resources/assets/identity/lang/pt_br.json rename to forge/src/main/resources/assets/identity/lang/pt_br.json diff --git a/common/src/main/resources/assets/identity/lang/sk_sk.json b/forge/src/main/resources/assets/identity/lang/sk_sk.json similarity index 100% rename from common/src/main/resources/assets/identity/lang/sk_sk.json rename to forge/src/main/resources/assets/identity/lang/sk_sk.json diff --git a/common/src/main/resources/assets/identity/lang/zh_cn.json b/forge/src/main/resources/assets/identity/lang/zh_cn.json similarity index 100% rename from common/src/main/resources/assets/identity/lang/zh_cn.json rename to forge/src/main/resources/assets/identity/lang/zh_cn.json diff --git a/common/src/main/resources/assets/identity/textures/gui/player.png b/forge/src/main/resources/assets/identity/textures/gui/player.png similarity index 100% rename from common/src/main/resources/assets/identity/textures/gui/player.png rename to forge/src/main/resources/assets/identity/textures/gui/player.png diff --git a/common/src/main/resources/assets/identity/textures/gui/selected.png b/forge/src/main/resources/assets/identity/textures/gui/selected.png similarity index 100% rename from common/src/main/resources/assets/identity/textures/gui/selected.png rename to forge/src/main/resources/assets/identity/textures/gui/selected.png diff --git a/common/src/main/resources/assets/identity/textures/gui/star.png b/forge/src/main/resources/assets/identity/textures/gui/star.png similarity index 100% rename from common/src/main/resources/assets/identity/textures/gui/star.png rename to forge/src/main/resources/assets/identity/textures/gui/star.png diff --git a/common/src/main/resources/data/identity/tags/entity_types.zip b/forge/src/main/resources/data/identity/tags/entity_types.zip similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types.zip rename to forge/src/main/resources/data/identity/tags/entity_types.zip diff --git a/common/src/main/resources/data/identity/tags/entity_types/breathe_underwater.json b/forge/src/main/resources/data/identity/tags/entity_types/breathe_underwater.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/breathe_underwater.json rename to forge/src/main/resources/data/identity/tags/entity_types/breathe_underwater.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/burns_in_daylight.json b/forge/src/main/resources/data/identity/tags/entity_types/burns_in_daylight.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/burns_in_daylight.json rename to forge/src/main/resources/data/identity/tags/entity_types/burns_in_daylight.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/cant_swim.json b/forge/src/main/resources/data/identity/tags/entity_types/cant_swim.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/cant_swim.json rename to forge/src/main/resources/data/identity/tags/entity_types/cant_swim.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_breathe_underwater.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_breathe_underwater.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_breathe_underwater.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_breathe_underwater.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_burns_in_daylight.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_burns_in_daylight.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_burns_in_daylight.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_burns_in_daylight.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_cant_swim.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_cant_swim.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_cant_swim.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_cant_swim.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_fire_immune.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_fire_immune.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_fire_immune.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_fire_immune.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_flying.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_flying.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_flying.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_flying.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_fox_prey.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_fox_prey.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_fox_prey.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_fox_prey.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_hurt_by_high_temperature.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_hurt_by_high_temperature.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_hurt_by_high_temperature.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_hurt_by_high_temperature.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_lava_walking.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_lava_walking.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_lava_walking.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_lava_walking.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_piglin_friendly.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_piglin_friendly.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_piglin_friendly.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_piglin_friendly.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_ravager_riding.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_ravager_riding.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_ravager_riding.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_ravager_riding.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_slow_falling.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_slow_falling.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_slow_falling.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_slow_falling.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_undrownable.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_undrownable.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_undrownable.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_undrownable.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/custom_wolf_prey.json b/forge/src/main/resources/data/identity/tags/entity_types/custom_wolf_prey.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/custom_wolf_prey.json rename to forge/src/main/resources/data/identity/tags/entity_types/custom_wolf_prey.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/fire_immune.json b/forge/src/main/resources/data/identity/tags/entity_types/fire_immune.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/fire_immune.json rename to forge/src/main/resources/data/identity/tags/entity_types/fire_immune.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/flying.json b/forge/src/main/resources/data/identity/tags/entity_types/flying.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/flying.json rename to forge/src/main/resources/data/identity/tags/entity_types/flying.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/fox_prey.json b/forge/src/main/resources/data/identity/tags/entity_types/fox_prey.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/fox_prey.json rename to forge/src/main/resources/data/identity/tags/entity_types/fox_prey.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/hurt_by_high_temperature.json b/forge/src/main/resources/data/identity/tags/entity_types/hurt_by_high_temperature.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/hurt_by_high_temperature.json rename to forge/src/main/resources/data/identity/tags/entity_types/hurt_by_high_temperature.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/lava_walking.json b/forge/src/main/resources/data/identity/tags/entity_types/lava_walking.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/lava_walking.json rename to forge/src/main/resources/data/identity/tags/entity_types/lava_walking.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/piglin_friendly.json b/forge/src/main/resources/data/identity/tags/entity_types/piglin_friendly.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/piglin_friendly.json rename to forge/src/main/resources/data/identity/tags/entity_types/piglin_friendly.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/ravager_riding.json b/forge/src/main/resources/data/identity/tags/entity_types/ravager_riding.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/ravager_riding.json rename to forge/src/main/resources/data/identity/tags/entity_types/ravager_riding.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/slow_falling.json b/forge/src/main/resources/data/identity/tags/entity_types/slow_falling.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/slow_falling.json rename to forge/src/main/resources/data/identity/tags/entity_types/slow_falling.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/undrownable.json b/forge/src/main/resources/data/identity/tags/entity_types/undrownable.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/undrownable.json rename to forge/src/main/resources/data/identity/tags/entity_types/undrownable.json diff --git a/common/src/main/resources/data/identity/tags/entity_types/wolf_prey.json b/forge/src/main/resources/data/identity/tags/entity_types/wolf_prey.json similarity index 100% rename from common/src/main/resources/data/identity/tags/entity_types/wolf_prey.json rename to forge/src/main/resources/data/identity/tags/entity_types/wolf_prey.json diff --git a/forge/src/main/resources/identity-forge.mixins.json b/forge/src/main/resources/identity-forge.mixins.json deleted file mode 100644 index cff4144..0000000 --- a/forge/src/main/resources/identity-forge.mixins.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "compatibilityLevel": "JAVA_17", - "package": "draylar.identity.forge.mixin", - "plugin": "draylar.identity.forge.mixin.IdentityMixinPlugin", - "mixins": [ - "WitherEntityMixin", - "BjornCompatMixin" - - ], - "client": [], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/forge/src/main/resources/identity.alexsmobs.mixins.json b/forge/src/main/resources/identity.alexsmobs.mixins.json deleted file mode 100644 index 258ce5a..0000000 --- a/forge/src/main/resources/identity.alexsmobs.mixins.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "required": false, - "minVersion": "0.8", - "package": "draylar.identity.forge.mixin", - "compatibilityLevel": "JAVA_17", - "plugin": "draylar.identity.forge.mixin.IdentityMixinPlugin", - "mixins": [ - "ServerPlayerEntityMixin"], - "client": [ - "ClientPlayerEntityMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/forge/src/main/resources/identity.mixins.json b/forge/src/main/resources/identity.mixins.json new file mode 100644 index 0000000..6ac70ea --- /dev/null +++ b/forge/src/main/resources/identity.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "draylar.identity.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "PlayerEntityMixin", + "ServerPlayerEntityMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/forge/src/main/resources/pack.mcmeta b/forge/src/main/resources/pack.mcmeta index 284720e..aad098b 100644 --- a/forge/src/main/resources/pack.mcmeta +++ b/forge/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "Identity", - "pack_format": 6 + "pack_format": 48 } -} \ No newline at end of file +} diff --git a/gradle.properties b/gradle.properties index 02794d7..00914a6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,10 @@ org.gradle.jvmargs=-Xmx4G # Base Versions -minecraft_version=1.20.1 +minecraft_version=1.21.1 archives_base_name=identity mod_version=2.8.6.1 maven_group=dev.Gabou # Loader Versions -fabric_loader_version=0.14.21 -fabric_api_version=0.84.0+1.20.1 -yarn_mappings=1.20.1+build.8 -forge_version=47.4.6 - -# Dependency Versions -architectury_version=9.2.14 -mixin.debug=true - -geckolib_version = 4.7 -midnightlib_fabric_version = 1.4.1 -midnightlib_forge_version = 1.4.2 +forge_version=52.1.3 diff --git a/settings.gradle b/settings.gradle index eb5493a..6216d5b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,14 +1,10 @@ pluginManagement { repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } maven { url "https://maven.minecraftforge.net/" } gradlePluginPortal() } } -include("common") -include("fabric") include("forge") -rootProject.name = "identity" \ No newline at end of file +rootProject.name = "identity"