From c91590b553e5a01ce60886517ad7d6c20b201bd6 Mon Sep 17 00:00:00 2001 From: craisinlord Date: Thu, 16 Jul 2026 00:04:00 -0500 Subject: [PATCH] started lotus, seashell, giant lilypad, improved krakens grasp --- .../geckolib/animatable/GeoBlockEntity.java | 146 ---------- .../model/DefaultedBlockGeoModel.java | 65 ----- .../bernie/geckolib/model/GeoModel.java | 250 ---------------- .../geckolib/renderer/GeoBlockRenderer.java | 272 ------------------ tmp_extract/Frog.javap.txt | Bin 97376 -> 0 bytes tmp_extract/Frog_full.javap.txt | Bin 97376 -> 0 bytes tmp_extract/ShootTongue.javap.txt | Bin 56346 -> 0 bytes .../FabricBrewingRecipeRegistryBuilder.java | 69 ----- .../common/brewing/BrewingRecipe.java | 48 ---- .../common/brewing/IBrewingRecipe.java | 38 --- .../brewing/RegisterBrewingRecipesEvent.java | 35 --- 11 files changed, 923 deletions(-) delete mode 100644 .tmp/software/bernie/geckolib/animatable/GeoBlockEntity.java delete mode 100644 .tmp/software/bernie/geckolib/model/DefaultedBlockGeoModel.java delete mode 100644 .tmp/software/bernie/geckolib/model/GeoModel.java delete mode 100644 .tmp/software/bernie/geckolib/renderer/GeoBlockRenderer.java delete mode 100644 tmp_extract/Frog.javap.txt delete mode 100644 tmp_extract/Frog_full.javap.txt delete mode 100644 tmp_extract/ShootTongue.javap.txt delete mode 100644 tmp_extract/net/fabricmc/fabric/api/registry/FabricBrewingRecipeRegistryBuilder.java delete mode 100644 tmp_extract/net/neoforged/neoforge/common/brewing/BrewingRecipe.java delete mode 100644 tmp_extract/net/neoforged/neoforge/common/brewing/IBrewingRecipe.java delete mode 100644 tmp_extract/net/neoforged/neoforge/event/brewing/RegisterBrewingRecipesEvent.java diff --git a/.tmp/software/bernie/geckolib/animatable/GeoBlockEntity.java b/.tmp/software/bernie/geckolib/animatable/GeoBlockEntity.java deleted file mode 100644 index 170ed02c..00000000 --- a/.tmp/software/bernie/geckolib/animatable/GeoBlockEntity.java +++ /dev/null @@ -1,146 +0,0 @@ -package software.bernie.geckolib.animatable; - -import net.minecraft.class_1937; -import net.minecraft.class_2586; -import net.minecraft.class_3218; -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; -import software.bernie.geckolib.GeckoLibConstants; -import software.bernie.geckolib.GeckoLibServices; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.AnimationController; -import software.bernie.geckolib.constant.dataticket.SerializableDataTicket; -import software.bernie.geckolib.util.RenderUtil; - -/** - * The {@link GeoAnimatable} interface specific to {@link class_2586 BlockEntities} - * - * @see GeckoLib Wiki - Block Animations - */ -public interface GeoBlockEntity extends GeoAnimatable { - /** - * Get server-synced animation data via its relevant {@link SerializableDataTicket}. - *

- * Should only be used on the client-side - *

- * DO NOT OVERRIDE - * - * @param dataTicket The data ticket for the data to retrieve - * @return The synced data, or null if no data of that type has been synced - */ - @ApiStatus.NonExtendable - @Nullable - default D getAnimData(SerializableDataTicket dataTicket) { - return getAnimatableInstanceCache().getManagerForId(0).getData(dataTicket); - } - - /** - * Saves an arbitrary piece of data to this animatable's {@link AnimatableManager} - *

- * DO NOT OVERRIDE - * - * @param dataTicket The DataTicket to sync the data for - * @param data The data to sync - */ - @ApiStatus.NonExtendable - default void setAnimData(SerializableDataTicket dataTicket, D data) { - class_2586 blockEntity = (class_2586)this; - class_1937 level = blockEntity.method_10997(); - - if (level == null) { - GeckoLibConstants.LOGGER.error("Attempting to set animation data for BlockEntity too early! Must wait until after the BlockEntity has been set in the world. (" + blockEntity.getClass().toString() + ")"); - - return; - } - - if (level.method_8608()) { - getAnimatableInstanceCache().getManagerForId(0).setData(dataTicket, data); - } - else { - GeckoLibServices.NETWORK.syncBlockEntityAnimData(blockEntity.method_11016(), dataTicket, data, (class_3218)level); - } - } - - /** - * Trigger an animation for this BlockEntity, based on the controller name and animation name - *

- * This can be fired from either the client or the server, but optimally you would call it from the server - *

- * DO NOT OVERRIDE - * - * @param controllerName The name of the controller name the animation belongs to, or null to do an inefficient lazy search - * @param animName The name of animation to trigger. This needs to have been registered with the controller via {@link AnimationController#triggerableAnim AnimationController.triggerableAnim} - */ - @ApiStatus.NonExtendable - default void triggerAnim(@Nullable String controllerName, String animName) { - class_2586 blockEntity = (class_2586)this; - class_1937 level = blockEntity.method_10997(); - - if (level == null) { - GeckoLibConstants.LOGGER.error("Attempting to trigger an animation for a BlockEntity too early! Must wait until after the BlockEntity has been set in the world. (" + blockEntity.getClass().toString() + ")"); - - return; - } - - if (level.method_8608()) { - if (controllerName != null) { - getAnimatableInstanceCache().getManagerForId(0).tryTriggerAnimation(controllerName, animName); - } - else { - getAnimatableInstanceCache().getManagerForId(0).tryTriggerAnimation(animName); - } - } - else { - GeckoLibServices.NETWORK.triggerBlockEntityAnim(blockEntity.method_11016(), controllerName, animName, (class_3218)level); - } - } - - /** - * Stop a previously triggered animation for this BlockEntity for the given controller name and animation name - *

- * This can be fired from either the client or the server, but optimally you would call it from the server - *

- * DO NOT OVERRIDE - * - * @param controllerName The name of the controller name the animation belongs to, or null to do an inefficient lazy search - * @param animName The name of the triggered animation to stop, or null to stop any currently playing triggered animation - */ - @ApiStatus.NonExtendable - default void stopTriggeredAnim(@Nullable String controllerName, @Nullable String animName) { - class_2586 blockEntity = (class_2586)this; - class_1937 level = blockEntity.method_10997(); - - if (level == null) { - GeckoLibConstants.LOGGER.error("Attempting to stop a triggered animation for a BlockEntity too early! Must wait until after the BlockEntity has been set in the world. (" + blockEntity.getClass().toString() + ")"); - - return; - } - - if (level.method_8608()) { - AnimatableManager animatableManager = getAnimatableInstanceCache().getManagerForId(0); - - if (controllerName != null) { - animatableManager.stopTriggeredAnimation(controllerName, animName); - } - else { - animatableManager.stopTriggeredAnimation(animName); - } - } - else { - GeckoLibServices.NETWORK.stopTriggeredBlockEntityAnim(blockEntity.method_11016(), (class_3218)level, controllerName, animName); - } - } - - /** - * Returns the current age/tick of the animatable instance - *

- * By default this is just the animatable's age in ticks, but this method allows for non-ticking custom animatables to provide their own values - * - * @param blockEntity The BlockEntity representing this animatable - * @return The current tick/age of the animatable, for animation purposes - */ - @Override - default double getTick(Object blockEntity) { - return RenderUtil.getCurrentTick(); - } -} diff --git a/.tmp/software/bernie/geckolib/model/DefaultedBlockGeoModel.java b/.tmp/software/bernie/geckolib/model/DefaultedBlockGeoModel.java deleted file mode 100644 index 799e55a8..00000000 --- a/.tmp/software/bernie/geckolib/model/DefaultedBlockGeoModel.java +++ /dev/null @@ -1,65 +0,0 @@ -package software.bernie.geckolib.model; - -import net.minecraft.class_2960; -import software.bernie.geckolib.animatable.GeoAnimatable; - -/** - * {@link DefaultedGeoModel} specific to {@link net.minecraft.class_2248 Blocks} - *

- * Using this class pre-sorts provided asset paths into the "block" subdirectory - */ -public class DefaultedBlockGeoModel extends DefaultedGeoModel { - /** - * Create a new instance of this model class - *

- * The asset path should be the truncated relative path from the base folder - *

- * E.G. - *

{@code
-	 * 	new ResourceLocation("myMod", "workbench/sawmill")
-	 * }
- */ - public DefaultedBlockGeoModel(class_2960 assetSubpath) { - super(assetSubpath); - } - - /** - * Returns the subtype string for this type of model - *

- * This allows for sorting of asset files into neat subdirectories for clean management. - */ - @Override - protected String subtype() { - return "block"; - } - - /** - * Changes the constructor-defined model path for this model to an alternate - *

- * This is useful if your animatable shares a model path with another animatable that differs in path to the texture and animations for this model - */ - @Override - public DefaultedBlockGeoModel withAltModel(class_2960 altPath) { - return (DefaultedBlockGeoModel)super.withAltModel(altPath); - } - - /** - * Changes the constructor-defined animations path for this model to an alternate - *

- * This is useful if your animatable shares an animations path with another animatable that differs in path to the model and texture for this model - */ - @Override - public DefaultedBlockGeoModel withAltAnimations(class_2960 altPath) { - return (DefaultedBlockGeoModel)super.withAltAnimations(altPath); - } - - /** - * Changes the constructor-defined texture path for this model to an alternate - *

- * This is useful if your animatable shares a texture path with another animatable that differs in path to the model and animations for this model - */ - @Override - public DefaultedBlockGeoModel withAltTexture(class_2960 altPath) { - return (DefaultedBlockGeoModel)super.withAltTexture(altPath); - } -} diff --git a/.tmp/software/bernie/geckolib/model/GeoModel.java b/.tmp/software/bernie/geckolib/model/GeoModel.java deleted file mode 100644 index 3e17328b..00000000 --- a/.tmp/software/bernie/geckolib/model/GeoModel.java +++ /dev/null @@ -1,250 +0,0 @@ -package software.bernie.geckolib.model; - -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; -import software.bernie.geckolib.GeckoLibConstants; -import software.bernie.geckolib.animatable.GeoAnimatable; -import software.bernie.geckolib.animatable.GeoReplacedEntity; -import software.bernie.geckolib.animation.AnimatableManager; -import software.bernie.geckolib.animation.Animation; -import software.bernie.geckolib.animation.AnimationProcessor; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.cache.GeckoLibCache; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.constant.dataticket.DataTicket; -import software.bernie.geckolib.loading.object.BakedAnimations; -import software.bernie.geckolib.renderer.GeoRenderer; -import software.bernie.geckolib.util.RenderUtil; - -import java.util.Optional; -import java.util.function.BiConsumer; -import java.util.function.DoubleSupplier; -import net.minecraft.class_1297; -import net.minecraft.class_1921; -import net.minecraft.class_2960; -import net.minecraft.class_310; - -/** - * Base class for all code-based model objects - *

- * All models registered to a {@link GeoRenderer} must be an instance of this or one of its subclasses - * - * @see GeckoLib Wiki - Models - */ -public abstract class GeoModel { - private final AnimationProcessor processor = new AnimationProcessor<>(this); - - private BakedGeoModel currentModel = null; - private double animTime; - private double lastGameTickTime; - private long lastRenderedInstance = -1; - - /** - * Returns the resource path for the {@link BakedGeoModel} (model json file) to render based on the provided animatable - */ - public class_2960 getModelResource(T animatable, @Nullable GeoRenderer renderer) { - return getModelResource(animatable); - } - - /** - * Returns the resource path for the {@link BakedGeoModel} (model json file) to render based on the provided animatable - */ - @Deprecated - public abstract class_2960 getModelResource(T animatable); - - /** - * Returns the resource path for the texture file to render based on the provided animatable - */ - public class_2960 getTextureResource(T animatable, @Nullable GeoRenderer renderer) { - return getTextureResource(animatable); - } - - /** - * Returns the resource path for the texture file to render based on the provided animatable - */ - @Deprecated - public abstract class_2960 getTextureResource(T animatable); - - /** - * Returns the resource path for the {@link BakedAnimations} (animation json file) to use for animations based on the provided animatable - */ - public abstract class_2960 getAnimationResource(T animatable); - - /** - * Returns the resource path for the {@link BakedAnimations} (animation json file) fallback locations in the event - * your animation isn't present in the {@link #getAnimationResource(GeoAnimatable) primary resource}. - *

- * Should NOT be used as the primary animation resource path, and in general shouldn't be used - * at all unless you know what you are doing - */ - public class_2960[] getAnimationResourceFallbacks(T animatable) { - return new class_2960[0]; - } - - /** - * Override this and return true if Geckolib should crash when attempting to animate the model, but fails to find a bone - *

- * By default, GeckoLib will just gracefully ignore a missing bone, which might cause oddities with incorrect models or mismatching variables - */ - public boolean crashIfBoneMissing() { - return false; - } - - /** - * Gets the default render type for this animatable, to be selected by default by the renderer using it - * - * @return Return the RenderType to use, or null to prevent the model rendering. Returning null will not prevent animation functions taking place - */ - @Nullable - public class_1921 getRenderType(T animatable, class_2960 texture) { - return class_1921.method_23578(texture); - } - - /** - * Get the baked geo model object used for rendering from the given resource path - */ - public BakedGeoModel getBakedModel(class_2960 location) { - BakedGeoModel model = GeckoLibCache.getBakedModels().get(location); - - if (model == null) { - if (!location.method_12832().contains("geo/")) - throw GeckoLibConstants.exception(location, "Invalid model resource path provided - GeckoLib models must be placed in assets//geo/"); - - throw GeckoLibConstants.exception(location, "Unable to find model"); - } - - if (model != this.currentModel) { - this.processor.setActiveModel(model); - this.currentModel = model; - } - - return this.currentModel; - } - - /** - * Gets a bone from this model by name - * - * @param name The name of the bone - * @return An {@link Optional} containing the {@link software.bernie.geckolib.cache.object.GeoBone} if one matches, otherwise an empty Optional - */ - public Optional getBone(String name) { - return Optional.ofNullable(getAnimationProcessor().getBone(name)); - } - - /** - * Gets the loaded {@link Animation} for the given animation {@code name}, if it exists - * - * @param animatable The {@code GeoAnimatable} instance being referred to - * @param name The name of the animation to retrieve - * @return The {@code Animation} instance for the provided {@code name}, or null if none match - */ - @Nullable - public Animation getAnimation(T animatable, String name) { - class_2960 location = getAnimationResource(animatable); - BakedAnimations bakedAnimations = GeckoLibCache.getBakedAnimations().get(location); - Animation animation = bakedAnimations != null ? bakedAnimations.getAnimation(name) : null; - - if (animation != null) - return animation; - - for (class_2960 fallbackLocation : getAnimationResourceFallbacks(animatable)) { - bakedAnimations = GeckoLibCache.getBakedAnimations().get(location = fallbackLocation); - animation = bakedAnimations != null ? bakedAnimations.getAnimation(name) : null; - - if (animation != null) - return animation; - } - - if (bakedAnimations == null) { - if (!location.method_12832().contains("animations/")) - throw GeckoLibConstants.exception(location, "Invalid animation resource path provided - GeckoLib animations must be placed in assets//animations/"); - - throw GeckoLibConstants.exception(location, "Unable to find animation file."); - } - - return null; - } - - /** - * Gets the {@link AnimationProcessor} for this model. - */ - public AnimationProcessor getAnimationProcessor() { - return this.processor; - } - - /** - * Add additional {@link DataTicket DataTickets} to the {@link AnimationState} to be handled by your animation handler at render time - * - * @param animatable The animatable instance currently being animated - * @param instanceId The unique instance id of the animatable being animated - * @param dataConsumer The DataTicket + data consumer to be added to the AnimationEvent - */ - public void addAdditionalStateData(T animatable, long instanceId, BiConsumer, T> dataConsumer) {} - - /** - * This method is called once per render-frame for each {@link GeoAnimatable} being rendered - *

- * It is an internal method for automated animation parsing. Use {@link GeoModel#setCustomAnimations(GeoAnimatable, long, AnimationState)} for custom animation work - */ - @ApiStatus.Internal - public void handleAnimations(T animatable, long instanceId, AnimationState animationState, float partialTick) { - class_310 mc = class_310.method_1551(); - AnimatableManager animatableManager = animatable.getAnimatableInstanceCache().getManagerForId(instanceId); - Double currentTick = animationState.getData(DataTickets.TICK); - - if (currentTick == null) - currentTick = animatable instanceof class_1297 entity ? (double)entity.field_6012 : RenderUtil.getCurrentTick(); - - if (animatableManager.getFirstTickTime() == -1) - animatableManager.startedAt(currentTick + partialTick); - - double currentFrameTime = animatable instanceof class_1297 || animatable instanceof GeoReplacedEntity ? currentTick + partialTick : currentTick - animatableManager.getFirstTickTime(); - boolean isReRender = !animatableManager.isFirstTick() && currentFrameTime == animatableManager.getLastUpdateTime(); - - if (isReRender && instanceId == this.lastRenderedInstance) - return; - - if (!mc.method_1493() || animatable.shouldPlayAnimsWhileGamePaused()) { - animatableManager.updatedAt(currentFrameTime); - - double lastUpdateTime = animatableManager.getLastUpdateTime(); - this.animTime += lastUpdateTime - this.lastGameTickTime; - this.lastGameTickTime = lastUpdateTime; - } - - animationState.animationTick = this.animTime; - this.lastRenderedInstance = instanceId; - AnimationProcessor processor = getAnimationProcessor(); - - processor.preAnimationSetup(animationState, this.animTime); - - if (!processor.getRegisteredBones().isEmpty()) - processor.tickAnimation(animatable, this, animatableManager, this.animTime, animationState, crashIfBoneMissing()); - - setCustomAnimations(animatable, instanceId, animationState); - } - - /** - * This method is called once per render-frame for each {@link GeoAnimatable} being rendered - *

- * Override to set custom animations (such as head rotation, etc) - * - * @param animatable The {@code GeoAnimatable} instance currently being rendered - * @param instanceId The instance id of the {@code GeoAnimatable} - * @param animationState An {@link AnimationState} instance created to hold animation data for the {@code animatable} for this method call - */ - public void setCustomAnimations(T animatable, long instanceId, AnimationState animationState) {} - - /** - * This method is called once per render-frame for each {@link GeoAnimatable} being rendered - *

- * Use this method to set custom {@link software.bernie.geckolib.loading.math.value.Variable Variable} values via - * {@link software.bernie.geckolib.loading.math.MathParser#setVariable(String, DoubleSupplier) MathParser.setVariable} - * - * @param animationState The AnimationState data for the current render frame - * @param animTime The internal tick counter kept by the {@link AnimatableManager manager} for this animatable - */ - public void applyMolangQueries(AnimationState animationState, double animTime) {} -} diff --git a/.tmp/software/bernie/geckolib/renderer/GeoBlockRenderer.java b/.tmp/software/bernie/geckolib/renderer/GeoBlockRenderer.java deleted file mode 100644 index 2f8bfa7d..00000000 --- a/.tmp/software/bernie/geckolib/renderer/GeoBlockRenderer.java +++ /dev/null @@ -1,272 +0,0 @@ -package software.bernie.geckolib.renderer; - -import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; -import org.joml.Vector3f; -import software.bernie.geckolib.GeckoLibServices; -import software.bernie.geckolib.animatable.GeoAnimatable; -import software.bernie.geckolib.animation.AnimationState; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.cache.texture.AnimatableTexture; -import software.bernie.geckolib.constant.DataTickets; -import software.bernie.geckolib.model.DefaultedBlockGeoModel; -import software.bernie.geckolib.model.GeoModel; -import software.bernie.geckolib.renderer.layer.GeoRenderLayer; -import software.bernie.geckolib.renderer.layer.GeoRenderLayersContainer; -import software.bernie.geckolib.util.RenderUtil; - -import java.util.List; -import net.minecraft.class_1921; -import net.minecraft.class_2318; -import net.minecraft.class_2338; -import net.minecraft.class_2350; -import net.minecraft.class_2383; -import net.minecraft.class_2586; -import net.minecraft.class_2591; -import net.minecraft.class_2680; -import net.minecraft.class_4587; -import net.minecraft.class_4588; -import net.minecraft.class_4597; -import net.minecraft.class_7833; -import net.minecraft.class_7923; -import net.minecraft.class_827; - -/** - * Base {@link GeoRenderer} class for rendering {@link class_2586 Blocks} specifically - *

- * All blocks added to be rendered by GeckoLib should use an instance of this class. - */ -public class GeoBlockRenderer implements GeoRenderer, class_827 { - protected final GeoRenderLayersContainer renderLayers = new GeoRenderLayersContainer<>(this); - protected final GeoModel model; - - protected T animatable; - protected float scaleWidth = 1; - protected float scaleHeight = 1; - - protected Matrix4f blockRenderTranslations = new Matrix4f(); - protected Matrix4f modelRenderTranslations = new Matrix4f(); - - /** - * Creates a new defaulted renderer instance, using the blockentity's registered id as the file name for its assets - */ - public GeoBlockRenderer(class_2591 blockEntityType) { - this(new DefaultedBlockGeoModel<>(class_7923.field_41181.method_10221(blockEntityType))); - } - - public GeoBlockRenderer(GeoModel model) { - this.model = model; - } - - /** - * Gets the model instance for this renderer - */ - @Override - public GeoModel getGeoModel() { - return this.model; - } - - /** - * Gets the {@link GeoAnimatable} instance currently being rendered - */ - @Override - public T getAnimatable() { - return this.animatable; - } - - /** - * Gets the id that represents the current animatable's instance for animation purposes - *

- * This is mostly useful for things like items, which have a single registered instance for all objects - */ - @Override - public long getInstanceId(T animatable) { - return animatable.method_11016().hashCode(); - } - - /** - * Returns the list of registered {@link GeoRenderLayer GeoRenderLayers} for this renderer - */ - @Override - public List> getRenderLayers() { - return this.renderLayers.getRenderLayers(); - } - - /** - * Adds a {@link GeoRenderLayer} to this renderer, to be called after the main model is rendered each frame - */ - public GeoBlockRenderer addRenderLayer(GeoRenderLayer renderLayer) { - this.renderLayers.addLayer(renderLayer); - - return this; - } - - /** - * Sets a scale override for this renderer, telling GeckoLib to pre-scale the model - */ - public GeoBlockRenderer withScale(float scale) { - return withScale(scale, scale); - } - - /** - * Sets a scale override for this renderer, telling GeckoLib to pre-scale the model - */ - public GeoBlockRenderer withScale(float scaleWidth, float scaleHeight) { - this.scaleWidth = scaleWidth; - this.scaleHeight = scaleHeight; - - return this; - } - - /** - * Called before rendering the model to buffer. Allows for render modifications and preparatory work such as scaling and translating - *

- * {@link class_4587} translations made here are kept until the end of the render process - */ - @Override - public void preRender(class_4587 poseStack, T animatable, BakedGeoModel model, @Nullable class_4597 bufferSource, @Nullable class_4588 buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int colour) { - this.blockRenderTranslations = new Matrix4f(poseStack.method_23760().method_23761()); - - if (!isReRender) - poseStack.method_22904(0.5, 0, 0.5); - - scaleModelForRender(this.scaleWidth, this.scaleHeight, poseStack, animatable, model, isReRender, partialTick, packedLight, packedOverlay); - } - - @Override - @ApiStatus.Internal - public void method_3569(T animatable, float partialTick, class_4587 poseStack, class_4597 bufferSource, - int packedLight, int packedOverlay) { - this.animatable = animatable; - - defaultRender(poseStack, this.animatable, bufferSource, null, null, 0, partialTick, packedLight); - } - - /** - * The actual render method that subtype renderers should override to handle their specific rendering tasks - *

- * {@link GeoRenderer#preRender} has already been called by this stage, and {@link GeoRenderer#postRender} will be called directly after - */ - @Override - public void actuallyRender(class_4587 poseStack, T animatable, BakedGeoModel model, @Nullable class_1921 renderType, - class_4597 bufferSource, @Nullable class_4588 buffer, boolean isReRender, float partialTick, int packedLight, - int packedOverlay, int colour) { - if (!isReRender) { - AnimationState animationState = new AnimationState(animatable, 0, 0, partialTick, false); - long instanceId = getInstanceId(animatable); - GeoModel currentModel = getGeoModel(); - - animationState.setData(DataTickets.TICK, animatable.getTick(animatable)); - animationState.setData(DataTickets.BLOCK_ENTITY, animatable); - currentModel.addAdditionalStateData(animatable, instanceId, animationState::setData); - rotateBlock(getFacing(animatable), poseStack); - currentModel.handleAnimations(animatable, instanceId, animationState, partialTick); - } - - this.modelRenderTranslations = new Matrix4f(poseStack.method_23760().method_23761()); - - if (buffer != null) - GeoRenderer.super.actuallyRender(poseStack, animatable, model, renderType, bufferSource, buffer, isReRender, partialTick, - packedLight, packedOverlay, colour); - } - - /** - * Called after all render operations are completed and the render pass is considered functionally complete. - *

- * Use this method to clean up any leftover persistent objects stored during rendering or any other post-render maintenance tasks as required - */ - @Override - public void doPostRenderCleanup() { - this.animatable = null; - } - - /** - * Renders the provided {@link GeoBone} and its associated child bones - */ - @Override - public void renderRecursively(class_4587 poseStack, T animatable, GeoBone bone, class_1921 renderType, class_4597 bufferSource, class_4588 buffer, boolean isReRender, float partialTick, int packedLight, - int packedOverlay, int colour) { - if (bone.isTrackingMatrices()) { - Matrix4f poseState = new Matrix4f(poseStack.method_23760().method_23761()); - Matrix4f localMatrix = RenderUtil.invertAndMultiplyMatrices(poseState, this.blockRenderTranslations); - Matrix4f worldState = new Matrix4f(localMatrix); - class_2338 pos = this.animatable.method_11016(); - - bone.setModelSpaceMatrix(RenderUtil.invertAndMultiplyMatrices(poseState, this.modelRenderTranslations)); - bone.setLocalSpaceMatrix(localMatrix); - bone.setWorldSpaceMatrix(worldState.translate(new Vector3f(pos.method_10263(), pos.method_10264(), pos.method_10260()))); - } - - GeoRenderer.super.renderRecursively(poseStack, animatable, bone, renderType, bufferSource, buffer, isReRender, partialTick, packedLight, packedOverlay, - colour); - } - - /** - * Rotate the {@link class_4587} based on the determined {@link class_2350} the block is facing - */ - protected void rotateBlock(class_2350 facing, class_4587 poseStack) { - switch (facing) { - case field_11035 -> poseStack.method_22907(class_7833.field_40716.rotationDegrees(180)); - case field_11039 -> poseStack.method_22907(class_7833.field_40716.rotationDegrees(90)); - case field_11043 -> poseStack.method_22907(class_7833.field_40716.rotationDegrees(0)); - case field_11034 -> poseStack.method_22907(class_7833.field_40716.rotationDegrees(270)); - case field_11036 -> poseStack.method_22907(class_7833.field_40714.rotationDegrees(90)); - case field_11033 -> poseStack.method_22907(class_7833.field_40713.rotationDegrees(90)); - } - } - - /** - * Attempt to extract a direction from the block so that the model can be oriented correctly - */ - protected class_2350 getFacing(T block) { - class_2680 blockState = block.method_11010(); - - if (blockState.method_28498(class_2383.field_11177)) - return blockState.method_11654(class_2383.field_11177); - - if (blockState.method_28498(class_2318.field_10927)) - return blockState.method_11654(class_2318.field_10927); - - return class_2350.field_11043; - } - - /** - * Update the current frame of a {@link AnimatableTexture potentially animated} texture used by this GeoRenderer - *

- * This should only be called immediately prior to rendering - * - * @see AnimatableTexture#setAndUpdate - */ - @Override - public void updateAnimatedTextureFrame(T animatable) { - AnimatableTexture.setAndUpdate(getTextureLocation(animatable)); - } - - /** - * Create and fire the relevant {@code CompileLayers} event hook for this renderer - */ - @Override - public void fireCompileRenderLayersEvent() { - GeckoLibServices.Client.EVENTS.fireCompileBlockRenderLayers(this); - } - - /** - * Create and fire the relevant {@code Pre-Render} event hook for this renderer - * - * @return Whether the renderer should proceed based on the cancellation state of the event - */ - @Override - public boolean firePreRenderEvent(class_4587 poseStack, BakedGeoModel model, class_4597 bufferSource, float partialTick, int packedLight) { - return GeckoLibServices.Client.EVENTS.fireBlockPreRender(this, poseStack, model, bufferSource, partialTick, packedLight); - } - - /** - * Create and fire the relevant {@code Post-Render} event hook for this renderer - */ - @Override - public void firePostRenderEvent(class_4587 poseStack, BakedGeoModel model, class_4597 bufferSource, float partialTick, int packedLight) { - GeckoLibServices.Client.EVENTS.fireBlockPostRender(this, poseStack, model, bufferSource, partialTick, packedLight); - } -} diff --git a/tmp_extract/Frog.javap.txt b/tmp_extract/Frog.javap.txt deleted file mode 100644 index 5d6a49fba124871d2071e963fb7ef789613f85de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97376 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 E56d-Ood5s; diff --git a/tmp_extract/net/fabricmc/fabric/api/registry/FabricBrewingRecipeRegistryBuilder.java b/tmp_extract/net/fabricmc/fabric/api/registry/FabricBrewingRecipeRegistryBuilder.java deleted file mode 100644 index 88084cd5..00000000 --- a/tmp_extract/net/fabricmc/fabric/api/registry/FabricBrewingRecipeRegistryBuilder.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2016, 2017, 2018, 2019 FabricMC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package net.fabricmc.fabric.api.registry; - -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import net.minecraft.class_1792; -import net.minecraft.class_1842; -import net.minecraft.class_1845; -import net.minecraft.class_1856; -import net.minecraft.class_6880; -import net.minecraft.class_7699; - -/** - * An extension of {@link class_1845.class_9665} to support ingredients. - */ -public interface FabricBrewingRecipeRegistryBuilder { - /** - * An event that is called when the brewing recipe registry is being built. - */ - Event BUILD = EventFactory.createArrayBacked(FabricBrewingRecipeRegistryBuilder.BuildCallback.class, listeners -> builder -> { - for (FabricBrewingRecipeRegistryBuilder.BuildCallback listener : listeners) { - listener.build(builder); - } - }); - - default void registerItemRecipe(class_1792 input, class_1856 ingredient, class_1792 output) { - throw new AssertionError("Must be implemented via interface injection"); - } - - default void registerPotionRecipe(class_6880 input, class_1856 ingredient, class_6880 output) { - throw new AssertionError("Must be implemented via interface injection"); - } - - default void registerRecipes(class_1856 ingredient, class_6880 potion) { - throw new AssertionError("Must be implemented via interface injection"); - } - - default class_7699 getEnabledFeatures() { - throw new AssertionError("Must be implemented via interface injection"); - } - - /** - * Use this event to register custom brewing recipes. - */ - @FunctionalInterface - interface BuildCallback { - /** - * Called when the brewing recipe registry is being built. - * - * @param builder the {@link class_1845} instance - */ - void build(class_1845.class_9665 builder); - } -} diff --git a/tmp_extract/net/neoforged/neoforge/common/brewing/BrewingRecipe.java b/tmp_extract/net/neoforged/neoforge/common/brewing/BrewingRecipe.java deleted file mode 100644 index 48015c2b..00000000 --- a/tmp_extract/net/neoforged/neoforge/common/brewing/BrewingRecipe.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.common.brewing; - -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; - -public class BrewingRecipe implements IBrewingRecipe { - private final Ingredient input; - private final Ingredient ingredient; - private final ItemStack output; - - public BrewingRecipe(Ingredient input, Ingredient ingredient, ItemStack output) { - this.input = input; - this.ingredient = ingredient; - this.output = output; - } - - @Override - public boolean isInput(ItemStack stack) { - return this.input.test(stack); - } - - @Override - public ItemStack getOutput(ItemStack input, ItemStack ingredient) { - return isInput(input) && isIngredient(ingredient) ? getOutput().copy() : ItemStack.EMPTY; - } - - public Ingredient getInput() { - return input; - } - - public Ingredient getIngredient() { - return ingredient; - } - - public ItemStack getOutput() { - return output; - } - - @Override - public boolean isIngredient(ItemStack ingredient) { - return this.ingredient.test(ingredient); - } -} diff --git a/tmp_extract/net/neoforged/neoforge/common/brewing/IBrewingRecipe.java b/tmp_extract/net/neoforged/neoforge/common/brewing/IBrewingRecipe.java deleted file mode 100644 index c8a113c4..00000000 --- a/tmp_extract/net/neoforged/neoforge/common/brewing/IBrewingRecipe.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.common.brewing; - -import static net.minecraft.world.item.alchemy.PotionBrewing.Builder; - -import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.event.brewing.RegisterBrewingRecipesEvent; - -/** - * Interface for more flexible brewing recipes. - * - *

Register using {@link RegisterBrewingRecipesEvent} and {@link Builder#addRecipe(IBrewingRecipe)}. - */ -public interface IBrewingRecipe { - /** - * Returns true is the passed ItemStack is an input for this recipe. "Input" - * being the item that goes in one of the three bottom slots of the brewing - * stand (e.g: water bottle) - */ - boolean isInput(ItemStack input); - - /** - * Returns true if the passed ItemStack is an ingredient for this recipe. - * "Ingredient" being the item that goes in the top slot of the brewing - * stand (e.g: nether wart) - */ - boolean isIngredient(ItemStack ingredient); - - /** - * Returns the output when the passed input is brewed with the passed - * ingredient. Empty if invalid input or ingredient. - */ - ItemStack getOutput(ItemStack input, ItemStack ingredient); -} diff --git a/tmp_extract/net/neoforged/neoforge/event/brewing/RegisterBrewingRecipesEvent.java b/tmp_extract/net/neoforged/neoforge/event/brewing/RegisterBrewingRecipesEvent.java deleted file mode 100644 index 669e61ce..00000000 --- a/tmp_extract/net/neoforged/neoforge/event/brewing/RegisterBrewingRecipesEvent.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) NeoForged and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.neoforged.neoforge.event.brewing; - -import net.minecraft.core.RegistryAccess; -import net.minecraft.world.item.alchemy.PotionBrewing; -import net.neoforged.bus.api.Event; -import org.jetbrains.annotations.ApiStatus; - -/** - * Event to register new brewing recipes. - * - *

Fired on both client and server side, on the main event bus. - */ -public class RegisterBrewingRecipesEvent extends Event { - private final PotionBrewing.Builder builder; - private final RegistryAccess registryAccess; - - @ApiStatus.Internal - public RegisterBrewingRecipesEvent(PotionBrewing.Builder builder, RegistryAccess registryAccess) { - this.builder = builder; - this.registryAccess = registryAccess; - } - - public PotionBrewing.Builder getBuilder() { - return builder; - } - - public RegistryAccess getRegistryAccess() { - return registryAccess; - } -}