Jump to content

Recommended Posts

Posted

the ores also have to break successively

 

Meaning?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

how would I create ores without making a new class for each of the ores (because I have 25+ ores (metallurgy))?

 

Well, if you know Java, the answer: "Class != Instance" should be enough.

If you don't I can only say - learn what above answer means (google). You can't really write anything "nice" without Java :P

 

As to config ores - you will need to use forge's Configuration. Load config on startup (preInit). Read some values and use them to change properties of new ore instances or their generators. Again - without java, learning to use Config can be hard.

1.7.10 is no longer supported by forge, you are on your own.

Posted

Aside from the fact that I'd originally needed some slight customization between the different ores (which has become less and less needed) you can do it all through one class.  You just need to push enough things into the constructor (or have setters).

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

It depends how distinctive these ores and their behaviors are. If you have a very systematic way of programming them, then look into metadata and setting up sets of 16 ingots for 16 ores. Above all of the sets would be an abstract class with all of the common code.

 

Then again, metadata might not work for what you might want to do, but an abstract class can still hold all your common code so that the many ore classes are tiny things.

 

And if your ores sort into a few broad categories with systematic features, you could even have an intermediate layer with ore-category abstract classes.

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Posted

I have them mostly working, but the method to get the next block is apparently not initializing the value it is passing and I'm not sure if it is the method itself that's the problem, or if it is one of the classes it calls. am I doing something stupid, or just being stupid?

 

    public Block GetNextBlock(BlockDIOre inputBlock) {

        Block outputBlock;

        DIOreRegistry registry = new DIOreRegistry();

        if (registry.densityMap.get(inputBlock) != 0) {

            for (BlockDIOre currentOre : registry.oreMap.keySet()) {

                for (BlockDIOre currentOre1 : registry.densityMap.keySet()) {

                    for (BlockDIOre currentOre2 : registry.baseBlockMap.keySet()) {

                        if (registry.oreMap.get(currentOre).equals(registry.oreMap.get(inputBlock)) && registry.densityMap.get(currentOre1) == registry.densityMap.get(inputBlock) - 1 && registry.baseBlockMap.get(currentOre2) == registry.baseBlockMap.get(inputBlock)) {

                            outputBlock = currentOre;

                        }

                    }

                }

            }

        } else outputBlock = registry.baseBlockMap.get(inputBlock);

        return outputBlock;

    }

Posted

I have them mostly working, but the method to get the next block is apparently not initializing the value it is passing and I'm not sure if it is the method itself that's the problem, or if it is one of the classes it calls. am I doing something stupid, or just being stupid?

 

    public Block GetNextBlock(BlockDIOre inputBlock) {

        Block outputBlock;

        DIOreRegistry registry = new DIOreRegistry();

        if (registry.densityMap.get(inputBlock) != 0) {

            for (BlockDIOre currentOre : registry.oreMap.keySet()) {

                for (BlockDIOre currentOre1 : registry.densityMap.keySet()) {

                    for (BlockDIOre currentOre2 : registry.baseBlockMap.keySet()) {

                        if (currentOre.ore.equals(registry.oreMap.get(inputBlock)) && currentOre1.density == registry.densityMap.get(inputBlock) - 1 && currentOre2.baseBlock == registry.baseBlockMap.get(inputBlock)) {

                            outputBlock = currentOre;

                        }

                    }

                }

            }

        } else outputBlock = registry.baseBlockMap.get(inputBlock);

        return outputBlock;

    }

 

I do not even know WTF you're doing here.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

starting to think I don't either, looking at it.  :-\

trying to replace the ore with a less dense version after it reaches max meta. my setup seems kinda stupid... I register 3 values from the ore constructor to 3 different HashMaps (so I can look them up to replace the ore block) and then look them up in the getNextBlock() method and check them against the current block's values to find the next densest ore.

ore is the metal/gem/dust the ore has, density is the number of blocks left before the ore runs out (basically), baseBlock is what block the ore is found in like stone/dirt/gravel.

Posted

Trying to have more than 16 density values is probably messing you up.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

