mirror of
https://github.com/Creators-of-Create/Create.git
synced 2025-02-13 13:55:01 +01:00
Mixin scrubbing
- Move all client mixins to separate package - Prefix all mixin injector callback methods and added fields - Remove unnecessary code from EntityContraptionInteractionMixin - Remove EnchantmentMixin and use IForgeItem#canApplyAtEnchantingTable instead - Do not sync fire immune tag to client - Bump network version to 3 - Remove 0.5.0j from Github issue template
This commit is contained in:
parent
9c0c058fc0
commit
bb5d0fedee
31 changed files with 287 additions and 424 deletions
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
1
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
@ -50,7 +50,6 @@ body:
|
||||||
description: The version of the mod you were using when the bug occured
|
description: The version of the mod you were using when the bug occured
|
||||||
options:
|
options:
|
||||||
- "0.5.1a"
|
- "0.5.1a"
|
||||||
- "0.5.0j"
|
|
||||||
- "0.5.0i"
|
- "0.5.0i"
|
||||||
- "0.5.0h"
|
- "0.5.0h"
|
||||||
- "0.5.0g"
|
- "0.5.0g"
|
||||||
|
|
|
@ -575,15 +575,6 @@ public class ContraptionCollider {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vec3 getWorldToLocalTranslation(Entity entity, AbstractContraptionEntity contraptionEntity) {
|
|
||||||
return getWorldToLocalTranslation(entity, contraptionEntity.getAnchorVec(),
|
|
||||||
contraptionEntity.getRotationState());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vec3 getWorldToLocalTranslation(Entity entity, Vec3 anchorVec, ContraptionRotationState rotation) {
|
|
||||||
return getWorldToLocalTranslation(entity, anchorVec, rotation.asMatrix(), rotation.getYawOffset());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Vec3 getWorldToLocalTranslation(Entity entity, Vec3 anchorVec, Matrix3d rotationMatrix,
|
public static Vec3 getWorldToLocalTranslation(Entity entity, Vec3 anchorVec, Matrix3d rotationMatrix,
|
||||||
float yawOffset) {
|
float yawOffset) {
|
||||||
Vec3 entityPosition = entity.position();
|
Vec3 entityPosition = entity.position();
|
||||||
|
@ -591,35 +582,29 @@ public class ContraptionCollider {
|
||||||
.getYsize() / 2, 0);
|
.getYsize() / 2, 0);
|
||||||
Vec3 position = entityPosition;
|
Vec3 position = entityPosition;
|
||||||
position = position.add(centerY);
|
position = position.add(centerY);
|
||||||
position = position.subtract(VecHelper.CENTER_OF_ORIGIN);
|
position = worldToLocalPos(position, anchorVec, rotationMatrix, yawOffset);
|
||||||
position = position.subtract(anchorVec);
|
|
||||||
position = VecHelper.rotate(position, -yawOffset, Axis.Y);
|
|
||||||
position = rotationMatrix.transform(position);
|
|
||||||
position = position.add(VecHelper.CENTER_OF_ORIGIN);
|
|
||||||
position = position.subtract(centerY);
|
position = position.subtract(centerY);
|
||||||
position = position.subtract(entityPosition);
|
position = position.subtract(entityPosition);
|
||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vec3 getWorldToLocalTranslation(Vec3 entity, AbstractContraptionEntity contraptionEntity) {
|
public static Vec3 worldToLocalPos(Vec3 worldPos, AbstractContraptionEntity contraptionEntity) {
|
||||||
return getWorldToLocalTranslation(entity, contraptionEntity.getAnchorVec(),
|
return worldToLocalPos(worldPos, contraptionEntity.getAnchorVec(),
|
||||||
contraptionEntity.getRotationState());
|
contraptionEntity.getRotationState());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vec3 getWorldToLocalTranslation(Vec3 inPos, Vec3 anchorVec, ContraptionRotationState rotation) {
|
public static Vec3 worldToLocalPos(Vec3 worldPos, Vec3 anchorVec, ContraptionRotationState rotation) {
|
||||||
return getWorldToLocalTranslation(inPos, anchorVec, rotation.asMatrix(), rotation.getYawOffset());
|
return worldToLocalPos(worldPos, anchorVec, rotation.asMatrix(), rotation.getYawOffset());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vec3 getWorldToLocalTranslation(Vec3 inPos, Vec3 anchorVec, Matrix3d rotationMatrix,
|
public static Vec3 worldToLocalPos(Vec3 worldPos, Vec3 anchorVec, Matrix3d rotationMatrix, float yawOffset) {
|
||||||
float yawOffset) {
|
Vec3 localPos = worldPos;
|
||||||
Vec3 position = inPos;
|
localPos = localPos.subtract(anchorVec);
|
||||||
position = position.subtract(VecHelper.CENTER_OF_ORIGIN);
|
localPos = localPos.subtract(VecHelper.CENTER_OF_ORIGIN);
|
||||||
position = position.subtract(anchorVec);
|
localPos = VecHelper.rotate(localPos, -yawOffset, Axis.Y);
|
||||||
position = VecHelper.rotate(position, -yawOffset, Axis.Y);
|
localPos = rotationMatrix.transform(localPos);
|
||||||
position = rotationMatrix.transform(position);
|
localPos = localPos.add(VecHelper.CENTER_OF_ORIGIN);
|
||||||
position = position.add(VecHelper.CENTER_OF_ORIGIN);
|
return localPos;
|
||||||
position = position.subtract(inPos);
|
|
||||||
return position;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** From Entity#collide **/
|
/** From Entity#collide **/
|
||||||
|
|
|
@ -6,12 +6,10 @@ import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.sounds.SoundEvent;
|
import net.minecraft.sounds.SoundEvent;
|
||||||
import net.minecraft.sounds.SoundSource;
|
import net.minecraft.sounds.SoundSource;
|
||||||
import net.minecraft.util.Mth;
|
import net.minecraft.util.Mth;
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.Blocks;
|
import net.minecraft.world.level.block.Blocks;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
|
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
|
||||||
import net.minecraft.world.phys.Vec3;
|
|
||||||
|
|
||||||
public class ContraptionWorld extends WrappedWorld {
|
public class ContraptionWorld extends WrappedWorld {
|
||||||
final Contraption contraption;
|
final Contraption contraption;
|
||||||
|
@ -45,18 +43,8 @@ public class ContraptionWorld extends WrappedWorld {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void playSound(Player player, double x, double y, double z, SoundEvent soundIn, SoundSource category, float volume, float pitch) {
|
public void playLocalSound(double x, double y, double z, SoundEvent sound, SoundSource category, float volume, float pitch, boolean distanceDelay) {
|
||||||
|
world.playLocalSound(x, y, z, sound, category, volume, pitch, distanceDelay);
|
||||||
Vec3 worldPos = ContraptionCollider.getWorldToLocalTranslation(new Vec3(x, y, z), this.contraption.entity);
|
|
||||||
|
|
||||||
worldPos = worldPos.add(x, y, z);
|
|
||||||
|
|
||||||
world.playSound(player, worldPos.x, worldPos.y, worldPos.z, soundIn, category, volume, pitch);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void playLocalSound(double x, double y, double z, SoundEvent p_184134_7_, SoundSource p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) {
|
|
||||||
world.playLocalSound(x, y, z, p_184134_7_, p_184134_8_, p_184134_9_, p_184134_10_, p_184134_11_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure that we provide accurate information about ContraptionWorld height to mods (such as Starlight) which
|
// Ensure that we provide accurate information about ContraptionWorld height to mods (such as Starlight) which
|
||||||
|
|
|
@ -85,12 +85,12 @@ public class DivingBootsItem extends BaseArmorItem {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vec3 getMovementMultiplier(Entity entity) {
|
public static Vec3 getMovementMultiplier(LivingEntity entity) {
|
||||||
double yMotion = entity.getDeltaMovement().y;
|
double yMotion = entity.getDeltaMovement().y;
|
||||||
double vMultiplier = yMotion < 0 ? Math.max(0, 2.5 - Math.abs(yMotion) * 2) : 1;
|
double vMultiplier = yMotion < 0 ? Math.max(0, 2.5 - Math.abs(yMotion) * 2) : 1;
|
||||||
|
|
||||||
if (!entity.isOnGround()) {
|
if (!entity.isOnGround()) {
|
||||||
if (entity instanceof LivingEntity le && le.jumping && entity.getPersistentData()
|
if (entity.jumping && entity.getPersistentData()
|
||||||
.contains("LavaGrounded")) {
|
.contains("LavaGrounded")) {
|
||||||
vMultiplier = yMotion == 0 ? 0 : 1 / yMotion;
|
vMultiplier = yMotion == 0 ? 0 : 1 / yMotion;
|
||||||
} else if (yMotion > 0)
|
} else if (yMotion > 0)
|
||||||
|
@ -101,7 +101,6 @@ public class DivingBootsItem extends BaseArmorItem {
|
||||||
return new Vec3(1.75, vMultiplier, 1.75);
|
return new Vec3(1.75, vMultiplier, 1.75);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entity instanceof LivingEntity)
|
|
||||||
entity.getPersistentData()
|
entity.getPersistentData()
|
||||||
.putBoolean("LavaGrounded", true);
|
.putBoolean("LavaGrounded", true);
|
||||||
double hMultiplier = entity.isSprinting() ? 1.85 : 1.75;
|
double hMultiplier = entity.isSprinting() ? 1.85 : 1.75;
|
||||||
|
|
|
@ -15,6 +15,8 @@ import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.player.Player;
|
import net.minecraft.world.entity.player.Player;
|
||||||
import net.minecraft.world.item.ArmorMaterial;
|
import net.minecraft.world.item.ArmorMaterial;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.minecraft.world.item.enchantment.Enchantment;
|
||||||
|
import net.minecraft.world.item.enchantment.Enchantments;
|
||||||
import net.minecraft.world.level.Level;
|
import net.minecraft.world.level.Level;
|
||||||
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
|
import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
|
@ -28,6 +30,14 @@ public class DivingHelmetItem extends BaseArmorItem {
|
||||||
super(material, SLOT, properties, textureLoc);
|
super(material, SLOT, properties, textureLoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) {
|
||||||
|
if (enchantment == Enchantments.AQUA_AFFINITY) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return super.canApplyAtEnchantingTable(stack, enchantment);
|
||||||
|
}
|
||||||
|
|
||||||
public static boolean isWornBy(Entity entity, boolean fireproof) {
|
public static boolean isWornBy(Entity entity, boolean fireproof) {
|
||||||
ItemStack stack = getWornItem(entity);
|
ItemStack stack = getWornItem(entity);
|
||||||
if (stack == null)
|
if (stack == null)
|
||||||
|
|
|
@ -1,25 +1,16 @@
|
||||||
package com.simibubi.create.content.curiosities.armor;
|
package com.simibubi.create.content.curiosities.armor;
|
||||||
|
|
||||||
import com.simibubi.create.AllItems;
|
import com.simibubi.create.AllItems;
|
||||||
import com.simibubi.create.foundation.networking.AllPackets;
|
|
||||||
import com.simibubi.create.foundation.networking.SimplePacketBase;
|
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraft.network.FriendlyByteBuf;
|
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
|
||||||
import net.minecraft.world.entity.EquipmentSlot;
|
import net.minecraft.world.entity.EquipmentSlot;
|
||||||
import net.minecraft.world.entity.LivingEntity;
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.item.ArmorItem;
|
import net.minecraft.world.item.ArmorItem;
|
||||||
import net.minecraft.world.item.ArmorMaterials;
|
import net.minecraft.world.item.ArmorMaterials;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent;
|
import net.minecraftforge.event.entity.living.LivingEquipmentChangeEvent;
|
||||||
import net.minecraftforge.event.entity.player.PlayerEvent;
|
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
|
||||||
import net.minecraftforge.network.NetworkEvent.Context;
|
|
||||||
import net.minecraftforge.network.PacketDistributor;
|
|
||||||
|
|
||||||
@EventBusSubscriber
|
@EventBusSubscriber
|
||||||
public final class NetheriteDivingHandler {
|
public final class NetheriteDivingHandler {
|
||||||
|
@ -64,10 +55,14 @@ public final class NetheriteDivingHandler {
|
||||||
public static void setBit(LivingEntity entity, EquipmentSlot slot) {
|
public static void setBit(LivingEntity entity, EquipmentSlot slot) {
|
||||||
CompoundTag nbt = entity.getPersistentData();
|
CompoundTag nbt = entity.getPersistentData();
|
||||||
byte bits = nbt.getByte(NETHERITE_DIVING_BITS_KEY);
|
byte bits = nbt.getByte(NETHERITE_DIVING_BITS_KEY);
|
||||||
|
if ((bits & 0b1111) == 0b1111) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bits |= 1 << slot.getIndex();
|
bits |= 1 << slot.getIndex();
|
||||||
nbt.putByte(NETHERITE_DIVING_BITS_KEY, bits);
|
nbt.putByte(NETHERITE_DIVING_BITS_KEY, bits);
|
||||||
|
|
||||||
if ((bits & 0xF) == 0xF) {
|
if ((bits & 0b1111) == 0b1111) {
|
||||||
setFireImmune(entity, true);
|
setFireImmune(entity, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,7 +74,7 @@ public final class NetheriteDivingHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
byte bits = nbt.getByte(NETHERITE_DIVING_BITS_KEY);
|
byte bits = nbt.getByte(NETHERITE_DIVING_BITS_KEY);
|
||||||
boolean prevFullSet = (bits & 0xF) == 0xF;
|
boolean prevFullSet = (bits & 0b1111) == 0b1111;
|
||||||
bits &= ~(1 << slot.getIndex());
|
bits &= ~(1 << slot.getIndex());
|
||||||
nbt.putByte(NETHERITE_DIVING_BITS_KEY, bits);
|
nbt.putByte(NETHERITE_DIVING_BITS_KEY, bits);
|
||||||
|
|
||||||
|
@ -88,59 +83,10 @@ public final class NetheriteDivingHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: sync to the client
|
||||||
|
// The feature works without syncing because health and burning are calculated server-side and synced through vanilla code.
|
||||||
|
// This method will not be called when the entity is wearing a full diving set on creation because the NBT values are persistent.
|
||||||
public static void setFireImmune(LivingEntity entity, boolean fireImmune) {
|
public static void setFireImmune(LivingEntity entity, boolean fireImmune) {
|
||||||
entity.getPersistentData().putBoolean(FIRE_IMMUNE_KEY, fireImmune);
|
entity.getPersistentData().putBoolean(FIRE_IMMUNE_KEY, fireImmune);
|
||||||
AllPackets.getChannel().send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> entity), SetFireImmunePacket.create(entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SubscribeEvent
|
|
||||||
public static void onStartTrackingEntity(PlayerEvent.StartTracking event) {
|
|
||||||
if (!(event.getPlayer() instanceof ServerPlayer player)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(event.getTarget() instanceof LivingEntity entity)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AllPackets.getChannel().send(PacketDistributor.PLAYER.with(() -> player), SetFireImmunePacket.create(entity));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class SetFireImmunePacket extends SimplePacketBase {
|
|
||||||
private final int entityId;
|
|
||||||
private final boolean fireImmune;
|
|
||||||
|
|
||||||
public SetFireImmunePacket(int entityId, boolean fireImmune) {
|
|
||||||
this.entityId = entityId;
|
|
||||||
this.fireImmune = fireImmune;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static SetFireImmunePacket create(Entity entity) {
|
|
||||||
int entityId = entity.getId();
|
|
||||||
boolean fireImmune = entity.getPersistentData().getBoolean(FIRE_IMMUNE_KEY);
|
|
||||||
return new SetFireImmunePacket(entityId, fireImmune);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SetFireImmunePacket(FriendlyByteBuf buffer) {
|
|
||||||
entityId = buffer.readVarInt();
|
|
||||||
fireImmune = buffer.readBoolean();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void write(FriendlyByteBuf buffer) {
|
|
||||||
buffer.writeVarInt(entityId);
|
|
||||||
buffer.writeBoolean(fireImmune);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean handle(Context context) {
|
|
||||||
context.enqueueWork(() -> {
|
|
||||||
Entity entity = Minecraft.getInstance().level.getEntity(entityId);
|
|
||||||
if (entity != null) {
|
|
||||||
entity.getPersistentData().putBoolean(FIRE_IMMUNE_KEY, fireImmune);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,14 +30,15 @@ public class ClientboundMapItemDataPacketMixin {
|
||||||
private List<MapDecoration> decorations;
|
private List<MapDecoration> decorations;
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private int[] stationIndices;
|
private int[] create$stationIndices;
|
||||||
|
|
||||||
@Inject(method = "<init>(IBZLjava/util/Collection;Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData$MapPatch;)V", at = @At("RETURN"))
|
@Inject(method = "<init>(IBZLjava/util/Collection;Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData$MapPatch;)V", at = @At("RETURN"))
|
||||||
private void onInit(int mapId, byte scale, boolean locked, @Nullable Collection<MapDecoration> decorations, @Nullable MapItemSavedData.MapPatch colorPatch, CallbackInfo ci) {
|
private void create$onInit(int mapId, byte scale, boolean locked, @Nullable Collection<MapDecoration> decorations, @Nullable MapItemSavedData.MapPatch colorPatch, CallbackInfo ci) {
|
||||||
stationIndices = getStationIndices(this.decorations);
|
create$stationIndices = create$getStationIndices(this.decorations);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int[] getStationIndices(List<MapDecoration> decorations) {
|
@Unique
|
||||||
|
private static int[] create$getStationIndices(List<MapDecoration> decorations) {
|
||||||
if (decorations == null) {
|
if (decorations == null) {
|
||||||
return new int[0];
|
return new int[0];
|
||||||
}
|
}
|
||||||
|
@ -53,11 +54,11 @@ public class ClientboundMapItemDataPacketMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "<init>(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At("RETURN"))
|
@Inject(method = "<init>(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At("RETURN"))
|
||||||
private void onInit(FriendlyByteBuf buf, CallbackInfo ci) {
|
private void create$onInit(FriendlyByteBuf buf, CallbackInfo ci) {
|
||||||
stationIndices = buf.readVarIntArray();
|
create$stationIndices = buf.readVarIntArray();
|
||||||
|
|
||||||
if (decorations != null) {
|
if (decorations != null) {
|
||||||
for (int i : stationIndices) {
|
for (int i : create$stationIndices) {
|
||||||
if (i >= 0 && i < decorations.size()) {
|
if (i >= 0 && i < decorations.size()) {
|
||||||
MapDecoration decoration = decorations.get(i);
|
MapDecoration decoration = decorations.get(i);
|
||||||
decorations.set(i, StationMarker.Decoration.from(decoration));
|
decorations.set(i, StationMarker.Decoration.from(decoration));
|
||||||
|
@ -67,7 +68,7 @@ public class ClientboundMapItemDataPacketMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "write(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At("RETURN"))
|
@Inject(method = "write(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At("RETURN"))
|
||||||
private void onWrite(FriendlyByteBuf buf, CallbackInfo ci) {
|
private void create$onWrite(FriendlyByteBuf buf, CallbackInfo ci) {
|
||||||
buf.writeVarIntArray(stationIndices);
|
buf.writeVarIntArray(create$stationIndices);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ import net.minecraftforge.common.extensions.IForgeEntity;
|
||||||
@Mixin(Entity.class)
|
@Mixin(Entity.class)
|
||||||
@Implements(@Interface(iface = IForgeEntity.class, prefix = "iForgeEntity$"))
|
@Implements(@Interface(iface = IForgeEntity.class, prefix = "iForgeEntity$"))
|
||||||
public abstract class ContraptionDriverInteractMixin extends CapabilityProvider<Entity> {
|
public abstract class ContraptionDriverInteractMixin extends CapabilityProvider<Entity> {
|
||||||
|
|
||||||
private ContraptionDriverInteractMixin(Class<Entity> baseClass) {
|
private ContraptionDriverInteractMixin(Class<Entity> baseClass) {
|
||||||
super(baseClass);
|
super(baseClass);
|
||||||
}
|
}
|
||||||
|
@ -30,5 +29,4 @@ public abstract class ContraptionDriverInteractMixin extends CapabilityProvider<
|
||||||
public boolean iForgeEntity$canRiderInteract() {
|
public boolean iForgeEntity$canRiderInteract() {
|
||||||
return getRootVehicle() instanceof AbstractContraptionEntity;
|
return getRootVehicle() instanceof AbstractContraptionEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,7 @@ public abstract class CustomItemUseEffectsMixin extends Entity {
|
||||||
public abstract ItemStack getUseItem();
|
public abstract ItemStack getUseItem();
|
||||||
|
|
||||||
@Inject(method = "shouldTriggerItemUseEffects()Z", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "shouldTriggerItemUseEffects()Z", at = @At("HEAD"), cancellable = true)
|
||||||
private void onShouldTriggerUseEffects(CallbackInfoReturnable<Boolean> cir) {
|
private void create$onShouldTriggerUseEffects(CallbackInfoReturnable<Boolean> cir) {
|
||||||
ItemStack using = getUseItem();
|
ItemStack using = getUseItem();
|
||||||
Item item = using.getItem();
|
Item item = using.getItem();
|
||||||
if (item instanceof CustomUseEffectsItem handler) {
|
if (item instanceof CustomUseEffectsItem handler) {
|
||||||
|
@ -38,7 +38,7 @@ public abstract class CustomItemUseEffectsMixin extends Entity {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "triggerItemUseEffects(Lnet/minecraft/world/item/ItemStack;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getUseAnimation()Lnet/minecraft/world/item/UseAnim;", ordinal = 0), cancellable = true)
|
@Inject(method = "triggerItemUseEffects(Lnet/minecraft/world/item/ItemStack;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;getUseAnimation()Lnet/minecraft/world/item/UseAnim;", ordinal = 0), cancellable = true)
|
||||||
private void onTriggerUseEffects(ItemStack stack, int count, CallbackInfo ci) {
|
private void create$onTriggerUseEffects(ItemStack stack, int count, CallbackInfo ci) {
|
||||||
Item item = stack.getItem();
|
Item item = stack.getItem();
|
||||||
if (item instanceof CustomUseEffectsItem handler) {
|
if (item instanceof CustomUseEffectsItem handler) {
|
||||||
if (handler.triggerUseEffects(stack, (LivingEntity) (Object) this, count, random)) {
|
if (handler.triggerUseEffects(stack, (LivingEntity) (Object) this, count, random)) {
|
||||||
|
|
|
@ -15,7 +15,7 @@ import net.minecraft.world.item.enchantment.Enchantments;
|
||||||
@Mixin(EnchantmentHelper.class)
|
@Mixin(EnchantmentHelper.class)
|
||||||
public class EnchantmentHelperMixin {
|
public class EnchantmentHelperMixin {
|
||||||
@Inject(method = "getItemEnchantmentLevel(Lnet/minecraft/world/item/enchantment/Enchantment;Lnet/minecraft/world/item/ItemStack;)I", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "getItemEnchantmentLevel(Lnet/minecraft/world/item/enchantment/Enchantment;Lnet/minecraft/world/item/ItemStack;)I", at = @At("HEAD"), cancellable = true)
|
||||||
private static void onGetItemEnchantmentLevel(Enchantment enchantment, ItemStack stack, CallbackInfoReturnable<Integer> cir) {
|
private static void create$onGetItemEnchantmentLevel(Enchantment enchantment, ItemStack stack, CallbackInfoReturnable<Integer> cir) {
|
||||||
if (enchantment == Enchantments.AQUA_AFFINITY && stack.getItem() instanceof DivingHelmetItem) {
|
if (enchantment == Enchantments.AQUA_AFFINITY && stack.getItem() instanceof DivingHelmetItem) {
|
||||||
cir.setReturnValue(1);
|
cir.setReturnValue(1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
|
||||||
|
|
||||||
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 com.simibubi.create.content.curiosities.armor.DivingHelmetItem;
|
|
||||||
|
|
||||||
import net.minecraft.world.item.ItemStack;
|
|
||||||
import net.minecraft.world.item.enchantment.Enchantment;
|
|
||||||
import net.minecraft.world.item.enchantment.Enchantments;
|
|
||||||
|
|
||||||
@Mixin(Enchantment.class)
|
|
||||||
public class EnchantmentMixin {
|
|
||||||
@Inject(method = "canEnchant(Lnet/minecraft/world/item/ItemStack;)Z", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void onCanEnchant(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
|
|
||||||
if ((Object) this == Enchantments.AQUA_AFFINITY && stack.getItem() instanceof DivingHelmetItem) {
|
|
||||||
cir.setReturnValue(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,194 +0,0 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
|
||||||
|
|
||||||
import java.lang.ref.Reference;
|
|
||||||
import java.util.Random;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import org.apache.logging.log4j.util.TriConsumer;
|
|
||||||
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;
|
|
||||||
|
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
|
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider;
|
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler;
|
|
||||||
|
|
||||||
import net.minecraft.core.BlockPos;
|
|
||||||
import net.minecraft.core.particles.BlockParticleOption;
|
|
||||||
import net.minecraft.core.particles.ParticleTypes;
|
|
||||||
import net.minecraft.sounds.SoundEvent;
|
|
||||||
import net.minecraft.world.entity.Entity;
|
|
||||||
import net.minecraft.world.entity.MoverType;
|
|
||||||
import net.minecraft.world.entity.player.Player;
|
|
||||||
import net.minecraft.world.level.block.RenderShape;
|
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
|
||||||
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
|
|
||||||
import net.minecraft.world.phys.Vec3;
|
|
||||||
import net.minecraftforge.common.capabilities.CapabilityProvider;
|
|
||||||
|
|
||||||
@Mixin(Entity.class)
|
|
||||||
public abstract class EntityContraptionInteractionMixin extends CapabilityProvider<Entity> {
|
|
||||||
private EntityContraptionInteractionMixin(Class<Entity> baseClass) {
|
|
||||||
super(baseClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
private final Entity self = (Entity) (Object) this;
|
|
||||||
|
|
||||||
private AbstractContraptionEntity contraption;
|
|
||||||
|
|
||||||
@Final
|
|
||||||
@Shadow
|
|
||||||
protected Random random;
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
private float nextStep;
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
protected abstract float nextStep();
|
|
||||||
|
|
||||||
@Shadow
|
|
||||||
protected abstract void playStepSound(BlockPos p_180429_1_, BlockState p_180429_2_);
|
|
||||||
|
|
||||||
private Set<AbstractContraptionEntity> getIntersectingContraptions() {
|
|
||||||
Set<AbstractContraptionEntity> contraptions = getIntersectionContraptionsStream().collect(Collectors.toSet());
|
|
||||||
|
|
||||||
contraptions.addAll(self.level.getEntitiesOfClass(AbstractContraptionEntity.class, self.getBoundingBox()
|
|
||||||
.inflate(1f)));
|
|
||||||
return contraptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Stream<AbstractContraptionEntity> getIntersectionContraptionsStream() {
|
|
||||||
return ContraptionHandler.loadedContraptions.get(self.level)
|
|
||||||
.values()
|
|
||||||
.stream()
|
|
||||||
.map(Reference::get)
|
|
||||||
.filter(cEntity -> cEntity != null && cEntity.collidingEntities.containsKey(self));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void forCollision(Vec3 anchorPos, TriConsumer<Contraption, BlockState, BlockPos> action) {
|
|
||||||
getIntersectingContraptions().forEach(cEntity -> {
|
|
||||||
Vec3 localPos = ContraptionCollider.getWorldToLocalTranslation(anchorPos, cEntity);
|
|
||||||
|
|
||||||
localPos = anchorPos.add(localPos);
|
|
||||||
|
|
||||||
BlockPos blockPos = new BlockPos(localPos);
|
|
||||||
Contraption contraption = cEntity.getContraption();
|
|
||||||
StructureTemplate.StructureBlockInfo info = contraption.getBlocks()
|
|
||||||
.get(blockPos);
|
|
||||||
|
|
||||||
if (info != null) {
|
|
||||||
BlockState blockstate = info.state;
|
|
||||||
action.accept(contraption, blockstate, blockPos);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(at = @At(value = "JUMP", opcode = 154, // IFNE line 661 injecting before `!blockstate.isAir(this.world, blockpos)`
|
|
||||||
ordinal = 7), method = "move")
|
|
||||||
private void movementStepMixin(MoverType mover, Vec3 movement, CallbackInfo ci) { // involves block step sounds on contraptions
|
|
||||||
Vec3 worldPos = self.position()
|
|
||||||
.add(0, -0.2, 0);
|
|
||||||
AtomicBoolean stepped = new AtomicBoolean(false);
|
|
||||||
|
|
||||||
forCollision(worldPos, (contraption, blockstate, blockPos) -> {
|
|
||||||
bindContraption(contraption);
|
|
||||||
playStepSound(blockPos, blockstate);
|
|
||||||
unbindContraption();
|
|
||||||
stepped.set(true);
|
|
||||||
});
|
|
||||||
|
|
||||||
if (stepped.get())
|
|
||||||
this.nextStep = this.nextStep();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(at = @At(value = "TAIL"), method = "move")
|
|
||||||
private void movementMixin(MoverType mover, Vec3 movement, CallbackInfo ci) {
|
|
||||||
// involves client-side view bobbing animation on contraptions
|
|
||||||
if (!self.level.isClientSide)
|
|
||||||
return;
|
|
||||||
if (self.isOnGround())
|
|
||||||
return;
|
|
||||||
if (self.isPassenger())
|
|
||||||
return;
|
|
||||||
|
|
||||||
Vec3 worldPos = self.position()
|
|
||||||
.add(0, -0.2, 0);
|
|
||||||
boolean onAtLeastOneContraption = getIntersectionContraptionsStream().anyMatch(cEntity -> {
|
|
||||||
Vec3 localPos = ContraptionCollider.getWorldToLocalTranslation(worldPos, cEntity);
|
|
||||||
|
|
||||||
localPos = worldPos.add(localPos);
|
|
||||||
|
|
||||||
BlockPos blockPos = new BlockPos(localPos);
|
|
||||||
Contraption contraption = cEntity.getContraption();
|
|
||||||
StructureTemplate.StructureBlockInfo info = contraption.getBlocks()
|
|
||||||
.get(blockPos);
|
|
||||||
|
|
||||||
if (info == null)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
cEntity.registerColliding(self);
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!onAtLeastOneContraption)
|
|
||||||
return;
|
|
||||||
|
|
||||||
self.setOnGround(true);
|
|
||||||
self.getPersistentData()
|
|
||||||
.putBoolean("ContraptionGrounded", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = { "spawnSprintParticle" }, at = @At(value = "TAIL"))
|
|
||||||
private void createRunningParticlesMixin(CallbackInfo ci) {
|
|
||||||
Vec3 worldPos = self.position()
|
|
||||||
.add(0, -0.2, 0);
|
|
||||||
BlockPos pos = new BlockPos(worldPos); // pos where particles are spawned
|
|
||||||
|
|
||||||
forCollision(worldPos, (contraption, blockstate, blockpos) -> {
|
|
||||||
if (!blockstate.addRunningEffects(self.level, blockpos, self)
|
|
||||||
&& blockstate.getRenderShape() != RenderShape.INVISIBLE) {
|
|
||||||
Vec3 vec3d = self.getDeltaMovement();
|
|
||||||
self.level.addParticle(new BlockParticleOption(ParticleTypes.BLOCK, blockstate).setPos(pos),
|
|
||||||
self.getX() + ((double) random.nextFloat() - 0.5D) * (double) self.getBbWidth(), self.getY() + 0.1D,
|
|
||||||
self.getZ() + ((double) random.nextFloat() - 0.5D) * (double) self.getBbWidth(), vec3d.x * -4.0D, 1.5D,
|
|
||||||
vec3d.z * -4.0D);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "playSound", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void playSoundShifted(SoundEvent event, float pitch, float volume, CallbackInfo ci) {
|
|
||||||
if (this.contraption != null && (!self.isSilent() || self instanceof Player)) {
|
|
||||||
double x = self.getX();
|
|
||||||
double y = self.getY();
|
|
||||||
double z = self.getZ();
|
|
||||||
Vec3 worldPos = ContraptionCollider.getWorldToLocalTranslation(new Vec3(x, y, z), this.contraption);
|
|
||||||
|
|
||||||
worldPos = worldPos.add(x, y, z);
|
|
||||||
|
|
||||||
self.level.playSound(null, worldPos.x + x, worldPos.y + y, worldPos.z + z, event, self.getSoundSource(),
|
|
||||||
pitch, volume);
|
|
||||||
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void bindContraption(Contraption contraption) {
|
|
||||||
bindContraption(contraption.entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void bindContraption(AbstractContraptionEntity contraption) {
|
|
||||||
this.contraption = contraption;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void unbindContraption() {
|
|
||||||
this.contraption = null;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -12,7 +12,7 @@ import net.minecraft.world.entity.Entity;
|
||||||
@Mixin(Entity.class)
|
@Mixin(Entity.class)
|
||||||
public class EntityMixin {
|
public class EntityMixin {
|
||||||
@Inject(method = "fireImmune()Z", at = @At("RETURN"), cancellable = true)
|
@Inject(method = "fireImmune()Z", at = @At("RETURN"), cancellable = true)
|
||||||
public void fireImmune(CallbackInfoReturnable<Boolean> cir) {
|
public void create$onFireImmune(CallbackInfoReturnable<Boolean> cir) {
|
||||||
if (!cir.getReturnValueZ()) {
|
if (!cir.getReturnValueZ()) {
|
||||||
Entity self = (Entity) (Object) this;
|
Entity self = (Entity) (Object) this;
|
||||||
boolean immune = self.getPersistentData().getBoolean(NetheriteDivingHandler.FIRE_IMMUNE_KEY);
|
boolean immune = self.getPersistentData().getBoolean(NetheriteDivingHandler.FIRE_IMMUNE_KEY);
|
||||||
|
|
|
@ -19,14 +19,14 @@ import net.minecraft.world.phys.Vec3;
|
||||||
|
|
||||||
@Mixin(LivingEntity.class)
|
@Mixin(LivingEntity.class)
|
||||||
public abstract class LavaSwimmingMixin extends Entity {
|
public abstract class LavaSwimmingMixin extends Entity {
|
||||||
public LavaSwimmingMixin(EntityType<?> type, Level level) {
|
private LavaSwimmingMixin(EntityType<?> type, Level level) {
|
||||||
super(type, level);
|
super(type, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "travel(Lnet/minecraft/world/phys/Vec3;)V", slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;isInLava()Z")), at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;move(Lnet/minecraft/world/entity/MoverType;Lnet/minecraft/world/phys/Vec3;)V", shift = Shift.AFTER, ordinal = 0))
|
@Inject(method = "travel(Lnet/minecraft/world/phys/Vec3;)V", slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;isInLava()Z")), at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;move(Lnet/minecraft/world/entity/MoverType;Lnet/minecraft/world/phys/Vec3;)V", shift = Shift.AFTER, ordinal = 0))
|
||||||
private void onLavaTravel(Vec3 travelVector, CallbackInfo ci) {
|
private void create$onLavaTravel(Vec3 travelVector, CallbackInfo ci) {
|
||||||
ItemStack bootsStack = DivingBootsItem.getWornItem(this);
|
ItemStack bootsStack = DivingBootsItem.getWornItem(this);
|
||||||
if (bootsStack != null && AllItems.NETHERITE_DIVING_BOOTS.isIn(bootsStack))
|
if (bootsStack != null && AllItems.NETHERITE_DIVING_BOOTS.isIn(bootsStack))
|
||||||
setDeltaMovement(getDeltaMovement().multiply(DivingBootsItem.getMovementMultiplier(this)));
|
setDeltaMovement(getDeltaMovement().multiply(DivingBootsItem.getMovementMultiplier((LivingEntity) (Object) this)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ import java.util.Collection;
|
||||||
|
|
||||||
@Mixin(Main.class)
|
@Mixin(Main.class)
|
||||||
public class MainMixin {
|
public class MainMixin {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Forge completely bypasses vanilla's
|
* Forge completely bypasses vanilla's
|
||||||
* {@link GameTestServer#create(Thread, LevelStorageAccess, PackRepository, Collection, BlockPos)},
|
* {@link GameTestServer#create(Thread, LevelStorageAccess, PackRepository, Collection, BlockPos)},
|
||||||
|
|
|
@ -53,13 +53,13 @@ public class MapItemSavedDataMixin implements StationMapData {
|
||||||
private int trackedDecorationCount;
|
private int trackedDecorationCount;
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private final Map<String, StationMarker> stationMarkers = Maps.newHashMap();
|
private final Map<String, StationMarker> create$stationMarkers = Maps.newHashMap();
|
||||||
|
|
||||||
@Inject(
|
@Inject(
|
||||||
method = "load(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData;",
|
method = "load(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/world/level/saveddata/maps/MapItemSavedData;",
|
||||||
at = @At("RETURN")
|
at = @At("RETURN")
|
||||||
)
|
)
|
||||||
private static void onLoad(CompoundTag compound, CallbackInfoReturnable<MapItemSavedData> cir) {
|
private static void create$onLoad(CompoundTag compound, CallbackInfoReturnable<MapItemSavedData> cir) {
|
||||||
MapItemSavedData mapData = cir.getReturnValue();
|
MapItemSavedData mapData = cir.getReturnValue();
|
||||||
StationMapData stationMapData = (StationMapData) mapData;
|
StationMapData stationMapData = (StationMapData) mapData;
|
||||||
|
|
||||||
|
@ -74,9 +74,9 @@ public class MapItemSavedDataMixin implements StationMapData {
|
||||||
method = "save(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/nbt/CompoundTag;",
|
method = "save(Lnet/minecraft/nbt/CompoundTag;)Lnet/minecraft/nbt/CompoundTag;",
|
||||||
at = @At("RETURN")
|
at = @At("RETURN")
|
||||||
)
|
)
|
||||||
public void onSave(CompoundTag compound, CallbackInfoReturnable<CompoundTag> cir) {
|
public void create$onSave(CompoundTag compound, CallbackInfoReturnable<CompoundTag> cir) {
|
||||||
ListTag listTag = new ListTag();
|
ListTag listTag = new ListTag();
|
||||||
for (StationMarker stationMarker : stationMarkers.values()) {
|
for (StationMarker stationMarker : create$stationMarkers.values()) {
|
||||||
listTag.add(stationMarker.save());
|
listTag.add(stationMarker.save());
|
||||||
}
|
}
|
||||||
compound.put(STATION_MARKERS_KEY, listTag);
|
compound.put(STATION_MARKERS_KEY, listTag);
|
||||||
|
@ -84,7 +84,7 @@ public class MapItemSavedDataMixin implements StationMapData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addStationMarker(StationMarker marker) {
|
public void addStationMarker(StationMarker marker) {
|
||||||
stationMarkers.put(marker.getId(), marker);
|
create$stationMarkers.put(marker.getId(), marker);
|
||||||
|
|
||||||
int scaleMultiplier = 1 << scale;
|
int scaleMultiplier = 1 << scale;
|
||||||
float localX = (marker.getTarget().getX() - x) / (float) scaleMultiplier;
|
float localX = (marker.getTarget().getX() - x) / (float) scaleMultiplier;
|
||||||
|
@ -144,7 +144,7 @@ public class MapItemSavedDataMixin implements StationMapData {
|
||||||
if (marker == null)
|
if (marker == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (stationMarkers.remove(marker.getId(), marker)) {
|
if (create$stationMarkers.remove(marker.getId(), marker)) {
|
||||||
removeDecoration(marker.getId());
|
removeDecoration(marker.getId());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -161,12 +161,13 @@ public class MapItemSavedDataMixin implements StationMapData {
|
||||||
method = "checkBanners(Lnet/minecraft/world/level/BlockGetter;II)V",
|
method = "checkBanners(Lnet/minecraft/world/level/BlockGetter;II)V",
|
||||||
at = @At("RETURN")
|
at = @At("RETURN")
|
||||||
)
|
)
|
||||||
public void checkBanners(BlockGetter blockGetter, int x, int z, CallbackInfo ci) {
|
public void create$onCheckBanners(BlockGetter blockGetter, int x, int z, CallbackInfo ci) {
|
||||||
checkStations(blockGetter, x, z);
|
create$checkStations(blockGetter, x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkStations(BlockGetter blockGetter, int x, int z) {
|
@Unique
|
||||||
Iterator<StationMarker> iterator = stationMarkers.values().iterator();
|
private void create$checkStations(BlockGetter blockGetter, int x, int z) {
|
||||||
|
Iterator<StationMarker> iterator = create$stationMarkers.values().iterator();
|
||||||
List<StationMarker> newMarkers = new ArrayList<>();
|
List<StationMarker> newMarkers = new ArrayList<>();
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
|
|
|
@ -20,9 +20,8 @@ import net.minecraft.world.level.material.FluidState;
|
||||||
|
|
||||||
@Mixin(FlowingFluid.class)
|
@Mixin(FlowingFluid.class)
|
||||||
public class WaterWheelFluidSpreadMixin {
|
public class WaterWheelFluidSpreadMixin {
|
||||||
|
@Inject(method = "canPassThrough(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;)Z", at = @At("HEAD"), cancellable = true)
|
||||||
@Inject(at = @At("HEAD"), cancellable = true, method = "canPassThrough(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/world/level/material/Fluid;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/Direction;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;)Z")
|
protected void create$canPassThroughOnWaterWheel(BlockGetter pLevel, Fluid pFluid, BlockPos pFromPos, BlockState p_75967_,
|
||||||
protected void canPassThroughOnWaterWheel(BlockGetter pLevel, Fluid pFluid, BlockPos pFromPos, BlockState p_75967_,
|
|
||||||
Direction pDirection, BlockPos p_75969_, BlockState p_75970_, FluidState p_75971_,
|
Direction pDirection, BlockPos p_75969_, BlockState p_75970_, FluidState p_75971_,
|
||||||
CallbackInfoReturnable<Boolean> cir) {
|
CallbackInfoReturnable<Boolean> cir) {
|
||||||
|
|
||||||
|
@ -43,5 +42,4 @@ public class WaterWheelFluidSpreadMixin {
|
||||||
&& irotate.getRotationAxis(belowState) == pDirection.getAxis())
|
&& irotate.getRotationAxis(belowState) == pDirection.getAxis())
|
||||||
cir.setReturnValue(false);
|
cir.setReturnValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
@ -13,15 +13,15 @@ import net.minecraft.server.level.BlockDestructionProgress;
|
||||||
@Mixin(BlockDestructionProgress.class)
|
@Mixin(BlockDestructionProgress.class)
|
||||||
public class BlockDestructionProgressMixin implements BlockDestructionProgressExtension {
|
public class BlockDestructionProgressMixin implements BlockDestructionProgressExtension {
|
||||||
@Unique
|
@Unique
|
||||||
private Set<BlockPos> extraPositions;
|
private Set<BlockPos> create$extraPositions;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<BlockPos> getExtraPositions() {
|
public Set<BlockPos> getExtraPositions() {
|
||||||
return extraPositions;
|
return create$extraPositions;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setExtraPositions(Set<BlockPos> positions) {
|
public void setExtraPositions(Set<BlockPos> positions) {
|
||||||
extraPositions = positions;
|
create$extraPositions = positions;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -15,7 +15,7 @@ public abstract class CameraMixin {
|
||||||
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;getMaxZoom(D)D"),
|
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;getMaxZoom(D)D"),
|
||||||
index = 0
|
index = 0
|
||||||
)
|
)
|
||||||
public double modifyCameraOffset(double originalValue) {
|
public double create$modifyCameraOffset(double originalValue) {
|
||||||
return originalValue * CameraDistanceModifier.getMultiplier();
|
return originalValue * CameraDistanceModifier.getMultiplier();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,172 @@
|
||||||
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
|
import java.lang.ref.Reference;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.mutable.MutableBoolean;
|
||||||
|
import org.apache.logging.log4j.util.TriConsumer;
|
||||||
|
import org.objectweb.asm.Opcodes;
|
||||||
|
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 com.simibubi.create.content.contraptions.components.structureMovement.AbstractContraptionEntity;
|
||||||
|
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
||||||
|
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionCollider;
|
||||||
|
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionHandler;
|
||||||
|
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.particles.BlockParticleOption;
|
||||||
|
import net.minecraft.core.particles.ParticleTypes;
|
||||||
|
import net.minecraft.world.entity.Entity;
|
||||||
|
import net.minecraft.world.entity.EntityDimensions;
|
||||||
|
import net.minecraft.world.entity.MoverType;
|
||||||
|
import net.minecraft.world.level.Level;
|
||||||
|
import net.minecraft.world.level.block.RenderShape;
|
||||||
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
|
||||||
|
import net.minecraft.world.phys.Vec3;
|
||||||
|
import net.minecraftforge.common.capabilities.CapabilityProvider;
|
||||||
|
|
||||||
|
@Mixin(Entity.class)
|
||||||
|
public abstract class EntityContraptionInteractionMixin extends CapabilityProvider<Entity> {
|
||||||
|
private EntityContraptionInteractionMixin(Class<Entity> baseClass) {
|
||||||
|
super(baseClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
public Level level;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
private Vec3 position;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
private float nextStep;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
protected Random random;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
private EntityDimensions dimensions;
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
protected abstract float nextStep();
|
||||||
|
|
||||||
|
@Shadow
|
||||||
|
protected abstract void playStepSound(BlockPos pos, BlockState state);
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private Stream<AbstractContraptionEntity> create$getIntersectionContraptionsStream() {
|
||||||
|
return ContraptionHandler.loadedContraptions.get(level)
|
||||||
|
.values()
|
||||||
|
.stream()
|
||||||
|
.map(Reference::get)
|
||||||
|
.filter(cEntity -> cEntity != null && cEntity.collidingEntities.containsKey((Entity) (Object) this));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private Set<AbstractContraptionEntity> create$getIntersectingContraptions() {
|
||||||
|
Set<AbstractContraptionEntity> contraptions = create$getIntersectionContraptionsStream().collect(Collectors.toSet());
|
||||||
|
|
||||||
|
contraptions.addAll(level.getEntitiesOfClass(AbstractContraptionEntity.class, ((Entity) (Object) this).getBoundingBox()
|
||||||
|
.inflate(1f)));
|
||||||
|
return contraptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Unique
|
||||||
|
private void forCollision(Vec3 worldPos, TriConsumer<Contraption, BlockState, BlockPos> action) {
|
||||||
|
create$getIntersectingContraptions().forEach(cEntity -> {
|
||||||
|
Vec3 localPos = ContraptionCollider.worldToLocalPos(worldPos, cEntity);
|
||||||
|
|
||||||
|
BlockPos blockPos = new BlockPos(localPos);
|
||||||
|
Contraption contraption = cEntity.getContraption();
|
||||||
|
StructureTemplate.StructureBlockInfo info = contraption.getBlocks()
|
||||||
|
.get(blockPos);
|
||||||
|
|
||||||
|
if (info != null) {
|
||||||
|
BlockState blockstate = info.state;
|
||||||
|
action.accept(contraption, blockstate, blockPos);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// involves block step sounds on contraptions
|
||||||
|
// IFNE line 661 injecting before `!blockstate.isAir(this.world, blockpos)`
|
||||||
|
@Inject(method = "move", at = @At(value = "JUMP", opcode = Opcodes.IFNE, ordinal = 7))
|
||||||
|
private void create$contraptionStepSounds(MoverType mover, Vec3 movement, CallbackInfo ci) {
|
||||||
|
Vec3 worldPos = position.add(0, -0.2, 0);
|
||||||
|
MutableBoolean stepped = new MutableBoolean(false);
|
||||||
|
|
||||||
|
forCollision(worldPos, (contraption, state, pos) -> {
|
||||||
|
playStepSound(pos, state);
|
||||||
|
stepped.setTrue();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (stepped.booleanValue())
|
||||||
|
nextStep = nextStep();
|
||||||
|
}
|
||||||
|
|
||||||
|
// involves client-side view bobbing animation on contraptions
|
||||||
|
@Inject(method = "move", at = @At(value = "TAIL"))
|
||||||
|
private void create$onMove(MoverType mover, Vec3 movement, CallbackInfo ci) {
|
||||||
|
if (!level.isClientSide)
|
||||||
|
return;
|
||||||
|
Entity self = (Entity) (Object) this;
|
||||||
|
if (self.isOnGround())
|
||||||
|
return;
|
||||||
|
if (self.isPassenger())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Vec3 worldPos = position.add(0, -0.2, 0);
|
||||||
|
boolean onAtLeastOneContraption = create$getIntersectionContraptionsStream().anyMatch(cEntity -> {
|
||||||
|
Vec3 localPos = ContraptionCollider.worldToLocalPos(worldPos, cEntity);
|
||||||
|
|
||||||
|
BlockPos blockPos = new BlockPos(localPos);
|
||||||
|
Contraption contraption = cEntity.getContraption();
|
||||||
|
StructureTemplate.StructureBlockInfo info = contraption.getBlocks()
|
||||||
|
.get(blockPos);
|
||||||
|
|
||||||
|
if (info == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
cEntity.registerColliding(self);
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!onAtLeastOneContraption)
|
||||||
|
return;
|
||||||
|
|
||||||
|
self.setOnGround(true);
|
||||||
|
self.getPersistentData()
|
||||||
|
.putBoolean("ContraptionGrounded", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject(method = "spawnSprintParticle", at = @At(value = "TAIL"))
|
||||||
|
private void create$onSpawnSprintParticle(CallbackInfo ci) {
|
||||||
|
Entity self = (Entity) (Object) this;
|
||||||
|
Vec3 worldPos = position.add(0, -0.2, 0);
|
||||||
|
BlockPos particlePos = new BlockPos(worldPos); // pos where particles are spawned
|
||||||
|
|
||||||
|
forCollision(worldPos, (contraption, state, pos) -> {
|
||||||
|
if (!state.addRunningEffects(level, pos, self)
|
||||||
|
&& state.getRenderShape() != RenderShape.INVISIBLE) {
|
||||||
|
Vec3 speed = self.getDeltaMovement();
|
||||||
|
level.addParticle(
|
||||||
|
new BlockParticleOption(ParticleTypes.BLOCK, state).setPos(particlePos),
|
||||||
|
self.getX() + ((double) random.nextFloat() - 0.5D) * (double) dimensions.width,
|
||||||
|
self.getY() + 0.1D,
|
||||||
|
self.getZ() + ((double) random.nextFloat() - 0.5D) * (double) dimensions.height,
|
||||||
|
speed.x * -4.0D, 1.5D, speed.z * -4.0D
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -18,7 +18,7 @@ public class FixNormalScalingMixin {
|
||||||
* same as in the beginning.
|
* same as in the beginning.
|
||||||
*/
|
*/
|
||||||
@Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/math/Matrix3f;mul(F)V", shift = Shift.AFTER), method = "scale(FFF)V", cancellable = true)
|
@Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/math/Matrix3f;mul(F)V", shift = Shift.AFTER), method = "scale(FFF)V", cancellable = true)
|
||||||
private void returnAfterNegate(float x, float y, float z, CallbackInfo ci) {
|
private void create$returnAfterNegate(float x, float y, float z, CallbackInfo ci) {
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ public class FixNormalScalingMixin {
|
||||||
* does not work for negative numbers.
|
* does not work for negative numbers.
|
||||||
*/
|
*/
|
||||||
@ModifyArg(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;fastInvCubeRoot(F)F"), method = "scale(FFF)V")
|
@ModifyArg(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;fastInvCubeRoot(F)F"), method = "scale(FFF)V")
|
||||||
private float absInvCbrtInput(float input) {
|
private float create$absInvCbrtInput(float input) {
|
||||||
return Math.abs(input);
|
return Math.abs(input);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -9,14 +9,11 @@ import com.simibubi.create.content.logistics.trains.track.TrackBlockOutline;
|
||||||
import com.simibubi.create.foundation.block.BigOutlines;
|
import com.simibubi.create.foundation.block.BigOutlines;
|
||||||
|
|
||||||
import net.minecraft.client.renderer.GameRenderer;
|
import net.minecraft.client.renderer.GameRenderer;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
@Mixin(GameRenderer.class)
|
@Mixin(GameRenderer.class)
|
||||||
public class GameRendererMixin {
|
public class GameRendererMixin {
|
||||||
@Inject(at = @At("TAIL"), method = "pick")
|
@Inject(method = "pick(F)V", at = @At("TAIL"))
|
||||||
private void bigShapePick(CallbackInfo ci) {
|
private void create$bigShapePick(CallbackInfo ci) {
|
||||||
BigOutlines.pick();
|
BigOutlines.pick();
|
||||||
TrackBlockOutline.pickCurves();
|
TrackBlockOutline.pickCurves();
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -11,22 +11,17 @@ import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
import net.minecraft.client.player.AbstractClientPlayer;
|
import net.minecraft.client.player.AbstractClientPlayer;
|
||||||
import net.minecraft.client.player.LocalPlayer;
|
import net.minecraft.client.player.LocalPlayer;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
@Mixin(LocalPlayer.class)
|
@Mixin(LocalPlayer.class)
|
||||||
public abstract class HeavyBootsOnPlayerMixin extends AbstractClientPlayer {
|
public abstract class HeavyBootsOnPlayerMixin extends AbstractClientPlayer {
|
||||||
|
|
||||||
private HeavyBootsOnPlayerMixin(ClientLevel level, GameProfile profile) {
|
private HeavyBootsOnPlayerMixin(ClientLevel level, GameProfile profile) {
|
||||||
super(level, profile);
|
super(level, profile);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "isUnderWater()Z", at = @At("HEAD"), cancellable = true)
|
@Inject(method = "isUnderWater()Z", at = @At("HEAD"), cancellable = true)
|
||||||
public void noSwimmingWithHeavyBootsOn(CallbackInfoReturnable<Boolean> cir) {
|
public void create$noSwimmingWithHeavyBootsOn(CallbackInfoReturnable<Boolean> cir) {
|
||||||
CompoundTag persistentData = getPersistentData();
|
CompoundTag persistentData = getPersistentData();
|
||||||
if (persistentData.contains("HeavyBoots"))
|
if (persistentData.contains("HeavyBoots"))
|
||||||
cir.setReturnValue(false);
|
cir.setReturnValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -19,7 +19,7 @@ import net.minecraft.world.item.ItemStack;
|
||||||
@Mixin(HumanoidArmorLayer.class)
|
@Mixin(HumanoidArmorLayer.class)
|
||||||
public class HumanoidArmorLayerMixin {
|
public class HumanoidArmorLayerMixin {
|
||||||
@Inject(method = "renderArmorPiece(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/EquipmentSlot;ILnet/minecraft/client/model/HumanoidModel;)V", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/entity/LivingEntity;getItemBySlot(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/world/item/ItemStack;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
|
@Inject(method = "renderArmorPiece(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/EquipmentSlot;ILnet/minecraft/client/model/HumanoidModel;)V", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/entity/LivingEntity;getItemBySlot(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/world/item/ItemStack;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
|
||||||
private void onRenderArmorPiece(PoseStack poseStack, MultiBufferSource bufferSource, LivingEntity entity, EquipmentSlot slot, int light, HumanoidModel<?> model, CallbackInfo ci, ItemStack stack) {
|
private void create$onRenderArmorPiece(PoseStack poseStack, MultiBufferSource bufferSource, LivingEntity entity, EquipmentSlot slot, int light, HumanoidModel<?> model, CallbackInfo ci, ItemStack stack) {
|
||||||
if (stack.getItem() instanceof CustomRenderedArmorItem renderer) {
|
if (stack.getItem() instanceof CustomRenderedArmorItem renderer) {
|
||||||
renderer.renderArmorPiece((HumanoidArmorLayer<?, ?, ?>) (Object) this, poseStack, bufferSource, entity, slot, light, model, stack);
|
renderer.renderArmorPiece((HumanoidArmorLayer<?, ?, ?>) (Object) this, poseStack, bufferSource, entity, slot, light, model, stack);
|
||||||
ci.cancel();
|
ci.cancel();
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
|
@ -35,7 +35,7 @@ public class LevelRendererMixin {
|
||||||
private Long2ObjectMap<SortedSet<BlockDestructionProgress>> destructionProgress;
|
private Long2ObjectMap<SortedSet<BlockDestructionProgress>> destructionProgress;
|
||||||
|
|
||||||
@Inject(method = "destroyBlockProgress(ILnet/minecraft/core/BlockPos;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/BlockDestructionProgress;updateTick(I)V", shift = Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD)
|
@Inject(method = "destroyBlockProgress(ILnet/minecraft/core/BlockPos;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/BlockDestructionProgress;updateTick(I)V", shift = Shift.AFTER), locals = LocalCapture.CAPTURE_FAILHARD)
|
||||||
private void onDestroyBlockProgress(int breakerId, BlockPos pos, int progress, CallbackInfo ci, BlockDestructionProgress progressObj) {
|
private void create$onDestroyBlockProgress(int breakerId, BlockPos pos, int progress, CallbackInfo ci, BlockDestructionProgress progressObj) {
|
||||||
BlockState state = level.getBlockState(pos);
|
BlockState state = level.getBlockState(pos);
|
||||||
IBlockRenderProperties properties = RenderProperties.get(state);
|
IBlockRenderProperties properties = RenderProperties.get(state);
|
||||||
if (properties instanceof MultiPosDestructionHandler handler) {
|
if (properties instanceof MultiPosDestructionHandler handler) {
|
||||||
|
@ -51,7 +51,7 @@ public class LevelRendererMixin {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "removeProgress(Lnet/minecraft/server/level/BlockDestructionProgress;)V", at = @At("RETURN"))
|
@Inject(method = "removeProgress(Lnet/minecraft/server/level/BlockDestructionProgress;)V", at = @At("RETURN"))
|
||||||
private void onRemoveProgress(BlockDestructionProgress progress, CallbackInfo ci) {
|
private void create$onRemoveProgress(BlockDestructionProgress progress, CallbackInfo ci) {
|
||||||
Set<BlockPos> extraPositions = ((BlockDestructionProgressExtension) progress).getExtraPositions();
|
Set<BlockPos> extraPositions = ((BlockDestructionProgressExtension) progress).getExtraPositions();
|
||||||
if (extraPositions != null) {
|
if (extraPositions != null) {
|
||||||
for (BlockPos extraPos : extraPositions) {
|
for (BlockPos extraPos : extraPositions) {
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ public class MapRendererMapInstanceMixin {
|
||||||
|
|
||||||
@Group(name = "custom_decoration_rendering", min = 1, max = 1)
|
@Group(name = "custom_decoration_rendering", min = 1, max = 1)
|
||||||
@Inject(method = "draw(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ZI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/saveddata/maps/MapDecoration;render(I)Z", remap = false), locals = LocalCapture.CAPTURE_FAILHARD)
|
@Inject(method = "draw(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ZI)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/saveddata/maps/MapDecoration;render(I)Z", remap = false), locals = LocalCapture.CAPTURE_FAILHARD)
|
||||||
private void onDraw(PoseStack poseStack, MultiBufferSource bufferSource, boolean active, int packedLight, CallbackInfo ci, int i, int j, float f, Matrix4f matrix4f, VertexConsumer vertexConsumer, int index, Iterator<MapDecoration> iterator, MapDecoration decoration) {
|
private void create$onDraw(PoseStack poseStack, MultiBufferSource bufferSource, boolean active, int packedLight, CallbackInfo ci, int i, int j, float f, Matrix4f matrix4f, VertexConsumer vertexConsumer, int index, Iterator<MapDecoration> iterator, MapDecoration decoration) {
|
||||||
if (decoration instanceof CustomRenderedMapDecoration renderer) {
|
if (decoration instanceof CustomRenderedMapDecoration renderer) {
|
||||||
renderer.render(poseStack, bufferSource, active, packedLight, data, index);
|
renderer.render(poseStack, bufferSource, active, packedLight, data, index);
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ public class MapRendererMapInstanceMixin {
|
||||||
|
|
||||||
@Group(name = "custom_decoration_rendering")
|
@Group(name = "custom_decoration_rendering")
|
||||||
@Inject(method = "draw(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ZI)V", at = @At(value = "FIELD", target = "net/optifine/reflect/Reflector.ForgeMapDecoration_render:Lnet/optifine/reflect/ReflectorMethod;", opcode = Opcodes.GETSTATIC, ordinal = 1, remap = false), locals = LocalCapture.CAPTURE_FAILHARD)
|
@Inject(method = "draw(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ZI)V", at = @At(value = "FIELD", target = "net/optifine/reflect/Reflector.ForgeMapDecoration_render:Lnet/optifine/reflect/ReflectorMethod;", opcode = Opcodes.GETSTATIC, ordinal = 1, remap = false), locals = LocalCapture.CAPTURE_FAILHARD)
|
||||||
private void onDrawOptifine(PoseStack poseStack, MultiBufferSource bufferSource, boolean active, int packedLight, CallbackInfo ci, int i, int j, float f, Matrix4f matrix4f, VertexConsumer vertexConsumer, int index, Iterator<MapDecoration> iterator, MapDecoration decoration) {
|
private void create$onDrawOptifine(PoseStack poseStack, MultiBufferSource bufferSource, boolean active, int packedLight, CallbackInfo ci, int i, int j, float f, Matrix4f matrix4f, VertexConsumer vertexConsumer, int index, Iterator<MapDecoration> iterator, MapDecoration decoration) {
|
||||||
if (decoration instanceof CustomRenderedMapDecoration renderer) {
|
if (decoration instanceof CustomRenderedMapDecoration renderer) {
|
||||||
renderer.render(poseStack, bufferSource, active, packedLight, data, index);
|
renderer.render(poseStack, bufferSource, active, packedLight, data, index);
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -17,20 +17,18 @@ import net.minecraftforge.client.model.ModelDataManager;
|
||||||
@OnlyIn(Dist.CLIENT)
|
@OnlyIn(Dist.CLIENT)
|
||||||
@Mixin(ModelDataManager.class)
|
@Mixin(ModelDataManager.class)
|
||||||
public class ModelDataRefreshMixin {
|
public class ModelDataRefreshMixin {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normally ModelDataManager will throw an exception if a block entity tries
|
* Normally ModelDataManager will throw an exception if a block entity tries
|
||||||
* to refresh its model data from a world the client isn't currently in,
|
* to refresh its model data from a world the client isn't currently in,
|
||||||
* but we need that to not happen for block entities in fake schematic
|
* but we need that to not happen for block entities in fake schematic
|
||||||
* worlds, so in those cases just do nothing instead.
|
* worlds, so in those cases just do nothing instead.
|
||||||
*/
|
*/
|
||||||
@Inject(at = @At("HEAD"), method = "requestModelDataRefresh", cancellable = true, remap = false)
|
@Inject(method = "requestModelDataRefresh", at = @At("HEAD"), cancellable = true, remap = false)
|
||||||
private static void requestModelDataRefresh(BlockEntity be, CallbackInfo ci) {
|
private static void create$requestModelDataRefresh(BlockEntity be, CallbackInfo ci) {
|
||||||
if (be != null) {
|
if (be != null) {
|
||||||
Level world = be.getLevel();
|
Level world = be.getLevel();
|
||||||
if (world != Minecraft.getInstance().level && world instanceof SchematicWorld)
|
if (world != Minecraft.getInstance().level && world instanceof SchematicWorld)
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -17,7 +17,7 @@ import net.minecraft.world.item.ItemStack;
|
||||||
@Mixin(PlayerRenderer.class)
|
@Mixin(PlayerRenderer.class)
|
||||||
public class PlayerRendererMixin {
|
public class PlayerRendererMixin {
|
||||||
@Inject(method = "getArmPose(Lnet/minecraft/client/player/AbstractClientPlayer;Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/client/model/HumanoidModel$ArmPose;", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/player/AbstractClientPlayer;getItemInHand(Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/item/ItemStack;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
|
@Inject(method = "getArmPose(Lnet/minecraft/client/player/AbstractClientPlayer;Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/client/model/HumanoidModel$ArmPose;", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/player/AbstractClientPlayer;getItemInHand(Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/item/ItemStack;"), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true)
|
||||||
private static void onGetArmPose(AbstractClientPlayer player, InteractionHand hand, CallbackInfoReturnable<ArmPose> cir, ItemStack stack) {
|
private static void create$onGetArmPose(AbstractClientPlayer player, InteractionHand hand, CallbackInfoReturnable<ArmPose> cir, ItemStack stack) {
|
||||||
if (stack.getItem() instanceof CustomArmPoseItem armPoseProvider) {
|
if (stack.getItem() instanceof CustomArmPoseItem armPoseProvider) {
|
||||||
ArmPose pose = armPoseProvider.getArmPose(stack, player, hand);
|
ArmPose pose = armPoseProvider.getArmPose(stack, player, hand);
|
||||||
if (pose != null) {
|
if (pose != null) {
|
|
@ -1,4 +1,4 @@
|
||||||
package com.simibubi.create.foundation.mixin;
|
package com.simibubi.create.foundation.mixin.client;
|
||||||
|
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
@ -11,18 +11,15 @@ import com.mojang.blaze3d.platform.Window;
|
||||||
import com.simibubi.create.foundation.gui.UIRenderHelper;
|
import com.simibubi.create.foundation.gui.UIRenderHelper;
|
||||||
|
|
||||||
import net.minecraft.client.Minecraft;
|
import net.minecraft.client.Minecraft;
|
||||||
import net.minecraftforge.api.distmarker.Dist;
|
|
||||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
||||||
|
|
||||||
@OnlyIn(Dist.CLIENT)
|
|
||||||
@Mixin(Minecraft.class)
|
@Mixin(Minecraft.class)
|
||||||
public class WindowResizeMixin {
|
public class WindowResizeMixin {
|
||||||
|
@Shadow
|
||||||
|
@Final
|
||||||
|
private Window window;
|
||||||
|
|
||||||
@Shadow @Final private Window window;
|
@Inject(method = "resizeDisplay()V", at = @At("TAIL"))
|
||||||
|
private void create$updateWindowSize(CallbackInfo ci) {
|
||||||
@Inject(at = @At("TAIL"), method = "resizeDisplay")
|
|
||||||
private void updateWindowSize(CallbackInfo ci) {
|
|
||||||
UIRenderHelper.updateWindowSize(window);
|
UIRenderHelper.updateWindowSize(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -38,7 +38,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra
|
||||||
import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket;
|
import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket;
|
||||||
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.ConfigureSequencedGearshiftPacket;
|
import com.simibubi.create.content.contraptions.relays.advanced.sequencer.ConfigureSequencedGearshiftPacket;
|
||||||
import com.simibubi.create.content.contraptions.relays.gauge.GaugeObservedPacket;
|
import com.simibubi.create.content.contraptions.relays.gauge.GaugeObservedPacket;
|
||||||
import com.simibubi.create.content.curiosities.armor.NetheriteDivingHandler;
|
|
||||||
import com.simibubi.create.content.curiosities.bell.SoulPulseEffectPacket;
|
import com.simibubi.create.content.curiosities.bell.SoulPulseEffectPacket;
|
||||||
import com.simibubi.create.content.curiosities.clipboard.ClipboardEditPacket;
|
import com.simibubi.create.content.curiosities.clipboard.ClipboardEditPacket;
|
||||||
import com.simibubi.create.content.curiosities.symmetry.ConfigureSymmetryWandPacket;
|
import com.simibubi.create.content.curiosities.symmetry.ConfigureSymmetryWandPacket;
|
||||||
|
@ -200,15 +199,13 @@ public enum AllPackets {
|
||||||
TRACK_GRAPH_ROLL_CALL(TrackGraphRollCallPacket.class, TrackGraphRollCallPacket::new, PLAY_TO_CLIENT),
|
TRACK_GRAPH_ROLL_CALL(TrackGraphRollCallPacket.class, TrackGraphRollCallPacket::new, PLAY_TO_CLIENT),
|
||||||
UPDATE_ELEVATOR_FLOORS(ElevatorFloorListPacket.class, ElevatorFloorListPacket::new, PLAY_TO_CLIENT),
|
UPDATE_ELEVATOR_FLOORS(ElevatorFloorListPacket.class, ElevatorFloorListPacket::new, PLAY_TO_CLIENT),
|
||||||
CONTRAPTION_ACTOR_TOGGLE(ContraptionDisableActorPacket.class, ContraptionDisableActorPacket::new, PLAY_TO_CLIENT),
|
CONTRAPTION_ACTOR_TOGGLE(ContraptionDisableActorPacket.class, ContraptionDisableActorPacket::new, PLAY_TO_CLIENT),
|
||||||
SET_FIRE_IMMUNE(NetheriteDivingHandler.SetFireImmunePacket.class, NetheriteDivingHandler.SetFireImmunePacket::new,
|
|
||||||
PLAY_TO_CLIENT),
|
|
||||||
CONTRAPTION_COLLIDER_LOCK(ContraptionColliderLockPacket.class, ContraptionColliderLockPacket::new, PLAY_TO_CLIENT),
|
CONTRAPTION_COLLIDER_LOCK(ContraptionColliderLockPacket.class, ContraptionColliderLockPacket::new, PLAY_TO_CLIENT),
|
||||||
ATTACHED_COMPUTER(AttachedComputerPacket.class, AttachedComputerPacket::new, PLAY_TO_CLIENT),
|
ATTACHED_COMPUTER(AttachedComputerPacket.class, AttachedComputerPacket::new, PLAY_TO_CLIENT),
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
public static final ResourceLocation CHANNEL_NAME = Create.asResource("main");
|
public static final ResourceLocation CHANNEL_NAME = Create.asResource("main");
|
||||||
public static final int NETWORK_VERSION = 2;
|
public static final int NETWORK_VERSION = 3;
|
||||||
public static final String NETWORK_VERSION_STR = String.valueOf(NETWORK_VERSION);
|
public static final String NETWORK_VERSION_STR = String.valueOf(NETWORK_VERSION);
|
||||||
private static SimpleChannel channel;
|
private static SimpleChannel channel;
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
"WaterWheelFluidSpreadMixin",
|
"WaterWheelFluidSpreadMixin",
|
||||||
"CustomItemUseEffectsMixin",
|
"CustomItemUseEffectsMixin",
|
||||||
"EnchantmentHelperMixin",
|
"EnchantmentHelperMixin",
|
||||||
"EnchantmentMixin",
|
|
||||||
"EntityMixin",
|
"EntityMixin",
|
||||||
"LavaSwimmingMixin",
|
"LavaSwimmingMixin",
|
||||||
"MainMixin",
|
"MainMixin",
|
||||||
|
@ -25,18 +24,18 @@
|
||||||
"accessor.ServerLevelAccessor"
|
"accessor.ServerLevelAccessor"
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
"BlockDestructionProgressMixin",
|
"client.BlockDestructionProgressMixin",
|
||||||
"CameraMixin",
|
"client.CameraMixin",
|
||||||
"EntityContraptionInteractionMixin",
|
"client.EntityContraptionInteractionMixin",
|
||||||
"FixNormalScalingMixin",
|
"client.FixNormalScalingMixin",
|
||||||
"GameRendererMixin",
|
"client.GameRendererMixin",
|
||||||
"HeavyBootsOnPlayerMixin",
|
"client.HeavyBootsOnPlayerMixin",
|
||||||
"HumanoidArmorLayerMixin",
|
"client.HumanoidArmorLayerMixin",
|
||||||
"LevelRendererMixin",
|
"client.LevelRendererMixin",
|
||||||
"MapRendererMapInstanceMixin",
|
"client.MapRendererMapInstanceMixin",
|
||||||
"ModelDataRefreshMixin",
|
"client.ModelDataRefreshMixin",
|
||||||
"PlayerRendererMixin",
|
"client.PlayerRendererMixin",
|
||||||
"WindowResizeMixin",
|
"client.WindowResizeMixin",
|
||||||
"accessor.AgeableListModelAccessor",
|
"accessor.AgeableListModelAccessor",
|
||||||
"accessor.GameRendererAccessor",
|
"accessor.GameRendererAccessor",
|
||||||
"accessor.HumanoidArmorLayerAccessor",
|
"accessor.HumanoidArmorLayerAccessor",
|
||||||
|
|
Loading…
Reference in a new issue