repo for my hex addons :3
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

+191 -3
+2 -2
project/hexic/build.gradle.kts
··· 231 231 depends("hexal", ">=0.3.0") 232 232 depends("hexcellular", "^1.1.0") 233 233 depends("jsonpatcher", "^1.0.0-beta.4+mc.1.20.1") 234 - depends("hexpose", "^1.0.0") 234 + depends("hexpose", ">=1.0.0 <3.0.0") 235 235 depends("trinkets", "^3.7.2") 236 236 depends("phlib", ">=0.1.2 <0.2.0") 237 237 conflicts("valkyrienskies", "*") // need to figure out how to create dimensions without causing a crash ··· 243 243 entrypoint("cardinal-components", "org.eu.net.pool.hexic.ComponentInit") 244 244 mixins("hexic.mixins.json") 245 245 mixins("hexic.client.mixins.json", Environment.Client) 246 - cardinalComponents("player_wisp", "server_info", "murmur", "reveal") 246 + cardinalComponents("player_wisp", "server_info", "murmur", "reveal", "cat") 247 247 } 248 248 } 249 249
+3 -1
project/hexic/src/client/resources/hexic.client.mixins.json
··· 6 6 "client": [ 7 7 "ChatHudMixin", 8 8 "ChatScreenAccess", 9 - "ChatScreenMixin" 9 + "ChatScreenMixin", 10 + "EntityRendererDispatcher", 11 + "PlayerEntityRendererMixin" 10 12 ], 11 13 "injectors": { 12 14 "defaultRequire": 1
+27
project/hexic/src/client/scala/org/eu/net/pool/hexic/mixin/EntityRendererDispatcher.java
··· 1 + package org.eu.net.pool.hexic.mixin; 2 + 3 + import com.llamalad7.mixinextras.sugar.Local; 4 + import com.llamalad7.mixinextras.sugar.Share; 5 + import com.llamalad7.mixinextras.sugar.ref.LocalRef; 6 + import net.minecraft.client.render.VertexConsumerProvider; 7 + import net.minecraft.client.render.entity.EntityRenderDispatcher; 8 + import net.minecraft.client.util.math.MatrixStack; 9 + import net.minecraft.entity.Entity; 10 + import net.minecraft.entity.LivingEntity; 11 + import net.minecraft.entity.passive.CatEntity; 12 + import org.eu.net.pool.hexic.CatHolder; 13 + import org.spongepowered.asm.mixin.Mixin; 14 + import org.spongepowered.asm.mixin.injection.At; 15 + import org.spongepowered.asm.mixin.injection.Inject; 16 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 17 + 18 + @Mixin(EntityRenderDispatcher.class) 19 + public class EntityRendererDispatcher { 20 + @Inject( 21 + method = "render", at = @At("HEAD") 22 + ) 23 + private void replaceYouWithCat(Entity entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci, @Local(argsOnly = true) LocalRef<Entity> entityRef) { 24 + LivingEntity disguise = (CatEntity) CatHolder.getSyncedCat(entity); 25 + if (disguise != null) entityRef.set(disguise); 26 + } 27 + }
+22
project/hexic/src/client/scala/org/eu/net/pool/hexic/mixin/PlayerEntityRendererMixin.java
··· 1 + package org.eu.net.pool.hexic.mixin; 2 + 3 + import net.minecraft.client.model.ModelPart; 4 + import net.minecraft.client.network.AbstractClientPlayerEntity; 5 + import net.minecraft.client.render.VertexConsumerProvider; 6 + import net.minecraft.client.render.entity.PlayerEntityRenderer; 7 + import net.minecraft.client.util.math.MatrixStack; 8 + import org.eu.net.pool.hexic.CatHolder; 9 + import org.spongepowered.asm.mixin.Mixin; 10 + import org.spongepowered.asm.mixin.injection.At; 11 + import org.spongepowered.asm.mixin.injection.Inject; 12 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 + 14 + // rephrased from trickster 15 + @Mixin(PlayerEntityRenderer.class) 16 + public class PlayerEntityRendererMixin { 17 + @Inject(method = "renderArm", at = @At("HEAD"), cancellable = true) 18 + private void stealsYourArmsCutely(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, 19 + AbstractClientPlayerEntity player, ModelPart arm, ModelPart sleeve, CallbackInfo ci) { 20 + if (CatHolder.getCat(player) != null) ci.cancel(); 21 + } 22 + }
+2
project/hexic/src/main/resources/hexic.mixins.json
··· 16 16 "ItemPackagedHexMixin", 17 17 "ItemStackAccess", 18 18 "ItemStackMixin", 19 + "LimbAnimatorAccess", 19 20 "LivingEntityAccess", 21 + "LivingEntityMixin", 20 22 "MediafiedItemManagerIndexMixin", 21 23 "OpDimTeleport$SpellMixin", 22 24 "OpEdifySaplingMixin",
+80
project/hexic/src/main/scala/org/eu/net/pool/hexic/chat.scala
··· 19 19 import dev.onyxstudios.cca.api.v3.component.{Component, ComponentAccess, ComponentKey, ComponentRegistry} 20 20 import dev.onyxstudios.cca.api.v3.entity.{EntityComponentFactoryRegistry, EntityComponentInitializer, RespawnCopyStrategy} 21 21 import net.fabricmc.fabric.api.networking.v1.{PacketByteBufs, ServerPlayNetworking} 22 + import net.minecraft.entity.{Entity, EntityPose, EntityType, LimbAnimator} 23 + import net.minecraft.entity.passive.CatEntity 22 24 import net.minecraft.entity.player.PlayerEntity 23 25 import net.minecraft.item.ItemStack 24 26 import net.minecraft.nbt.{NbtCompound, NbtElement, NbtOps} ··· 31 33 import ram.talia.moreiotas.api.casting.iota.StringIota 32 34 33 35 import java.util.UUID 36 + import scala.annotation.{meta, static, targetName} 34 37 import scala.collection.immutable.* 35 38 import scala.jdk.CollectionConverters.* 36 39 import scala.language.implicitConversions ··· 65 68 def component[C <: Component: ComponentKey as key]: C = c.getComponent(key) 66 69 def syncComponent[C <: Component: ComponentKey as key](): Unit = c.syncComponent(key) 67 70 71 + // rephrased from trickster 72 + class CatHolder private[hexic] (p: PlayerEntity) extends Component: 73 + lazy private val realCat = 74 + val cat = CatEntity(EntityType.CAT, p.getWorld) 75 + cat.setAiDisabled(true) 76 + cat.setInvulnerable(true) 77 + cat.setTamed(true) 78 + cat 79 + def syncCat(collarColor: DyeColor) = 80 + val cat = this.realCat 81 + cat.setYaw(p.getYaw) 82 + cat.prevYaw = p.prevYaw 83 + cat.setPitch(p.getPitch) 84 + cat.prevPitch = p.prevPitch 85 + cat.setPos(p.getX, p.getY, p.getZ) 86 + cat.prevX = p.prevX 87 + cat.prevY = p.prevY 88 + cat.prevZ = p.prevZ 89 + cat.setBodyYaw(p.bodyYaw) 90 + cat.prevBodyYaw = p.prevBodyYaw 91 + cat.setHeadYaw(p.headYaw) 92 + cat.prevHeadYaw = p.prevHeadYaw 93 + cat.hurtTime = p.hurtTime 94 + cat.handSwinging = p.handSwinging 95 + cat.handSwingTicks = p.handSwingTicks 96 + cat.handSwingProgress = p.handSwingProgress 97 + cat.lastHandSwingProgress = p.lastHandSwingProgress 98 + cat.limbAnimator.prevSpeed = p.limbAnimator.prevSpeed 99 + cat.limbAnimator.speed = p.limbAnimator.speed 100 + cat.limbAnimator.pos = p.limbAnimator.pos 101 + cat.setCollarColor(collarColor) 102 + if p.getPose == EntityPose.CROUCHING then 103 + cat.setInSittingPose(true) 104 + cat.setPose(EntityPose.STANDING) 105 + else 106 + cat.setInSittingPose(false) 107 + cat.setPose(p.getPose) 108 + 109 + def cat = p.catCollarColor.map(_ => realCat) 110 + def syncAndGetCat() = p.catCollarColor.map { c => syncCat(c); realCat } 111 + def catOrNull: CatEntity | Null = cat.orNull 112 + 113 + override def readFromNbt(nbtCompound: NbtCompound): Unit = () 114 + override def writeToNbt(nbtCompound: NbtCompound): Unit = () 115 + object CatHolder: 116 + given key: ComponentKey[CatHolder] = ComponentRegistry.getOrCreate("cat", classOf[CatHolder]) 117 + def apply(p: PlayerEntity) = p.getComponent(key) 118 + @static def getCat(e: Entity): CatEntity | Null = e match 119 + case p: PlayerEntity => CatHolder(p).cat.orNull 120 + case _ => null 121 + @static def getSyncedCat(e: Entity): CatEntity | Null = e match 122 + case p: PlayerEntity => CatHolder(p).syncAndGetCat().orNull 123 + case _ => null 124 + 125 + given Conversion[LimbAnimator, hexic.mixin.LimbAnimatorAccess] = _.asInstanceOf 126 + package mixin: 127 + import org.spongepowered.asm.mixin.Mixin 128 + import org.spongepowered.asm.mixin.gen.Accessor 129 + @Mixin(value = Array(classOf[LimbAnimator])) 130 + private[hexic] trait LimbAnimatorAccess: 131 + this: LimbAnimator => 132 + @targetName("hexic$getPrevSpeed") @Accessor("prevSpeed") private[hexic] def prevSpeed: Float 133 + @targetName("hexic$getSpeed") @Accessor("speed") private[hexic] def speed: Float 134 + @targetName("hexic$getPos") @Accessor("pos") private[hexic] def pos: Float 135 + @targetName("hexic$setPrevSpeed") @Accessor("prevSpeed") private[hexic] def prevSpeed_=(prevSpeed: Float): Unit 136 + @targetName("hexic$setSpeed") @Accessor("speed") private[hexic] def speed_=(speed: Float): Unit 137 + @targetName("hexic$setPos") @Accessor("pos") private[hexic] def pos_=(pos: Float): Unit 138 + 68 139 extension (p: PlayerEntity) 69 140 def validMediaweave: Option[(NbtCompound, DyeColor, ItemStack)] = 70 141 TrinketsApi.getTrinketComponent(p) ··· 74 145 Function.unlift: p => 75 146 p.getRight.getItem match 76 147 case m@Mediaweave(color) => Option(m.readIotaTag(p.getRight)).map((_, color, p.getRight)) 148 + case _ => None 149 + def catCollarColor: Option[DyeColor] = 150 + TrinketsApi.getTrinketComponent(p) 151 + .pipe(o => Option.when[TrinketComponent](o.isPresent)(o.get())) 152 + .flatMap: (c: TrinketComponent) => 153 + c.getEquipped(_.getItem.isInstanceOf[Mediaweave]).asScala.collectFirst: 154 + Function.unlift: p => 155 + p.getRight.getItem match 156 + case m@Mediaweave(color) if p.getRight.hasCustomName && p.getRight.getName.getString.toLowerCase == "instant cat" => Some(m.color) 77 157 case _ => None 78 158 extension (p: ServerPlayerEntity) 79 159 def executeMediaweave(text: String, ctx: Seq[Iota]): Boolean =
+1
project/hexic/src/main/scala/org/eu/net/pool/hexic/main.scala
··· 1701 1701 PlayerInfoComponent.register 1702 1702 r.registerForPlayers(summon[ComponentKey[MurmurCache]], _ => MurmurCache(None), RespawnCopyStrategy.ALWAYS_COPY) 1703 1703 r.registerForPlayers(summon[ComponentKey[RevealComponent]], _ => RevealComponent(Seq.empty), RespawnCopyStrategy.LOSSLESS_ONLY) 1704 + r.registerForPlayers(CatHolder.key, new CatHolder(_), RespawnCopyStrategy.NEVER_COPY) 1704 1705 override def registerLevelComponentFactories(using LevelComponentFactoryRegistry): Unit = 1705 1706 ServerInfoComponent.register 1706 1707
+12
project/hexic/src/main/scala/org/eu/net/pool/hexic/mixin/EntityMixin.java
··· 1 1 package org.eu.net.pool.hexic.mixin; 2 2 3 + import com.llamalad7.mixinextras.injector.ModifyExpressionValue; 3 4 import net.minecraft.entity.Entity; 5 + import net.minecraft.entity.EntityType; 4 6 import net.minecraft.entity.LivingEntity; 5 7 import net.minecraft.entity.damage.DamageSource; 6 8 import net.minecraft.entity.damage.DamageSources; ··· 11 13 import net.minecraft.util.math.MathHelper; 12 14 import net.minecraft.util.math.Vec3d; 13 15 import net.minecraft.world.World; 16 + import org.objectweb.asm.Opcodes; 14 17 import org.spongepowered.asm.mixin.Mixin; 15 18 import org.spongepowered.asm.mixin.Shadow; 16 19 import org.spongepowered.asm.mixin.Unique; ··· 56 59 return; 57 60 } 58 61 } 62 + } 63 + 64 + // stolen from trickster 65 + @ModifyExpressionValue(method = {"handleFallDamage", "isFireImmune", "isInvulnerableTo"}, at = {@At(value = "FIELD", target = "Lnet/minecraft/entity/Entity;type:Lnet/minecraft/entity/EntityType;", opcode = Opcodes.GETFIELD), @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;getType()Lnet/minecraft/entity/EntityType;")}) 66 + private EntityType<?> modifyEntityType(EntityType<?> original) { 67 + if ((Object) this instanceof PlayerEntity) { 68 + 69 + } 70 + return original; 59 71 } 60 72 }
+42
project/hexic/src/main/scala/org/eu/net/pool/hexic/mixin/LivingEntityMixin.java
··· 1 + package org.eu.net.pool.hexic.mixin; 2 + 3 + import com.llamalad7.mixinextras.injector.ModifyExpressionValue; 4 + import com.llamalad7.mixinextras.injector.wrapoperation.Operation; 5 + import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; 6 + import net.minecraft.entity.*; 7 + import net.minecraft.entity.damage.DamageSource; 8 + import net.minecraft.entity.passive.CatEntity; 9 + import net.minecraft.sound.SoundEvent; 10 + import net.minecraft.sound.SoundEvents; 11 + import net.minecraft.world.World; 12 + import org.eu.net.pool.hexic.CatHolder; 13 + import org.spongepowered.asm.mixin.Mixin; 14 + import org.spongepowered.asm.mixin.injection.At; 15 + import org.spongepowered.asm.mixin.injection.Inject; 16 + import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 17 + 18 + // rephrased from trickster 19 + @Mixin(LivingEntity.class) 20 + public abstract class LivingEntityMixin extends Entity { 21 + public LivingEntityMixin(EntityType<?> type, World world) { 22 + super(type, world); 23 + } 24 + 25 + @Inject(method = "getDimensions", at = @At("HEAD"), cancellable = true) 26 + private void morphDimensions(EntityPose pose, CallbackInfoReturnable<EntityDimensions> cir) { 27 + LivingEntity disguise = (CatEntity) CatHolder.getCat(this); 28 + if (disguise != null) cir.setReturnValue(disguise.getDimensions(pose)); 29 + } 30 + 31 + @WrapOperation(method = {"playHurtSound", "onDamaged"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getHurtSound(Lnet/minecraft/entity/damage/DamageSource;)Lnet/minecraft/sound/SoundEvent;")) 32 + private SoundEvent morphHurtSound(LivingEntity instance, DamageSource source, Operation<SoundEvent> original) { 33 + LivingEntity disguise = (CatEntity) CatHolder.getCat(this); 34 + return disguise != null ? SoundEvents.ENTITY_CAT_HURT : original.call(instance, source); 35 + } 36 + 37 + @ModifyExpressionValue(method = {"computeFallDamage", "canBreatheInWater"}, at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;getType()Lnet/minecraft/entity/EntityType;")) 38 + private EntityType<?> modifyEntityType(EntityType<?> original) { 39 + LivingEntity disguise = (CatEntity) CatHolder.getCat(this); 40 + return disguise != null ? disguise.getType() : original; 41 + } 42 + }