nope, density is blocks, not meta.

 

Ok....what are you using meta for, then?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

Kinda... Also density? But separate from the density value.

I added "= null" to initialize outputBlock, was that really all it was? maybe it had an issue because there wasn't an "else" condition on the inner "if" block.

"currentOre" is a BlockDIOre, not the "ore" value.

Posted

Its still a terrible, terrible loop.

 

I'm almost certain there is a collection that would suit your needs better than a HashMap which you aren't even using as a hash map.  You're treating them as arrays for no good reason.

 

Because seriously,

currentOre.ore.equals(registry.oreMap.get(inputBlock)) //being true

could be done by

currentOre = registry.oreMap.get(inputBlock)

AFAICT.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Posted

The full class, if that helps at all:

 

 

package com.dualinfinities.DIOres.block;

import com.dualinfinities.DIOres.reference.DIOreRegistry;
import com.dualinfinities.DIOres.reference.Names;
import com.dualinfinities.DIOres.reference.Reference;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.world.World;

public class BlockDIOre extends Block {

    public String ore;
    public int density;
    public Block baseBlock;
    DIOreRegistry registry = new DIOreRegistry();
    Names nameClass = new Names();

public BlockDIOre(Material material){
	super(material);
}
public BlockDIOre(String ore, int miningLevel, String miningTool, int oreStyle, int density, Block baseBlock){
	this(baseBlock.getMaterial());
	this.setCreativeTab(CreativeTabs.tabBlock);
        this.setBlockName(nameClass.translateValuesToString(this));
        this.setDensity(density);
        this.setOre(ore);
        this.setBaseBlock(baseBlock);
        /**
         * valid tool values are "pickaxe", "shovel", "axe"
         * */
        this.setHarvestLevel(miningTool, miningLevel);
        this.addToOreMap(this, ore);
        this.addToDensityMap(this, density);
        this.addToBaseMap(this, baseBlock);
}

    @Override
    public String getUnlocalizedName()
    {
        return String.format("tile.%s%s", Reference.MOD_ID.toLowerCase() + ":", getUnwrappedUnlocalizedName(super.getUnlocalizedName()));
    }

    @Override
    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister iconRegister)
    {
        blockIcon = iconRegister.registerIcon(String.format("%s", getUnwrappedUnlocalizedName(this.getUnlocalizedName())));
    }

    protected String getUnwrappedUnlocalizedName(String unlocalizedName)
    {
        return unlocalizedName.substring(unlocalizedName.indexOf(".") + 1);
    }

    @Override
    public void breakBlock(World world, int x, int y, int z, Block block, int meta) {
        if (meta < 15) {
            world.setBlock(x, y, z, this, meta + 1, 0);
        } else if (meta == 15) {
            world.setBlock(x, y, z, getNextBlock((BlockDIOre) block), 0, 0);
        }

    }

    public Block getNextBlock(BlockDIOre inputBlock) {
        Block outputBlock = null;
        if (registry.densityMap.get(inputBlock) != 0) {
            for (BlockDIOre currentOre : registry.oreMap.keySet()) {
                for (BlockDIOre currentOre1 : registry.densityMap.keySet()) {
                    for (BlockDIOre currentOre2 : registry.baseBlockMap.keySet()) {
                        if (getOre(currentOre).equals(getOre(inputBlock)) && getDensity(currentOre1) == getDensity(inputBlock) - 1 && getBaseBlock(currentOre2) == getBaseBlock(inputBlock) && currentOre == currentOre1 && currentOre1 == currentOre2) {
                            outputBlock = currentOre;
                        }
                    }
                }
            }
        } else outputBlock = registry.baseBlockMap.get(inputBlock);
        return outputBlock;
    }

    public int getDensity(BlockDIOre oreToGet){
        return registry.densityMap.get(oreToGet);
    }
    public void setDensity(int densityToSet) {
        this.density = densityToSet;
    }
    public String getOre(BlockDIOre oreToGet){
        return registry.oreMap.get(oreToGet);
    }
    public void setOre(String oreToSet) {
        this.ore = oreToSet;
    }
    public Block getBaseBlock(BlockDIOre baseBlockToGet){
        return registry.baseBlockMap.get(baseBlockToGet);
    }
    public void setBaseBlock(Block baseBlockToSet) {
        this.baseBlock = baseBlockToSet;
    }
