From cb3132c6d3df2d1d3907ea219dcb68efb5f1161a Mon Sep 17 00:00:00 2001 From: Goodbird Date: Tue, 2 Jul 2024 09:35:16 +0300 Subject: [PATCH] First attempt of adding custom modeled scripted items --- dependencies.gradle | 2 +- ... geckolib-unofficial-1.7.10-1.0.6-dev.jar} | Bin 4136620 -> 4146088 bytes .../npcgecko/api/AbstractGeckoAPI.java | 7 ++ .../com/goodbird/npcgecko/api/GeckoAPI.java | 39 +++++++++ .../client/model/ItemModelCustom.java | 53 +++++++++++++ .../npcgecko/data/CustomItemModelData.java | 75 ++++++++++++++++++ .../item/ItemCustomModelPredicate.java | 23 ++++++ .../npcgecko/mixin/IScriptCustomItem.java | 11 +++ .../mixin/impl/MixinCustomItemRenderer.java | 52 ++++++++++++ .../mixin/impl/MixinItemScripted.java | 30 +++++++ .../mixin/impl/MixinScriptCustomItem.java | 50 ++++++++++++ src/main/resources/mixins.npcgecko.json | 3 + 12 files changed, 344 insertions(+), 1 deletion(-) rename lib/{geckolib-unofficial-1.7.10-1.0.5-dev.jar => geckolib-unofficial-1.7.10-1.0.6-dev.jar} (97%) create mode 100644 src/main/java/com/goodbird/npcgecko/client/model/ItemModelCustom.java create mode 100644 src/main/java/com/goodbird/npcgecko/data/CustomItemModelData.java create mode 100644 src/main/java/com/goodbird/npcgecko/item/ItemCustomModelPredicate.java create mode 100644 src/main/java/com/goodbird/npcgecko/mixin/IScriptCustomItem.java create mode 100644 src/main/java/com/goodbird/npcgecko/mixin/impl/MixinCustomItemRenderer.java create mode 100644 src/main/java/com/goodbird/npcgecko/mixin/impl/MixinItemScripted.java create mode 100644 src/main/java/com/goodbird/npcgecko/mixin/impl/MixinScriptCustomItem.java diff --git a/dependencies.gradle b/dependencies.gradle index 3464f88..28e3910 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -38,5 +38,5 @@ dependencies { runtimeOnlyNonPublishable("curse.maven:Nashorn-374413:2924946") implementation rfg.deobf(name: "CustomNPC-Plus-1.9.2") - implementation name: "geckolib-unofficial-1.7.10-1.0.5-dev" + implementation name: "geckolib-unofficial-1.7.10-1.0.6-dev" } diff --git a/lib/geckolib-unofficial-1.7.10-1.0.5-dev.jar b/lib/geckolib-unofficial-1.7.10-1.0.6-dev.jar similarity index 97% rename from lib/geckolib-unofficial-1.7.10-1.0.5-dev.jar rename to lib/geckolib-unofficial-1.7.10-1.0.6-dev.jar index 141386e327a69d5c37a96102f7c186570208c7c3..92704aa716569e35f07f4effd5b5d72cc5bcb143 100644 GIT binary patch delta 45961 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 Vc-cQQduFz9vS9LIZ#tHm{|6LLJplj! delta 36722 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 ppR+(Eux%X^7zibA player); public abstract void syncAnimForAll(IBlockScripted scriptedBlock, AnimationBuilder builder); + + public abstract void setModel(ScriptCustomItem item, String model); + public abstract void setTexture(ScriptCustomItem item, String texture); + public abstract void setAnimationFile(ScriptCustomItem item, String animation); + public abstract void setIdleAnimation(ScriptCustomItem item, String animation); } diff --git a/src/main/java/com/goodbird/npcgecko/api/GeckoAPI.java b/src/main/java/com/goodbird/npcgecko/api/GeckoAPI.java index 56ed336..793a3ba 100644 --- a/src/main/java/com/goodbird/npcgecko/api/GeckoAPI.java +++ b/src/main/java/com/goodbird/npcgecko/api/GeckoAPI.java @@ -1,7 +1,9 @@ package com.goodbird.npcgecko.api; import com.goodbird.npcgecko.client.renderer.RenderTileCustomModel; +import com.goodbird.npcgecko.data.CustomItemModelData; import com.goodbird.npcgecko.mixin.IDataDisplay; +import com.goodbird.npcgecko.mixin.IScriptCustomItem; import com.goodbird.npcgecko.network.CPacketSyncManualAnim; import com.goodbird.npcgecko.network.CPacketSyncTileManualAnim; import com.goodbird.npcgecko.network.NetworkHandler; @@ -16,6 +18,7 @@ import noppes.npcs.api.entity.IPlayer; import noppes.npcs.blocks.tiles.TileScripted; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.scripted.BlockScriptedWrapper; +import noppes.npcs.scripted.item.ScriptCustomItem; import software.bernie.geckolib3.core.builder.AnimationBuilder; public class GeckoAPI extends AbstractGeckoAPI { @@ -116,4 +119,40 @@ public class GeckoAPI extends AbstractGeckoAPI { public void syncAnimForAll(IBlockScripted scriptedBlock, AnimationBuilder builder) { NetworkHandler.sendToAll(new CPacketSyncTileManualAnim(scriptedBlock.getMCTileEntity(), builder)); } + + private CustomItemModelData getOrCreateCIMD(ScriptCustomItem item){ + IScriptCustomItem scriptCustomItem = (IScriptCustomItem) item; + if(!scriptCustomItem.hasCustomModel()){ + scriptCustomItem.setCustomModelData(new CustomItemModelData()); + } + return scriptCustomItem.getCustomModelData(); + } + + @Override + public void setModel(ScriptCustomItem item, String model) { + CustomItemModelData data = getOrCreateCIMD(item); + data.setModel(model); + item.saveItemData(); + } + + @Override + public void setTexture(ScriptCustomItem item, String texture) { + CustomItemModelData data = getOrCreateCIMD(item); + data.setTexture(texture); + item.saveItemData(); + } + + @Override + public void setAnimationFile(ScriptCustomItem item, String animation) { + CustomItemModelData data = getOrCreateCIMD(item); + data.setAnimFile(animation); + item.saveItemData(); + } + + @Override + public void setIdleAnimation(ScriptCustomItem item, String animation) { + CustomItemModelData data = getOrCreateCIMD(item); + data.setIdleAnim(animation); + item.saveItemData(); + } } diff --git a/src/main/java/com/goodbird/npcgecko/client/model/ItemModelCustom.java b/src/main/java/com/goodbird/npcgecko/client/model/ItemModelCustom.java new file mode 100644 index 0000000..033cbdc --- /dev/null +++ b/src/main/java/com/goodbird/npcgecko/client/model/ItemModelCustom.java @@ -0,0 +1,53 @@ +package com.goodbird.npcgecko.client.model; + +import com.goodbird.npcgecko.data.CustomItemModelData; +import com.goodbird.npcgecko.mixin.IScriptCustomItem; +import net.minecraft.util.ResourceLocation; +import noppes.npcs.api.item.IItemStack; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.item.ScriptCustomItem; +import software.bernie.geckolib3.item.AnimatableStackWrapper; +import software.bernie.geckolib3.model.AnimatedGeoModel; +import software.bernie.geckolib3.resource.GeckoLibCache; + +public class ItemModelCustom extends AnimatedGeoModel { + + private CustomItemModelData getModelData(AnimatableStackWrapper animatable){ + IItemStack istack = NpcAPI.Instance().getIItemStack(animatable.getStack()); + if(!(istack instanceof ScriptCustomItem)) return null; + return ((IScriptCustomItem)istack).getCustomModelData(); + } + + @Override + public ResourceLocation getAnimationFileLocation(AnimatableStackWrapper animatable) { + CustomItemModelData data = getModelData(animatable); + if(data==null || !GeckoLibCache.getInstance().getAnimations().containsKey(new ResourceLocation(data.getAnimFile()))){ + return new ResourceLocation("npcgecko","animations/none.animations.json"); + } + return new ResourceLocation(data.getAnimFile()); + } + + @Override + public ResourceLocation getModelLocation(AnimatableStackWrapper animatable) { + CustomItemModelData data = getModelData(animatable); + if(data==null || !GeckoLibCache.getInstance().getGeoModels().containsKey(new ResourceLocation(data.getModel()))){ + return new ResourceLocation("npcgecko","geo/modelnotfound.geo.json"); + } + if(!GeckoLibCache.getInstance().getAnimations().containsKey(new ResourceLocation(data.getAnimFile()))){ + return new ResourceLocation("npcgecko","geo/animfilenotfound.geo.json"); + } + return new ResourceLocation(data.getModel()); + } + + @Override + public ResourceLocation getTextureLocation(AnimatableStackWrapper animatable) { + CustomItemModelData data = getModelData(animatable); + if(data==null || !GeckoLibCache.getInstance().getGeoModels().containsKey(new ResourceLocation(data.getModel()))){ + return new ResourceLocation("npcgecko","textures/model/alphabet.png"); + } + if(!GeckoLibCache.getInstance().getAnimations().containsKey(new ResourceLocation(data.getAnimFile()))){ + return new ResourceLocation("npcgecko","textures/model/alphabet.png"); + } + return new ResourceLocation(data.getTexture()); + } +} diff --git a/src/main/java/com/goodbird/npcgecko/data/CustomItemModelData.java b/src/main/java/com/goodbird/npcgecko/data/CustomItemModelData.java new file mode 100644 index 0000000..163cd84 --- /dev/null +++ b/src/main/java/com/goodbird/npcgecko/data/CustomItemModelData.java @@ -0,0 +1,75 @@ +package com.goodbird.npcgecko.data; + +import net.minecraft.nbt.NBTTagCompound; + +public class CustomItemModelData { + private String model = "geckolib3:geo/npc.geo.json"; + private String animFile = "custom:geo_npc.animation.json"; + private String texture = "geckolib3:textures/item/jack.png"; + private String idleAnim = ""; + private int transitionLengthTicks = 10; + + public CustomItemModelData() { + } + + public NBTTagCompound writeToNBT(NBTTagCompound nbttagcompound) { + nbttagcompound.setString("Model", model); + nbttagcompound.setString("AnimFile", animFile); + nbttagcompound.setString("IdleAnim", idleAnim); + nbttagcompound.setString("Texture", texture); + nbttagcompound.setInteger("TransitionLengthTicks", transitionLengthTicks); + return nbttagcompound; + } + + public void readFromNBT(NBTTagCompound nbttagcompound) { + if(nbttagcompound.hasKey("Model")) { + model = nbttagcompound.getString("Model"); + animFile = nbttagcompound.getString("AnimFile"); + idleAnim = nbttagcompound.getString("IdleAnim"); + texture = nbttagcompound.getString("Texture"); + if(nbttagcompound.hasKey("TransitionLengthTicks")){ + transitionLengthTicks = nbttagcompound.getInteger("TransitionLengthTicks"); + } + } + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getAnimFile() { + return animFile; + } + + public void setAnimFile(String animFile) { + this.animFile = animFile; + } + + public String getIdleAnim() { + return idleAnim; + } + + public void setIdleAnim(String idleAnim) { + this.idleAnim = idleAnim; + } + + public int getTransitionLengthTicks() { + return transitionLengthTicks; + } + + public void setTransitionLengthTicks(int transitionLengthTicks) { + this.transitionLengthTicks = transitionLengthTicks; + } + + public String getTexture() { + return texture; + } + + public void setTexture(String texture) { + this.texture = texture; + } +} diff --git a/src/main/java/com/goodbird/npcgecko/item/ItemCustomModelPredicate.java b/src/main/java/com/goodbird/npcgecko/item/ItemCustomModelPredicate.java new file mode 100644 index 0000000..fc42c05 --- /dev/null +++ b/src/main/java/com/goodbird/npcgecko/item/ItemCustomModelPredicate.java @@ -0,0 +1,23 @@ +package com.goodbird.npcgecko.item; + +import com.goodbird.npcgecko.mixin.IScriptCustomItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import noppes.npcs.api.item.IItemStack; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.item.ScriptCustomItem; +import software.bernie.geckolib3.core.IAnimatable; +import software.bernie.geckolib3.core.PlayState; +import software.bernie.geckolib3.core.builder.AnimationBuilder; +import software.bernie.geckolib3.core.event.predicate.AnimationEvent; + +public class ItemCustomModelPredicate { + public static

