More alien stuff

This commit is contained in:
Sam 2017-05-03 20:48:19 +01:00
parent 10258d66b8
commit bd52e63dc3
6 changed files with 398 additions and 5 deletions

View File

@ -56,7 +56,7 @@ public class LineParticle
if (_direction == null) if (_direction == null)
{ {
direction = UtilAlg.getTrajectory(start, end).normalize(); _direction = UtilAlg.getTrajectory(start, end).normalize();
} }
} }

View File

@ -99,7 +99,7 @@ public enum GameDisplay
StrikeGames("Strike Games", Material.DIAMOND_LEGGINGS, (byte) 0, GameCategory.SURVIVAL, 66, false), StrikeGames("Strike Games", Material.DIAMOND_LEGGINGS, (byte) 0, GameCategory.SURVIVAL, 66, false),
AlienInvasion("Alien Invaison", Material.ENDER_STONE, (byte) 0, GameCategory.EVENT, 69, false), AlienInvasion("Alien Invasion", Material.ENDER_STONE, (byte) 0, GameCategory.EVENT, 69, false),
Event("Mineplex Event", Material.CAKE, (byte)0, GameCategory.EVENT, 999, false), Event("Mineplex Event", Material.CAKE, (byte)0, GameCategory.EVENT, 999, false),

View File

@ -1,11 +1,30 @@
package nautilus.game.arcade.game.games.alieninvasion; package nautilus.game.arcade.game.games.alieninvasion;
import mineplex.core.common.Pair;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilTime;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.GameType; import nautilus.game.arcade.GameType;
import nautilus.game.arcade.events.GameStateChangeEvent;
import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.SoloGame;
import nautilus.game.arcade.game.games.alieninvasion.kit.KitPlayer;
import nautilus.game.arcade.game.games.dragonescape.DragonScore;
import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.Kit;
import org.bukkit.Material; import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack; import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class AlienInvasion extends SoloGame public class AlienInvasion extends SoloGame
{ {
@ -15,8 +34,245 @@ public class AlienInvasion extends SoloGame
"Add this soon" "Add this soon"
}; };
private final List<BeamSource> _sources = new ArrayList<>(5);
private final List<Location> _targets = new ArrayList<>();
private final ArrayList<Location> _path = new ArrayList<>();
private int _lastBeamId;
private long _lastBeam;
private final List<DragonScore> _score = new ArrayList<>(16);
public AlienInvasion(ArcadeManager manager) public AlienInvasion(ArcadeManager manager)
{ {
super(manager, GameType.AlienInvasion, new Kit[]{}, DESCRIPTION, ); super(manager, GameType.AlienInvasion, new Kit[]{new KitPlayer(manager)}, DESCRIPTION);
WorldTimeSet = 18000;
DamagePvP = false;
}
@Override
@EventHandler
public void ScoreboardUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST || !IsLive())
{
return;
}
Scoreboard.writeNewLine();
AtomicInteger index = new AtomicInteger(0);
List<DragonScore> scores = new ArrayList<>(_score);
Collections.reverse(scores);
Scoreboard.writeGroup(scores.subList(0, Math.min(16, scores.size())), score ->
{
ChatColor col = IsAlive(score.Player) ? ChatColor.GREEN : ChatColor.RED;
return Pair.create(col + score.Player.getName(), index.incrementAndGet());
}, true);
Scoreboard.writeNewLine();
Scoreboard.draw();
}
@Override
public void ParseData()
{
// Setup all Beam Sources
List<Location> sources = WorldData.GetDataLocs("LIME");
for (Location location : sources)
{
_sources.add(new BeamSource(location));
}
Location start = WorldData.GetDataLocs("RED").get(0);
Location last = start;
List<Location> targets = WorldData.GetDataLocs("BLACK");
ArrayList<Location> path = new ArrayList<>();
path.addAll(targets);
path.addAll(WorldData.GetDataLocs("BROWN"));
while (!path.isEmpty())
{
Location closestPath = UtilAlg.findClosest(last, path);
if (targets.contains(closestPath))
{
_targets.add(closestPath);
}
_path.add(closestPath);
path.remove(closestPath);
last = closestPath;
}
int id = 0;
for (Location pathPoint : _path)
{
BeamSource source = getClosestSource(pathPoint);
source.addBeam(Manager, id++, pathPoint);
}
}
private BeamSource getClosestSource(Location location)
{
BeamSource best = null;
double bestDist = Double.MAX_VALUE;
for (BeamSource source : _sources)
{
double dist = UtilMath.offsetSquared(source.getSource(), location);
if (best == null || dist < bestDist)
{
best = source;
bestDist = dist;
}
}
return best;
}
@EventHandler
public void live(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Live)
{
return;
}
for (Player player : GetPlayers(true))
{
_score.add(new DragonScore(player, 0));
}
_lastBeam = System.currentTimeMillis();
}
@EventHandler
public void updateBeam(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST || !IsLive())
{
return;
}
Beam beam = getSuitableBeam();
if (beam == null)
{
return;
}
_lastBeam = System.currentTimeMillis();
_lastBeamId++;
Manager.runSyncTimer(new BukkitRunnable()
{
@Override
public void run()
{
if (beam.update())
{
for (DragonScore score : _score)
{
if (score.Score <= _lastBeamId)
{
Manager.GetDamage().NewDamageEvent(score.Player, null, null, DamageCause.CUSTOM, 9999, false, true, false, GetName(), "Phaser");
}
}
cancel();
}
}
}, 0, 2);
}
private Beam getSuitableBeam()
{
if (!UtilTime.elapsed(_lastBeam, 5000))
{
return null;
}
for (BeamSource beamSource : _sources)
{
Beam beam = beamSource.getFromId(_lastBeamId);
if (beam != null)
{
return beam;
}
}
return null;
}
@EventHandler
public void updatePlayerTracker(UpdateEvent event)
{
if (event.getType() != UpdateType.FASTEST || !IsLive())
{
return;
}
for (Player player : GetPlayers(true))
{
DragonScore score = getScore(player);
double currentScore = score.Score;
int newScore = 0;
Location location = UtilAlg.findClosest(player.getLocation(), _path);
if (UtilMath.offsetSquared(player.getLocation(), location) > 100)
{
break;
}
for (int i = 0; i < _path.size(); i++)
{
Location a = _path.get(i);
if (location.equals(a))
{
newScore = i;
}
}
if (newScore > currentScore)
{
Bukkit.broadcastMessage(player.getName() + "=" + newScore);
score.Score = newScore;
}
}
}
@Override
public void EndCheck()
{
for (DragonScore score : _score)
{
if (score.Score == _path.size() - 1)
{
SetState(GameState.End);
}
}
}
private DragonScore getScore(Player player)
{
for (DragonScore score : _score)
{
if (score.Player.equals(player))
{
return score;
}
}
return null;
} }
} }

