wahoo! at least get forg working

This commit is contained in:
petrak@ 2023-05-10 13:52:09 -05:00
parent 5f4360e197
commit 2ccede6a5e
5 changed files with 93 additions and 32 deletions

View file

@ -0,0 +1,14 @@
package at.petrak.hexcasting.common.items;
import com.google.common.collect.Multimap;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.item.ItemStack;
/**
* Why don't we just use the same API mod on Forge and Fabric? Beats me. botania does it like this.
* I feel like botnia probably does it this way becase it's older than xplat curios
*/
public interface HexBaubleItem {
Multimap<Attribute, AttributeModifier> getHexBaubleAttrs(ItemStack stack);
}

View file

@ -21,8 +21,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class ItemLens extends Item implements Wearable {
public class ItemLens extends Item implements Wearable, HexBaubleItem {
// The 0.1 is *additive*
@ -55,6 +54,14 @@ public class ItemLens extends Item implements Wearable {
return out;
}
@Override
public Multimap<Attribute, AttributeModifier> getHexBaubleAttrs(ItemStack stack) {
HashMultimap<Attribute, AttributeModifier> out = HashMultimap.create();
out.put(HexAttributes.GRID_ZOOM, GRID_ZOOM);
out.put(HexAttributes.SCRY_SIGHT, SCRY_SIGHT);
return out;
}
// In fabric impled with extension property?
@Nullable
@SoftImplement("forge")

View file

@ -1,9 +1,8 @@
package at.petrak.hexcasting.fabric.interop.trinkets;
import at.petrak.hexcasting.api.misc.DiscoveryHandlers;
import at.petrak.hexcasting.common.items.ItemLens;
import at.petrak.hexcasting.common.items.HexBaubleItem;
import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker;
import at.petrak.hexcasting.common.lib.HexAttributes;
import at.petrak.hexcasting.common.lib.HexItems;
import com.google.common.collect.Multimap;
import dev.emi.trinkets.api.SlotReference;
@ -13,6 +12,7 @@ import dev.emi.trinkets.api.TrinketsApi;
import dev.emi.trinkets.api.client.TrinketRendererRegistry;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.core.Registry;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
@ -23,17 +23,21 @@ import java.util.UUID;
public class TrinketsApiInterop {
public static void init() {
TrinketsApi.registerTrinket(HexItems.SCRYING_LENS, new Trinket() {
@Override
public Multimap<Attribute, AttributeModifier> getModifiers(ItemStack stack, SlotReference slot,
LivingEntity entity, UUID uuid) {
var map = Trinket.super.getModifiers(stack, slot, entity, uuid);
map.put(HexAttributes.GRID_ZOOM, ItemLens.GRID_ZOOM);
map.put(HexAttributes.SCRY_SIGHT, ItemLens.SCRY_SIGHT);
return map;
Registry.ITEM.stream().forEach(item -> {
if (item instanceof HexBaubleItem bauble) {
TrinketsApi.registerTrinket(item, new Trinket() {
@Override
public Multimap<Attribute, AttributeModifier> getModifiers(ItemStack stack, SlotReference slot,
LivingEntity entity, UUID uuid) {
var map = Trinket.super.getModifiers(stack, slot, entity, uuid);
map.putAll(bauble.getHexBaubleAttrs(stack));
return map;
}
});
}
});
DiscoveryHandlers.addDebugItemDiscoverer((player, type) -> {
Optional<TrinketComponent> optional = TrinketsApi.getTrinketComponent(player);
if (optional.isPresent()) {

View file

@ -10,9 +10,13 @@ import at.petrak.hexcasting.api.item.MediaHolderItem;
import at.petrak.hexcasting.api.misc.MediaConstants;
import at.petrak.hexcasting.api.mod.HexConfig;
import at.petrak.hexcasting.common.entities.EntityWallScroll;
import at.petrak.hexcasting.common.items.HexBaubleItem;
import at.petrak.hexcasting.common.lib.HexBlocks;
import at.petrak.hexcasting.common.lib.HexItems;
import at.petrak.hexcasting.forge.cap.adimpl.*;
import at.petrak.hexcasting.forge.interop.curios.CuriosApiInterop;
import at.petrak.hexcasting.interop.HexInterop;
import at.petrak.hexcasting.xplat.IXplatAbstractions;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
@ -61,6 +65,7 @@ public class ForgeCapabilityHandler {
* Items that work as pigments.
*/
public static final ResourceLocation PIGMENT_CAP = modLoc("pigment");
public static final ResourceLocation CURIO_CAP = modLoc("curio");
private static final ResourceLocation IMPETUS_HANDLER = modLoc("impetus_items");
@ -113,6 +118,11 @@ public class ForgeCapabilityHandler {
evt.addCapability(PIGMENT_CAP,
provide(stack, HexCapabilities.COLOR, () -> new CapItemColorizer(colorizer, stack)));
}
if (IXplatAbstractions.INSTANCE.isModPresent(HexInterop.Forge.CURIOS_API_ID)
&& stack.getItem() instanceof HexBaubleItem) {
evt.addCapability(CURIO_CAP, CuriosApiInterop.curioCap(stack));
}
}
public static void attachEntityCaps(AttachCapabilitiesEvent<Entity> evt) {
@ -153,7 +163,7 @@ public class ForgeCapabilityHandler {
return provide(be::isRemoved, capability, supplier);
}
private static <CAP> SimpleProvider<CAP> provide(ItemStack stack, Capability<CAP> capability,
public static <CAP> SimpleProvider<CAP> provide(ItemStack stack, Capability<CAP> capability,
NonNullSupplier<CAP> supplier) {
return provide(stack::isEmpty, capability, supplier);
}
@ -163,9 +173,14 @@ public class ForgeCapabilityHandler {
return new SimpleProvider<>(invalidated, capability, LazyOptional.of(supplier));
}
private record SimpleProvider<CAP>(BooleanSupplier invalidated,
Capability<CAP> capability,
LazyOptional<CAP> instance) implements ICapabilityProvider {
public static <T, U extends T> ICapabilityProvider makeProvider(Capability<T> cap, U instance) {
LazyOptional<T> lazyInstanceButNotReally = LazyOptional.of(() -> instance);
return new SimpleProvider<>(() -> false, cap, lazyInstanceButNotReally);
}
public record SimpleProvider<CAP>(BooleanSupplier invalidated,
Capability<CAP> capability,
LazyOptional<CAP> instance) implements ICapabilityProvider {
@NotNull
@Override

View file

@ -1,34 +1,60 @@
package at.petrak.hexcasting.forge.interop.curios;
import at.petrak.hexcasting.api.misc.DiscoveryHandlers;
import at.petrak.hexcasting.common.items.ItemLens;
import at.petrak.hexcasting.common.items.HexBaubleItem;
import at.petrak.hexcasting.common.items.magic.ItemCreativeUnlocker;
import at.petrak.hexcasting.common.lib.HexAttributes;
import at.petrak.hexcasting.common.lib.HexItems;
import at.petrak.hexcasting.forge.cap.ForgeCapabilityHandler;
import at.petrak.hexcasting.interop.HexInterop;
import com.google.common.collect.Multimap;
import net.minecraft.world.entity.ai.attributes.Attribute;
import net.minecraft.world.entity.ai.attributes.AttributeModifier;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.fml.InterModComms;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import top.theillusivec4.curios.api.CuriosApi;
import top.theillusivec4.curios.api.CuriosCapability;
import top.theillusivec4.curios.api.SlotContext;
import top.theillusivec4.curios.api.SlotTypeMessage;
import top.theillusivec4.curios.api.SlotTypePreset;
import top.theillusivec4.curios.api.type.capability.ICurio;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
public class CuriosApiInterop {
static class Wrapper implements ICurio {
private final ItemStack stack;
private final HexBaubleItem bauble;
Wrapper(ItemStack stack) {
this.stack = stack;
if (stack.getItem() instanceof HexBaubleItem bauble) {
this.bauble = bauble;
} else {
throw new IllegalArgumentException("Item stack " + stack + " wasn't a bauble item weewoo");
}
}
@Override
public ItemStack getStack() {
return stack;
}
@Override
public Multimap<Attribute, AttributeModifier> getAttributeModifiers(SlotContext slotContext, UUID uuid) {
var map = ICurio.super.getAttributeModifiers(slotContext, uuid);
map.putAll(this.bauble.getHexBaubleAttrs(this.stack));
return map;
}
}
public static ICapabilityProvider curioCap(ItemStack stack) {
return ForgeCapabilityHandler.makeProvider(CuriosCapability.ITEM, new Wrapper(stack));
}
public static void init() {
addAttr(HexItems.SCRYING_LENS, SlotTypePreset.HEAD.getIdentifier(),
HexAttributes.GRID_ZOOM, ItemLens.GRID_ZOOM);
addAttr(HexItems.SCRYING_LENS, SlotTypePreset.HEAD.getIdentifier(),
HexAttributes.SCRY_SIGHT, ItemLens.SCRY_SIGHT);
DiscoveryHandlers.addDebugItemDiscoverer((player, type) -> {
AtomicReference<ItemStack> result = new AtomicReference<>(ItemStack.EMPTY);
player.getCapability(CuriosCapability.INVENTORY).ifPresent(handler -> {
@ -55,9 +81,4 @@ public class CuriosApiInterop {
public static void onClientSetup(final FMLClientSetupEvent event) {
CuriosRenderers.register();
}
private static void addAttr(Item item, String slot, Attribute attr, AttributeModifier mod) {
CuriosApi.getCuriosHelper().addModifier(new ItemStack(item), attr,
mod.getName(), mod.getId(), mod.getAmount(), mod.getOperation(), slot);
}
}