Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

SirLovealot

11
Posts
3
Topics
1
Followers
30
Following
A member registered Jun 28, 2020

Recent community posts

(1 edit)

Yes, just look for that line and simply comment it out. In case you want to restore it later. For me it worked well, and if it also works without it, that’s fine too. Especially in connection with my Farming Plugin from DSI I tinkered around with it. Give it a try. Maybe I also mixed something up: also try this fix I still have up my sleeve AND that ist only fix I actually use and it works for me:

//const _Scene_Boot_isReady = Scene_Boot.prototype.isReady;

//Scene_Boot.prototype.isReady = function () {

    // Make sure preloaded images are ready

  //  if (enablePreload) {

        // Check preload status

    //    const status = PermanentImageCache.getLoadingStatus();

      //  if (status.total > 0 && status.loaded + status.failed < status.total) {

        //    return false;

        //}

    //}

    //return _Scene_Boot_isReady.call(this);

//};

// === SF Safe Preload Hook (replaces the old isReady hook) ===================

// Purpose:

//  - Waits until the Hendrix preloader is finished (loaded+failed == total).

//  - Prevents infinite loops when files are missing or status gets stuck.

//  - Logs cleanly if a timeout occurs.

//

// Usage:

//  - Comment out the old block.

//  - Insert this block below.

//  - Can be used unchanged with your enablePreload flag.

// ============================================================================

const _Scene_Boot_isReady = Scene_Boot.prototype.isReady;

Scene_Boot.prototype.isReady = function () {

    try {

        // Only check if preload is enabled and the cache API exists

        if (typeof enablePreload !== "undefined" && enablePreload &&

            window.PermanentImageCache && typeof PermanentImageCache.getLoadingStatus === "function") {

            // Query status robustly (in case Hendrix’ method crashes)

            let status = { total: 0, loaded: 0, failed: 0 };

            try {

                const s = PermanentImageCache.getLoadingStatus();

                if (s && Number.isFinite(s.total) && Number.isFinite(s.loaded) && Number.isFinite(s.failed)) {

                    status = s;

                }

            } catch (e) {

                // If status cannot be read, continue boot but log once

                if (!this._sfPreloadLoggedStatusError) {

                    console.warn("[SF Preload] getLoadingStatus() threw an exception. Continuing boot.", e);

                    this._sfPreloadLoggedStatusError = true;

                }

                return _Scene_Boot_isReady.call(this);

            }

            // If there’s nothing to load → continue directly

            if (status.total <= 0) {

                return _Scene_Boot_isReady.call(this);

            }

            // Check progress

            const done = status.loaded + status.failed;

            const total = status.total;

            // Initialize progress tracker

            if (this._sfPreloadLastDone == null) this._sfPreloadLastDone = -1;

            if (this._sfPreloadStallFrames == null) this._sfPreloadStallFrames = 0;

            // If progress was made → reset stall counter

            if (done !== this._sfPreloadLastDone) {

                this._sfPreloadLastDone = done;

                this._sfPreloadStallFrames = 0;

            } else {

                // No progress this frame → increase stall counter

                this._sfPreloadStallFrames++;

            }

            // Maximum allowed wait frames (≈5 seconds at 60 FPS)

            const MAX_STALL_FRAMES = 300;

            // Not finished yet?

            if (done < total) {

                // As long as we see progress or are below timeout → wait

                if (this._sfPreloadStallFrames < MAX_STALL_FRAMES) {

                    return false; // Scene not ready yet

                } else {

                    // Timeout: continue anyway, but log a warning

                    if (!this._sfPreloadTimedOutOnce) {

                        console.warn(

                            `[SF Preload] Timeout after ${MAX_STALL_FRAMES} frames. `

                            + `Progress: ${done}/${total} (failed: ${status.failed}). `

                            + `Starting scene anyway.`

                        );

                        this._sfPreloadTimedOutOnce = true;

                    }

                    // Falls through and lets Scene_Boot continue normally

                }

            }

            // Finished (done >= total) → continue normally

        }

    } catch (err) {

        // If something unexpected happens here, don’t block boot

        console.warn("[SF Preload] Unexpected error in boot hook. Continuing.", err);

    }

    return _Scene_Boot_isReady.call(this);

};

