Jump to content

Recommended Posts

Posted

I have been working on custom trees and know how to add a block anywhere I want but it seems like there is probably a much better way of doing it. Thought more experienced people might be able to compact it a bit. Thanks in advance

 

int branchHeight = 4;
            	for(int branchLength = 0; branchLength < 3; branchLength++)
            	{
            		BlockPos north = pos.north(branchLength);
            		BlockPos east = pos.east(branchLength);
            		BlockPos south = pos.south(branchLength);
            		BlockPos west = pos.west(branchLength);
            		
            		IBlockState nState = world.getBlockState(north);
            		IBlockState eState = world.getBlockState(east);
            		IBlockState sState = world.getBlockState(south);
            		IBlockState wState = world.getBlockState(west);
            		
            		if (nState.getBlock().isAir(nState, world, north) || nState.getBlock().isLeaves(nState, world, north))
                    {
                        this.setBlockAndNotifyAdequately(world, pos.north(branchLength).up(branchHeight), LOG);
                    }
            		if (eState.getBlock().isAir(eState, world, east) || eState.getBlock().isLeaves(eState, world, east))
                    {
                        this.setBlockAndNotifyAdequately(world, pos.east(branchLength).up(branchHeight), LOG);
                    }
            		if (sState.getBlock().isAir(sState, world, south) || sState.getBlock().isLeaves(sState, world, south))
                    {
                        this.setBlockAndNotifyAdequately(world, pos.south(branchLength).up(branchHeight), LOG);
                    }
            		if (wState.getBlock().isAir(wState, world, west) || wState.getBlock().isLeaves(wState, world, west))
                    {
                        this.setBlockAndNotifyAdequately(world, pos.west(branchLength).up(branchHeight), LOG);
                    }
            		
            	}

 

Posted (edited)

What's the difference between this-

BlockPos north = pos.north(branchLength);
...
IBlockState nState = world.getBlockState(north);
...
if (nState.getBlock().isAir(nState, world, north) || nState.getBlock().isLeaves(nState, world, north))
{
  this.setBlockAndNotifyAdequately(world, pos.north(branchLength).up(branchHeight), LOG);
}

- and this -

BlockPos east = pos.east(branchLength);
...
IBlockState eState = world.getBlockState(east);
...
if (eState.getBlock().isAir(eState, world, east) || eState.getBlock().isLeaves(eState, world, east))
{
  this.setBlockAndNotifyAdequately(world, pos.east(branchLength).up(branchHeight), LOG);
}

?

 

The only difference is that every instance of north in the first example is replaced with east in the second example. You could streamline this by looping through the horizontal directions (EnumFacing.HORIZONTALS), and write out this procedure just once inside the loop.

Edited by Jay Avery
Posted

Yeah, but you'll note that none of your code is really repeated -- you're checking different blocks / locations and placing blocks in different locations. You've already shortened the amount of code by assigning things like north, east, south, west.

 

Now the code you posted seems to be about checking specific location. Do you have other code that loops through lots of locations?  Or maybe you're just started and will add a lot more lines like the ones you show? In those cases, yes you might be able to compact it.

 

But there is nothing wrong with "brute" force approaches to programming. It is often less buggy to do it the way you're doing it, because if you try to get clever you can end up doing something wrong in a loop that creates very strange results. It also doesn't save much typing because you can cut and paste easily enough.

 

So my recommendation is to only look at compacting code if you have a lot of repetition or if you feel performance is being hampered due to inefficiency. Otherwise, as long as it is short and readable it is good code.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted (edited)
11 minutes ago, Jay Avery said:

The only difference is that every instance of north in the first example is replaced with east in the second example. You could streamline this by looping through the horizontal directions (EnumFacing.HORIZONTALS), and write out this procedure just once inside the loop.

Not that easy though because it isn't just the conditions that cycle through the directions but also the action -- the positions are different in each case. So if he had an iterator for the direction he'd still have to look up what to do, probably using a bunch of if statements, when the condition is met. I really don't think it would save many lines of code.

 

If he was doing the SAME thing in each case then definitely it could be compacted, but harder when it does different things.

Edited by jabelar

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted (edited)
32 minutes ago, jabelar said:

