wahoo! at least get forg working
This commit is contained in:
parent
5f4360e197
commit
2ccede6a5e
|
@ -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);
|
||||
}
|
|
@ -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")
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue