added a pattern to cycle the offhand item's variant, haven't documented it since I'm not sure if it should be a temp-dev thing or the actual way of making variants.
This commit is contained in:
parent
0f78ac17a1
commit
31b7577605
|
@ -0,0 +1,9 @@
|
|||
package at.petrak.hexcasting.api.addldata;
|
||||
|
||||
public interface ADVariantItem {
|
||||
int numVariants();
|
||||
int getVariant();
|
||||
|
||||
|
||||
void setVariant(int variant);
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
package at.petrak.hexcasting.common.casting.actions.spells
|
||||
|
||||
import at.petrak.hexcasting.api.addldata.ADVariantItem
|
||||
import at.petrak.hexcasting.api.casting.RenderedSpell
|
||||
import at.petrak.hexcasting.api.casting.castables.SpellAction
|
||||
import at.petrak.hexcasting.api.casting.eval.CastingEnvironment
|
||||
import at.petrak.hexcasting.api.casting.iota.Iota
|
||||
import at.petrak.hexcasting.api.casting.mishaps.MishapBadOffhandItem
|
||||
import at.petrak.hexcasting.xplat.IXplatAbstractions
|
||||
import net.minecraft.world.item.ItemStack
|
||||
|
||||
object OpCycleVariant : SpellAction {
|
||||
override val argc = 0
|
||||
|
||||
override fun execute(args: List<Iota>, ctx: CastingEnvironment): SpellAction.Result {
|
||||
val (handStack, hand) = ctx.getHeldItemToOperateOn {
|
||||
IXplatAbstractions.INSTANCE.findVariantHolder(it) != null
|
||||
} ?: throw MishapBadOffhandItem.of(ItemStack.EMPTY.copy(), null, "variant") // TODO: hack
|
||||
|
||||
val variantHolder = IXplatAbstractions.INSTANCE.findVariantHolder(handStack)
|
||||
?: throw MishapBadOffhandItem.of(handStack, hand, "variant")
|
||||
|
||||
return SpellAction.Result(
|
||||
Spell(variantHolder),
|
||||
0,
|
||||
listOf()
|
||||
)
|
||||
}
|
||||
|
||||
private data class Spell(val variantHolder: ADVariantItem) : RenderedSpell {
|
||||
override fun cast(ctx: CastingEnvironment) {
|
||||
variantHolder.variant = (variantHolder.variant + 1) % variantHolder.numVariants()
|
||||
}
|
||||
}
|
||||
}
|
|
@ -222,6 +222,8 @@ public class HexActions {
|
|||
new ActionRegistryEntry(HexPattern.fromAngles("eeeeede", HexDir.SOUTH_WEST), OpPlaceBlock.INSTANCE));
|
||||
public static final ActionRegistryEntry COLORIZE = make("colorize",
|
||||
new ActionRegistryEntry(HexPattern.fromAngles("awddwqawqwawq", HexDir.EAST), OpColorize.INSTANCE));
|
||||
public static final ActionRegistryEntry CYCLE_VARIANT = make("cycle_variant",
|
||||
new ActionRegistryEntry(HexPattern.fromAngles("dwaawedwewdwe", HexDir.WEST), OpCycleVariant.INSTANCE));
|
||||
public static final ActionRegistryEntry CREATE_WATER = make("create_water",
|
||||
new ActionRegistryEntry(HexPattern.fromAngles("aqawqadaq", HexDir.SOUTH_EAST), new OpCreateFluid(
|
||||
MediaConstants.DUST_UNIT,
|
||||
|
|
|
@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.HexAPI;
|
|||
import at.petrak.hexcasting.api.addldata.ADHexHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADIotaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADMediaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADVariantItem;
|
||||
import at.petrak.hexcasting.api.casting.ActionRegistryEntry;
|
||||
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
||||
import at.petrak.hexcasting.api.casting.castables.SpecialHandler;
|
||||
|
@ -121,6 +122,8 @@ public interface IXplatAbstractions {
|
|||
@Nullable
|
||||
ADHexHolder findHexHolder(ItemStack stack);
|
||||
|
||||
@Nullable ADVariantItem findVariantHolder(ItemStack stack);
|
||||
|
||||
// coooollooorrrs
|
||||
|
||||
boolean isColorizer(ItemStack stack);
|
||||
|
|
|
@ -686,6 +686,7 @@
|
|||
"bottle": "a glass bottle",
|
||||
"rechargable": "a rechargable item",
|
||||
"colorizer": "a pigment",
|
||||
"variant": "an item with variants"
|
||||
},
|
||||
bad_block: {
|
||||
"": "Expected %s at %s, but got %s",
|
||||
|
|
|
@ -3,10 +3,7 @@ package at.petrak.hexcasting.fabric.cc;
|
|||
import at.petrak.hexcasting.api.addldata.ADMediaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ItemDelegatingEntityIotaHolder;
|
||||
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
||||
import at.petrak.hexcasting.api.item.ColorizerItem;
|
||||
import at.petrak.hexcasting.api.item.HexHolderItem;
|
||||
import at.petrak.hexcasting.api.item.IotaHolderItem;
|
||||
import at.petrak.hexcasting.api.item.MediaHolderItem;
|
||||
import at.petrak.hexcasting.api.item.*;
|
||||
import at.petrak.hexcasting.api.misc.MediaConstants;
|
||||
import at.petrak.hexcasting.api.mod.HexConfig;
|
||||
import at.petrak.hexcasting.common.entities.EntityWallScroll;
|
||||
|
@ -60,6 +57,9 @@ public class HexCardinalComponents implements EntityComponentInitializer, ItemCo
|
|||
public static final ComponentKey<CCHexHolder> HEX_HOLDER = ComponentRegistry.getOrCreate(modLoc("hex_holder"),
|
||||
CCHexHolder.class);
|
||||
|
||||
public static final ComponentKey<CCVariantItem> VARIANT_ITEM = ComponentRegistry.getOrCreate(modLoc("variant_item"),
|
||||
CCVariantItem.class);
|
||||
|
||||
@Override
|
||||
public void registerEntityComponentFactories(EntityComponentFactoryRegistry registry) {
|
||||
registry.registerFor(Mob.class, BRAINSWEPT, CCBrainswept::new);
|
||||
|
@ -108,6 +108,8 @@ public class HexCardinalComponents implements EntityComponentInitializer, ItemCo
|
|||
));
|
||||
|
||||
registry.register(i -> i instanceof HexHolderItem, HEX_HOLDER, CCHexHolder.ItemBased::new);
|
||||
|
||||
registry.register(i -> i instanceof VariantItem, VARIANT_ITEM, CCVariantItem.ItemBased::new);
|
||||
}
|
||||
|
||||
private <E extends Entity> ComponentFactory<E, CCEntityIotaHolder.Wrapper> wrapItemEntityDelegate(Function<E,
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
package at.petrak.hexcasting.fabric.cc.adimpl;
|
||||
|
||||
import at.petrak.hexcasting.api.addldata.ADVariantItem;
|
||||
import at.petrak.hexcasting.api.item.VariantItem;
|
||||
import at.petrak.hexcasting.fabric.cc.HexCardinalComponents;
|
||||
import dev.onyxstudios.cca.api.v3.item.ItemComponent;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
public abstract class CCVariantItem extends ItemComponent implements ADVariantItem {
|
||||
public CCVariantItem(ItemStack stack) {
|
||||
super(stack, HexCardinalComponents.VARIANT_ITEM);
|
||||
}
|
||||
|
||||
public static class ItemBased extends CCVariantItem {
|
||||
private final VariantItem variantItem;
|
||||
|
||||
public ItemBased(ItemStack owner) {
|
||||
super(owner);
|
||||
var item = owner.getItem();
|
||||
if (!(item instanceof VariantItem variantItem)) {
|
||||
throw new IllegalStateException("item is not a colorizer: " + owner);
|
||||
}
|
||||
this.variantItem = variantItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int numVariants() {
|
||||
return variantItem.numVariants();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getVariant() {
|
||||
return variantItem.getVariant(this.stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVariant(int variant) {
|
||||
variantItem.setVariant(this.stack, variant);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.HexAPI;
|
|||
import at.petrak.hexcasting.api.addldata.ADHexHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADIotaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADMediaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADVariantItem;
|
||||
import at.petrak.hexcasting.api.casting.ActionRegistryEntry;
|
||||
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
||||
import at.petrak.hexcasting.api.casting.castables.SpecialHandler;
|
||||
|
@ -259,6 +260,12 @@ public class FabricXplatImpl implements IXplatAbstractions {
|
|||
return cc.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable ADVariantItem findVariantHolder(ItemStack stack) {
|
||||
var cc = HexCardinalComponents.VARIANT_ITEM.maybeGet(stack);
|
||||
return cc.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isColorizer(ItemStack stack) {
|
||||
return HexCardinalComponents.COLORIZER.isProvidedBy(stack);
|
||||
|
|
|
@ -3,10 +3,7 @@ package at.petrak.hexcasting.forge.cap;
|
|||
import at.petrak.hexcasting.api.addldata.*;
|
||||
import at.petrak.hexcasting.api.casting.circles.BlockEntityAbstractImpetus;
|
||||
import at.petrak.hexcasting.api.casting.iota.DoubleIota;
|
||||
import at.petrak.hexcasting.api.item.ColorizerItem;
|
||||
import at.petrak.hexcasting.api.item.HexHolderItem;
|
||||
import at.petrak.hexcasting.api.item.IotaHolderItem;
|
||||
import at.petrak.hexcasting.api.item.MediaHolderItem;
|
||||
import at.petrak.hexcasting.api.item.*;
|
||||
import at.petrak.hexcasting.api.misc.MediaConstants;
|
||||
import at.petrak.hexcasting.api.mod.HexConfig;
|
||||
import at.petrak.hexcasting.common.entities.EntityWallScroll;
|
||||
|
@ -61,6 +58,10 @@ public class ForgeCapabilityHandler {
|
|||
* Items that store a packaged Hex.
|
||||
*/
|
||||
public static final ResourceLocation HEX_HOLDER_CAP = modLoc("hex_item");
|
||||
/**
|
||||
* Items that have multiple visual variants.
|
||||
*/
|
||||
public static final ResourceLocation VARIANT_ITEM_CAP = modLoc("variant_item");
|
||||
/**
|
||||
* Items that work as pigments.
|
||||
*/
|
||||
|
@ -118,6 +119,10 @@ public class ForgeCapabilityHandler {
|
|||
evt.addCapability(HEX_HOLDER_CAP,
|
||||
provide(stack, HexCapabilities.STORED_HEX, () -> new CapItemHexHolder(holder, stack)));
|
||||
}
|
||||
if (stack.getItem() instanceof VariantItem variantItem) {
|
||||
evt.addCapability(VARIANT_ITEM_CAP,
|
||||
provide(stack, HexCapabilities.VARIANT_ITEM, () -> new CapItemVariantItem(variantItem, stack)));
|
||||
}
|
||||
|
||||
if (stack.getItem() instanceof ColorizerItem colorizer) {
|
||||
evt.addCapability(PIGMENT_CAP,
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
package at.petrak.hexcasting.forge.cap;
|
||||
|
||||
import at.petrak.hexcasting.api.addldata.ADColorizer;
|
||||
import at.petrak.hexcasting.api.addldata.ADHexHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADIotaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADMediaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.*;
|
||||
import net.minecraftforge.common.capabilities.Capability;
|
||||
import net.minecraftforge.common.capabilities.CapabilityManager;
|
||||
import net.minecraftforge.common.capabilities.CapabilityToken;
|
||||
|
@ -16,6 +13,8 @@ public final class HexCapabilities {
|
|||
});
|
||||
public static final Capability<ADHexHolder> STORED_HEX = CapabilityManager.get(new CapabilityToken<>() {
|
||||
});
|
||||
public static final Capability<ADVariantItem> VARIANT_ITEM = CapabilityManager.get(new CapabilityToken<>() {
|
||||
});
|
||||
public static final Capability<ADColorizer> COLOR = CapabilityManager.get(new CapabilityToken<>() {
|
||||
});
|
||||
}
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
package at.petrak.hexcasting.forge.cap.adimpl;
|
||||
|
||||
import at.petrak.hexcasting.api.addldata.ADVariantItem;
|
||||
import at.petrak.hexcasting.api.item.VariantItem;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
||||
public record CapItemVariantItem(VariantItem variantItem, ItemStack stack) implements ADVariantItem {
|
||||
@Override
|
||||
public int numVariants() {
|
||||
return variantItem.numVariants();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getVariant() {
|
||||
return variantItem.getVariant(stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setVariant(int variant) {
|
||||
variantItem.setVariant(stack, variant);
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ import at.petrak.hexcasting.api.HexAPI;
|
|||
import at.petrak.hexcasting.api.addldata.ADHexHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADIotaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADMediaHolder;
|
||||
import at.petrak.hexcasting.api.addldata.ADVariantItem;
|
||||
import at.petrak.hexcasting.api.casting.ActionRegistryEntry;
|
||||
import at.petrak.hexcasting.api.casting.arithmetic.Arithmetic;
|
||||
import at.petrak.hexcasting.api.casting.castables.SpecialHandler;
|
||||
|
@ -332,6 +333,12 @@ public class ForgeXplatImpl implements IXplatAbstractions {
|
|||
return maybeCap.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable ADVariantItem findVariantHolder(ItemStack stack) {
|
||||
var maybeCap = stack.getCapability(HexCapabilities.VARIANT_ITEM).resolve();
|
||||
return maybeCap.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isColorizer(ItemStack stack) {
|
||||
return stack.getCapability(HexCapabilities.COLOR).isPresent();
|
||||
|
|
Loading…
Reference in a new issue