HeroWarsHelper

Automation of actions for the game Hero Wars

< 腳本HeroWarsHelper的回應

提問/評論

§
發表於:2025-05-21

> "we detected an abnormal speed in dungeon" etc.

looks like those scumbag devs at Nexter have made another change to the game now in the dungeon I get this warning EVERY time and it interrupts everything

is there any setting or value we can change to avoid this message?

orb
§
發表於:2025-05-21
編輯:2025-05-21

I also got this issue, but it's not permanent. it fixes itself after refresh. There's some inconsistency between how the script stores oracle cards and how the game views them. The script tries to skip a battle using an oracle card but for some reason the game doesn't register them. If you look in the logs, it will show something like "countcard 15", but then "Cards 0", when you do a refresh and click dungeon again it's fixed

§
發表於:2025-05-21

wait "log"? I dont have a log (I have "do all" "actions" "others" "Toe" "dungeon" "adv" "raid" "rewards" "guild war" "quests" and "sync" but for me no log) should there be a log button?

orb
§
發表於:2025-05-21

press F12 to open the console. there are logs there.

§
發表於:2025-05-27

so any workaround? those scumbag devs keep giving that message (and refresh dont work)

ZingerY作者
§
發表於:2025-05-27

what do you use?

§
發表於:2025-05-27

browser? Firefox
its on a old laptop 2 core intel

§
發表於:2025-06-01

so anyway way to bypass this msg? I still get it all the time especially in Dungeon it's like every 10 titanite I get it

those devs really are human garbage
I told these scumbags what I think of them (on their social page they cant censor me there hehehe)

orb
§
發表於:2025-06-01

I have a workaround, it doesn't fix the core issue (some inconsistency with oracle card calculations) but it prevents the dungeon from stopping by setting the cards to 0 and trying again. I can't test this currently but it should be fine, let me know how it goes. import this script with tampermonkey (save the text below as a .js file):

// ==UserScript==
// @name            fixoraclecards
// @name:en         fixoraclecards
// @name:ru         fixoraclecards
// @namespace       fixoraclecards
// @version         0.0.12
// @description     fixoraclecards for HeroWarsHelper script
// @description:en  fixoraclecards for HeroWarsHelper script
// @description:ru  fixoraclecards для скрипта HeroWarsHelper
// @author          ZingerY
// @license         Copyright ZingerY
// @homepage        https://zingery.ru/scripts/HWHBestDungeonExt.user.js
// @icon            https://zingery.ru/scripts/VaultBoyIco16.ico
// @icon64          https://zingery.ru/scripts/VaultBoyIco64.png
// @match           https://www.hero-wars.com/*
// @match           https://apps-1701433570146040.apps.fbsbx.com/*
// @run-at          document-start
// ==/UserScript==

(function () {
    if (!this.HWHClasses) {
        console.log('%cObject for extension not found', 'color: red');
        return;
    }
    if (!this.HWHData) {
        console.log('HWHData not found');
    } else {console.log('HWHDataLoaded')}

    console.log('%cStart Extension ' + GM_info.script.name + ', v' + GM_info.script.version + ' by ' + GM_info.script.author, 'color: red');
    const { addExtentionName } = HWHFuncs;
    addExtentionName(GM_info.script.name, GM_info.script.version, GM_info.script.author);

    const {

        getInput,
        setProgress,
        hideProgress,
        I18N,
        send,
        getTimer,
        countdownTimer,
        getUserInfo,
        getSaveVal,
        setSaveVal,
        popup,
        setIsCancalBattle,
        random,
        endBattle,
        EventEmitterMixin,
    } = HWHFuncs;


    endBattle = async function (battleInfo) {
        if (battleInfo.result.win) {
            const args = {
                result: battleInfo.result,
                progress: battleInfo.progress,
            }
            if (HWHData.countPredictionCard > 0) {
                args.isRaid = true;
            } else {
                const timer = getTimer(battleInfo.battleTime);
                console.log(timer);
                await countdownTimer(timer, `${I18N('DUNGEON')}: ${I18N('TITANIT')} ${dungeonActivity}/${maxDungeonActivity} ${talentMsg}`);
            }
            const calls = [{
                name: "dungeonEndBattle",
                args,
                ident: "body"
            }];
            lastDungeonBattleData = null;
            try {send(JSON.stringify({ calls }), resultEndBattle);}
            catch(e) {// Check if error contains "abnormal speed" or "NotAvailable in dungeonEndBattle"
                    if (e.message.includes("abnormal speed") || e.message.includes("NotAvailable in dungeonEndBattle")) {
                        console.warn("Server detected fast dungeon completion, retrying without raid...");
                        HWHData.countPredictionCard = 0; delete args.isRaid; endBattle(battleInfo)}

         else {
            endDungeon('dungeonEndBattle win: false\n', battleInfo);
        } }}
    }
    this.HWHFuncs.endBattle = endBattle;



    })();
