diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/speedbuilder/SpeedBuilder.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/speedbuilder/SpeedBuilder.java index 266afc399..87ad7c2be 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/speedbuilder/SpeedBuilder.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/speedbuilder/SpeedBuilder.java @@ -1,6 +1,7 @@ package nautilus.game.arcade.game.games.speedbuilder; import java.util.ArrayList; +import java.util.HashSet; import java.util.Map.Entry; import mineplex.core.common.util.C; @@ -85,6 +86,7 @@ public class SpeedBuilder extends SoloGame private ArmorStand _judgeEntity; private DisguiseGuardian _judgeDisguise; private Location _judgeSpawn; + private ArmorStand _judgeLaserHelper; private ArmorStand _judgeLaserTarget; private ArrayList _toEliminate = new ArrayList(); @@ -123,7 +125,7 @@ public class SpeedBuilder extends SoloGame { _buildMiddle = WorldData.GetDataLocs("RED").get(0).clone().subtract(0.5, 0, 0.5); - _judgeSpawn = _buildMiddle.clone().add(0, 5, 0); + _judgeSpawn = _buildMiddle.clone().add(0.5, 5, 0.5); Location groundMin = _buildMiddle.clone().subtract(2, 1, 2); @@ -250,13 +252,13 @@ public class SpeedBuilder extends SoloGame { if (_judgeLaserTarget == null) return; - - _judgeDisguise.setTarget(0); - - Manager.GetDisguise().updateDisguise(_judgeDisguise); - + + Manager.GetDisguise().undisguise(_judgeLaserHelper); + + _judgeLaserHelper.remove(); _judgeLaserTarget.remove(); - + + _judgeLaserHelper = null; _judgeLaserTarget = null; } else @@ -265,21 +267,28 @@ public class SpeedBuilder extends SoloGame judgeTargetLocation(null); CreatureAllowOverride = true; - + + _judgeLaserHelper = _judgeEntity.getWorld().spawn(_judgeEntity.getLocation().subtract(_judgeEntity.getLocation().getDirection()), ArmorStand.class); _judgeLaserTarget = _judgeEntity.getWorld().spawn(loc, ArmorStand.class); CreatureAllowOverride = false; + + _judgeLaserHelper.setVisible(false); + _judgeLaserHelper.setGravity(false); + _judgeLaserHelper.setSmall(true); _judgeLaserTarget.setVisible(false); _judgeLaserTarget.setGravity(false); _judgeLaserTarget.setSmall(true); - _judgeLaserTarget.setGhost(true); UtilEnt.CreatureLook(_judgeEntity, _judgeLaserTarget.getLocation()); + + DisguiseGuardian disguise = new DisguiseGuardian(_judgeLaserHelper); - _judgeDisguise.setTarget(_judgeLaserTarget.getEntityId()); + disguise.setTarget(_judgeLaserTarget.getEntityId()); + disguise.setInvisible(true); - Manager.GetDisguise().updateDisguise(_judgeDisguise); + Manager.GetDisguise().disguise(disguise); } } @@ -636,6 +645,18 @@ public class SpeedBuilder extends SoloGame { recreation.pasteBuildData(_currentBuild); } + + Location specLocation = GetSpectatorLocation(); + double avgDist = 0; + + //Add up all the distances + for (Location loc : GetTeamList().get(0).GetSpawns()) + { + avgDist += UtilMath.offset2d(specLocation, loc); + } + + //Get the average by dividing + avgDist /= GetTeamList().get(0).GetSpawns().size(); for (Player player : UtilServer.getPlayers()) { @@ -648,8 +669,16 @@ public class SpeedBuilder extends SoloGame { player.setAllowFlight(true); player.setFlying(true); + + Location toTeleport = specLocation.clone(); + + //Spread players by getting a random x and z in that radius + toTeleport.setX(toTeleport.getX() + (Math.random() * avgDist * 2 - avgDist)); + toTeleport.setZ(toTeleport.getZ() + (Math.random() * avgDist * 2 - avgDist)); + + toTeleport.setDirection(UtilAlg.getTrajectory(toTeleport, _buildMiddle.clone().add(0.5, 0, 0.5))); - player.teleport(GetSpectatorLocation()); + player.teleport(toTeleport); } } @@ -689,9 +718,14 @@ public class SpeedBuilder extends SoloGame WorldData.World.playEffect(eliminating.getMidpoint(), Effect.EXPLOSION_HUGE, 0); WorldData.World.playSound(eliminating.getMidpoint(), Sound.EXPLODE, 10F, 1F); - - Manager.GetExplosion().BlockExplosion(eliminating.getBlocks(), eliminating.getMidpoint(), false, false); - + + HashSet blocks = UtilBlock.findConnectedBlocks(eliminating.OriginalBuildLocation.getBlock(), null, 1000); + + //Sets should remove duplicates + blocks.addAll(eliminating.getBlocks()); + + Manager.GetExplosion().BlockExplosion(blocks, eliminating.getMidpoint(), false, true); + eliminating.clearBuildArea(true); judgeTargetLocation(null);