/**
* NYI
* */
    public void addToOreMap(BlockDIOre blockOre, String ore) {

    }
    public void addToDensityMap(BlockDIOre blockOre, int density) {

    }
    public void addToBaseMap(BlockDIOre blockOre, Block baseBlock) {

    }
}

Posted

See, your hashmaps are useless.

 

this.addToBaseMap(this, baseBlock); //this serves no purpose

 

If you have the block that is the key in that map (

registry.baseBlockMap.get(theBlock)

), you can just do

theBlock.baseBlock

and get the same thing.

 

What you should be doing is storing a block1 -> block2 map where block1 is "this" and block2 is the next density (or whatever) down after its mined.  Then you just have to create the blocks in the correct order (densest to least dense) adding to the map as you go.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hi! I'm trying to add my custom models/textures renderer like this: public class PonyPlayerWrapperRenderer extends EntityRenderer<Player> { // wrapper class under my LivingEntityRenderer class implementation private final PonyPlayerRenderer innerRenderer; private final PonyPlayerRenderer innerSlimRenderer; public PonyPlayerWrapperRenderer(final EntityRendererProvider.Context context) { super(context); System.out.println("creating new PonyPlayerWrapperRenderer"); this.innerRenderer = new PonyPlayerRenderer(context, false); this.innerSlimRenderer = new PonyPlayerRenderer(context, true); } @Override public void render(final Player entity, final float yaw, final float partialTicks, final PoseStack poseStack, final MultiBufferSource bufferSource, final int packedLight) { System.out.println("PonyPlayerWrapperRenderer render: " + entity.toString()); if (entity instanceof AbstractClientPlayer clientPlayer) { if (clientPlayer.getModelName().contains("slim")) { innerSlimRenderer.render(clientPlayer, yaw, partialTicks, poseStack, bufferSource, packedLight); } else { innerRenderer.render(clientPlayer, yaw, partialTicks, poseStack, bufferSource, packedLight); } } } @Override public ResourceLocation getTextureLocation(final Player player) { System.out.println("PonyPlayerWrapperRenderer getTextureLocation"); if (player instanceof AbstractClientPlayer clientPlayer) { return clientPlayer.getSkinTextureLocation(); } System.out.println("player instanceof AbstractClientPlayer is false"); return getDefaultSkin(player.getUUID()); } } public class PonyPlayerRenderer extends LivingEntityRenderer<AbstractClientPlayer, PlayerModel<AbstractClientPlayer>> { private final PlayerModel<AbstractClientPlayer> earthModel; private final PlayerModel<AbstractClientPlayer> pegasusModel; private final PlayerModel<AbstractClientPlayer> unicornModel; public PonyPlayerRenderer(final EntityRendererProvider.Context context, final boolean slim) { super( context, slim ? new PonyModelSlim(context.bakeLayer(PonyModelSlim.LAYER_LOCATION)) : new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)), 0.5f ); System.out.println("creating new PonyPlayerRenderer"); this.earthModel = slim ? new PonyModelSlim(context.bakeLayer(PonyModelSlim.LAYER_LOCATION)) : new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)); this.pegasusModel = new PegasusModel(context.bakeLayer(PegasusModel.LAYER_LOCATION)); this.unicornModel = new UnicornModel(context.bakeLayer(UnicornModel.LAYER_LOCATION)); } @Override public void render(final AbstractClientPlayer player, final float entityYaw, final float partialTicks, final PoseStack poseStack, final MultiBufferSource buffer, final int packedLight) { final PonyRace race = player.getCapability(PONY_DATA) .map(data -> ofNullable(data.getRace()).orElse(PonyRace.EARTH)) .orElse(PonyRace.EARTH); this.model = switch (race) { case PEGASUS -> pegasusModel; case UNICORN -> unicornModel; case EARTH -> earthModel; }; super.render(player, entityYaw, partialTicks, poseStack, buffer, packedLight); } @Override public ResourceLocation getTextureLocation(final AbstractClientPlayer player) { final PonyRace race = player.getCapability(PONY_DATA) .map(data -> ofNullable(data.getRace()).orElse(PonyRace.EARTH)) .orElse(PonyRace.EARTH); return switch (race) { case EARTH -> fromNamespaceAndPath(MODID, "textures/entity/earth_pony.png"); case PEGASUS -> fromNamespaceAndPath(MODID, "textures/entity/pegasus.png"); case UNICORN -> fromNamespaceAndPath(MODID, "textures/entity/unicorn.png"); }; } } @Mod.EventBusSubscriber(modid = MODID, bus = MOD, value = CLIENT) public class ClientRenderers { // mod bus render registration config @SubscribeEvent public static void onRegisterLayerDefinitions(final EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(PonyModel.LAYER_LOCATION, PonyModel::createBodyLayer); event.registerLayerDefinition(PonyModelSlim.LAYER_LOCATION, PonyModelSlim::createBodyLayer); event.registerLayerDefinition(PegasusModel.LAYER_LOCATION, PegasusModel::createBodyLayer); event.registerLayerDefinition(UnicornModel.LAYER_LOCATION, UnicornModel::createBodyLayer); event.registerLayerDefinition(InnerPonyArmorModel.LAYER_LOCATION, InnerPonyArmorModel::createBodyLayer); event.registerLayerDefinition(OuterPonyArmorModel.LAYER_LOCATION, OuterPonyArmorModel::createBodyLayer); } @SubscribeEvent public static void onRegisterRenderers(final EntityRenderersEvent.RegisterRenderers event) { event.registerEntityRenderer(EntityType.PLAYER, PonyPlayerWrapperRenderer::new); System.out.println("onRegisterRenderers end"); } } Method onRegisterRenderers() is called and I can see it being logged. But when I enter the world, my PonyWrapperRenderer render() method doesn't ever seem to be called. I also tried to put my renderer to EntityRenderDispatcher's playerRenderers via reflection: @Mod.EventBusSubscriber(modid = MODID, bus = MOD, value = CLIENT) public class ClientRenderers { @SubscribeEvent public static void onRegisterLayerDefinitions(final EntityRenderersEvent.RegisterLayerDefinitions event) { event.registerLayerDefinition(PonyModel.LAYER_LOCATION, PonyModel::createBodyLayer); event.registerLayerDefinition(PonyModelSlim.LAYER_LOCATION, PonyModelSlim::createBodyLayer); event.registerLayerDefinition(PegasusModel.LAYER_LOCATION, PegasusModel::createBodyLayer); event.registerLayerDefinition(UnicornModel.LAYER_LOCATION, UnicornModel::createBodyLayer); event.registerLayerDefinition(InnerPonyArmorModel.LAYER_LOCATION, InnerPonyArmorModel::createBodyLayer); event.registerLayerDefinition(OuterPonyArmorModel.LAYER_LOCATION, OuterPonyArmorModel::createBodyLayer); } @SubscribeEvent public static void onClientSetup(final FMLClientSetupEvent event) { event.enqueueWork(() -> { try { final EntityRenderDispatcher dispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); final Field renderersField = getEntityRenderDispatcherField("playerRenderers"); final Field itemInHandRenderer = getEntityRenderDispatcherField("itemInHandRenderer"); @SuppressWarnings("unchecked") final Map<String, EntityRenderer<? extends Player>> playerRenderers = (Map<String, EntityRenderer<? extends Player>>)renderersField.get(dispatcher); final PonyPlayerWrapperRenderer renderer = new PonyPlayerWrapperRenderer( new EntityRendererProvider.Context( dispatcher, Minecraft.getInstance().getItemRenderer(), Minecraft.getInstance().getBlockRenderer(), (ItemInHandRenderer)itemInHandRenderer.get(dispatcher), Minecraft.getInstance().getResourceManager(), Minecraft.getInstance().getEntityModels(), Minecraft.getInstance().font ) ); playerRenderers.put("default", renderer); playerRenderers.put("slim", renderer); System.out.println("Player renderers replaced"); } catch (final Exception e) { throw new RuntimeException("Failed to replace player renderers", e); } }); } private static Field getEntityRenderDispatcherField(final String fieldName) throws NoSuchFieldException { final Field field = EntityRenderDispatcher.class.getDeclaredField(fieldName); field.setAccessible(true); return field; } } But I receive the error before Minecraft Client appears (RuntimeException: Failed to replace player renderers - from ClientRenderers onClientSetup() method - and its cause below): java.lang.IllegalArgumentException: No model for layer anotherlittlepony:earth_pony#main at net.minecraft.client.model.geom.EntityModelSet.bakeLayer(EntityModelSet.java:18) ~[forge-1.20.1-47.4.0_mapped_official_1.20.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at net.minecraft.client.renderer.entity.EntityRendererProvider$Context.bakeLayer(EntityRendererProvider.java:69) ~[forge-1.20.1-47.4.0_mapped_official_1.20.1-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} at com.thuggeelya.anotherlittlepony.client.renderer.pony.PonyPlayerRenderer.<init>(PonyPlayerRenderer.java:32) ~[main/:?] {re:classloading} at com.thuggeelya.anotherlittlepony.client.renderer.pony.PonyPlayerWrapperRenderer.<init>(PonyPlayerWrapperRenderer.java:24) ~[main/:?] {re:classloading} at com.thuggeelya.anotherlittlepony.client.renderer.ClientRenderers.lambda$onClientSetup$0(ClientRenderers.java:79) ~[main/:?] {re:classloading} ... 33 more Problem appears when EntityRendererProvider context tries to bakeLayer with my model layer location: new PonyModel(context.bakeLayer(PonyModel.LAYER_LOCATION)); // PonyPlayerRenderer.java:32 public class PonyModel extends PlayerModel<AbstractClientPlayer> { // the model class itself public static final ModelLayerLocation LAYER_LOCATION = new ModelLayerLocation( ResourceLocation.fromNamespaceAndPath(MODID, "earth_pony"), "main" ); public PonyModel(final ModelPart root) { super(root, false); } public static LayerDefinition createBodyLayer() { // some CubeListBuilder stuff for model appearance } } Textures PNGs are placed at: resources/assets/[my mod id]/textures/entity. My forge version is 1.20.1. Would appreciate any help.
    • Well, a bit more information about what you're trying to do would be helpful. e.g. why you're trying to use "INVOKE_ASSIGN" instead of "INVOKE". "INVOKE_ASSIGN" calls your code after the "target" is called and its value is stored, if applicable. "INVOKE" calls your code before the target is called. "target" expects a fully qualified name, as per the SpongePowered docs, if that name is going to be remapped (which it will be if your injecting into Minecraft itself and not another mod). For more information on fully qualified names versus canonical names, see the Java specifications. Here's an example of a working "@At" from my own code that targets the "getClosestsVulnerablePlayerToEntity" call inside a mob's logic: @At(value = "INVOKE_ASSIGN", target = "net.minecraft.world.World.getClosestVulnerablePlayerToEntity(Lnet/minecraft/entity/Entity;D)Lnet/minecraft/entity/player/EntityPlayer;") Hope this helps!
    • Ran it one more time just to check, and there's no errors this time on the log??? Log : https://mclo.gs/LnuaAiu I tried allocating more memory to the modpack, around 8000MB and it's still the same; stopping at "LOAD_REGISTRIES". Are some of the mods clashing, maybe? I have no clue what to do LOL
    • Tried removing some biome generation mods and test ran it again, but it's still the same; still not responding as soon as it gets to "LOAD_REGISTRIES". This time with more errors though. Log : https://mclo.gs/uygZzD8 Is there too little memory allocated to the modpack maybe? Can someone help please.    (T.T)💔
    • This is sad. Over 3300 people have checked the thread and no one is able to help or give any ideas :(.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.