Соединение заборов из ванильного майнкрафта и мода

Версия Minecraft
1.7.10
API
Forge
40
1
0
Добрый день. Пытаюсь перенести заборы из новых версий (те, которые из разных досок делаются) на указанную.
Появилась проблема: мои заборы соединяются с ванильными дубовыми заборами, а те им не отвечают взаимностью, так сказать.
Можно ли как-то изменить поведение блоков НЕ из мода (этих самых дубовых заборов), чтобы они соединялись с моими? Например, использовать рефлексию?

canConnectFenceTo() заборов из мода:
Java:
public boolean canConnectFenceTo(IBlockAccess iBlockAccess, int posX, int posY, int posZ) {
        Block block = iBlockAccess.getBlock(posX, posY, posZ);
        return (block instanceof net.minecraft.block.BlockFence && block.getMaterial() == this.getMaterial()) || block instanceof BlockFenceGate ||
                (block.getMaterial().isOpaque() && block.renderAsNormalBlock() && block.getMaterial() != Material.gourd);
}

canConnectFenceTo() дубовых заборов (эту функцию, я так понимаю, нужно заменить):
Java:
public boolean canConnectFenceTo(IBlockAccess p_149826_1_, int p_149826_2_, int p_149826_3_, int p_149826_4_)
{
    Block block = p_149826_1_.getBlock(p_149826_2_, p_149826_3_, p_149826_4_);
    return block != this && block != Blocks.fence_gate ? (block.blockMaterial.isOpaque() && block.renderAsNormalBlock() ? block.blockMaterial != Material.gourd : false) : true;
}

2021-07-19_00.22.50.png
 
47
1
27
 
40
1
0
Ведь нужно всего-то сделать, чтобы он удовлетворял всем условиям соединения...

Два варианта по Вашему предложению:

1. block != this && block != Blocks.fence_gate должно возвращать false, но это невозможно, очевидно, так как заборы каждого вида будут отдельными экземплярами класса и оба условия будут выполнены

2. block.blockMaterial.isOpaque() && block.renderAsNormalBlock() должно возвращать true, значит блок должен рендериться как полноценный, а это будет заставлять его отбрасывать тень как на скриншоте.

Укажите, пожалуйста, если я где-то не прав.

2021-07-19_15.53.55.png
 
1,200
37
237
Ванильный забор не трогай, оставь только для совместимости с модами (крафты и т. д.). Свой же просто наследуй от ванильного забора и сделай вариации по виду дерева (можешь заморочиться и сделать для любого дерева из модов). Крафты делаешь досками одного типа, ванильный же из любых досок, либо перекрафтом из дубового. Все, все что осталось, это замена установки ванильного забора на дубовый (но я бы этого не делал, вдруг в модах нужен забор дубовый в мире).

---

Да и есть же мод EtFuturum.
 
40
1
0
(но я бы этого не делал, вдруг в модах нужен забор дубовый в мире)
Вот именно поэтому я и не пошёл через замену)
Не хочу, чтоб потом были проблемы как у связки DivineRPG + Thaumic Tinkerer, где невозможно было сделать ихоровую броню, так как вместо обычной брони из майнкрафта крафтилась такая же, но с другим id из DivineRPG

Сейчас нашёл вариант сделать вот так:
Java:
public boolean renderAsNormalBlock() {
    return Thread.currentThread().getStackTrace()[2].getMethodName().equals("canConnectFenceTo");
}

... но это очень тормозит игру, так как renderAsNormalBlock() вызывается очень много раз при установке забора

Тоже думал не заменять логику деревянного, а просто добавить такой же дубовый. Если другого адекватного решения не найду, то так и сделаю, спасибо
 

will0376

Токсичная личность
2,077
55
585
то так и сделаю
Можно немного схитрить. Через миксины сделай инжект в дефолтный забор, мол Если соблюдается нужное тебе условие - возвращать true, иначе продолжить выполнение метода ванильного
 
40
1
0
Вот это:
можно использовать?
 
Сверху