Posted January 22, 20232 yr For now it's working as intended. What are your opinions on the code? - How could things be done better? Let me know what you think. - Am i right in assuming ClipContext is for ray tracing? - I couldn't find the RayTracingContext, it took me some time of digging around blind to finally stumble upon this ClipContext class. How could i have investigated the topic faster? By digging through minecraft and other mods? By asking you here? package net.ja.testmod.item; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LightningBolt; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ClipContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; public class ThunderWand extends Item { public ThunderWand(Item.Properties properties){ super(properties); } @Override public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand interactionHand) { //if main hand, lightningbolt at crosshair if(interactionHand == InteractionHand.MAIN_HAND) { BlockHitResult result = getCrosshairLocation(level, player, 50f); Vec3 location = correctLightningBoltSpawnHeight(level, result); spawnLightningBoltAt(level, location); } //if offhand, lightningbolt at player if(interactionHand == InteractionHand.OFF_HAND) spawnLightningBoltAtPlayer(level, player); //super return super.use(level, player, interactionHand); } public Vec3 correctLightningBoltSpawnHeight(Level level, BlockHitResult prevResult){ //avoid spawning lightningbolts in the air, spawn them straight down instead BlockState state = level.getBlockState(prevResult.getBlockPos()); if(state.isAir()){ Vec3 down = new Vec3(0, -1, 0); ClipContext cc = new ClipContext(prevResult.getLocation(), prevResult.getLocation().add(down.scale(500)), ClipContext.Block.COLLIDER, ClipContext.Fluid.ANY, null); BlockHitResult result = level.clip(cc); return result.getLocation(); } return prevResult.getLocation(); } public BlockHitResult getCrosshairLocation(Level level, Player player, float distance){ Vec3 view = player.getViewVector(0f); Vec3 from = player.getEyePosition(); Vec3 to = from.add(view.scale(distance)); ClipContext cc = new ClipContext(from, to, ClipContext.Block.COLLIDER, ClipContext.Fluid.ANY, null); BlockHitResult result = level.clip(cc); return result; } public void spawnLightningBoltAt(Level level, Vec3 location){ if(!level.isClientSide()){ LightningBolt lb = new LightningBolt(EntityType.LIGHTNING_BOLT, level); lb.setPos(location); level.addFreshEntity(lb); } } //Minecraft.getInstance().player.chat('msg'); public void spawnLightningBoltAtPlayer(Level level, Player player){ if(!level.isClientSide()){ LightningBolt lb = new LightningBolt(EntityType.LIGHTNING_BOLT, level); lb.setPos(player.getPosition(0f)); level.addFreshEntity(lb); } } }
January 22, 20232 yr what are trying to achive op to understand the raytrace you have to look into te abstrab arrow class mostly is the same but they change the names of things package net.minecraft.world.phys.HitResult; i do this when i want to search things ignoring liquids but stoping on solid blocks this.hitresult = this.warudo.clip(new ClipContext(this.vi, this.vo, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this.player_entity));
January 22, 20232 yr Author 2 hours ago, perromercenary00 said: to understand the raytrace you have to look into te abstrab arrow class I do understand raytracing. And i think it's pretty clear what i want to achieve (which i've done) the comments are clear.
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.