Баг с временем горения своего топлива

Версия Minecraft
1.7.10
API
Forge
192
2
9
Всем привет. Недавно я создавал подобную тему, но просил закрыть её для более детального поиска проблем.
Как понятно из заголовка темы, я создаю свой блок и делаю из него топливо. При обычном тесте в клиенте из среды всё работает хорошо, но стоит перезайти в мир, как уже установленные печи начинают багаться именно с моим топливом.

Описание бага. Есть 3 моих блока(блок1, блок2, блок3). Если все 3 блока положить в 3 разных печи и начать плавить руду, то всё в порядке. Выходим из мира и заходим снова, печи с блоками 1 и 2 не плавят, нет прогресса плавки и горения, но анимация на самих блоках печи, что печи работают, есть. Печь с блоком 3 при этом то ли визуально, то ли на самом деле сбрасывает огромную часть топлива(не всегда, но часто), хотя случиться это должно было через ~150 часов в силу кол-ва указанных тиков. Печь при этом и далее работает как надо, если исключить описанный нюанс. Багаться может в рандомном порядке и баги могут отличаться.

Причина бага. Думал, дело в синхронизации, но совсем убрал всякие прокси и зарегистрировал всё в главном классе - не помогло. Пришла в голову мысль поиграться со значениями длительности горения в getBurnTime(). В итоге, если заменить все мои значения на 200 тиков, то блоки работают исправно. Я устанавливаю значения примерно пропорциональные горению ванильного блока угля * 9 * уровень блока для своих блоков. Так блок1 горит 129600 тиков, блок2 1166400 тиков, блок3 10497600 тиков и эти значения приводят к багу.

Не откажусь от советов, подсказок и ресурсов по данному вопросу, так как знаний и опыта буквально нет. Не брался за моддинг несколько лет, а ранее далеко не зашел.
Main.java:
@Mod (modid = ModInfo.MODID, name = ModInfo.NAME, version = ModInfo.VERSION)

public class Main {

    @EventHandler
    public void pre(FMLPreInitializationEvent e) {
        RegisterBlocks.init();
        RegisterBlocks.register();
        RegisterRecipes.register();
    }

    @EventHandler
    public void init(FMLInitializationEvent e) {
        GameRegistry.registerFuelHandler(new Fuels());
    }

}
CompressedCoal.java:
public class CompressedCoal extends Block {

    public CompressedCoal() {
        super(Material.rock);
        this.setBlockName("block_compressed_coal");
        this.setHardness(5.0F);
        this.setCreativeTab(CreativeTabs.tabBlock);
        this.setResistance(5F);
        this.setHarvestLevel("pickaxe",2);
        this.setStepSound(soundTypePiston);
        this.setBlockTextureName(ModInfo.MODID+":block_compressed_coal");
    }

}
Fuels.java:
public class Fuels implements IFuelHandler {
    @Override
    public int getBurnTime(ItemStack fuel) {
        if (fuel != null && fuel.getItem() == Item.getItemFromBlock((Block)RegisterBlocks.block_compressed_coal))
            // return 144000;
            return 200;
        if (fuel != null && fuel.getItem() == Item.getItemFromBlock((Block)RegisterBlocks.block_double_compressed_coal))
            // return 1296000;
            return 200;
        if (fuel != null && fuel.getItem() == Item.getItemFromBlock((Block)RegisterBlocks.block_triple_compressed_coal))
            // return 11664000;
            return 200;
        return 0;
    }

}
 

Вложения

  • 1234.png
    1234.png
    1.4 MB · Просмотры: 15
Последнее редактирование:
1,200
37
237
Тип NBT тега, который хранит время горения печи почему-то short (а не int, как сама переменная), вот ты и не можешь использовать значения больше 32767:

TileEntityFurnace#readFromNBT(NBTTagCompound):
...      
this.furnaceBurnTime = p_145839_1_.getShort("BurnTime");
this.furnaceCookTime = p_145839_1_.getShort("CookTime");
...
 
192
2
9
Как вариант, хуками захерачить весь TileEntityFurnace и убрать этот хардкод с шортом.
https://forum.mcmodding.ru/threads/...a-chuzhogo-koda-pri-zapuske-transfomery.6352/ в помощь
Я хотел сделать подобное топливо, рассчитывая на юзабельность в других модах. Разве, если хукнуть ванилльную печь, подобная проблема будет решена в чужих модификациях? Не мало модов, которые используют что-то из "горящего" в печи в качестве топлива, чтобы преобразовать его в энергию мода. Или же тут зависит от авторов модов уже и мне нужно подумать лишь о фиксе ванилльной механики печи?
 