// ============================================================================

// End SF Safe Preload Hook

other question: Do you use this plugin? https://qiujiu.itch.io/qj-mapprojectilemz I think it can collide hard with Hendrix plugins.

I think itch caused some formatting errors here.
Check the other post: https://itch.io/t/5210497/answered-plugin-incompatibily-fix

there I shared the plugin for free on my Google Drive account regarding your request.
Just give it a try and see if it helps you, and please let me know if it worked.

(1 edit)

Here are the two scripts on Google Drive:
https://drive.google.com/drive/folders/1Lx3_1KdHMz1DUMJA8kxnrLIpAF6N3KBw?usp=sharing

Compat_DotMove_PKD_DotMove.js fixes "TypeError: character.centerRealX is not a function" by adding the missing centerRealX/centerRealY at runtime. No parameters required. Load it after DotMoveSystem & PKD_PocketEvents. Both before HendrixPlugins.

About the plugin SF_CharFrameGuard_MZ.js:
Activate it in the Plugin Manager below Hendrix_Animation_Solution / Hendrix_Action_Engine.
I can’t say how it works together with QJprojectiles since I don’t use it – I stick to the Hendrix ecosystem. But you can give it a try.

All plugins are free to use. Feel free to modify or adapt them however you like, also for commercial projects. I’d appreciate a credit, but it’s not mandatory. If you want, you can also send me a copy of your game as a thank you if it helped you.

The comments in the script are unfortunately in German, but I’ll translate them into English once I have time. Have fun with it, and I hope it solves your problem as it did for me.

Just as additional context:
I was able to reproduce this issue reliably on different Linux-based systems (Garuda Linux, CachyOS/Arch, and also Debian-based Linux Mint). Unfortunately, I cannot judge how it behaves under Microsoft Windows or macOS.

It might depend on my hardware configuration or possibly on using an NVIDIA graphics card with the respective driver – I can’t fully confirm that, but it’s worth keeping in mind.

So, even if the bug does not occur on every setup, it is reproducible under certain environments. Perhaps this information could be forwarded to the user who had the same issue in the browser. They can simply try my small fix script to see if it solves the problem for them as well.

(1 edit)

Hello, I’m using your Hendrix Action/Animation System in a project and ran into two important issues.

I wrote my own fix plugins to solve them and would like to share the results with you.

1. Rendering Bug – “Fullsheet Flash”

Issue:
On the very first movement start (Idle → Walk/Run, or any sprite change), the engine shows the entire spritesheet for exactly 1 frame before the correct animation frame appears.
After that, everything works fine until the next graphic switch.

Cause:
When a new bitmap is ready, updateFrame has not yet applied a valid rectangle, so PIXI draws the full bitmap once.

Fix:
I wrote a small guard that prevents invalid rectangles from ever reaching the screen:

  • If the current rect is invalid (0×0 or full bitmap), reuse the last valid rect, or skip rendering for that tick.

  • After every updateFrame, the last valid rect is remembered.

  • No changes to your frame logic, fully compatible with Idle/Walk/Run, 8-dir, _fX.

Result:
The fullsheet flash never appears again. Characters always show the correct frame immediately.
Worst case = sprite invisible for 1 tick (instead of flashing).

External Fix Plugin (ready to use):

