From 0e8ef2d817f6fccd845e5c53f9a73c546f28745e Mon Sep 17 00:00:00 2001 From: Kli Kli Date: Sun, 21 Jan 2024 10:11:33 +0100 Subject: [PATCH] feat: new foliot models - thanks @FeellianSinger --- .../gui/storage/StorageControllerGuiBase.java | 19 +- .../client/model/entity/FoliotModel.java | 133 ++++---- .../client/render/entity/FoliotRenderer.java | 19 +- .../ai/behaviour/FellTreeBehaviour.java | 2 +- .../common/entity/spirit/FoliotEntity.java | 41 ++- .../handlers/ClientSetupEventHandler.java | 1 - .../occultism/registry/OccultismEntities.java | 2 +- .../registry/OccultismSpiritJobs.java | 31 +- .../entity/foliot_crusher.animation.json | 245 +++++++++++++++ .../entity/foliot_janitor.animation.json | 214 +++++++++++++ .../entity/foliot_lumberjack.animation.json | 281 +++++++++++++++++ .../entity/foliot_transporter.animation.json | 290 ++++++++++++++++++ .../geo/entity/foliot_crusher.geo.json | 95 ++++++ .../geo/entity/foliot_janitor.geo.json | 115 +++++++ .../geo/entity/foliot_lumberjack.geo.json | 160 ++++++++++ .../geo/entity/foliot_transporter.geo.json | 137 +++++++++ .../textures/entity/foliot_crusher.png | Bin 0 -> 3495 bytes .../textures/entity/foliot_janitor.png | Bin 0 -> 4479 bytes .../textures/entity/foliot_lumberjack.png | Bin 0 -> 4271 bytes .../textures/entity/foliot_transporter.png | Bin 0 -> 4828 bytes 20 files changed, 1678 insertions(+), 107 deletions(-) create mode 100644 src/main/resources/assets/occultism/animations/entity/foliot_crusher.animation.json create mode 100644 src/main/resources/assets/occultism/animations/entity/foliot_janitor.animation.json create mode 100644 src/main/resources/assets/occultism/animations/entity/foliot_lumberjack.animation.json create mode 100644 src/main/resources/assets/occultism/animations/entity/foliot_transporter.animation.json create mode 100644 src/main/resources/assets/occultism/geo/entity/foliot_crusher.geo.json create mode 100644 src/main/resources/assets/occultism/geo/entity/foliot_janitor.geo.json create mode 100644 src/main/resources/assets/occultism/geo/entity/foliot_lumberjack.geo.json create mode 100644 src/main/resources/assets/occultism/geo/entity/foliot_transporter.geo.json create mode 100644 src/main/resources/assets/occultism/textures/entity/foliot_crusher.png create mode 100644 src/main/resources/assets/occultism/textures/entity/foliot_janitor.png create mode 100644 src/main/resources/assets/occultism/textures/entity/foliot_lumberjack.png create mode 100644 src/main/resources/assets/occultism/textures/entity/foliot_transporter.png diff --git a/src/main/java/com/klikli_dev/occultism/client/gui/storage/StorageControllerGuiBase.java b/src/main/java/com/klikli_dev/occultism/client/gui/storage/StorageControllerGuiBase.java index 29d6e6e99..99f8a7f21 100644 --- a/src/main/java/com/klikli_dev/occultism/client/gui/storage/StorageControllerGuiBase.java +++ b/src/main/java/com/klikli_dev/occultism/client/gui/storage/StorageControllerGuiBase.java @@ -97,12 +97,15 @@ public abstract class StorageControllerGuiBase cachedStacksToDisplay; private String cachedSearchString; @@ -537,9 +540,19 @@ public void initButtons() { protected void drawItems(GuiGraphics guiGraphics, float partialTicks, int mouseX, int mouseY) { List stacksToDisplay = this.applySearchToItems(); - this.sortItemStacks(stacksToDisplay); - this.buildPage(stacksToDisplay); - this.buildItemSlots(stacksToDisplay); + + var changedPage = this.previousPage != this.currentPage; + this.previousPage = this.currentPage; + + var changedStacksToDisplay = this.lastCachedStacksToDisplayCount != this.cachedStacksToDisplay.size(); + this.lastCachedStacksToDisplayCount = this.cachedStacksToDisplay.size(); + + if(changedPage || changedStacksToDisplay){ + this.sortItemStacks(stacksToDisplay); + this.buildPage(stacksToDisplay); + this.buildItemSlots(stacksToDisplay); + } + this.drawItemSlots(guiGraphics, mouseX, mouseY); } diff --git a/src/main/java/com/klikli_dev/occultism/client/model/entity/FoliotModel.java b/src/main/java/com/klikli_dev/occultism/client/model/entity/FoliotModel.java index e098baf18..956f4df3d 100644 --- a/src/main/java/com/klikli_dev/occultism/client/model/entity/FoliotModel.java +++ b/src/main/java/com/klikli_dev/occultism/client/model/entity/FoliotModel.java @@ -22,80 +22,79 @@ package com.klikli_dev.occultism.client.model.entity; +import com.klikli_dev.occultism.Occultism; import com.klikli_dev.occultism.common.entity.spirit.FoliotEntity; -import net.minecraft.client.model.HumanoidModel; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.model.geom.builders.*; +import com.klikli_dev.occultism.registry.OccultismSpiritJobs; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.model.DefaultedEntityGeoModel; +import java.util.Objects; -public class FoliotModel extends HumanoidModel { - private final ModelPart leftHorn; - private final ModelPart rightHorn; +public class FoliotModel extends DefaultedEntityGeoModel { - public FoliotModel(ModelPart part) { - super(part); - this.leftHorn = this.head.getChild("left_horn"); - this.rightHorn = this.head.getChild("right_horn"); + public final static String ASSET_SUBPATH = "foliot"; + + public final ModelData crusher; + public final ModelData transporter; + public final ModelData janitor; + public final ModelData lumberjack; + + public FoliotModel() { + super(new ResourceLocation(Occultism.MODID, ASSET_SUBPATH), false); + + this.crusher = this.buildModelData("crusher"); + this.transporter = this.buildModelData("transporter"); + this.janitor = this.buildModelData("janitor"); + this.lumberjack = this.buildModelData("lumberjack"); + } + + public ModelData getModelData(FoliotEntity animatable) { + var job = animatable.getJobID(); + + if (Objects.equals(job, OccultismSpiritJobs.TRANSPORT_ITEMS.getId().toString())) { + return this.transporter; + } + + if (Objects.equals(job, OccultismSpiritJobs.CLEANER.getId().toString())) { + return this.janitor; + } + + if (Objects.equals(job, OccultismSpiritJobs.LUMBERJACK.getId().toString())) { + return this.lumberjack; + } + + return this.crusher; } - public static LayerDefinition createBodyLayer() { - MeshDefinition mesh = new MeshDefinition(); - PartDefinition parts = mesh.getRoot(); - PartDefinition head = parts.addOrReplaceChild("head", CubeListBuilder.create() - .addBox("", -4.0F, -8.0F, -4.0F, 8, 8, 8, CubeDeformation.NONE, 0, 0), - PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0, 0, 0)); - - PartDefinition hat = parts.addOrReplaceChild("hat", CubeListBuilder.create() - .addBox("", -5.0F, -10.0F, -5.0F, 10, 10, 10, CubeDeformation.NONE, 24, 44), - PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0, 0, 0)); - - PartDefinition body = parts.addOrReplaceChild("body", CubeListBuilder.create() - .addBox("", -4.0F, 0.0F, -3.0F, 8, 12, 6, CubeDeformation.NONE, 0, 16), - PartPose.offsetAndRotation(0.0F, 0.0F, 0.0F, 0, 0, 0)); - - PartDefinition rightArm = parts.addOrReplaceChild("right_arm", CubeListBuilder.create() - .addBox("", -1.0F, -1.6816F, -1.2683F, 3, 11, 3, CubeDeformation.NONE, 12, 34), - PartPose.offsetAndRotation(5.0F, 3.0F, -1.0F, -0.75F, 0.0F, 0.0F)); - PartDefinition leftArm = parts.addOrReplaceChild("left_arm", CubeListBuilder.create(). - addBox("", -2.0F, -2.0F, -2.0F, 3, 11, 3, CubeDeformation.NONE, 0, 34), - PartPose.offsetAndRotation(-5.0F, 3.0F, -1.0F, -0.75F, 0.0F, 0.0F)); - PartDefinition rightLeg = parts.addOrReplaceChild("right_leg", CubeListBuilder.create() - .addBox("", -2.0F, 0.0F, -2.0F, 4, 12, 4, CubeDeformation.NONE, 28, 28), - PartPose.offsetAndRotation(2.0F, 12.0F, 0.0F, 0, 0, 0)); - PartDefinition leftLeg = parts.addOrReplaceChild("left_leg", CubeListBuilder.create(). - addBox("", -2.0F, 0.0F, -2.0F, 4, 12, 4, CubeDeformation.NONE, 28, 12), - PartPose.offsetAndRotation(-2.0F, 12.0F, 0.0F, 0, 0, 0)); - - PartDefinition leftHorn = head.addOrReplaceChild("left_horn", CubeListBuilder.create() - .addBox("", 0.5F, -0.5F, -2.5F, 1, 1, 6, CubeDeformation.NONE, 24, 0) - .addBox("", 0.5F, 4.5F, -1.5F, 1, 1, 5, CubeDeformation.NONE, 32, 0) - .addBox("", 0.5F, 5.5F, -0.5F, 1, 1, 3, CubeDeformation.NONE, 0, 0) - .addBox("", 0.5F, 0.5F, 1.5F, 1, 1, 3, CubeDeformation.NONE, 39, 0) - .addBox("", 0.5F, 1.5F, 2.5F, 1, 1, 3, CubeDeformation.NONE, 37, 6) - .addBox("", 0.5F, 2.5F, 2.5F, 1, 1, 3, CubeDeformation.NONE, 32, 7) - .addBox("", 0.5F, 3.5F, 1.5F, 1, 1, 3, CubeDeformation.NONE, 0, 4) - .addBox("", 0.5F, 0.5F, -2.5F, 1, 1, 2, CubeDeformation.NONE, 0, 16) - .addBox("", 0.5F, 3.5F, -1.5F, 1, 1, 1, CubeDeformation.NONE, 22, 20) - .addBox("", 0.5F, 1.5F, -2.5F, 1, 1, 1, CubeDeformation.NONE, 0, 19), - PartPose.offsetAndRotation(3.5F, -8.5F, -1.5F, 0, 0, 0)); - - PartDefinition rightHorn = head.addOrReplaceChild("right_horn", CubeListBuilder.create() - .addBox("", 0.5F, -0.5F, -2.5F, 1, 1, 6, CubeDeformation.NONE, 24, 0) - .addBox("", 0.5F, 4.5F, -1.5F, 1, 1, 5, CubeDeformation.NONE, 32, 0) - .addBox("", 0.5F, 5.5F, -0.5F, 1, 1, 3, CubeDeformation.NONE, 0, 0) - .addBox("", 0.5F, 0.5F, 1.5F, 1, 1, 3, CubeDeformation.NONE, 39, 0) - .addBox("", 0.5F, 1.5F, 2.5F, 1, 1, 3, CubeDeformation.NONE, 37, 6) - .addBox("", 0.5F, 2.5F, 2.5F, 1, 1, 3, CubeDeformation.NONE, 32, 7) - .addBox("", 0.5F, 3.5F, 1.5F, 1, 1, 3, CubeDeformation.NONE, 0, 4) - .addBox("", 0.5F, 0.5F, -2.5F, 1, 1, 2, CubeDeformation.NONE, 0, 16) - .addBox("", 0.5F, 3.5F, -1.5F, 1, 1, 1, CubeDeformation.NONE, 22, 20) - .addBox("", 0.5F, 1.5F, -2.5F, 1, 1, 1, CubeDeformation.NONE, 0, 19), - PartPose.offsetAndRotation(-5.5F, -8.5F, -1.5F, 0, 0, 0)); - - - return LayerDefinition.create(mesh, 64, 64); + @Override + public ResourceLocation getModelResource(FoliotEntity animatable) { + return this.getModelData(animatable).model(); } + @Override + public ResourceLocation getTextureResource(FoliotEntity animatable) { + return this.getModelData(animatable).texture(); + } + + @Override + public ResourceLocation getAnimationResource(FoliotEntity animatable) { + return this.getModelData(animatable).animation(); + } + + public ModelData buildModelData(String job) { + return this.buildModelData(job, "_"); + } + + public ModelData buildModelData(String job, String separator) { + return new ModelData( + this.buildFormattedModelPath(new ResourceLocation(Occultism.MODID, ASSET_SUBPATH + separator + job)), + this.buildFormattedTexturePath(new ResourceLocation(Occultism.MODID, ASSET_SUBPATH + separator + job)), + this.buildFormattedAnimationPath(new ResourceLocation(Occultism.MODID, ASSET_SUBPATH + separator + job)) + ); + } + + public record ModelData(ResourceLocation model, ResourceLocation texture, ResourceLocation animation) { + } } + diff --git a/src/main/java/com/klikli_dev/occultism/client/render/entity/FoliotRenderer.java b/src/main/java/com/klikli_dev/occultism/client/render/entity/FoliotRenderer.java index 45e3510fc..4264d4a80 100644 --- a/src/main/java/com/klikli_dev/occultism/client/render/entity/FoliotRenderer.java +++ b/src/main/java/com/klikli_dev/occultism/client/render/entity/FoliotRenderer.java @@ -29,25 +29,12 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.renderer.GeoEntityRenderer; -public class FoliotRenderer extends BipedSpiritRenderer { - - private static final ResourceLocation[] TEXTURES = {new ResourceLocation(Occultism.MODID, - "textures/entity/foliot.png")}; +public class FoliotRenderer extends GeoEntityRenderer { public FoliotRenderer(EntityRendererProvider.Context context) { - super(context, new FoliotModel(context.bakeLayer(OccultismModelLayers.FOLIOT)), 0.25f); - } - - @Override - public ResourceLocation getTextureLocation(FoliotEntity entity) { - return TEXTURES[entity.getEntityData().get(entity.getDataParameterSkin())]; - } - - @Override - protected void scale(FoliotEntity entity, PoseStack matrixStackIn, float partialTickTime) { - super.scale(entity, matrixStackIn, partialTickTime); - matrixStackIn.scale(0.6f, 0.6f, 0.6f); + super(context, new FoliotModel()); } } diff --git a/src/main/java/com/klikli_dev/occultism/common/entity/ai/behaviour/FellTreeBehaviour.java b/src/main/java/com/klikli_dev/occultism/common/entity/ai/behaviour/FellTreeBehaviour.java index 824b410c8..ef4e8ae0e 100644 --- a/src/main/java/com/klikli_dev/occultism/common/entity/ai/behaviour/FellTreeBehaviour.java +++ b/src/main/java/com/klikli_dev/occultism/common/entity/ai/behaviour/FellTreeBehaviour.java @@ -59,7 +59,7 @@ protected void tick(E entity) { if (NearestTreeSensor.isLog(entity.level(), treePos)) { BrainUtils.setMemory(entity, MemoryModuleType.LOOK_TARGET, new BlockPosTracker(treePos)); this.breakingTime++; - entity.swing(InteractionHand.MAIN_HAND); + entity.swing(InteractionHand.MAIN_HAND, true); int i = (int) ((float) this.breakingTime / 160.0F * 10.0F); if (this.breakingTime % 10 == 0) { entity.playSound(SoundEvents.WOOD_HIT, 1, 1); diff --git a/src/main/java/com/klikli_dev/occultism/common/entity/spirit/FoliotEntity.java b/src/main/java/com/klikli_dev/occultism/common/entity/spirit/FoliotEntity.java index e825a050a..398910bf1 100644 --- a/src/main/java/com/klikli_dev/occultism/common/entity/spirit/FoliotEntity.java +++ b/src/main/java/com/klikli_dev/occultism/common/entity/spirit/FoliotEntity.java @@ -26,14 +26,24 @@ import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.level.Level; +import software.bernie.geckolib.animatable.GeoEntity; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.core.animation.AnimationController; +import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.core.animation.RawAnimation; +import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.util.GeckoLibUtil; -public class FoliotEntity extends SpiritEntity { +public class FoliotEntity extends SpiritEntity implements GeoEntity { + + AnimatableInstanceCache animatableInstanceCache = GeckoLibUtil.createInstanceCache(this); public FoliotEntity(EntityType type, Level level) { super(type, level); } - //region Static Methods public static AttributeSupplier.Builder createAttributes() { return SpiritEntity.createAttributes() .add(Attributes.ATTACK_DAMAGE, 1.0) @@ -43,5 +53,30 @@ public static AttributeSupplier.Builder createAttributes() { .add(Attributes.ARMOR_TOUGHNESS, 1.0) .add(Attributes.FOLLOW_RANGE, 50.0); } - //endregion Static Methods + + @Override + public int getCurrentSwingDuration() { + return 11; //to match our attack animation speed + 1 tick + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllers) { + var mainController = new AnimationController<>(this, "mainController", 0, this::animPredicate); + controllers.add(mainController); + } + + private PlayState animPredicate(AnimationState tAnimationState) { + + if (this.swinging) { + return tAnimationState.setAndContinue(RawAnimation.begin().thenLoop("attack")); + } + + return tAnimationState.setAndContinue(tAnimationState.isMoving() ? RawAnimation.begin().thenPlay("walk") : RawAnimation.begin().thenPlay("idle")); + } + + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animatableInstanceCache; + } } diff --git a/src/main/java/com/klikli_dev/occultism/handlers/ClientSetupEventHandler.java b/src/main/java/com/klikli_dev/occultism/handlers/ClientSetupEventHandler.java index 826733884..5ff6359b4 100644 --- a/src/main/java/com/klikli_dev/occultism/handlers/ClientSetupEventHandler.java +++ b/src/main/java/com/klikli_dev/occultism/handlers/ClientSetupEventHandler.java @@ -101,7 +101,6 @@ public static void onRegisterEntityRendererLayerDefinitions(EntityRenderersEvent event.registerLayerDefinition(OccultismModelLayers.FAMILIAR_MUMMY, MummyFamiliarModel::createBodyLayer); event.registerLayerDefinition(OccultismModelLayers.FAMILIAR_BEAVER, BeaverFamiliarModel::createBodyLayer); event.registerLayerDefinition(OccultismModelLayers.DJINNI, DjinniModel::createBodyLayer); - event.registerLayerDefinition(OccultismModelLayers.FOLIOT, FoliotModel::createBodyLayer); event.registerLayerDefinition(OccultismModelLayers.MARID, MaridModel::createBodyLayer); event.registerLayerDefinition(OccultismModelLayers.KAPOW, MummyFamiliarRenderer.KapowModel::createBodyLayer); } diff --git a/src/main/java/com/klikli_dev/occultism/registry/OccultismEntities.java b/src/main/java/com/klikli_dev/occultism/registry/OccultismEntities.java index 2ab77b373..74ee073f7 100644 --- a/src/main/java/com/klikli_dev/occultism/registry/OccultismEntities.java +++ b/src/main/java/com/klikli_dev/occultism/registry/OccultismEntities.java @@ -46,7 +46,7 @@ public class OccultismEntities { public static final NonNullLazy> FOLIOT_TYPE = NonNullLazy.of(() -> EntityType.Builder.of(FoliotEntity::new, MobCategory.CREATURE) - .sized(0.6f, 1.1f) + .sized(0.6f, 0.7f) .clientTrackingRange(8) .build(new ResourceLocation(Occultism.MODID, "foliot").toString())); public static final NonNullLazy> DJINNI_TYPE = diff --git a/src/main/java/com/klikli_dev/occultism/registry/OccultismSpiritJobs.java b/src/main/java/com/klikli_dev/occultism/registry/OccultismSpiritJobs.java index 3c55319d6..6d6b3b0eb 100644 --- a/src/main/java/com/klikli_dev/occultism/registry/OccultismSpiritJobs.java +++ b/src/main/java/com/klikli_dev/occultism/registry/OccultismSpiritJobs.java @@ -27,6 +27,7 @@ import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; import java.util.function.Supplier; @@ -39,24 +40,24 @@ public class OccultismSpiritJobs { public static final Registry REGISTRY = JOBS.makeRegistry((builder) -> { }); - public static final Supplier LUMBERJACK = JOBS.register("lumberjack", + public static final DeferredHolder LUMBERJACK = JOBS.register("lumberjack", () -> new SpiritJobFactory(LumberjackJob::new)); - public static final Supplier MANAGE_MACHINE = JOBS.register("manage_machine", + public static final DeferredHolder MANAGE_MACHINE = JOBS.register("manage_machine", () -> new SpiritJobFactory(ManageMachineJob::new)); - public static final Supplier TRANSPORT_ITEMS = JOBS.register("transport_items", + public static final DeferredHolder TRANSPORT_ITEMS = JOBS.register("transport_items", () -> new SpiritJobFactory(TransportItemsJob::new)); - public static final Supplier CLEANER = JOBS.register("cleaner", + public static final DeferredHolder CLEANER = JOBS.register("cleaner", () -> new SpiritJobFactory(CleanerJob::new)); //Trade jobs - public static final Supplier TRADE_OTHERSTONE_T1 = JOBS.register("trade_otherstone_t1", + public static final DeferredHolder TRADE_OTHERSTONE_T1 = JOBS.register("trade_otherstone_t1", () -> new SpiritJobFactory((entity) -> { TraderJob job = new TraderJob(entity, new ResourceLocation(Occultism.MODID, "spirit_trade/stone_to_otherstone")); job.setTimeToConvert(15); job.setMaxTradesPerRound(4); return job; })); - public static final Supplier TRADE_OTHERWORLD_SAPLINGS_T2 = JOBS.register("trade_otherworld_saplings_t1", + public static final DeferredHolder TRADE_OTHERWORLD_SAPLINGS_T2 = JOBS.register("trade_otherworld_saplings_t1", () -> new SpiritJobFactory((entity) -> { TraderJob job = new TraderJob(entity, new ResourceLocation(Occultism.MODID, "spirit_trade/otherworld_sapling")); job.setTimeToConvert(20); @@ -65,25 +66,25 @@ public class OccultismSpiritJobs { })); //Crushing jobs - public static final Supplier CRUSH_TIER1 = JOBS.register("crush_tier1", + public static final DeferredHolder CRUSH_TIER1 = JOBS.register("crush_tier1", () -> new SpiritJobFactory((entity) -> new CrusherJob(entity, () -> Occultism.SERVER_CONFIG.spiritJobs.tier1CrusherTimeMultiplier.get().floatValue(), () -> Occultism.SERVER_CONFIG.spiritJobs.tier1CrusherOutputMultiplier.get().floatValue(), () -> 1 ))); - public static final Supplier CRUSH_TIER2 = JOBS.register("crush_tier2", + public static final DeferredHolder CRUSH_TIER2 = JOBS.register("crush_tier2", () -> new SpiritJobFactory((entity) -> new CrusherJob(entity, () -> Occultism.SERVER_CONFIG.spiritJobs.tier2CrusherTimeMultiplier.get().floatValue(), () -> Occultism.SERVER_CONFIG.spiritJobs.tier2CrusherOutputMultiplier.get().floatValue(), () -> 2 ))); - public static final Supplier CRUSH_TIER3 = JOBS.register("crush_tier3", + public static final DeferredHolder CRUSH_TIER3 = JOBS.register("crush_tier3", () -> new SpiritJobFactory((entity) -> new CrusherJob(entity, () -> Occultism.SERVER_CONFIG.spiritJobs.tier3CrusherTimeMultiplier.get().floatValue(), () -> Occultism.SERVER_CONFIG.spiritJobs.tier3CrusherOutputMultiplier.get().floatValue(), () -> 3 ))); - public static final Supplier CRUSH_TIER4 = JOBS.register("crush_tier4", + public static final DeferredHolder CRUSH_TIER4 = JOBS.register("crush_tier4", () -> new SpiritJobFactory((entity) -> new CrusherJob(entity, () -> Occultism.SERVER_CONFIG.spiritJobs.tier4CrusherTimeMultiplier.get().floatValue(), () -> Occultism.SERVER_CONFIG.spiritJobs.tier4CrusherOutputMultiplier.get().floatValue(), @@ -91,17 +92,17 @@ public class OccultismSpiritJobs { ))); //Weather Jobs - public static final Supplier CLEAR_WEATHER = JOBS.register("clear_weather", + public static final DeferredHolder CLEAR_WEATHER = JOBS.register("clear_weather", () -> new SpiritJobFactory((entity) -> new ClearWeatherJob(entity, 20 * 15))); - public static final Supplier RAIN_WEATHER = JOBS.register("rain_weather", + public static final DeferredHolder RAIN_WEATHER = JOBS.register("rain_weather", () -> new SpiritJobFactory((entity) -> new RainWeatherJob(entity, 20 * 30))); - public static final Supplier THUNDER_WEATHER = JOBS.register("thunder_weather", + public static final DeferredHolder THUNDER_WEATHER = JOBS.register("thunder_weather", () -> new SpiritJobFactory((entity) -> new ThunderWeatherJob(entity, 20 * 60))); //Time Jobs - public static final Supplier DAY_TIME = JOBS.register("day_time", + public static final DeferredHolder DAY_TIME = JOBS.register("day_time", () -> new SpiritJobFactory((entity) -> new DayTimeJob(entity, 20 * 5))); - public static final Supplier NIGHT_TIME = JOBS.register("night_time", + public static final DeferredHolder NIGHT_TIME = JOBS.register("night_time", () -> new SpiritJobFactory((entity) -> new NightTimeJob(entity, 20 * 5))); } diff --git a/src/main/resources/assets/occultism/animations/entity/foliot_crusher.animation.json b/src/main/resources/assets/occultism/animations/entity/foliot_crusher.animation.json new file mode 100644 index 000000000..48908c5f4 --- /dev/null +++ b/src/main/resources/assets/occultism/animations/entity/foliot_crusher.animation.json @@ -0,0 +1,245 @@ +{ + "format_version": "1.8.0", + "animations": { + "idle": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [4, 0, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [1, 0, 0] + }, + "1.0": { + "vector": [-2, 0, 0] + }, + "2.0": { + "vector": [1, 0, 0] + } + } + } + } + }, + "walk": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "rotation": { + "0.0": { + "vector": [0, 0, -1] + }, + "0.5": { + "vector": [0, 0, 2] + }, + "1.0": { + "vector": [0, 0, -1] + }, + "1.5": { + "vector": [0, 0, 2] + }, + "2.0": { + "vector": [0, 0, -1] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [31, 0, 0] + }, + "0.25": { + "vector": [-25.75, 0, 0] + }, + "0.5": { + "vector": [31, 0, 0] + }, + "0.75": { + "vector": [-25.75, 0, 0] + }, + "1.0": { + "vector": [31, 0, 0] + }, + "1.25": { + "vector": [-25.75, 0, 0] + }, + "1.5": { + "vector": [31, 0, 0] + }, + "1.75": { + "vector": [-25.75, 0, 0] + }, + "2.0": { + "vector": [31, 0, 0] + } + } + }, + "bone2": { + "rotation": { + "0.0": { + "vector": [27.5, 0, 0] + }, + "0.25": { + "vector": [-32.5, 0, 0] + }, + "0.5": { + "vector": [27.5, 0, 0] + }, + "0.75": { + "vector": [-32.5, 0, 0] + }, + "1.0": { + "vector": [27.5, 0, 0] + }, + "1.25": { + "vector": [-32.5, 0, 0] + }, + "1.5": { + "vector": [27.5, 0, 0] + }, + "1.75": { + "vector": [-32.5, 0, 0] + }, + "2.0": { + "vector": [27.5, 0, 0] + } + } + }, + "bone": { + "rotation": { + "0.0": { + "vector": [-26, 0, 0] + }, + "0.25": { + "vector": [31.5, 0, 0] + }, + "0.5": { + "vector": [-26, 0, 0] + }, + "0.75": { + "vector": [31.5, 0, 0] + }, + "1.0": { + "vector": [-26, 0, 0] + }, + "1.25": { + "vector": [31.5, 0, 0] + }, + "1.5": { + "vector": [-26, 0, 0] + }, + "1.75": { + "vector": [31.5, 0, 0] + }, + "2.0": { + "vector": [-26, 0, 0] + } + } + }, + "FAT": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1.01, 1, 1] + }, + "0.5": { + "vector": [1, 1, 1] + }, + "0.75": { + "vector": [1.01, 1, 1] + }, + "1.0": { + "vector": [1, 1, 1] + }, + "1.25": { + "vector": [1.01, 1, 1] + }, + "1.5": { + "vector": [1, 1, 1] + }, + "1.75": { + "vector": [1.01, 1, 1] + }, + "2.0": { + "vector": [1, 1, 1] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-22.5, 0, 0] + }, + "0.25": { + "vector": [27.5, 0, 0] + }, + "0.5": { + "vector": [-22.5, 0, 0] + }, + "0.75": { + "vector": [27.5, 0, 0] + }, + "1.0": { + "vector": [-22.5, 0, 0] + }, + "1.25": { + "vector": [27.5, 0, 0] + }, + "1.5": { + "vector": [-22.5, 0, 0] + }, + "1.75": { + "vector": [27.5, 0, 0] + }, + "2.0": { + "vector": [-22.5, 0, 0] + } + }, + "position": { + "vector": [0, 0, 0] + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/animations/entity/foliot_janitor.animation.json b/src/main/resources/assets/occultism/animations/entity/foliot_janitor.animation.json new file mode 100644 index 000000000..6549e9ca5 --- /dev/null +++ b/src/main/resources/assets/occultism/animations/entity/foliot_janitor.animation.json @@ -0,0 +1,214 @@ +{ + "format_version": "1.8.0", + "animations": { + "idle": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [-124.55, 0, 0] + }, + "1.0": { + "vector": [-124.55, 0, 0] + }, + "2.0": { + "vector": [-124.55, 0, 0] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-44.44863, -5.91742, -0.99382] + }, + "1.0": { + "vector": [-44.44863, -5.91742, -0.99382] + }, + "2.0": { + "vector": [-44.44863, -5.91742, -0.99382] + } + } + }, + "bone3": { + "rotation": { + "vector": [-25.51195, -38.12805, 27.92469] + }, + "position": { + "vector": [0.9, -0.5, -1.1] + } + } + } + }, + "walk": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "rotation": { + "0.0": { + "vector": [0, 0, -1] + }, + "0.5": { + "vector": [0, 0, 2] + }, + "1.0": { + "vector": [0, 0, -1] + }, + "1.5": { + "vector": [0, 0, 2] + }, + "2.0": { + "vector": [0, 0, -1] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "vector": [-127.05, 0, 0] + } + }, + "bone2": { + "rotation": { + "0.0": { + "vector": [27.5, 0, 0] + }, + "0.25": { + "vector": [-32.5, 0, 0] + }, + "0.5": { + "vector": [27.5, 0, 0] + }, + "0.75": { + "vector": [-32.5, 0, 0] + }, + "1.0": { + "vector": [27.5, 0, 0] + }, + "1.25": { + "vector": [-32.5, 0, 0] + }, + "1.5": { + "vector": [27.5, 0, 0] + }, + "1.75": { + "vector": [-32.5, 0, 0] + }, + "2.0": { + "vector": [27.5, 0, 0] + } + } + }, + "bone": { + "rotation": { + "0.0": { + "vector": [-26, 0, 0] + }, + "0.25": { + "vector": [31.5, 0, 0] + }, + "0.5": { + "vector": [-26, 0, 0] + }, + "0.75": { + "vector": [31.5, 0, 0] + }, + "1.0": { + "vector": [-26, 0, 0] + }, + "1.25": { + "vector": [31.5, 0, 0] + }, + "1.5": { + "vector": [-26, 0, 0] + }, + "1.75": { + "vector": [31.5, 0, 0] + }, + "2.0": { + "vector": [-26, 0, 0] + } + } + }, + "FAT": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1.01, 1, 1] + }, + "0.5": { + "vector": [1, 1, 1] + }, + "0.75": { + "vector": [1.01, 1, 1] + }, + "1.0": { + "vector": [1, 1, 1] + }, + "1.25": { + "vector": [1.01, 1, 1] + }, + "1.5": { + "vector": [1, 1, 1] + }, + "1.75": { + "vector": [1.01, 1, 1] + }, + "2.0": { + "vector": [1, 1, 1] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-44.44863, -5.91742, -0.99382] + }, + "1.0": { + "vector": [-44.44863, -5.91742, -0.99382] + }, + "2.0": { + "vector": [-44.44863, -5.91742, -0.99382] + } + } + }, + "bone3": { + "rotation": { + "vector": [-25.51195, -38.12805, 27.92469] + }, + "position": { + "vector": [0.9, -0.5, -1.1] + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/animations/entity/foliot_lumberjack.animation.json b/src/main/resources/assets/occultism/animations/entity/foliot_lumberjack.animation.json new file mode 100644 index 000000000..a68456c42 --- /dev/null +++ b/src/main/resources/assets/occultism/animations/entity/foliot_lumberjack.animation.json @@ -0,0 +1,281 @@ +{ + "format_version": "1.8.0", + "animations": { + "idle": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [4, 0, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-103.94912, 15.93376, -13.86048] + }, + "1.0": { + "vector": [-103.94912, 15.93376, -13.86048] + }, + "2.0": { + "vector": [-103.94912, 15.93376, -13.86048] + } + } + }, + "bone3": { + "rotation": { + "vector": [-76.05631, -4.09097, 15.48139] + } + } + } + }, + "walk": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "rotation": { + "0.0": { + "vector": [0, 0, -1] + }, + "0.5": { + "vector": [0, 0, 2] + }, + "1.0": { + "vector": [0, 0, -1] + }, + "1.5": { + "vector": [0, 0, 2] + }, + "2.0": { + "vector": [0, 0, -1] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [31, 0, 0] + }, + "0.25": { + "vector": [-25.75, 0, 0] + }, + "0.5": { + "vector": [31, 0, 0] + }, + "0.75": { + "vector": [-25.75, 0, 0] + }, + "1.0": { + "vector": [31, 0, 0] + }, + "1.25": { + "vector": [-25.75, 0, 0] + }, + "1.5": { + "vector": [31, 0, 0] + }, + "1.75": { + "vector": [-25.75, 0, 0] + }, + "2.0": { + "vector": [31, 0, 0] + } + } + }, + "bone2": { + "rotation": { + "0.0": { + "vector": [27.5, 0, 0] + }, + "0.25": { + "vector": [-32.5, 0, 0] + }, + "0.5": { + "vector": [27.5, 0, 0] + }, + "0.75": { + "vector": [-32.5, 0, 0] + }, + "1.0": { + "vector": [27.5, 0, 0] + }, + "1.25": { + "vector": [-32.5, 0, 0] + }, + "1.5": { + "vector": [27.5, 0, 0] + }, + "1.75": { + "vector": [-32.5, 0, 0] + }, + "2.0": { + "vector": [27.5, 0, 0] + } + } + }, + "bone": { + "rotation": { + "0.0": { + "vector": [-26, 0, 0] + }, + "0.25": { + "vector": [31.5, 0, 0] + }, + "0.5": { + "vector": [-26, 0, 0] + }, + "0.75": { + "vector": [31.5, 0, 0] + }, + "1.0": { + "vector": [-26, 0, 0] + }, + "1.25": { + "vector": [31.5, 0, 0] + }, + "1.5": { + "vector": [-26, 0, 0] + }, + "1.75": { + "vector": [31.5, 0, 0] + }, + "2.0": { + "vector": [-26, 0, 0] + } + } + }, + "FAT": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1.01, 1, 1] + }, + "0.5": { + "vector": [1, 1, 1] + }, + "0.75": { + "vector": [1.01, 1, 1] + }, + "1.0": { + "vector": [1, 1, 1] + }, + "1.25": { + "vector": [1.01, 1, 1] + }, + "1.5": { + "vector": [1, 1, 1] + }, + "1.75": { + "vector": [1.01, 1, 1] + }, + "2.0": { + "vector": [1, 1, 1] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-22.5, 0, 0] + }, + "0.25": { + "vector": [27.5, 0, 0] + }, + "0.5": { + "vector": [-22.5, 0, 0] + }, + "0.75": { + "vector": [27.5, 0, 0] + }, + "1.0": { + "vector": [-22.5, 0, 0] + }, + "1.25": { + "vector": [27.5, 0, 0] + }, + "1.5": { + "vector": [-22.5, 0, 0] + }, + "1.75": { + "vector": [27.5, 0, 0] + }, + "2.0": { + "vector": [-22.5, 0, 0] + } + }, + "position": { + "vector": [0, 0, 0] + } + } + } + }, + "attack": { + "animation_length": 0.5, + "bones": { + "Torso": { + "rotation": { + "0.0": { + "vector": [-10, 0, 0] + }, + "0.25": { + "vector": [10, 0, 0] + }, + "0.5": { + "vector": [-10, 0, 0] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-140.08688, -1.45192, 6.8485] + }, + "0.25": { + "vector": [-85, 0, 0] + }, + "0.5": { + "vector": [-140.08688, -1.45192, 6.8485] + } + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/animations/entity/foliot_transporter.animation.json b/src/main/resources/assets/occultism/animations/entity/foliot_transporter.animation.json new file mode 100644 index 000000000..a2039a0a7 --- /dev/null +++ b/src/main/resources/assets/occultism/animations/entity/foliot_transporter.animation.json @@ -0,0 +1,290 @@ +{ + "format_version": "1.8.0", + "animations": { + "idle": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [4, 0, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-181.5, 0, 0] + }, + "1.0": { + "vector": [-181.5, 0, 0] + }, + "2.0": { + "vector": [-181.5, 0, 0] + } + } + }, + "bone3": { + "rotation": { + "vector": [-28, 0, 0] + } + } + } + }, + "walk": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "rotation": { + "0.0": { + "vector": [0, 0, -1] + }, + "0.5": { + "vector": [0, 0, 2] + }, + "1.0": { + "vector": [0, 0, -1] + }, + "1.5": { + "vector": [0, 0, 2] + }, + "2.0": { + "vector": [0, 0, -1] + } + }, + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [31, 0, 0] + }, + "0.25": { + "vector": [-25.75, 0, 0] + }, + "0.5": { + "vector": [31, 0, 0] + }, + "0.75": { + "vector": [-25.75, 0, 0] + }, + "1.0": { + "vector": [31, 0, 0] + }, + "1.25": { + "vector": [-25.75, 0, 0] + }, + "1.5": { + "vector": [31, 0, 0] + }, + "1.75": { + "vector": [-25.75, 0, 0] + }, + "2.0": { + "vector": [31, 0, 0] + } + } + }, + "bone2": { + "rotation": { + "0.0": { + "vector": [27.5, 0, 0] + }, + "0.25": { + "vector": [-32.5, 0, 0] + }, + "0.5": { + "vector": [27.5, 0, 0] + }, + "0.75": { + "vector": [-32.5, 0, 0] + }, + "1.0": { + "vector": [27.5, 0, 0] + }, + "1.25": { + "vector": [-32.5, 0, 0] + }, + "1.5": { + "vector": [27.5, 0, 0] + }, + "1.75": { + "vector": [-32.5, 0, 0] + }, + "2.0": { + "vector": [27.5, 0, 0] + } + } + }, + "bone": { + "rotation": { + "0.0": { + "vector": [-26, 0, 0] + }, + "0.25": { + "vector": [31.5, 0, 0] + }, + "0.5": { + "vector": [-26, 0, 0] + }, + "0.75": { + "vector": [31.5, 0, 0] + }, + "1.0": { + "vector": [-26, 0, 0] + }, + "1.25": { + "vector": [31.5, 0, 0] + }, + "1.5": { + "vector": [-26, 0, 0] + }, + "1.75": { + "vector": [31.5, 0, 0] + }, + "2.0": { + "vector": [-26, 0, 0] + } + } + }, + "FAT": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.25": { + "vector": [1.01, 1, 1] + }, + "0.5": { + "vector": [1, 1, 1] + }, + "0.75": { + "vector": [1.01, 1, 1] + }, + "1.0": { + "vector": [1, 1, 1] + }, + "1.25": { + "vector": [1.01, 1, 1] + }, + "1.5": { + "vector": [1, 1, 1] + }, + "1.75": { + "vector": [1.01, 1, 1] + }, + "2.0": { + "vector": [1, 1, 1] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [-181.5, 0, 0] + }, + "1.0": { + "vector": [-181.5, 0, 0] + }, + "2.0": { + "vector": [-181.5, 0, 0] + } + }, + "position": { + "vector": [0, 0, 0] + } + }, + "bone3": { + "rotation": { + "vector": [-28, 0, 0] + } + } + } + }, + "idle_no_bag": { + "loop": true, + "animation_length": 2, + "bones": { + "Torso": { + "position": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [0, -0.1, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "RARM": { + "rotation": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [4, 0, 0] + }, + "2.0": { + "vector": [0, 0, 0] + } + } + }, + "LARM": { + "rotation": { + "0.0": { + "vector": [1, 0, 0] + }, + "1.0": { + "vector": [-2, 0, 0] + }, + "2.0": { + "vector": [1, 0, 0] + } + } + }, + "bone3": { + "position": { + "vector": [4, 1, 0] + }, + "scale": { + "vector": [0.1, 0.1, 0.2] + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/geo/entity/foliot_crusher.geo.json b/src/main/resources/assets/occultism/geo/entity/foliot_crusher.geo.json new file mode 100644 index 000000000..a2c4ba587 --- /dev/null +++ b/src/main/resources/assets/occultism/geo/entity/foliot_crusher.geo.json @@ -0,0 +1,95 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.foliot_crusher", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "All", + "pivot": [0, 0, 0] + }, + { + "name": "bone2", + "parent": "All", + "pivot": [-1.6, 4, 0], + "cubes": [ + {"origin": [-2.9, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [0, 24]}, + {"origin": [-3, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [16, 21]} + ] + }, + { + "name": "bone", + "parent": "All", + "pivot": [1.3, 3.9, 0], + "cubes": [ + {"origin": [0.3, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [23, 10]}, + {"origin": [0.1, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [18, 0]} + ] + }, + { + "name": "Torso", + "parent": "All", + "pivot": [0, 6, 0] + }, + { + "name": "FAT", + "parent": "Torso", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-3, 4, -3], "size": [6, 6, 6], "uv": [0, 0]} + ] + }, + { + "name": "Head", + "parent": "Torso", + "pivot": [0, 11.4, -2], + "cubes": [ + {"origin": [-2, 9, -2], "size": [4, 4, 4], "uv": [11, 13]}, + { + "origin": [-1.5, 12, -1.5], + "size": [0.8, 2, 0.8], + "pivot": [-1, 13, -1.1], + "rotation": [16.93839, -4.46375, 14.33501], + "uv": { + "north": {"uv": [0, 0], "uv_size": [0, 2]}, + "east": {"uv": [0, 0], "uv_size": [0, 2]}, + "south": {"uv": [0, 0], "uv_size": [0, 2]}, + "west": {"uv": [0, 0], "uv_size": [0, 2]}, + "up": {"uv": [0, 0], "uv_size": [0, 0]}, + "down": {"uv": [0, 0], "uv_size": [0, 0]} + } + }, + {"origin": [0.7, 12, -1.5], "size": [0.8, 2, 0.8], "pivot": [1, 13, -1.1], "rotation": [16.93839, 4.46375, -14.33501], "uv": [0, 0]}, + {"origin": [-0.4, 11.3, -2.8], "size": [0.9, 0.6, 1.5], "pivot": [0, 11.4, -2], "rotation": [32.5, 0, 0], "uv": [1, 1]}, + {"origin": [1.6, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [2, 11.7, 0], "rotation": [-23.01667, 16.64946, 8.06026], "uv": [1, 1]}, + {"origin": [-2, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [-2, 11.7, 0], "rotation": [-23.01667, -16.64946, -8.06026], "uv": [1, 1], "mirror": true} + ] + }, + { + "name": "LARM", + "parent": "Torso", + "pivot": [-5, 8.3, -0.3], + "rotation": [-28, 0, 0], + "cubes": [ + {"origin": [-5, 4.08168, -1.07023], "size": [2, 5, 2], "pivot": [-3.5, 8.28168, -0.07023], "rotation": [28.30479, -7.48388, -4.25406], "uv": [8, 21]} + ] + }, + { + "name": "RARM", + "parent": "Torso", + "pivot": [3, 8, 0], + "cubes": [ + {"origin": [3, 4, -1], "size": [2, 5, 2], "uv": [0, 17]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/geo/entity/foliot_janitor.geo.json b/src/main/resources/assets/occultism/geo/entity/foliot_janitor.geo.json new file mode 100644 index 000000000..267d97885 --- /dev/null +++ b/src/main/resources/assets/occultism/geo/entity/foliot_janitor.geo.json @@ -0,0 +1,115 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.foliot_janitor", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "All", + "pivot": [0, 0, 0] + }, + { + "name": "bone2", + "parent": "All", + "pivot": [-1.6, 4, 0], + "cubes": [ + {"origin": [-2.9, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [0, 24]}, + {"origin": [-3, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [16, 21]} + ] + }, + { + "name": "bone", + "parent": "All", + "pivot": [1.3, 3.9, 0], + "cubes": [ + {"origin": [0.3, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [23, 10]}, + {"origin": [0.1, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [18, 0]} + ] + }, + { + "name": "Torso", + "parent": "All", + "pivot": [0, 6, 0] + }, + { + "name": "FAT", + "parent": "Torso", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-3, 4, -3], "size": [6, 6, 6], "uv": [0, 0]} + ] + }, + { + "name": "Head", + "parent": "Torso", + "pivot": [0, 11.4, -2], + "cubes": [ + {"origin": [-2, 9, -2], "size": [4, 4, 4], "uv": [11, 13]}, + { + "origin": [-1.5, 12, -1.5], + "size": [0.8, 2, 0.8], + "pivot": [-1, 13, -1.1], + "rotation": [16.93839, -4.46375, 14.33501], + "uv": { + "north": {"uv": [0, 0], "uv_size": [0, 2]}, + "east": {"uv": [0, 0], "uv_size": [0, 2]}, + "south": {"uv": [0, 0], "uv_size": [0, 2]}, + "west": {"uv": [0, 0], "uv_size": [0, 2]}, + "up": {"uv": [0, 0], "uv_size": [0, 0]}, + "down": {"uv": [0, 0], "uv_size": [0, 0]} + } + }, + {"origin": [0.7, 12, -1.5], "size": [0.8, 2, 0.8], "pivot": [1, 13, -1.1], "rotation": [16.93839, 4.46375, -14.33501], "uv": [0, 0]}, + {"origin": [-0.4, 11.3, -2.8], "size": [0.9, 0.6, 1.5], "pivot": [0, 11.4, -2], "rotation": [32.5, 0, 0], "uv": [1, 1]}, + {"origin": [1.6, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [2, 11.7, 0], "rotation": [-23.01667, 16.64946, 8.06026], "uv": [1, 1]}, + {"origin": [-2, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [-2, 11.7, 0], "rotation": [-23.01667, -16.64946, -8.06026], "uv": [1, 1], "mirror": true} + ] + }, + { + "name": "LARM", + "parent": "Torso", + "pivot": [-5, 8.3, -0.3], + "rotation": [-28, 0, 0], + "cubes": [ + {"origin": [-5, 3.48168, -1.07023], "size": [2, 5.6, 2], "pivot": [-3.5, 8.28168, -0.07023], "rotation": [28.30479, -7.48388, -4.25406], "uv": [8, 21]} + ] + }, + { + "name": "bone3", + "parent": "LARM", + "pivot": [-0.3, 4.3, -1], + "cubes": [ + { + "origin": [-0.53259, 4.56943, -5.1881], + "size": [0.7, 0.7, 11.4], + "uv": { + "north": {"uv": [32, 18], "uv_size": [0, 0]}, + "east": {"uv": [32, 14.5], "uv_size": [0, 3.5]}, + "south": {"uv": [43, 18], "uv_size": [0, 0]}, + "west": {"uv": [31.5, 18], "uv_size": [0.5, -2.5]}, + "up": {"uv": [32, 15.5], "uv_size": [-0.5, 2.5]}, + "down": {"uv": [31.5, 18], "uv_size": [0.5, -2.5]} + } + }, + {"origin": [-1.49679, 4.16565, 6.06816], "size": [2.8, 1.5, 3.7], "uv": [6, 28]} + ] + }, + { + "name": "RARM", + "parent": "Torso", + "pivot": [3, 8, 0], + "cubes": [ + {"origin": [3, 3.2, -1], "size": [2, 5.8, 2], "uv": [0, 17]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/geo/entity/foliot_lumberjack.geo.json b/src/main/resources/assets/occultism/geo/entity/foliot_lumberjack.geo.json new file mode 100644 index 000000000..894ff20df --- /dev/null +++ b/src/main/resources/assets/occultism/geo/entity/foliot_lumberjack.geo.json @@ -0,0 +1,160 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.foliot_lumberjack", + "texture_width": 32, + "texture_height": 32, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "All", + "pivot": [0, 0, 0] + }, + { + "name": "bone2", + "parent": "All", + "pivot": [-1.6, 4, 0], + "cubes": [ + {"origin": [-2.9, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [0, 24]}, + {"origin": [-3, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [16, 21]} + ] + }, + { + "name": "bone", + "parent": "All", + "pivot": [1.3, 3.9, 0], + "cubes": [ + {"origin": [0.3, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [23, 10]}, + {"origin": [0.1, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [18, 0]} + ] + }, + { + "name": "Torso", + "parent": "All", + "pivot": [0, 6, 0] + }, + { + "name": "FAT", + "parent": "Torso", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-3, 4, -3], "size": [6, 6, 6], "uv": [0, 0]} + ] + }, + { + "name": "Head", + "parent": "Torso", + "pivot": [0, 11.4, -2], + "cubes": [ + {"origin": [-2, 9, -2], "size": [4, 4, 4], "uv": [11, 13]}, + { + "origin": [-1.5, 12, -1.5], + "size": [0.8, 2, 0.8], + "pivot": [-1, 13, -1.1], + "rotation": [16.93839, -4.46375, 14.33501], + "uv": { + "north": {"uv": [0, 0], "uv_size": [0, 2]}, + "east": {"uv": [0, 0], "uv_size": [0, 2]}, + "south": {"uv": [0, 0], "uv_size": [0, 2]}, + "west": {"uv": [0, 0], "uv_size": [0, 2]}, + "up": {"uv": [0, 0], "uv_size": [0, 0]}, + "down": {"uv": [0, 0], "uv_size": [0, 0]} + } + }, + {"origin": [0.7, 12, -1.5], "size": [0.8, 2, 0.8], "pivot": [1, 13, -1.1], "rotation": [16.93839, 4.46375, -14.33501], "uv": [0, 0]}, + {"origin": [-0.4, 11.3, -2.8], "size": [0.9, 0.6, 1.5], "pivot": [0, 11.4, -2], "rotation": [32.5, 0, 0], "uv": [1, 1]}, + {"origin": [1.6, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [2, 11.7, 0], "rotation": [-23.01667, 16.64946, 8.06026], "uv": [1, 1]}, + {"origin": [-2, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [-2, 11.7, 0], "rotation": [-23.01667, -16.64946, -8.06026], "uv": [1, 1], "mirror": true}, + {"origin": [-2.1, 11.4, -1], "size": [4.2, 1, 4], "pivot": [0, 12.4, 2], "rotation": [-34, 0, 0], "uv": [12, 26]}, + { + "origin": [-2.1, 12.4, -0.3], + "size": [4.2, 0.9, 2.8], + "pivot": [0, 12.4, 2], + "rotation": [-34, 0, 0], + "uv": { + "north": {"uv": [26, 28], "uv_size": [3, 0.5]}, + "east": {"uv": [26.5, 28.5], "uv_size": [2, 0.5]}, + "south": {"uv": [26.5, 28.5], "uv_size": [3, 0.5]}, + "west": {"uv": [26.5, 28.5], "uv_size": [2.5, 0.5]}, + "up": {"uv": [26, 26], "uv_size": [3, 2]}, + "down": {"uv": [29, 28], "uv_size": [3, -2]} + } + }, + {"origin": [-0.6, 13.4, 0.8], "size": [1.1, 0.7, 0.6], "pivot": [0, 12.4, 2], "rotation": [-34, 0, 0], "uv": [27, 28]} + ] + }, + { + "name": "LARM", + "parent": "Torso", + "pivot": [-5, 8.3, -0.3], + "rotation": [-28, 0, 0], + "cubes": [ + {"origin": [-5, 4.08168, -1.07023], "size": [2, 5, 2], "pivot": [-3.5, 8.28168, -0.07023], "rotation": [28.30479, -7.48388, -4.25406], "uv": [8, 21]} + ] + }, + { + "name": "bone3", + "parent": "LARM", + "pivot": [-4, 4.7, 0.7], + "cubes": [ + { + "origin": [-4.3428, 3.9203, -4.69813], + "size": [0.8, 0.7, 5.4], + "pivot": [-4.0428, 4.3203, -0.29813], + "rotation": [27.5, 0, 0], + "uv": { + "north": {"uv": [2, 2], "uv_size": [0, 0]}, + "east": {"uv": [13, 11], "uv_size": [5, 0]}, + "south": {"uv": [7, 2], "uv_size": [0, 0]}, + "west": {"uv": [13.5, 11], "uv_size": [5, 0]}, + "up": {"uv": [11, 11], "uv_size": [0, -0.5]}, + "down": {"uv": [11, 12], "uv_size": [0, -5]} + } + }, + { + "origin": [-4.1428, 2.5203, -4.59813], + "size": [0.4, 2, 1.3], + "pivot": [-4.0428, 4.3203, -0.29813], + "rotation": [27.5, 0, 0], + "uv": { + "north": {"uv": [31, 6], "uv_size": [0, 2]}, + "east": {"uv": [30, 6], "uv_size": [1, 2]}, + "south": {"uv": [32, 6], "uv_size": [0, 2]}, + "west": {"uv": [31, 6], "uv_size": [1, 2]}, + "up": {"uv": [31, 5], "uv_size": [0, 1]}, + "down": {"uv": [31, 6], "uv_size": [0, -1]} + } + }, + { + "origin": [-4.0428, 0.58078, -4.00665], + "size": [0.2, 1.8, 2.2], + "pivot": [-4.0428, 1.3203, -2.89813], + "rotation": [2.5, 0, 0], + "uv": { + "north": {"uv": [30, 7], "uv_size": [0, 1]}, + "east": {"uv": [28, 7], "uv_size": [2, 1]}, + "south": {"uv": [32, 7], "uv_size": [0, 1]}, + "west": {"uv": [30, 7], "uv_size": [2, 1]}, + "up": {"uv": [30, 5], "uv_size": [0, 2]}, + "down": {"uv": [30, 7], "uv_size": [0, -2]} + } + } + ] + }, + { + "name": "RARM", + "parent": "Torso", + "pivot": [3, 8, 0], + "cubes": [ + {"origin": [3, 4, -1], "size": [2, 5, 2], "uv": [0, 17]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/geo/entity/foliot_transporter.geo.json b/src/main/resources/assets/occultism/geo/entity/foliot_transporter.geo.json new file mode 100644 index 000000000..3ad1eeed2 --- /dev/null +++ b/src/main/resources/assets/occultism/geo/entity/foliot_transporter.geo.json @@ -0,0 +1,137 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.foliot_transporter", + "texture_width": 50, + "texture_height": 50, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "All", + "pivot": [0, 0, 0] + }, + { + "name": "bone2", + "parent": "All", + "pivot": [-1.6, 4, 0], + "cubes": [ + {"origin": [-2.9, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [0, 24]}, + {"origin": [-3, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [16, 21]} + ] + }, + { + "name": "bone", + "parent": "All", + "pivot": [1.3, 3.9, 0], + "cubes": [ + {"origin": [0.3, 1.2, -1], "size": [2.6, 3.1, 2], "uv": [23, 10]}, + {"origin": [0.1, 0, -2.3], "size": [2.9, 2, 3.5], "uv": [18, 0]} + ] + }, + { + "name": "Torso", + "parent": "All", + "pivot": [0, 6, 0] + }, + { + "name": "FAT", + "parent": "Torso", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-3, 4, -3], "size": [6, 6, 6], "uv": [0, 0]} + ] + }, + { + "name": "Head", + "parent": "Torso", + "pivot": [0, 11.4, -2], + "cubes": [ + {"origin": [-2, 9, -2], "size": [4, 4, 4], "uv": [11, 13]}, + { + "origin": [-1.5, 12, -1.5], + "size": [0.8, 2, 0.8], + "pivot": [-1, 13, -1.1], + "rotation": [16.93839, -4.46375, 14.33501], + "uv": { + "north": {"uv": [0, 0], "uv_size": [0, 2]}, + "east": {"uv": [0, 0], "uv_size": [0, 2]}, + "south": {"uv": [0, 0], "uv_size": [0, 2]}, + "west": {"uv": [0, 0], "uv_size": [0, 2]}, + "up": {"uv": [0, 0], "uv_size": [0, 0]}, + "down": {"uv": [0, 0], "uv_size": [0, 0]} + } + }, + {"origin": [0.7, 12, -1.5], "size": [0.8, 2, 0.8], "pivot": [1, 13, -1.1], "rotation": [16.93839, 4.46375, -14.33501], "uv": [0, 0]}, + {"origin": [-0.4, 11.3, -2.8], "size": [0.9, 0.6, 1.5], "pivot": [0, 11.4, -2], "rotation": [32.5, 0, 0], "uv": [1, 1]}, + {"origin": [1.6, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [2, 11.7, 0], "rotation": [-23.01667, 16.64946, 8.06026], "uv": [1, 1]}, + {"origin": [-2, 11.4, -0.5], "size": [0.4, 2, 1.5], "pivot": [-2, 11.7, 0], "rotation": [-23.01667, -16.64946, -8.06026], "uv": [1, 1], "mirror": true} + ] + }, + { + "name": "LARM", + "parent": "Torso", + "pivot": [-5, 8.3, -0.3], + "rotation": [-28, 0, 0], + "cubes": [ + {"origin": [-5, 4.08168, -1.07023], "size": [2, 5, 2], "pivot": [-3.5, 8.28168, -0.07023], "rotation": [28.30479, -7.48388, -4.25406], "uv": [8, 21]} + ] + }, + { + "name": "bone3", + "parent": "LARM", + "pivot": [-3.56, 4.8, 0.75], + "rotation": [-60, 0, 0], + "cubes": [ + { + "origin": [-5.74, -0.4, -1.58], + "size": [4.92, 4.92, 4.92], + "uv": { + "north": {"uv": [28.5, 23], "uv_size": [6, 6]}, + "east": {"uv": [28.5, 23], "uv_size": [6, 6]}, + "south": {"uv": [28.5, 23], "uv_size": [6, 6]}, + "west": {"uv": [28.5, 23], "uv_size": [6, 6]}, + "up": {"uv": [34.5, 29], "uv_size": [-6, -6]}, + "down": {"uv": [34.5, 29], "uv_size": [-6, -6]} + } + }, + { + "origin": [-4.51, 4.93, -0.35], + "size": [2.46, 1.23, 2.46], + "uv": { + "north": {"uv": [2.5, 34.5], "uv_size": [6, 3]}, + "east": {"uv": [32.5, 11], "uv_size": [6, 3]}, + "south": {"uv": [32.5, 14.5], "uv_size": [6, 3]}, + "west": {"uv": [3, 30.5], "uv_size": [6, 3]}, + "up": {"uv": [16, 34.5], "uv_size": [-6, -6]}, + "down": {"uv": [46, 15], "uv_size": [-6, -6]} + } + }, + { + "origin": [-4.1, 4.52, 0.06], + "size": [1.64, 0.41, 1.64], + "uv": { + "north": {"uv": [6, 3], "uv_size": [4, 1]}, + "east": {"uv": [6, 3], "uv_size": [4, 1]}, + "south": {"uv": [20, 16], "uv_size": [4, 1]}, + "west": {"uv": [6, 3], "uv_size": [4, 1]} + } + } + ] + }, + { + "name": "RARM", + "parent": "Torso", + "pivot": [3, 8, 0], + "cubes": [ + {"origin": [3, 4, -1], "size": [2, 5, 2], "uv": [0, 17]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/occultism/textures/entity/foliot_crusher.png b/src/main/resources/assets/occultism/textures/entity/foliot_crusher.png new file mode 100644 index 0000000000000000000000000000000000000000..883eae839de480cd3bf6a18148a8d9a4bd5f9eb3 GIT binary patch literal 3495 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

Bm^X5Ks-{T>G;6X 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/occultism/textures/entity/foliot_lumberjack.png b/src/main/resources/assets/occultism/textures/entity/foliot_lumberjack.png new file mode 100644 index 0000000000000000000000000000000000000000..26261251f02f326e5db7a1a29a056a5e7bb5d238 GIT binary patch literal 4271 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 Rb&~)9002ovPDHLkV1gxrSBwAv literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/occultism/textures/entity/foliot_transporter.png b/src/main/resources/assets/occultism/textures/entity/foliot_transporter.png new file mode 100644 index 0000000000000000000000000000000000000000..4efdff7e40c867aa8a5cec2b3a607732095c6f25 GIT binary patch literal 4828 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⩔mJ}fMB#bJnBbJ&-Orf74rD5udP)FnNM24{N_WAm`U2FqR!3Oh zd`8%t*fZgMl8E195}X!37m=WuH#T;Ee-lb=et?PP1V%z6iDA){8+KXmNTxJT*Au)BC>};Q#C7&y*S#?SNVT@g$0147c#CVXG9J*6< z+m-4_T}H*35 z_n5?w#82X5GBFJ`0JZH=L*JpC^tw zn#Y+Q%&}+=*_YE9r;BB`er+5nN$hL+LEd9cVZr`b*}KL0wQ+;43dC@~5ix~+?<|dG zd2c$N7(C)#H|bRWuTW*{i#Fv&l7D&*_{Clriu*0BG`YC=8Ckg3)vdIXTQo>}3s0-w ze@n|3HtMlV5)nHJr^b9^!8rWJ(btg=OZvU>2y4v5<1M4l&_3;goAeW(A>ZZ6{gV8! z`<2AI8CKv=7eI!s?aLc}FY50{DHU!M%VVb^%YGS{nt`SE#%Wu~w^#Lgn?10Xj^a-K zmPK@W$sF!(lD=&W($WQW(&yC#=SQZd%66_6K{W?B*?p%bUC7e=F3gpV{ku4lUG%$_ z=d;NIgW*G0hhvkyGi;7{L|9(Jc0K~Q_%I)SCdol+0^^T179Q?N%$KTz&7GHy6z8<; z0Ey6j9lUeHgonS)VZ*JnKIz~YfYNFd9~m=daD04d0q^fK8?y}mh>A_Tlfza%BS!DU zw`mmeC&zM3qU!RO1^tZMr{o*|jK`$Q3ypfx*lwekI>A2P%`%oYV@+XDh=9RFkB5-8f>y@?R63JUnEhk7tn{7U-b#iaYxUY~} zWQh5=hXDH;wtBy>^|&-!^^gY$KRN@d9&WkWu0P(WmSf$EF=E|5QLAR literal 0 HcmV?d00001