Not that easy though because it isn't just the conditions that cycle through the directions but also the action -- the positions are different in each case. So if he had an iterator for the direction he'd still have to look up what to do, probably using a bunch of if statements, when the condition is met. I really don't think it would save many lines of code.

 

If he was doing the SAME thing in each case then definitely it could be compacted, but harder when it does different things.

The position is just moved in the relevant direction, so you can do pos.offset(facing).

Edited by Jay Avery

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

    • Forge is probably the most feature loaded mod loader currently. You can change just about anything with the game mechanics by using mixins. You can also add more items and feature than what the docs show you. It is good to start with a Modding tutorial series like this one by Kaupenjoe.  Some good examples of what is possible with forge is clockwork, dynamic trees, and I guess create but its on fabric too.
    • I'm new to modding and trying to make a mod in 1.20.1. My mod currently just has a custom bow, but when I use my bow, it does not play the animation. I have the jsons and pngs in the right spots and I've compared my jsons with that of existing mods, everything seems to line up just fine. Anyone know what might be causing this? I've changed the item between a basic BowItem and a custom class extending from BowItem, even overriding the animation code, no dice. odysseus_bow.json: { "parent": "item/generated", "textures": { "layer0": "odyssey:item/odysseus_bow" }, "overrides": [ { "predicate": { "pulling": 1 }, "model": "odyssey:item/odysseus_bow_pulling_0" }, { "predicate": { "pulling": 1, "pull": 0.65 }, "model": "odyssey:item/odysseus_bow_pulling_1" }, { "predicate": { "pulling": 1, "pull": 0.9 }, "model": "odyssey:item/odysseus_bow_pulling_2" } ] } odysseus_bow_pulling_0.json: { "parent": "item/generated", "textures": { "layer0": "odyssey:item/odysseus_bow_pulling_0" }, "display": { "thirdperson_righthand": { "rotation": [ -80, 260, -40 ], "translation": [ -1, -2, 2.5 ], "scale": [ 1.2, 0.9, 1.2 ] }, "firstperson_righthand": { "rotation": [ 0, -90, 25 ], "translation": [ 1.13, 3.2, 1.13 ], "scale": [ 0.88, 0.68, 0.88 ] } } } (_1 and _2 are the same with the respective layer0)
    • Hello I've been having some issues with Multipart entities and that it is constantly taking damage. The video below shows the issues. Also the hit boxes that are moving constantly seem to be still, because you can still be seated on the hit box where it is suppose to be.  Here is some modified code taken from EnderDragonPart. public class TheHeartPart extends PartEntity<TheHeart> { public final TheHeart parentMob; public final String name; private final EntityDimensions size; public TheHeartPart(TheHeart pParentMob, String pName, float pWidth, float pHeight) { super(pParentMob); this.size = EntityDimensions.scalable(pWidth, pHeight); this.refreshDimensions(); this.parentMob = pParentMob; this.name = pName; } @Override protected void defineSynchedData() { } @Override protected void readAdditionalSaveData(CompoundTag pCompound) { } @Override protected void addAdditionalSaveData(CompoundTag pCompound) { } @Override public boolean isPickable() { return true; } @Nullable public ItemStack getPickResult() { return this.parentMob.getPickResult(); } @Override public boolean hurt(DamageSource pSource, float pAmount) { return false; //return this.isInvulnerableTo(pSource) ? false : this.parentMob.hurt(pSource, pAmount); } @Override public boolean is(Entity pEntity) { return this == pEntity || this.parentMob == pEntity; } @Override public Packet<ClientGamePacketListener> getAddEntityPacket() { throw new UnsupportedOperationException(); } @Override public EntityDimensions getDimensions(Pose pPose) { return this.size; } @Override public boolean shouldBeSaved() {return false;} } Any help is greatly appreciated!
    • I've been trying to run some modpacks through Prism launcher which haven't been working and I narrowed it down due to some forge issues. The issues only happen with modpacks using forge 1.20.1 so I tried to reinstall 1.20.1, but I keep getting this error log:https://pastebin.com/4w9pGURJ 
    • I split your reply to an unrelated topic into a separate request for help.   Please read the FAQ for how to properly request help and post logs.
  • Topics

×
×
  • Create New...

Important Information

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