diff --git a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/FakeTNT19.java b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/FakeTNT19.java index 38e0c138..de1c666f 100644 --- a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/FakeTNT19.java +++ b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/FakeTNT19.java @@ -26,43 +26,34 @@ import net.minecraft.network.protocol.game.PacketPlayOutSpawnEntity; import net.minecraft.network.syncher.DataWatcher; import net.minecraft.network.syncher.DataWatcherObject; import net.minecraft.network.syncher.DataWatcherRegistry; -import net.minecraft.tags.TagsBlock; import net.minecraft.util.MathHelper; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.*; import net.minecraft.world.entity.item.EntityTNTPrimed; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.ExplosionDamageCalculator; -import net.minecraft.world.level.RayTrace; import net.minecraft.world.level.World; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.IBlockData; -import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.phys.AxisAlignedBB; -import net.minecraft.world.phys.MovingObjectPosition; -import net.minecraft.world.phys.MovingObjectPositionBlock; import net.minecraft.world.phys.Vec3D; import net.minecraft.world.phys.shapes.VoxelShape; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.craftbukkit.v1_19_R1.SpigotTimings; import org.bukkit.entity.Explosive; -import org.bukkit.entity.Vehicle; import org.bukkit.event.entity.ExplosionPrimeEvent; -import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; import javax.annotation.Nullable; +import java.util.ArrayList; import java.util.List; public class FakeTNT19 extends EntityTNTPrimed { private static final DataWatcherObject b; private static final int c = 80; private List fakeTNT19s; + private List spawnList = new ArrayList<>(); + private int count; @Nullable public EntityLiving d; public float yield; public boolean isIncendiary; - public int offset = 0; public FakeTNT19(List fakeTNT19s, EntityTypes type, World world) { super(type, world); @@ -72,17 +63,17 @@ public class FakeTNT19 extends EntityTNTPrimed { super.q = true; } - public FakeTNT19(List fakeTNT19s, World world, double x, double y, double z, int tickoffset) { + public FakeTNT19(List fakeTNT19s, World world, double x, double y, double z, int fuse, int count) { this(fakeTNT19s, EntityTypes.av, world); this.e(x, y, z); double d3 = world.w.j() * 6.2831854820251465D; this.n(-Math.sin(d3) * 0.02D, 0.20000000298023224D, -Math.cos(d3) * 0.02D); - this.a(tickoffset); + this.a(fuse); super.t = x; super.u = y; super.v = z; this.d = null; - this.offset = tickoffset; + this.count = count; } protected void a_() { @@ -173,8 +164,7 @@ public class FakeTNT19 extends EntityTNTPrimed { } } - @Override - public void k() { + public void k(List spawnList) { if (!this.aN()) { this.f(this.de().b(0.0D, -0.04D, 0.0D)); } @@ -196,6 +186,16 @@ public class FakeTNT19 extends EntityTNTPrimed { } else { this.aZ(); } + + if (i == 1 && count > 1) { + for (int c = 0; c < count - 1; c++) { + FakeTNT19 fakeTNT19 = new FakeTNT19(fakeTNT19s, this.s, this.dg(), this.di(), this.dm(), i, 1); + fakeTNT19.y = this.y; + fakeTNT19.f(new Vec3D(this.de().c, this.de().d, this.de().e)); + spawnList.add(fakeTNT19); + } + count = 1; + } } private void j1() { diff --git a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/SimulatorPreview19.java b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/SimulatorPreview19.java index 1559b01a..5cfc5330 100644 --- a/BauSystem_19/src/de/steamwar/bausystem/features/simulator/SimulatorPreview19.java +++ b/BauSystem_19/src/de/steamwar/bausystem/features/simulator/SimulatorPreview19.java @@ -79,10 +79,18 @@ public class SimulatorPreview19 implements SimulatorPreview { while(hasSomeLeft.get()) { hasSomeLeft.set(false); pairs.forEach(pair -> { - if (pair.getValue() > 0) { + SimulatorPreview.SimulatorPreviewTNTData previewTNTData = pair.getKey(); + if (!previewTNTData.isXVelocity() && !previewTNTData.isZVelocity()) { + FakeTNT19 fakeTNT19 = new FakeTNT19(fakeTNT19s, WORLD, previewTNTData.getX(), previewTNTData.getY(), previewTNTData.getZ(), previewTNTData.getFuseTicks(), pair.getValue()); + TNTPrimed tntPrimed = (TNTPrimed) fakeTNT19.getBukkitEntity(); + if (!previewTNTData.isXVelocity()) tntPrimed.setVelocity(tntPrimed.getVelocity().setX(0)); + if (!previewTNTData.isYVelocity()) tntPrimed.setVelocity(tntPrimed.getVelocity().setY(0)); + if (!previewTNTData.isZVelocity()) tntPrimed.setVelocity(tntPrimed.getVelocity().setZ(0)); + fakeTNT19s.add(fakeTNT19); + pair.setValue(0); + } else if (pair.getValue() > 0) { hasSomeLeft.set(true); - SimulatorPreview.SimulatorPreviewTNTData previewTNTData = pair.getKey(); - FakeTNT19 fakeTNT19 = new FakeTNT19(fakeTNT19s, WORLD, previewTNTData.getX(), previewTNTData.getY(), previewTNTData.getZ(), previewTNTData.getFuseTicks()); + FakeTNT19 fakeTNT19 = new FakeTNT19(fakeTNT19s, WORLD, previewTNTData.getX(), previewTNTData.getY(), previewTNTData.getZ(), previewTNTData.getFuseTicks(), 1); TNTPrimed tntPrimed = (TNTPrimed) fakeTNT19.getBukkitEntity(); if (!previewTNTData.isXVelocity()) tntPrimed.setVelocity(tntPrimed.getVelocity().setX(0)); if (!previewTNTData.isYVelocity()) tntPrimed.setVelocity(tntPrimed.getVelocity().setY(0)); @@ -101,17 +109,24 @@ public class SimulatorPreview19 implements SimulatorPreview { } private void calculateTick(List fakeTNT19s, Record record, Map tntRecords) { - Iterator iterator = fakeTNT19s.iterator(); - while (iterator.hasNext()) { - FakeTNT19 fakeTNT19 = iterator.next(); - fakeTNT19.k(); + int i = 0; + while (i < fakeTNT19s.size()) { + List spawnList = new ArrayList<>(); + FakeTNT19 fakeTNT19 = fakeTNT19s.get(i); + fakeTNT19.k(spawnList); TNTPrimed tntPrimed = ((TNTPrimed) (fakeTNT19.getBukkitEntity())); if (tntPrimed.getFuseTicks() <= 0) { tntRecords.computeIfAbsent(fakeTNT19, ignore -> record.spawn()).explode(tntPrimed); - iterator.remove(); + fakeTNT19s.remove(i); + i--; } else { tntRecords.computeIfAbsent(fakeTNT19, ignore -> record.spawn()).explode(tntPrimed); } + if (!spawnList.isEmpty()) { + fakeTNT19s.addAll(i, spawnList); + i += spawnList.size(); + } + i++; } } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorPreviewStorage.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorPreviewStorage.java index f2845d6e..43024440 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorPreviewStorage.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/SimulatorPreviewStorage.java @@ -19,10 +19,10 @@ package de.steamwar.bausystem.features.simulator; +import de.steamwar.bausystem.features.simulator.show.PreviewEntityShowMode; import de.steamwar.bausystem.features.tracer.TNTPosition; import de.steamwar.bausystem.features.tracer.show.Record; import de.steamwar.bausystem.features.tracer.show.ShowModeParameter; -import de.steamwar.bausystem.features.tracer.show.mode.TraceEntityShowMode; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.shared.ShowMode; import lombok.experimental.UtilityClass; @@ -57,7 +57,7 @@ public class SimulatorPreviewStorage { pair.getValue().add(player); ShowModeParameter showModeParameter = new ShowModeParameter(); - TraceEntityShowMode showMode = new TraceEntityShowMode(player, showModeParameter); + PreviewEntityShowMode showMode = new PreviewEntityShowMode(player, showModeParameter); pair.getKey().showAll(showMode); showModes.put(player, new Pair<>(tntSimulator, showMode)); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java index 4be1c2ed..70591dc3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/TNTSimulatorListener.java @@ -132,7 +132,9 @@ public class TNTSimulatorListener implements Listener { simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInMainHand, e.getPlayer().getLocation()); } else { TNTSimulator tntSimulator = simulatorShowHide(e.getPlayer(), i -> null, PlayerInventory::getItemInOffHand, e.getPlayer().getLocation()); - if (tntSimulator != null) SimulatorPreviewStorage.show(e.getPlayer(), tntSimulator); + Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { + if (tntSimulator != null) SimulatorPreviewStorage.show(e.getPlayer(), tntSimulator); + }, 10); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/show/PreviewEntityShowMode.java b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/show/PreviewEntityShowMode.java new file mode 100644 index 00000000..3c1f9c81 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/show/PreviewEntityShowMode.java @@ -0,0 +1,45 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2022 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.features.simulator.show; + +import de.steamwar.bausystem.features.tracer.TNTPosition; +import de.steamwar.bausystem.features.tracer.show.ShowModeParameter; +import de.steamwar.bausystem.features.tracer.show.mode.FactoredEntityShowMode; +import org.bukkit.entity.Player; + +public class PreviewEntityShowMode extends FactoredEntityShowMode { + + public PreviewEntityShowMode(Player player, ShowModeParameter showModeParameter) { + super(player, showModeParameter, 10); + } + + @Override + public void show(TNTPosition position) { + if (position.getVelocity().lengthSquared() < 1) { + return; + } + super.show(position); + } + + @Override + public void hide() { + super.hide(); + } +}