Последнее редактирование:
1,200
37
237
Все зависит от того, кто, как и где реализовывал всё это, в большинстве случаев, я думаю, все ок в модах будет, так что только в ванильной печке что-то делать нужно (да и зачем тебе делать топливо, что будет гореть дольше 27ми минут (это примерный максимум из расчетов), если можно просто добавить печку, которая не требует топлива или еще чего, ну или сделать по аналогии с кольцом нагревательным из extra utilities (оно там греет на 200 тиков, но тратит свою прочность)).
 
627
72
178
потенциально ломается совместимость
по факту. других вариантов, кроме как НЕ делать топливо с временем горения более 32767 тиков, пока не вижу. обидно что 1.7.10 время от времени отдаёт кривизной :rolleyes:
 
192
2
9
да и зачем тебе делать топливо, что будет гореть дольше 27ми минут
Например для модов, которые могут использовать лишь ванильное топливо, в частности угольные блоки)
 
192
2
9
Проверил в 1.9.4, так как уже там в исходниках используется инт. Проблемы действительно нет. Так как всё же можно решить проблему в 1.8.9 и ниже? А то не красиво делать топливо, которое будет адекватно работать в модах, но багаться в ванилке... Использовать хуки?
 
627
72
178
наверное всё таки через хуки. мб в записи сетать значение short-тега "BurnTime" в 0 (не знаю как это повлияет на прогрузку данных), создать свой новый int-тег с другим названием и уже в него/из него всё записывать/читать. я не до конца уверен, как это будет работать. к сожалению нет сейчас среды под 1.7.10. можно попробовать, но если не получится - советую дождаться того-же агравейна

(по крайней мере я не видел, чтобы другие моды из ванильной печи тянули что-либо из NBT)
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Хук в конец метода и читаем/пишем в нбт не шорт, а инт.
Ничего не сломается в имеющимся мире, просто после установки мода все печки в мире сбросят время горения.
Ещё в контейнер, вроде, надо так же хукнуться, там пакет клиенту посылается с обновлением для гуи. Возможно, там тоже шорт летит.

По поводу других модов.
Только искать и смотреть вручную, автоматически я думаю никак не пофиксить везде.
 
192
2
9
А не тут то было, ребятки) Проблема видимо в другом месте.

GrimoireOfGaia3. Поставил мод GrimoireOfGaia3, ведь у него есть айтем на ~62000секунды горения, как заявлено модом и айтем не стакается. В одиночке ровно тот же баг(печи не плавят), что и на предыдущих версиях. На сервере то же самое, не плавят. Напоминаю, что баг вызывается рестартом мира.
Мой мод. В одиночке печи так же ломаются, не плавят. Однако на сервере присутствует лишь визуальный баг с прогрессом горения(не плавки) и после рестарта печи продолжают работать, но... После каждого рестарта мира печь обязательно "съедает" один айтем топлива из стака, именно потому я упомянул, что айтем из гримора не стакается. Этого бага со "съеданием" не было на 1.9.4 и 1.7.10.

Может быть я ошибаюсь, но вдруг появятся свежие мысли у кого-то. В этой версии я не использовал IFuelHandler, а просто переопределил getItemBurnTime() в самом айтеме. В этот раз сделал айтем вместо блока.
CoalCrystall.java:
public class CoalCrystall extends Item {

    public CoalCrystall() {
        this.setRegistryName("coal_crystall");
        this.setUnlocalizedName("coal_crystall");
        this.setMaxStackSize(64);
        this.setCreativeTab(CreativeTabs.MATERIALS);
    }

    public int getItemBurnTime(ItemStack itemStack) { return 1240000; }
}
 

Вложения

  • 20.03.2022-01.jpg
    20.03.2022-01.jpg
    43.7 KB · Просмотры: 4
Последнее редактирование:
627
72
178
посмотри на вчерашний второй скрин, я его просто не сразу скинул. тег хоть и интовый, но значения в short приведены 1647837566251.png
энивей, после ответа агравейна стало ясно что на 1.7.10 решение точно такое же (поверил первому ответившему, я не удосужился проверить заработает ли нормально мир при моём способе)
а проблема ваша в том, что тот предмет из гайи имеет время горения около 1240000 в INTEGER и путем преобразования типов переводится в short как -5184, и тут уже делай выводы, почему у тебя топливо с -5184 проецирует такого рода баги, думаю хук поможет
 
192
2
9
Думаю кому-то будет полезно узнать, работает ли способ через хуки .
Без меня проверить будет куда быстрее. Я ведь писал, что знаний и опыта 0) Так что я не скоро доберусь до этих тестов, но уже сел за материалы!
 
Сверху