Jump to content

Recommended Posts

Posted
package losokos.vce.custom;

import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LightningBolt;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ArmorItem;
import net.minecraft.world.item.ArmorMaterial;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraftforge.client.IBlockRenderProperties;
import net.minecraftforge.common.extensions.IForgeBlockState;

import java.util.concurrent.TimeUnit;

public class CopperHelmetItem extends ArmorItem {
    public CopperHelmetItem(ArmorMaterial material, EquipmentSlot slot, Properties properties) {
        super(material, slot, properties);
    }

    @Override
    public void onArmorTick(ItemStack stack, Level world, Player player) {
        if (!world.isClientSide()){

            BlockPos isOutside = player.getPosition().up();
            IForgeBlockState blockStateAbove = world.getBlockState(isOutside);

            if(world.isThundering()){
                //Adds "lightningEntity" that spawns lightning at players location
                Entity lightningEntity = new LightningBolt(EntityType.LIGHTNING_BOLT, world);
                lightningEntity.setPos(player.getX(),player.getY(),player.getZ());


                    try {
                        Thread.sleep(1000);
                        world.addFreshEntity(lightningEntity);
                    } catch (InterruptedException e) {
                        world.addFreshEntity(lightningEntity);
                    }



            }
        }
    }}

I am of course trying to check if all blocks above player are air blocks...
How would i do that?

Posted
6 minutes ago, Losokos said:
Thread.sleep(1000);

You can't do that. "Every game tick while this is equipped, add a 1 second delay".

You need to either count ticks (probably updating the item NBT so that it carries over saves) or check the time (probably save the "lastLightningTime" to NBT and compare it against the level time. Alternatively you could just do level time % 1000, but then everyone wearing the helmet would have lightning at the same time).

 

As for your actual request, you need to loop through all blocks above the player position (player y to world height), and check that they are air.

Posted
18 minutes ago, Alpvax said:

As for your actual request, you need to loop through all blocks above the player position (player y to world height), and check that they are air.

There are some helper methods in the Level class that already do this for you. I don't know what the mojang names are, but canLightningStrikeHere and getGroundHeight are the mcp names

  • Like 1

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
2 hours ago, Alpvax said:

You can't do that. "Every game tick while this is equipped, add a 1 second delay".

You need to either count ticks (probably updating the item NBT so that it carries over saves) or check the time (probably save the "lastLightningTime" to NBT and compare it against the level time. Alternatively you could just do level time % 1000, but then everyone wearing the helmet would have lightning at the same time).

It was just a temporary solution, for me to check if lightning spawns at all... But i mean this works perfectly fine, and strikes lightning on player every second, but i guess i can use this method instead, cause this just feels wrong haha
 

 

2 hours ago, Alpvax said:

As for your actual request, you need to loop through all blocks above the player position (player y to world height), and check that they are air.

That is what i was thinking, but i was wondering if there are methods that would do this, thanks anyway ;)

 

Posted
       BlockPos posAbove = player.getPosition().up();
                BlockState blockStateAbove = world.getBlockState(posAbove);
                Block above = blockStateAbove.getBlock();

I've found a piece of code like this, but i am getting an error t the first line in .getPosition()
I just have no idea what to place here in order for it to work properly... any suggestions??? 

Posted
5 minutes ago, Luis_ST said:

whats the error?

Oh yes, sorry haha
here:

error: method getPosition in class Entity cannot be applied to given types;
                BlockPos posAbove = player.getPosition().up();
                                          ^
  required: float
  found:    no arguments
  reason: actual and formal argument lists differ in length

 

Posted

I mean, i uderstand i need to give it a Vec3 instead of BlockPos, but in order for me to use getBlockState i need a BlockPos.
I am pretty new to java, so if i am getting something wrong here, please let me know..

Posted

If you need to loop through positions in world, use a single BlockPos.MutableBlockPos, not a bunch of BlockPos objects.

15 hours ago, Losokos said:
incompatible types: Vec3 cannot be converted to BlockPos

there should be player.blockPosition method.

Posted
18 hours ago, Losokos said:

But i mean this works perfectly fine, and strikes lightning on player every second

No, it doesn't. For each player on the server wearing the helmet, the game would freeze for 1 second each tick (there should be 20 per second). This would mean that if there were 2 players wearing the helmet, 1 in-game second would take about 40 seconds, otherwise known as the game freezing.

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



×
×
  • Create New...

Important Information

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