Losokos Posted February 28, 2022 Posted February 28, 2022 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? Quote
Alpvax Posted February 28, 2022 Posted February 28, 2022 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. Quote
Draco18s Posted February 28, 2022 Posted February 28, 2022 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 1 Quote 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.
Losokos Posted February 28, 2022 Author Posted February 28, 2022 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 Quote
Losokos Posted February 28, 2022 Author Posted February 28, 2022 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??? Quote
Losokos Posted February 28, 2022 Author Posted February 28, 2022 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 Quote
Luis_ST Posted February 28, 2022 Posted February 28, 2022 the error should be clear, getPosition requires a float as parameter you can use 1.0F, getPosition returns then the current position Quote
Losokos Posted February 28, 2022 Author Posted February 28, 2022 Does not work... error: incompatible types: Vec3 cannot be converted to BlockPos BlockPos posAbove = player.getPosition(1.0F); Quote
Luis_ST Posted February 28, 2022 Posted February 28, 2022 learn basic Java and read the error message Quote
Losokos Posted February 28, 2022 Author Posted February 28, 2022 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.. Quote
Luis_ST Posted February 28, 2022 Posted February 28, 2022 you can create a BlockPos form a Vec3, take a look at the constructors of BlockPos Quote
MFMods Posted March 1, 2022 Posted March 1, 2022 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. Quote
Alpvax Posted March 1, 2022 Posted March 1, 2022 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. Quote
Recommended Posts
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.