Jump to content

Looking for a better way [semi-solid block][Solved]


Recommended Posts

I'm looking for a better way to do my semi-solid cloud blocks.


Effect I'm after:

Entities fall through the block unless the cloudWalk flag return true, then it is just like any other solid block.

The cloudWalk flag is true when the player can fly or has equipped special armor.


How it is Currently working.

The block is solid.

in "onEntityWalking" and "onFallenUpon" the flag gets checked, if false the entity gets nudged into the block.

in "onEntityCollidedWithBlock" the flag gets checked, if false "entity.setInWeb()" & "entity.setVelocity(0.0D, -2.0D, 0.0D)"



In 1.2.5 this method worked well in SSP, but on the server it worked poorly on players.

Issue #1 --Solved with new server side noClip hook added in #237

Even though the server was pushing the player it was seen as an invalid move and NetServerHandler would push the player back.

The only way I found to get around this was to edit the base class and override the check while falling through the cloud block


Issue #2

Minecraft seen the block as a valid spawn spot, many times you'd fall to your death.

To hack around this I edited my generator so clouds wouldn't be placed withing the spawn zone (this looked dumb)


Issue #3 --Solved with new hook added in #237or at least it appears to be

If the clouds where thicker then one block (almost always) sometimes you'd get stuck while falling through because "onEntityWalking" and "onFallenUpon" didn't trigger on the block bellow. By wiggling you could get unstuck.



My thoughts for reworking:

I think the best thing to do is set the getCollisionBoundingBox to null.

That should solve the getting stuck problem, remove the base edit, and maybe solve the spawn problem.

But then I have to find a way to collide with a block that has no collision box  :o

For the y value I could check if there is a cloud bellow and change it to counter the fall, if done at LivingUpdateEvent there shouldn't be any noticeable jitter, but I've got no ideas for x and z.

Link to comment
Share on other sites

Colliding without the colliding box; have you considered putting a test in getCollisionBoundingBoxFromPool for cloudWalk?


so perhaps something like:


public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
        if (!cloudWalk)
            return null; //fall to your death.
            return AxisAlignedBB.getBoundingBox(par2, par3, par4, par2 + 1, par3 + 1, par4 + 1); //i.e a solid cloud.


So unless you have cloudWalk, you cant fall. At the very least, this should solve issue#3. As for issue#2, perhaps you could make it so players aren't given cloudWalk until after spawning? Perhaps add something like

 if (world.worldInfo.getWorldTime < youllhavetocheckwhattheworldtimeisafewsecondsafterspawn) { cloudWalk = true; } //i can see this being a little bit dodgey though


Alternatively, perhaps you could see if you can find a way to get number of generated chunks, and if it's > 8 or 16 or something, then apply cloudWalk?


As for issue#1, you're not moving the player, so maybe it will be fixed?


Just my 2 cents. Apologies if it's useless, I'm quite tired.

Link to comment
Share on other sites

"have you considered putting a test in getCollisionBoundingBoxFromPool for cloudWalk?"

Yep with funny results too, the block became pass through for everyone when one who couldn't walk on them touched it.

Another thing I tried in 1.2.3 was setting the box to null on the server but a full cube on the client. I don't remember what problems I had with that but it was scrapped.

Got through this one though, I submitted a hook that allows server mods to use noClip to stop NetServerHandler from freaking out.

It was put in Build #237 so all is good there.

