Skip to content

Commit

Permalink
Fix item components crashing in various ways
Browse files Browse the repository at this point in the history
  • Loading branch information
Pyrofab committed Oct 16, 2020
1 parent b872ae3 commit 0a557c1
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,11 @@
package dev.onyxstudios.cca.mixin.item.common;

import dev.onyxstudios.cca.api.v3.component.ComponentContainer;
import dev.onyxstudios.cca.internal.base.DynamicContainerFactory;
import dev.onyxstudios.cca.internal.item.CardinalItemInternals;
import dev.onyxstudios.cca.internal.item.ItemCaller;
import dev.onyxstudios.cca.internal.item.ItemComponentContainerFactory;
import nerdhub.cardinal.components.api.event.ItemComponentCallback;
import nerdhub.cardinal.components.api.event.ItemComponentCallbackV2;
import net.fabricmc.fabric.api.event.Event;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
Expand All @@ -35,21 +36,27 @@

@Mixin(Item.class)
public abstract class MixinItem implements ItemCaller {
@Unique private final Event<ItemComponentCallback> cardinal_componentsEvent = CardinalItemInternals.createItemComponentsEvent();
@Unique private DynamicContainerFactory<ItemStack> cardinal_containerFactory;
@Unique private final Event<ItemComponentCallbackV2> cardinal_componentsEventV2 = CardinalItemInternals.createItemComponentsEventV2();
@Unique private final Event<ItemComponentCallback> cardinal_componentsEvent = CardinalItemInternals.createItemComponentsEvent(this.cardinal_componentsEventV2);
@Unique private ItemComponentContainerFactory cardinal_containerFactory;

@Override
public Event<ItemComponentCallback> cardinal_getItemComponentEvent() {
return this.cardinal_componentsEvent;
}

@Override
public Event<ItemComponentCallbackV2> cardinal_getItemComponentEventV2() {
return this.cardinal_componentsEventV2;
}

@Override
public ComponentContainer cardinal_createComponents(ItemStack stack) {
//noinspection ConstantConditions
assert stack.getItem() == (ItemCaller) this;
if (this.cardinal_containerFactory == null) {
this.cardinal_containerFactory = CardinalItemInternals.createItemStackContainerFactory((Item) (Object) this);
}
return this.cardinal_containerFactory.create(stack);
return this.cardinal_containerFactory.create((Item) (Object) this, stack);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import org.jetbrains.annotations.Nullable;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
Expand Down Expand Up @@ -94,7 +93,7 @@ private void serialize(CompoundTag tag, CallbackInfoReturnable<CompoundTag> cir)

@Shadow public abstract void removeSubTag(String key);

@Inject(method = "<init>(Lnet/minecraft/nbt/CompoundTag;)V", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/item/ItemStack;count:I", shift = At.Shift.AFTER))
@Inject(method = "<init>(Lnet/minecraft/nbt/CompoundTag;)V", at = @At("RETURN"))
private void initComponentsNBT(CompoundTag tag, CallbackInfo ci) {
// Keep data without deserializing
Tag componentData = tag.get(AbstractComponentContainer.NBT_KEY);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
import nerdhub.cardinal.components.api.ComponentRegistry;
import nerdhub.cardinal.components.api.ComponentType;
import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
Expand All @@ -38,6 +40,7 @@
import java.util.List;

public final class TestStaticComponentInitializer implements StaticComponentInitializer {
public static final Logger LOGGER = LogManager.getLogger("Component Test Bootstrap");

// note: the actual ComponentKey must not be registered in this class' <clinit>, to avoid circular initialization
public static final Identifier ALT_VITA_ID = new Identifier("componenttest", "alt-vita");
Expand All @@ -53,13 +56,13 @@ public Collection<Identifier> getSupportedComponentKeys() {

@Override
public void finalizeStaticBootstrap() {
CardinalComponentsTest.LOGGER.info("CCA Bootstrap complete!");
LOGGER.info("CCA Bootstrap complete!");
ComponentType<Vita> altVita = ComponentRegistry.INSTANCE.registerIfAbsent(ALT_VITA_ID, Vita.class);
CardinalComponentsTest.TestCallback.EVENT.register((uuid, p, components) -> components.put(altVita, new BaseVita()));
ComponentContainer.Factory.Builder<@Nullable Void> builder = ComponentContainer.Factory.builder(Void.class);
for (int i = 127; i >= 0; i--) {
builder.component(ComponentRegistryV3.INSTANCE.getOrCreate(new Identifier("-.-", "-random/test." + i), Vita.class), v -> new BaseVita());
}
CardinalComponentsTest.LOGGER.info(builder.build().createContainer(null));
LOGGER.info(builder.build().createContainer(null));
}
}

0 comments on commit 0a557c1

Please sign in to comment.