PlayState predicate(AnimationEvent

event) { + ItemStack stack = (ItemStack) event.getExtraData().get(0); + IItemStack istack = NpcAPI.Instance().getIItemStack(stack); + if(!(istack instanceof ScriptCustomItem)) return PlayState.STOP; + IScriptCustomItem item = (IScriptCustomItem)istack; + event.getController().setAnimation(new AnimationBuilder().loop(item.getCustomModelData().getIdleAnim())); + return PlayState.CONTINUE; + } +} diff --git a/src/main/java/com/goodbird/npcgecko/mixin/IScriptCustomItem.java b/src/main/java/com/goodbird/npcgecko/mixin/IScriptCustomItem.java new file mode 100644 index 0000000..e4d0a2a --- /dev/null +++ b/src/main/java/com/goodbird/npcgecko/mixin/IScriptCustomItem.java @@ -0,0 +1,11 @@ +package com.goodbird.npcgecko.mixin; + +import com.goodbird.npcgecko.data.CustomItemModelData; + +public interface IScriptCustomItem { + CustomItemModelData getCustomModelData(); + + void setCustomModelData(CustomItemModelData data); + + boolean hasCustomModel(); +} diff --git a/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinCustomItemRenderer.java b/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinCustomItemRenderer.java new file mode 100644 index 0000000..a6709a2 --- /dev/null +++ b/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinCustomItemRenderer.java @@ -0,0 +1,52 @@ +package com.goodbird.npcgecko.mixin.impl; + +import com.goodbird.npcgecko.client.model.ItemModelCustom; +import com.goodbird.npcgecko.mixin.IScriptCustomItem; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.item.ItemStack; +import noppes.npcs.client.renderer.items.CustomItemRenderer; +import noppes.npcs.scripted.item.ScriptCustomItem; +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import software.bernie.geckolib3.item.AnimatableStackWrapper; +import software.bernie.geckolib3.renderers.geo.GeoItemStackRenderer; + +@Mixin(CustomItemRenderer.class) +public class MixinCustomItemRenderer { + @Unique + private static GeoItemStackRenderer renderer = new GeoItemStackRenderer(new ItemModelCustom()); + + @Inject(method = "renderEntityCustomItem", cancellable = true, at=@At("HEAD"), remap = false) + public void renderEntityCustomItem(ScriptCustomItem scriptCustomItem, ItemStack itemStack, EntityItem entityItem, CallbackInfo ci) { + if(((IScriptCustomItem)scriptCustomItem).hasCustomModel()){ + renderer.render(AnimatableStackWrapper.wrapItemStack(itemStack), itemStack); + ci.cancel(); + } + } + + @Inject(method = "renderInventoryCustomItem", cancellable = true, at=@At("HEAD"), remap = false) + public void renderInventoryCustomItem(ScriptCustomItem scriptCustomItem, CallbackInfo ci){ + if(((IScriptCustomItem)scriptCustomItem).hasCustomModel()){ + GL11.glPushMatrix(); + GL11.glTranslated(-1.0, -1.0, 0.0); + GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); + renderer.render(AnimatableStackWrapper.wrapItemStack(scriptCustomItem.item), scriptCustomItem.item); + GL11.glPopMatrix(); + ci.cancel(); + } + } + + @Inject(method = "renderItem3d", cancellable = true, at=@At("HEAD"), remap = false) + public void renderItem3d(ScriptCustomItem scriptCustomItem, EntityLivingBase entityLivingBase, ItemStack itemStack, CallbackInfo ci) { + if(((IScriptCustomItem)scriptCustomItem).hasCustomModel()){ + renderer.render(AnimatableStackWrapper.wrapItemStack(itemStack), itemStack); + ci.cancel(); + } + } + +} diff --git a/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinItemScripted.java b/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinItemScripted.java new file mode 100644 index 0000000..8c947b4 --- /dev/null +++ b/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinItemScripted.java @@ -0,0 +1,30 @@ +package com.goodbird.npcgecko.mixin.impl; + +import com.goodbird.npcgecko.item.ItemCustomModelPredicate; +import net.minecraft.item.Item; +import noppes.npcs.items.ItemScripted; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import software.bernie.geckolib3.core.IAnimatable; +import software.bernie.geckolib3.core.controller.AnimationController; +import software.bernie.geckolib3.core.manager.AnimationData; +import software.bernie.geckolib3.core.manager.AnimationFactory; + +@Mixin(ItemScripted.class) +@Implements(value = @Interface(iface = IAnimatable.class, prefix = "customNPC_Gecko_Addon$")) +public abstract class MixinItemScripted extends Item implements IAnimatable { + @Unique + public AnimationFactory customNPC_Gecko_Addon$factory = new AnimationFactory(this); + + @Unique + public void customNPC_Gecko_Addon$registerControllers(AnimationData data) { + data.addAnimationController(new AnimationController<>(this, "controller", 20, ItemCustomModelPredicate::predicate)); + } + + @Unique + public AnimationFactory customNPC_Gecko_Addon$getFactory() { + return this.customNPC_Gecko_Addon$factory; + } +} diff --git a/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinScriptCustomItem.java b/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinScriptCustomItem.java new file mode 100644 index 0000000..5da9745 --- /dev/null +++ b/src/main/java/com/goodbird/npcgecko/mixin/impl/MixinScriptCustomItem.java @@ -0,0 +1,50 @@ +package com.goodbird.npcgecko.mixin.impl; + +import com.goodbird.npcgecko.data.CustomItemModelData; +import com.goodbird.npcgecko.mixin.IScriptCustomItem; +import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.scripted.item.ScriptCustomItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ScriptCustomItem.class) +public class MixinScriptCustomItem implements IScriptCustomItem { + @Unique + private CustomItemModelData customNPC_Gecko_Addon$customModelData; + + @Inject(method = "getItemNBT", at = @At("HEAD"), remap = false) + public void writeToNBT(NBTTagCompound nbttagcompound, CallbackInfoReturnable cir) { + if(customNPC_Gecko_Addon$customModelData!=null){ + NBTTagCompound modelDataTag = new NBTTagCompound(); + customNPC_Gecko_Addon$customModelData.writeToNBT(modelDataTag); + nbttagcompound.setTag("GeckoModelData", modelDataTag); + } + } + + @Inject(method = "setItemNBT", at = @At("HEAD"), remap = false) + public void readFromNBT(NBTTagCompound nbttagcompound, CallbackInfo ci){ + if(nbttagcompound.hasKey("GeckoModelData")){ + customNPC_Gecko_Addon$customModelData = new CustomItemModelData(); + customNPC_Gecko_Addon$customModelData.readFromNBT(nbttagcompound.getCompoundTag("GeckoModelData")); + } + } + + @Unique + public CustomItemModelData getCustomModelData(){ + return customNPC_Gecko_Addon$customModelData; + } + + @Override + public void setCustomModelData(CustomItemModelData data) { + customNPC_Gecko_Addon$customModelData = data; + } + + @Unique + public boolean hasCustomModel() { + return customNPC_Gecko_Addon$customModelData!=null; + } +} diff --git a/src/main/resources/mixins.npcgecko.json b/src/main/resources/mixins.npcgecko.json index e16b80a..cb84187 100644 --- a/src/main/resources/mixins.npcgecko.json +++ b/src/main/resources/mixins.npcgecko.json @@ -8,9 +8,12 @@ "mixins": [ "MixinDataDisplay", "MixinGeckoAddon", + "MixinItemScripted", + "MixinScriptCustomItem", "TileScriptedMixin" ], "client": [ + "MixinCustomItemRenderer", "MixinBlockScriptedRenderer", "MixinGeckoAddonClient" ],