33import com .github .x3r .mekanism_turrets .common .block .LaserTurretBlock ;
44import com .github .x3r .mekanism_turrets .common .registry .DamageTypeRegistry ;
55import com .github .x3r .mekanism_turrets .common .registry .EntityRegistry ;
6+ import net .minecraft .core .SectionPos ;
7+ import net .minecraft .server .level .ServerLevel ;
68import net .minecraft .world .entity .EntityType ;
79import net .minecraft .world .entity .projectile .Projectile ;
810import net .minecraft .world .entity .projectile .ProjectileUtil ;
1214import net .minecraft .world .phys .EntityHitResult ;
1315import net .minecraft .world .phys .HitResult ;
1416import net .minecraft .world .phys .Vec3 ;
17+ import net .minecraftforge .event .entity .EntityEvent ;
18+ import net .minecraftforge .eventbus .api .SubscribeEvent ;
1519
1620public class LaserEntity extends Projectile {
1721
@@ -32,17 +36,22 @@ public LaserEntity(Level pLevel, Vec3 pos, double damage) {
3236 public void tick () {
3337 super .tick ();
3438 if (!level ().isClientSide ()) {
39+ if (lifeTime ++ > 10 * 20 ) {
40+ this .discard ();
41+ return ;
42+ }
43+ if (this .position ().y > level ().getMaxBuildHeight ()+100 ) {
44+ this .discard ();
45+ return ;
46+ }
3547 HitResult hitResult = ProjectileUtil .getHitResultOnMoveVector (this , this ::canHitEntity );
3648 if (hitResult .getType ().equals (HitResult .Type .BLOCK )) {
3749 onHitBlock ((BlockHitResult ) hitResult );
3850 }
3951 level ().getEntities (this , getBoundingBox ().inflate (0.5 )).forEach (entity -> {
4052 entity .hurt (new DamageTypeRegistry (level ().registryAccess ()).laser (), (float ) this .damage );
4153 });
42- lifeTime ++;
43- if (lifeTime > 10 * 20 ) {
44- this .discard ();
45- }
54+
4655 }
4756 this .setPos (this .position ().add (this .getDeltaMovement ()));
4857 }
@@ -60,4 +69,24 @@ protected void onHitBlock(BlockHitResult pResult) {
6069 protected void defineSynchedData () {
6170
6271 }
72+
73+ @ Override
74+ public boolean shouldBeSaved () {
75+ return false ;
76+ }
77+
78+ @ Override
79+ public int getPortalWaitTime () {
80+ return Integer .MAX_VALUE ;
81+ }
82+
83+ @ SubscribeEvent
84+ public static void enterChunk (EntityEvent .EnteringSection event ) {
85+ if (!event .getEntity ().level ().isClientSide () && event .didChunkChange () && event .getEntity () instanceof LaserEntity ) {
86+ ServerLevel level = ((ServerLevel ) event .getEntity ().level ());
87+ if (level .isPositionEntityTicking (SectionPos .of (event .getPackedNewPos ()).center ())) {
88+ event .getEntity ().discard ();
89+ }
90+ }
91+ }
6392}
0 commit comments