orb
§
發表於:2025-06-01
編輯:2025-06-01

sorry, there is a mistake it the previous file I sentand for some reason greasyfork doesn't let me edit/delete the comment, here is the updated script:

// ==UserScript==
// @name            fixoraclecards
// @name:en         fixoraclecards
// @name:ru         fixoraclecards
// @namespace       fixoraclecards
// @version         0.0.12
// @description     fixoraclecards for HeroWarsHelper script
// @description:en  fixoraclecards for HeroWarsHelper script
// @description:ru  fixoraclecards для скрипта HeroWarsHelper
// @author          ZingerY
// @license         Copyright ZingerY
// @homepage        https://zingery.ru/scripts/HWHBestDungeonExt.user.js
// @icon            https://zingery.ru/scripts/VaultBoyIco16.ico
// @icon64          https://zingery.ru/scripts/VaultBoyIco64.png
// @match           https://www.hero-wars.com/*
// @match           https://apps-1701433570146040.apps.fbsbx.com/*
// @run-at          document-start
// ==/UserScript==

(function () {
    if (!this.HWHClasses) {
        console.log('%cObject for extension not found', 'color: red');
        return;
    }
    if (!this.HWHData) {
        console.log('HWHData not found');
    } else {console.log('HWHDataLoaded')}

    console.log('%cStart Extension ' + GM_info.script.name + ', v' + GM_info.script.version + ' by ' + GM_info.script.author, 'color: red');
    const { addExtentionName } = HWHFuncs;
    addExtentionName(GM_info.script.name, GM_info.script.version, GM_info.script.author);

    const {

        getInput,
        executeDungeon,
        setProgress,
        hideProgress,
        I18N,
        send,
        getTimer,
        countdownTimer,
        getUserInfo,
        getSaveVal,
        setSaveVal,
        popup,
        setIsCancalBattle,
        random,
        EventEmitterMixin,
    } = HWHFuncs;


    executeDungeon.Prototype.endBattle = async function (battleInfo) {
        if (battleInfo.result.win) {
            const args = {
                result: battleInfo.result,
                progress: battleInfo.progress,
            }
            if (HWHData.countPredictionCard > 0) {
                args.isRaid = true;
            } else {
                const timer = getTimer(battleInfo.battleTime);
                console.log(timer);
                await countdownTimer(timer, `${I18N('DUNGEON')}: ${I18N('TITANIT')} ${dungeonActivity}/${maxDungeonActivity} ${talentMsg}`);
            }
            const calls = [{
                name: "dungeonEndBattle",
                args,
                ident: "body"
            }];
            lastDungeonBattleData = null;
            try {send(JSON.stringify({ calls }), resultEndBattle);}
            catch(e) {// Check if error contains "abnormal speed" or "NotAvailable in dungeonEndBattle"
                    if (e.message.includes("abnormal speed") || e.message.includes("NotAvailable in dungeonEndBattle")) {
                        console.warn("Server detected fast dungeon completion, retrying without raid...");
                        HWHData.countPredictionCard = 0; delete args.isRaid; endBattle(battleInfo)}

         else {
            endDungeon('dungeonEndBattle win: false\n', battleInfo);
        } }}
    }



    })();
§
發表於:2025-06-01

I have a workaround, it doesn't fix the core issue (some inconsistency with oracle card calculations) but it prevents the dungeon from stopping by setting the cards to 0 and trying again. I can't test this currently but it should be fine, let me know how it goes.
import this script with tampermonkey (save the text below as a .js file):

how do I add that?

like is it suppose to replace existent code in the script? or add to it? (and if it's replace, which part of the original HWH script must be delete and replace with yours?)

orb
§
發表於:2025-06-01

add it as another script, don't replace the existing one. save the code in a .js file and import it with tamper monkey.

§
發表於:2025-06-01

I'll test

by teh way lately I'm also getting it for campaign missions (there's one where I always get it)

it says "abnormal speed" but I still lose 2 energy for fail ... those Nexter devs are worth less then dog sht

orb
§
發表於:2025-06-02

You're saying there's a single campaign mission that gives you this trouble? What mission is that? Also do you have "skip battle" checked in the HWH settings?

§
發表於:2025-06-03

no it can happen on different missions
but so far only the hard missions (the ones that really test my team)

