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:
Talia-12 2023-06-02 15:00:38 +10:00
parent 0f78ac17a1
commit 31b7577605
12 changed files with 145 additions and 12 deletions

View file

@ -0,0 +1,9 @@
package at.petrak.hexcasting.api.addldata;
public interface ADVariantItem {
int numVariants();
int getVariant();
void setVariant(int variant);
}

View file

@ -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()
}
}
}

View file

@ -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,

View file

@ -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);

View file

@ -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",

View file

@ -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,

View file

@ -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);
}
}
}

View file

@ -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);

View file

@ -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,

View file

@ -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<>() {
});
}

View file

@ -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);
}
}

View file

@ -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();