(server side noClip seems to have solved issue #3 as well)



As long as a block exists, is solid, and is not a leaf block, Minecraft calls it a valid spawn block.

I located where this was happening and submitted a new hook, others may find it helpful also.

But it if doesn't make it in I'll just continue pushing my blocks away from the map spawn point. (and hope no server admins move it)

Link to comment
Share on other sites

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.

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.

  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Wait guys, I still don't don't understand... I shall send my code -- Define the function to decrease hunger local function decreaseHunger(player)     local currentHunger = player.getHunger()          -- Check if hunger is not already zero     if currentHunger > 0 then         player.setHunger(currentHunger - 1)     end end -- Register event to decrease hunger over time script.registerEvent(EntityPlayer, function(player)     while true do         -- Decrease hunger every few seconds         decreaseHunger(player)         script.sleep(1000) -- Sleep for 1 second     end end)     Any help appriecated. It's been a while since I learnt Javascript or whatever Minecraft is made with... ... ... ... Nicknotname Hungerinpeaceful xx
    • good days  i get this error: java.lang.ClassCastException: class net.minecraft.client.player.LocalPlayer cannot be cast to class net.minecraftforge.common.extensions.IForgeServerPlayer (net.minecraft.client.player.LocalPlayer is in module minecraft@1.20.4 of loader 'TRANSFORMER' @3e8b3b79; net.minecraftforge.common.extensions.IForgeServerPlayer is in module forge@49.0.26 of loader 'TRANSFORMER' @3e8b3b79)     at mercmod.blocks.classes.panel_whit_entity_inside.use(panel_whit_entity_inside.java:576) ~[main/:?] {re:classloading}     at net.minecraft.world.level.block.state.BlockBehaviour$BlockStateBase.use(BlockBehaviour.java:826) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading}     at net.minecraft.client.multiplayer.MultiPlayerGameMode.performUseItemOn(MultiPlayerGameMode.java:324) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraft.client.multiplayer.MultiPlayerGameMode.lambda$useItemOn$4(MultiPlayerGameMode.java:292) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraft.client.multiplayer.MultiPlayerGameMode.startPrediction(MultiPlayerGameMode.java:251) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraft.client.multiplayer.MultiPlayerGameMode.useItemOn(MultiPlayerGameMode.java:291) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A}     at net.minecraft.client.Minecraft.startUseItem(Minecraft.java:1799) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at net.minecraft.client.Minecraft.handleKeybinds(Minecraft.java:2083) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at net.minecraft.client.Minecraft.tick(Minecraft.java:1902) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at net.minecraft.client.Minecraft.runTick(Minecraft.java:1216) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at net.minecraft.client.Minecraft.run(Minecraft.java:801) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:accesstransformer:B,pl:runtimedistcleaner:A}     at net.minecraft.client.main.Main.main(Main.java:234) ~[forge-1.20.4-49.0.26_mapped_official_1.20.4-recomp.jar:?] {re:classloading,pl:runtimedistcleaner:A} ------------------------------------------------------------------------------------------------------------------   context:  im updating the briefcase from mi mod an i need to make a gui whit this image that gonna be launched from a block and from a item soo im using kapenjoe tutorials  ---------------------------------------------------------------------------------------- The problem is that tutorial is for 1.20.1 and im using 1.20.4 and i really dont get how to call and open the gui from the block nor from the item i made this based on post i made short ago everything seems find but when right click the block to open the gui it crash the game  @Override public InteractionResult use(BlockState blkstate, Level warudo, BlockPos pos, Player pe, InteractionHand hand, BlockHitResult hitresult) {     if(warudo.isClientSide()){         BlockEntity blkentity = warudo.getBlockEntity(pos);         if(blkentity instanceof Panel_BlockEntity){             //   ↓↓↓  open the menu from the block              IForgeServerPlayer ifpe = (IForgeServerPlayer)pe; //<--- this is wrong  "class net.minecraft.client.player.LocalPlayer cannot be cast to class net.minecraftforge.common.extensions.IForgeServerPlayer"             ifpe.openMenu( (Panel_BlockEntity) blkentity, pos ); //<-- i need an example of how open a gui in 1.20.4         }     } return InteractionResult.sidedSuccess(warudo.isClientSide()); } Theres nothing highlighted in red in the code like everything where right an possible but dont works  ####################################################################################################### i need to see an example, just the piece of code for the use() method of the block whit the block entity for 1.20.4  and the same  but for the item     @Override     public @NotNull InteractionResultHolder<ItemStack> use(@NotNull Level warudo, @NotNull Player pe, @NotNull InteractionHand interactionHand)     {         if (!warudo.isClientSide())         {             ItemStack heldItem = pe.getItemInHand(interactionHand);                          if (heldItem.getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent())             {                 //   ↓↓↓  open the menu from the item                 NetworkHooks.openScreen((ServerPlayer) pe, this);             }         }         return super.use(warudo, pe, interactionHand);     }   thanks for your attention           
    • It depends on the data you want to save, but generally speaking you should use some custom Player Capabilities, attach to the Player and use them to store/retrieve any kind of data you want. You can find how to make them work for 1.20.x in the documentation here: https://docs.minecraftforge.net/en/latest/datastorage/capabilities/
  • Topics

  • Who's Online (See full list)

  • Create New...

Important Information

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