btw I still get the "abnormal speed" error

I left another "nice message" to the devs on Nexters social page

orb
§
發表於:2025-06-03

I found a mistake I made in the script, here's updated version:

// ==UserScript==
// @name            fixoraclecards
// @name:en         fixoraclecards
// @name:ru         fixoraclecards
// @namespace       fixoraclecards
// @version         0.0.12
// @description     fixoraclecards for HeroWarsHelper script
// @description:en  fixoraclecards for HeroWarsHelper script
// @description:ru  fixoraclecards для скрипта HeroWarsHelper
// @author          ZingerY
// @license         Copyright ZingerY
// @homepage        https://zingery.ru/scripts/HWHBestDungeonExt.user.js
// @icon            https://zingery.ru/scripts/VaultBoyIco16.ico
// @icon64          https://zingery.ru/scripts/VaultBoyIco64.png
// @match           https://www.hero-wars.com/*
// @match           https://apps-1701433570146040.apps.fbsbx.com/*
// @run-at          document-start
// ==/UserScript==

(function () {
    if (!this.HWHClasses) {
        console.log('%cObject for extension not found', 'color: red');
        return;
    }
    if (!this.HWHData) {
        console.log('HWHData not found');
    } else {console.log('HWHDataLoaded')}

    console.log('%cStart Extension ' + GM_info.script.name + ', v' + GM_info.script.version + ' by ' + GM_info.script.author, 'color: red');
    const { addExtentionName } = HWHFuncs;
    addExtentionName(GM_info.script.name, GM_info.script.version, GM_info.script.author);

    const {

        getInput,
        setProgress,
        hideProgress,
        I18N,
        send,
        getTimer,
        countdownTimer,
        getUserInfo,
        getSaveVal,
        setSaveVal,
        popup,
        setIsCancalBattle,
        random,
        EventEmitterMixin,
    } = HWHFuncs;
    const executeDungeon = HWHClasses;


    executeDungeon.Prototype.endBattle = async function (battleInfo) {
        if (battleInfo.result.win) {
            const args = {
                result: battleInfo.result,
                progress: battleInfo.progress,
            }
            if (HWHData.countPredictionCard > 0) {
                args.isRaid = true;
            } else {
                const timer = getTimer(battleInfo.battleTime);
                console.log(timer);
                await countdownTimer(timer, `${I18N('DUNGEON')}: ${I18N('TITANIT')} ${dungeonActivity}/${maxDungeonActivity} ${talentMsg}`);
            }
            const calls = [{
                name: "dungeonEndBattle",
                args,
                ident: "body"
            }];
            lastDungeonBattleData = null;
            try {send(JSON.stringify({ calls }), resultEndBattle);}
            catch(e) {// Check if error contains "abnormal speed" or "NotAvailable in dungeonEndBattle"
                    if (e.message.includes("abnormal speed") || e.message.includes("NotAvailable in dungeonEndBattle")) {
                        console.warn("Server detected fast dungeon completion, retrying without raid...");
                        HWHData.countPredictionCard = 0; delete args.isRaid; endBattle(battleInfo)}

         else {
            endDungeon('dungeonEndBattle win: false\n', battleInfo);
        } }}
    }



    })();
§
發表於:2025-06-03
編輯:2025-06-03

At this point, wouldn't it just be more efficient for users if you published this on GreasyFork.com as a full project? That would make everything so much easier to use and organize.

orb
§
發表於:2025-06-03

You're right, but GreasyFork is giving me trouble for some reason. I'll see if I can resolve it.

orb
§
發表於:2025-06-03

I solved the issues, here is the link to the greasyfork script:
https://greasyfork.org/en/scripts/538202-fixoraclecards-for-hero-wars-helper

Further issues should be written there. Sorry for clogging up the chat :)

ZingerY作者
§
發表於:2025-06-03

The latest version should not have this problem. What scripts do you use to get it?

§
發表於:2025-06-04

I solved the issues, here is the link to the greasyfork script:
https://greasyfork.org/en/scripts/538202-fixoraclecards-for-hero-wars-helper

Further issues should be written there. Sorry for clogging up the chat :)

I still get the same error


hope those Nexter devs get braincancer

§
發表於:2025-06-04

The latest version should not have this problem. What scripts do you use to get it?

v2.352

ZingerY作者
§
發表於:2025-06-04

Perhaps you are using some other extensions?

§
發表於:2025-06-05
編輯:2025-06-05

1 extension Tampermonkey

btw today lasted over 400 titanite before I got that error
maybe lucky (yesterday it was like every 20 titanite or so)

發表回覆

登入以回覆