• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

Mod [CLOSED] setHarvestLevel wird nicht gesetzt?

Skyriis

Kuhfänger
Registriert
11 Juni 2018
Beiträge
59
Diamanten
329
Minecraft
MrProfessor
Hallo liebes Forum,
ist mir ein wenig peinlich diese Frage zu stellen aber anscheinend bin ich ein wenig betriebsblind und finde meinen Fehler nicht. Kommen wir zum Problem. Ich füge mithilfe meiner Mod einen Block hinzu welcher ein bestimmtes HarvestLevel und ein bestimmtes Tool benötigen soll. Wenn ich das HarvestLevel vom block abfrage dann wird auch der richtige wert angezeigt aber ingame kann ich trotzdem den block mit einem normalen Item (also kein Tool) abbauen. Hardness und Ressistance des Blocks wird auf die gleiche weise setzt und das funktioniert problemlos.

java:
    public BlockBase(String name, Material material){
        super(material);
        setUnlocalizedName(name);
        setRegistryName(name);
        setCreativeTab(CreativeTabs.MISC);

        ModBlocks.BLOCKS.add(this);
        ModItems.ITEMS.add(new ItemBlock(this).setRegistryName(this.getRegistryName()));
    }

    @Override
    public void registerModels() {
        BlutmondCore.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory");
    }
java:
    public BlockBaseAdvanced(String name, Material material, SoundType soundOnWalking, BlockHardness hardness, BlastResistance resistance, Tools tool, Harvestlevels harvestlevel){
        super(name, material);
        this.setSoundType(soundOnWalking);
        this.setHardness(hardness.getHardness());
        this.setResistance(resistance.getBlastResistance());
        this.setHarvestLevel(tool.getToolType(), harvestlevel.getHarvestLevel());

        System.out.println("Register: " + this.getRegistryName() + " with harvestlevel: " + this.getHarvestLevel(this.getDefaultState())); //debug
    }
java:
    AXE("axe"),
    PICKAXE("pickaxe"),
    SHOVEL("shovel"),
    SWORD("sword");

    private String type;

    Tools(String type){
        this.type = type;
    }
    public String getToolType(){
        return this.type;
    }
java:
    WOOD(0),
    STONE(1),
    COPPER(2),
    IRON(3),
    BRONZ(4),
    STEEL(5),
    PLATINUM(6),
    DARKSTEEL(7),
    MITHRIL(8),
    ORICHALCUM(9),
    DELDRIMOR_STEEL(10);

    private int level;

    Harvestlevels(int level){
        this.level = level;
    }
    public int getHarvestLevel(){
        return this.level;
    }

Vielleicht findet ja einer von euch vor mir den Fehler.
Schon mal im voraus danke :D
 
Zuletzt bearbeitet:

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Ehm.. ich weiß nicht was dein Harvestlevel ist, aber bei einem level von 0 können immer alle items genutzt werden.
Dafür müsstest du Block#canHarvest oder so ähnlich überschreiben, wenn es aber höher als 0 ist würde mich dein Registrierung code interessieren.
(Ich kritisiere mal nicht die code schnipsel die du bis jetzt gepostest hast da mir die zeit fehlt, kommt aber später noch xD)
 

Skyriis

Kuhfänger
Registriert
11 Juni 2018
Beiträge
59
Diamanten
329
Minecraft
MrProfessor
Das gesetzte harvestlevel von dem Testblock den ich erstellt habe war 5 und MeinRegistrierungscode kann ich dir heute Abend Mal Posten.

Kritik nehme ich immer danken an der Code ist frei improvisiert um auch von anderen Mods aus Blöcke registrieren zu können und wenn du da Verbesserungsvorschläge hast bin ich dir natürlich sehr dankbar.
 

Skyriis

Kuhfänger
Registriert
11 Juni 2018
Beiträge
59
Diamanten
329
Minecraft
MrProfessor
Klassen die an der Registrierung von Blöcken beteiligt sind.
java:
    @SubscribeEvent
    public static void onItemRegister(RegistryEvent.Register<Item> event){
        for (Item item : ModItems.ITEMS){
            event.getRegistry().register(item);
        }
    }

    @SubscribeEvent
    public static void onBlockRegister(RegistryEvent.Register<Block> event){
        for (Block block : ModBlocks.BLOCKS){
            event.getRegistry().register(block);
        }
    }

    @SubscribeEvent
    public static void onModelRegister(ModelRegistryEvent event){
        for (Item item : ModItems.ITEMS){
            if (item instanceof IHasModel){
                ((IHasModel)item).registerModels();
            }
        }

        for (Block block : ModBlocks.BLOCKS){
            if (block instanceof IHasModel){
                ((IHasModel)block).registerModels();
            }
        }
    }
java:
public interface IHasModel {
    void registerModels();
}
java:
    public void registerItemRenderer(Item item, int meta, String id){
        ModelLoader.setCustomModelResourceLocation(item,meta, new ModelResourceLocation(item.getRegistryName(), id));
    }
java:
    public static void addBlock(String name, Material material, SoundType soundOnWalking, BlockHardness hardness, BlastResistance resistance, Tools tool, Harvestlevels harvestlevel){
        Block block = new BlockBaseAdvanced(name,material,soundOnWalking,hardness,resistance,tool,harvestlevel);
    }
 

JTK222

Threadripper
Registriert
5 September 2013
Beiträge
1.150
Diamanten
323
Minecraft
JTK222
Hm... um ehrlich zu sein sehe ich da keinen Fehler.
Wobei mir fällt gerade ein. Das Harvestlevel schränkt den Block nicht darauf ein nur mit diesem Tool abbaubar zu sein.
Er wird mit diesem tool und diesem Level lediglich effektiver abgebaut.
Ich weiß leider nicht welche Methode dafür zuständig ist, aber es Hängt mit dem Material zusammen. Holz zum beispiel kann man immer abbauen.
Stein hingegen nur mit richtigen Tool. Also könnte es am Material liegen.
 

Skyriis

Kuhfänger
Registriert
11 Juni 2018
Beiträge
59
Diamanten
329
Minecraft
MrProfessor
java:
    public static final Materials TEST_MATERIAL = new Materials(MapColor.IRON, true);

    public Materials(MapColor mapColor, boolean requiresTool) {
        super(mapColor);
        if(requiresTool){
            this.setRequiresTool();
        }
    }
Und schwupps funktioniert alles :D
Hätte ich auch früher dran denken können ;)
 
Oben