Трудный выбор

5,021
47
784
Друзья, у меня возникла весьма напряженная дилемма. В общем, как вы видели, я запилил падающие деревья. Также, я хотел изменить видогенерацию деревьев.
Но дело в том, что механики используемые для падающих деревьев, содержатся не только в коде, но и в блокстейтах. В следствие чегл просто хук ваниллу проблемы не решит. Мне очень нужно ваше мнение по этому вопросу - если я выпилю нафиг ванильные деревья и ванильную генерацию, это будет очень-очень серьезный вид изменения мира, который может повлечь за собой катастрофические несовместимости с другими модами, так или иначе используемые другими модами(тогда уж и мир переделывать, и будет копипаста тфк. Этого ни в коем случае не должно произойти!). Есть ли какой то вариант, подменить ванильные блоки на мои, с сохранением ванильный ID и "фантомного имени"? Грубо говоря, чтобы вместо ванили были мои блоки, но другие моды считали их за ванильные?
 
2,932
44
598
А рефлексия не прокатит?
 
Я заменил стандартный камень на свой:
Java:
@Hook(returnCondition = ReturnCondition.ALWAYS, isMandatory = true)
public static void registerBlock(Block block, int id, ResourceLocation res, Block blockToRegister) {
    if(id == 1 /* Айди камня */){
        Block.REGISTRY.register(id, res, BlockRegister.stonefake);
    }
    else
        Block.REGISTRY.register(id, res, blockToRegister);
}

@Hook(returnCondition = ReturnCondition.ON_NOT_NULL, isMandatory = true)
public static Block getRegisteredBlock(Blocks inst, String name) {
    if(name.equals("stone")){
        return BlockRegister.stonefake;
    }
    return null;
}
Java:
public class BlockRegister {
    public static Block stonefake = new TestStone().setHardness(100.5F).setResistance(10.0F).setUnlocalizedName("stone");
}
Java:
public class TestStone extends BlockStone{
    @Override
    public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase entity, ItemStack stack) {
        super.onBlockPlacedBy(world, pos, state, entity, stack);
        Minecraft.getMinecraft().player.sendChatMessage("ee");
    }
}
1526475412729.png
2018-05-16_15.59.36.png
 
Последнее редактирование:
5,021
47
784
Понимаешь. Он имеет другое название.(и ID, но это не точно) А моды, которые генерят что то исходя не из ID(что не факт, что не изменилось), а по getBlockState()getBlock() == Blocks.STONE, не найдя его, начнут вопить эксепшинами.

не имя для форджа чекается, а именно твое вот... или я не прав?

если то что я описал, все успешно работает у тебя, я тебе лукасик скину)
 
Всм. Можешь вывести названия класса Blocks.STONE. В моем случае выведет BlockTest.1526499805788.png
С тебя лайк;)
 
5,021
47
784
оооооооооооо,
ща, вот кр напишу завтра
И таких дел понаворочу!
 
Как бы в момент регистрации майновских блоков хук отлавливает его айди, и присваивает статическому экземпляру в Blocks что ты захочешь. Думаю никакой мод не будет с этим конфликтовать, если конечно название класса проверять не будет.
 
Последнее редактирование:
Кстати да, если у тебя будет майноблок в классе с твоими блоками, то форж подумает, что их регает майн и будет постоянно спамить исключениями.
 
Последнее редактирование:
5,021
47
784
Слушай. А если это дерево, с метадатой? как быть?
 
5,021
47
784
И вообще, не понимаю, как у тебя это вышло. Сейчас вот только, подчистую все скопировал, попробовать. крашится, даже майн не запускает
Блок зарегал как обычно, имя дал такое же как в ванили - stone.
Java:
[06:30:17] [main/ERROR] [LaunchWrapper]: Unable to launch
java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_151]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_151]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_151]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_151]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_151]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_151]
    at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
    at GradleStart.main(GradleStart.java:25) [start/:?]
Caused by: java.lang.ExceptionInInitializerError
    at ru.legendgamer.Realism.RealismCore.RegBlocks.<clinit>(RegBlocks.java:69) ~[RegBlocks.class:?]
    at gloomyfolken.hooklib.example.AnnotationHooks.registerBlock(AnnotationHooks.java:81) ~[AnnotationHooks.class:?]
    at net.minecraft.block.Block.registerBlock(Block.java) ~[Block.class:?]
    at net.minecraft.block.Block.registerBlock(Block.java:2842) ~[Block.class:?]
    at net.minecraft.block.Block.registerBlocks(Block.java:2540) ~[Block.class:?]
    at net.minecraft.init.Bootstrap.register(Bootstrap.java:571) ~[Bootstrap.class:?]
    at net.minecraft.client.Minecraft.<init>(Minecraft.java:408) ~[Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) ~[Main.class:?]
    ... 12 more
