Skip to content

Commit

Permalink
Use Fabric Data Attachment API for fireproof ItemEntities
Browse files Browse the repository at this point in the history
Fixes Draylar#101

Signed-off-by: unilock <unilock@fennet.rentals>
  • Loading branch information
unilock committed Jun 12, 2024
1 parent 7938242 commit d7b8531
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 25 deletions.
1 change: 1 addition & 0 deletions src/main/java/draylar/gofish/GoFish.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public void onInitialize() {
.displayName(Text.translatable("itemGroup.gofish.group"))
.build());

GoFishAttachments.init();
GoFishBlocks.init();
GoFishItems.init();
GoFishEnchantments.init();
Expand Down
35 changes: 10 additions & 25 deletions src/main/java/draylar/gofish/mixin/ItemEntityFireproofMixin.java
Original file line number Diff line number Diff line change
@@ -1,43 +1,28 @@
package draylar.gofish.mixin;

import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import draylar.gofish.api.FireproofEntity;
import draylar.gofish.registry.GoFishAttachments;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.data.DataTracker;
import net.minecraft.entity.data.TrackedData;
import net.minecraft.entity.data.TrackedDataHandlerRegistry;
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.CallbackInfoReturnable;

@SuppressWarnings("UnstableApiUsage")
@Mixin(ItemEntity.class)
public abstract class ItemEntityFireproofMixin extends Entity implements FireproofEntity {

@Unique
private static final TrackedData<Boolean> GF_FIRE_IMMUNE = DataTracker.registerData(ItemEntity.class, TrackedDataHandlerRegistry.BOOLEAN);

public ItemEntityFireproofMixin(EntityType<?> type, World world) {
super(type, world);
}

@Inject(
method = "initDataTracker",
at = @At("RETURN"))
private void registerFireImmuneTracker(CallbackInfo ci) {
dataTracker.startTracking(GF_FIRE_IMMUNE, false);
}

@Inject(
@ModifyReturnValue(
method = "isFireImmune",
at = @At("RETURN"),
cancellable = true)
private void isLavaFishingLoot(CallbackInfoReturnable<Boolean> cir) {
cir.setReturnValue(cir.getReturnValue() || dataTracker.get(GF_FIRE_IMMUNE));
at = @At("RETURN")
)
private boolean isLavaFishingLoot(boolean original) {
return original || gf_isFireproof();
}

// todo: inject into super instead
Expand All @@ -52,11 +37,11 @@ public boolean isOnFire() {

@Override
public boolean gf_isFireproof() {
return dataTracker.get(GF_FIRE_IMMUNE);
return Boolean.TRUE.equals(this.getAttached(GoFishAttachments.FIRE_IMMUNE));
}

@Override
public void gf_setFireproof(boolean value) {
dataTracker.set(GF_FIRE_IMMUNE, value);
this.setAttached(GoFishAttachments.FIRE_IMMUNE, value);
}
}
17 changes: 17 additions & 0 deletions src/main/java/draylar/gofish/registry/GoFishAttachments.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package draylar.gofish.registry;

import com.mojang.serialization.Codec;
import draylar.gofish.GoFish;
import net.fabricmc.fabric.api.attachment.v1.AttachmentRegistry;
import net.fabricmc.fabric.api.attachment.v1.AttachmentType;

@SuppressWarnings("UnstableApiUsage")
public class GoFishAttachments {

// Used to represent an Entity that is fireproof, i.e. cannot be destroyed by fire or lava.
public static final AttachmentType<Boolean> FIRE_IMMUNE = AttachmentRegistry.createPersistent(GoFish.id("fire_immune"), Codec.BOOL);

public static void init() {
// NO-OP
}
}

0 comments on commit d7b8531

Please sign in to comment.