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
  On 2/28/2022 at 2:36 PM, Losokos said:
Thread.sleep(1000);
Expand  

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
  On 2/28/2022 at 2:47 PM, 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.

Expand  

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
  On 2/28/2022 at 2:47 PM, 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).

Expand  

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
 

 

  On 2/28/2022 at 2:47 PM, 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.

Expand  

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
  On 2/28/2022 at 7:11 PM, Luis_ST said:

whats the error?

Expand  

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.

  On 2/28/2022 at 7:46 PM, Losokos said:
incompatible types: Vec3 cannot be converted to BlockPos
Expand  

there should be player.blockPosition method.

Posted
  On 2/28/2022 at 5:35 PM, Losokos said:

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

Expand  

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.