Caused by: java.lang.IllegalStateException: Invalid Block requested: grass
    at net.minecraft.init.Blocks.getRegisteredBlock(Blocks.java:309) ~[Blocks.class:?]
    at net.minecraft.init.Blocks.<clinit>(Blocks.java:328) ~[Blocks.class:?]
    at ru.legendgamer.Realism.RealismCore.RegBlocks.<clinit>(RegBlocks.java:69) ~[RegBlocks.class:?]
    at gloomyfolken.hooklib.example.AnnotationHooks.registerBlock(AnnotationHooks.java:81) ~[AnnotationHooks.class:?]
    at net.minecraft.block.Block.registerBlock(Block.java) ~[Block.class:?]
    at net.minecraft.block.Block.registerBlock(Block.java:2842) ~[Block.class:?]
    at net.minecraft.block.Block.registerBlocks(Block.java:2540) ~[Block.class:?]
    at net.minecraft.init.Bootstrap.register(Bootstrap.java:571) ~[Bootstrap.class:?]
    at net.minecraft.client.Minecraft.<init>(Minecraft.java:408) ~[Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:118) ~[Main.class:?]
    ... 12 more
Exception in thread "Client thread" [06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]: java.lang.reflect.InvocationTargetException
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]:     at java.lang.reflect.Method.invoke(Method.java:498)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]:     at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1052]:     at GradleStart.main(GradleStart.java:25)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]: Caused by: net.minecraftforge.fml.relauncher.FMLSecurityManager$ExitTrappedException
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]:     at net.minecraftforge.fml.relauncher.FMLSecurityManager.checkPermission(FMLSecurityManager.java:49)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]:     at java.lang.SecurityManager.checkExit(SecurityManager.java:761)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]:     at java.lang.Runtime.exit(Runtime.java:107)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]:     at java.lang.System.exit(System.java:971)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]:     at net.minecraft.launchwrapper.Launch.launch(Launch.java:138)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]:     at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
[06:30:17] [main/INFO] [STDERR]: [java.lang.ThreadGroup:uncaughtException:1061]:     ... 6 more
Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
 
Покажи все классы, которые в этом задействованы.
 
Блок зарегал как обычно
Как обычно это как? его не надо регать. И registryName ему давать не надо. только UnlocalizedName. И такое же как в майне. Я все классы приложил к посту. Больше ничего делать не надо.
 
У меня все работает:
1526571815752.png
1526571839077.png
src\main\resources\assets\minecraft\blockstates\bedrock.json
JSON:
{
    "variants": {
        "test=true":{  "model": "cobblestone"},
        "test=false":{  "model": "bedrock"}
    }
}
TestStone.java
Java:
public class TestStone extends Block {
    public static final PropertyBool TEST_PROPERTY = PropertyBool.create("test");
    public TestStone (){
        super(Material.GLASS);
        this.setDefaultState(this.blockState.getBaseState().withProperty(TEST_PROPERTY, Boolean.valueOf(false)));
    }

    @Override
    public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase livingEntity, ItemStack stack) {
        super.onBlockPlacedBy(world, pos, state, livingEntity, stack);
        if(world.isRemote) return;
    }

    @Override
    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
        worldIn.setBlockState(pos, state.withProperty(TEST_PROPERTY, !worldIn.getBlockState(pos).getValue(TEST_PROPERTY)));
        return true;
    }

    @Override
    public int getMetaFromState(IBlockState state) {
        return 0;
    }

    @Override
    protected BlockStateContainer createBlockState() {
        return new BlockStateContainer(this, TEST_PROPERTY);
    }
}
 
5,021
47
784
Есть рабочие примеры блоков с метой? Типо как деревья?
 
А чем они отличаются от бедрока? я его тоже сделал с метой.
 
5,021
47
784
чекни как BlockOldLog выглядит. Вот про такое. Или класс шерсти
 
5,021
47
784
Так. Сделал как у тебя. И короче, крашит.
В своем классе с переменными вот такое с унлокалазед именем
Java:
    public static Block woodtest = new BaseBlock("stone");
И хуки вообще один в один. И крашится при попытке запуска
 
5,021
47
784
Ааа, а я и не заметил. Ну кстати, все равно крашит, уже по другой причине правда. Чет с проперятми не так...
Java:
Stacktrace:
    at net.minecraft.block.properties.PropertyEnum.getName(PropertyEnum.java:53)
    at net.minecraft.block.properties.PropertyEnum.getName(PropertyEnum.java:14)
    at net.minecraft.client.renderer.block.statemap.StateMap.removeName(StateMap.java:60)
    at net.minecraft.client.renderer.block.statemap.StateMap.getModelResourceLocation(StateMap.java:42)
    at net.minecraft.client.renderer.block.statemap.StateMapperBase.putStateModelLocations(StateMapperBase.java:56)
    at net.minecraft.client.renderer.block.statemap.BlockStateMapper.getBlockstateLocations(BlockStateMapper.java:62)
    at net.minecraftforge.client.model.ModelLoader.loadBlocks(ModelLoader.java:234)
    at net.minecraftforge.client.model.ModelLoader.setupModelRegistry(ModelLoader.java:163)
    at net.minecraft.client.renderer.block.model.ModelManager.onResourceManagerReload(ModelManager.java:28)
    at net.minecraft.client.resources.SimpleReloadableResourceManager.registerReloadListener(SimpleReloadableResourceManager.java:121)
    at net.minecraft.client.Minecraft.init(Minecraft.java:559)
расширял от Block. Попробовал от BlockStone - работает. Почему от блока не хочет?
 
Сверху