/*:  * @target MZ  * @plugindesc [v1.0] Prevents 1-frame fullsheet flash at movement start by guarding invalid frames in render step. Compatible with Hendrix system.  * @author Emanuel Allescher */  (() => {   "use strict";    function isBitmapReady(sprite) {     return sprite && sprite.bitmap && sprite.bitmap.isReady && sprite.bitmap.isReady();   }   function currentRect(sprite) {     if (!sprite || !sprite._frame) return null;     const f = sprite._frame;     return { x: f.x|0, y: f.y|0, width: f.width|0, height: f.height|0 };   }   function isValidNonFullRect(sprite, rect) {     if (!sprite || !sprite.bitmap || !rect) return false;     const w = rect.width|0, h = rect.height|0;     if (w <= 0 || h <= 0) return false;     const bw = sprite.bitmap.width|0, bh = sprite.bitmap.height|0;     if (bw > 0 && bh > 0 && w === bw && h === bh) return false; // fullsheet     return true;   }    const _Sprite_Character_updateFrame = Sprite_Character.prototype.updateFrame;   Sprite_Character.prototype.updateFrame = function() {     _Sprite_Character_updateFrame.call(this);     if (!isBitmapReady(this)) return;     const rect = currentRect(this);     if (isValidNonFullRect(this, rect)) {       this._sf_lastValidRect = rect;     }   };    const _Sprite_Character_setCharacterBitmap = Sprite_Character.prototype.setCharacterBitmap;   Sprite_Character.prototype.setCharacterBitmap = function() {     _Sprite_Character_setCharacterBitmap.call(this);     this._sf_lastValidRect = null;   };    const _Sprite_Character__render = Sprite_Character.prototype._render;   Sprite_Character.prototype._render = function(renderer) {     if (!isBitmapReady(this)) return;     const rect = currentRect(this);     if (!isValidNonFullRect(this, rect)) {       if (this._sf_lastValidRect) {         const r = this._sf_lastValidRect;         this.setFrame(r.x, r.y, r.width, r.height);       } else {         return; // skip this tick       }     }     _Sprite_Character__render.call(this, renderer);   };  })();

2. Preloader Bug – getLoadingStatus

Issue:
In Hendrix_Animation_Solution.js, the class PermanentImageCache defines:

static getLoadingStatus() {     return { .this._loadingStatus }; // ❌ invalid syntax } 

This breaks preload checks in Scene_Boot.isReady.

Fix:
It should safely return an object with totals:

static getLoadingStatus() {     const s = this._loadingStatus || { total:0, loaded:0, failed:0 };     return {         total: s.total | 0,         loaded: s.loaded | 0,         failed: s.failed | 0     }; } 

Result:

  • Scene_Boot.isReady no longer hangs when preload is active.

  • Boot waits correctly until all images are loaded or failed.

Summary

  • Problem 1 (Rendering): 1-frame “fullsheet flash” → fixed by guarding invalid frames.

  • Problem 2 (Preloader): getLoadingStatus() invalid → fixed by returning proper object.

Both fixes can be integrated directly into Hendrix_Animation_Solution.js.
For now, I’m sharing my external patch plugin (SF_CharFrameGuard_MZ.js) in case others need a quick solution.

Thanks again for your great work on this plugin – I hope these notes help improve it further!

(1 edit)

Hello SangHendrix,
While working on my project, I noticed that there are plugin incompatibilities – specifically between the DotMovePlugin and the third-party plugin Pocket Events/MapInventory by PhoenixKagedesu.
I created a plugin that catches the error TypeError: character.centerRealX is not a function and allows both to work together harmoniously.
If you’re interested, I’d be happy to send you the plugin file.
You can offer it yourself if you want, but I’d also be glad to host it. I’m not looking for any money – I just want to give something back to the community.

Ah thank you! But when I opened Tutorial 10 from https://rpgmakeractioncombatmanual.blogspot.com/p/all-tutorials.html I get a blank site.

How can I set up the right stick to use as mouse? I like to use it for aiming with the gun

(1 edit)

Well, I have unpacked the files. A few of them can be opened with an image viewer, and I can usually see the image file as a preview image in the file browser. If I want to open the broken files, nothing is displayed, whether I open it with an image viewer, browser or GIMP. The last also indicates that it is not a PNG format. 

EDIT: Under Windows 10 its working. Btw nice Set! <3 Before I tried this in Linux Mint.

I purchased this awesome Spaceship Tileset, but many files are broken. The PNG has an error.  Please fit it. :)

Do you have the amazing Spaceshipgraphics around the example maps? That would give the map a nice immersion in the final game