View File

@ -0,0 +1,59 @@
package nautilus.game.arcade.game.games.alieninvasion;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.particles.effects.LineParticle;
import nautilus.game.arcade.ArcadeManager;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
public class Beam extends LineParticle
{
private static final int EXPLOSION_RADIUS = 15;
private static final int BEAM_BLOCK_TIME = 1500;
private final ArcadeManager _manager;
private final Location _target;
private final int _id;
public Beam(ArcadeManager manager, int id, BeamSource source, Location target)
{
super(source.getSource(), target, null, 1, Integer.MAX_VALUE, null, ParticleType.FIREWORKS_SPARK, UtilServer.getPlayers());
_manager = manager;
_id = id;
_target = target;
}
@Override
public boolean update()
{
super.update();
Location last = getLastLocation();
boolean hit = UtilMath.offset(last, _target) < 5;
if (hit)
{
_manager.GetExplosion().BlockExplosion(UtilBlock.getInRadius(last, EXPLOSION_RADIUS).keySet(), last, false);
UtilParticle.PlayParticleToAll(ParticleType.HUGE_EXPLOSION, last, 4, 1, 4, 0.5F, 10, ViewDist.LONG);
}
else
{
last.getWorld().playSound(last, Sound.ZOMBIE_REMEDY, 2f, 0.75f);
_manager.GetBlockRestore().add(last.getBlock(), Material.SEA_LANTERN.getId(), (byte) 0, BEAM_BLOCK_TIME);
}
return hit;
}
public int getId()
{
return _id;
}
}

View File

@ -0,0 +1,43 @@
package nautilus.game.arcade.game.games.alieninvasion;
import nautilus.game.arcade.ArcadeManager;
import org.bukkit.Location;
import java.util.ArrayList;
import java.util.List;
public class BeamSource
{
private final Location _source;
private final List<Beam> _beams;
BeamSource(Location source)
{
_source = source;
_beams = new ArrayList<>(5);
}
public void addBeam(ArcadeManager manager, int id, Location target)
{
_beams.add(new Beam(manager, id, this, target));
}
public Location getSource()
{
return _source;
}
public Beam getFromId(int id)
{
for (Beam beam : _beams)
{
if (beam.getId() == id)
{
return beam;
}
}
return null;
}
}

View File

@ -0,0 +1,35 @@
package nautilus.game.arcade.game.games.alieninvasion.kit;
import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.kit.Kit;
import nautilus.game.arcade.kit.KitAvailability;
import nautilus.game.arcade.kit.Perk;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class KitPlayer extends Kit
{
private static final String[] DESCRIPTION = {
""
};
private static final Perk[] PERKS = {
};
private static final ItemStack IN_HAND = new ItemStack(Material.ENDER_STONE);
public KitPlayer(ArcadeManager manager)
{
super(manager, "Player", KitAvailability.Free, DESCRIPTION, PERKS, EntityType.SKELETON, IN_HAND);
}
@Override
public void GiveItems(Player player)
{
}
}