Added Dragon Escape

fixed kit availability for runner
SSM: wither skel projectile continues after releasing block
SSM: nerfed blizzard
SSM: reduced gem price of a few kits
This commit is contained in:
Chiss 2013-09-06 15:58:58 +10:00
parent 9fcda443e1
commit 213b1efb0c
24 changed files with 556 additions and 442 deletions

View File

@ -1,6 +1,7 @@
package mineplex.core.explosion; package mineplex.core.explosion;
import java.util.AbstractMap; import java.util.AbstractMap;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
@ -271,4 +272,54 @@ public class Explosion extends MiniPlugin
{ {
return _explosionBlocks; return _explosionBlocks;
} }
public void BlockExplosion(Collection<Block> blockSet, Location mid)
{
if (blockSet.isEmpty())
return;
//Save
final HashMap<Block, Entry<Integer, Byte>> blocks = new HashMap<Block, Entry<Integer, Byte>>();
for (Block cur : blockSet)
{
if (cur.getTypeId() == 0)
continue;
blocks.put(cur, new AbstractMap.SimpleEntry<Integer, Byte>(cur.getTypeId(), cur.getData()));
if (cur.getTypeId() != 98 || cur.getData() != 0)
cur.setTypeId(0);
}
//DELAY
final Location fLoc = mid;
_plugin.getServer().getScheduler().runTaskLater(_plugin, new Runnable()
{
public void run()
{
//Launch
for (Block cur : blocks.keySet())
{
if (blocks.get(cur).getKey() == 98)
if (blocks.get(cur).getValue() == 0)
continue;
double chance = 0.2 + (double)_explosionBlocks.size()/(double)120;
if (Math.random() > Math.min(0.85, chance))
{
FallingBlock fall = cur.getWorld().spawnFallingBlock(cur.getLocation().add(0.5, 0.5, 0.5), blocks.get(cur).getKey(), blocks.get(cur).getValue());
Vector vec = UtilAlg.getTrajectory(fLoc, fall.getLocation());
if (vec.getY() < 0) vec.setY(vec.getY() * -1);
UtilAction.velocity(fall, vec, 0.5 + 0.25*Math.random(), false, 0, 0.4 + 0.20*Math.random(), 10, false);
_explosionBlocks.add(fall);
}
}
}
}, 1);
}
} }

View File

@ -203,6 +203,11 @@ public class ArcadeManager extends MiniPlugin implements IRelation
{ {
return _donationManager; return _donationManager;
} }
public Explosion GetExplosion()
{
return _explosionManager;
}
public Fire GetFire() public Fire GetFire()
{ {

View File

@ -6,6 +6,7 @@ import org.bukkit.ChatColor;
import nautilus.game.arcade.game.Game; import nautilus.game.arcade.game.Game;
import nautilus.game.arcade.game.minigames.dragons.Dragons; import nautilus.game.arcade.game.minigames.dragons.Dragons;
import nautilus.game.arcade.game.minigames.escape.DragonEscape;
import nautilus.game.arcade.game.minigames.evolution.Evolution; import nautilus.game.arcade.game.minigames.evolution.Evolution;
import nautilus.game.arcade.game.minigames.mineware.MineWare; import nautilus.game.arcade.game.minigames.mineware.MineWare;
import nautilus.game.arcade.game.minigames.quiver.Quiver; import nautilus.game.arcade.game.minigames.quiver.Quiver;
@ -13,7 +14,6 @@ import nautilus.game.arcade.game.minigames.snowfight.SnowFight;
import nautilus.game.arcade.game.minigames.runner.Runner; import nautilus.game.arcade.game.minigames.runner.Runner;
import nautilus.game.arcade.game.minigames.spleef.Spleef; import nautilus.game.arcade.game.minigames.spleef.Spleef;
import nautilus.game.arcade.game.minigames.turfforts.TurfForts; import nautilus.game.arcade.game.minigames.turfforts.TurfForts;
import nautilus.game.arcade.game.minigames.undeadescape.UndeadEscape;
import nautilus.game.arcade.game.standalone.bridge.Bridge; import nautilus.game.arcade.game.standalone.bridge.Bridge;
import nautilus.game.arcade.game.standalone.castlesiege.CastleSiege; import nautilus.game.arcade.game.standalone.castlesiege.CastleSiege;
import nautilus.game.arcade.game.standalone.smash.SuperSmash; import nautilus.game.arcade.game.standalone.smash.SuperSmash;
@ -41,7 +41,7 @@ public class GameFactory
else if (gameType == GameType.Smash) return new SuperSmash(_manager); else if (gameType == GameType.Smash) return new SuperSmash(_manager);
else if (gameType == GameType.Spleef) return new Spleef(_manager); else if (gameType == GameType.Spleef) return new Spleef(_manager);
else if (gameType == GameType.TurfForts) return new TurfForts(_manager); else if (gameType == GameType.TurfForts) return new TurfForts(_manager);
else if (gameType == GameType.UndeadEscape) return new UndeadEscape(_manager); else if (gameType == GameType.DragonEscape) return new DragonEscape(_manager);
else if (gameType == GameType.ZombieSurvival) return new ZombieSurvival(_manager); else if (gameType == GameType.ZombieSurvival) return new ZombieSurvival(_manager);
else return null; else return null;
} }

View File

@ -10,7 +10,7 @@ public enum GameType
Evolution("Evolution"), Evolution("Evolution"),
Smash("Super Smash Mobs"), Smash("Super Smash Mobs"),
Spleef("Super Spleef"), Spleef("Super Spleef"),
UndeadEscape("Undead Escape"), DragonEscape("Dragon Escape"),
Quiver("One in the Quiver"), Quiver("One in the Quiver"),
Runner("Runner"), Runner("Runner"),
SnowFight("Snow Fight"), SnowFight("Snow Fight"),

View File

@ -129,6 +129,7 @@ public abstract class Game implements Listener
public boolean CreatureAllowOverride = false; public boolean CreatureAllowOverride = false;
public int WorldTimeSet = -1; public int WorldTimeSet = -1;
public boolean WorldWeatherEnabled = false;
public int WorldHeightLimit = 0; public int WorldHeightLimit = 0;
public int HungerSet = -1; public int HungerSet = -1;

View File

@ -74,20 +74,7 @@ public abstract class SoloGame extends Game
if (_places.size() >= 3) if (_places.size() >= 3)
AddGems(_places.get(2), 10, "3rd Place", false); AddGems(_places.get(2), 10, "3rd Place", false);
/*
int sections = _places.size()/10;
for (int i=0 ; i<5 ; i++)
{
for (int j=i*sections ; j < j*sections + sections ; j++)
{
AddGems(_places.get(j), 5-i, "Top " + ((i+1)*10) + "%", false);
}
}
*/
for (Player player : GetPlayers(false)) for (Player player : GetPlayers(false))
if (player.isOnline()) if (player.isOnline())
AddGems(player, 10, "Participation", false); AddGems(player, 10, "Participation", false);

View File

@ -39,7 +39,7 @@ public class DragonData
Location = dragon.getLocation(); Location = dragon.getLocation();
} }
public void Update() public void Move()
{ {
Turn(); Turn();

View File

@ -29,6 +29,7 @@ import nautilus.game.arcade.events.PlayerStateChangeEvent;
import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.SoloGame;
import nautilus.game.arcade.game.GameTeam.PlayerState; import nautilus.game.arcade.game.GameTeam.PlayerState;
import nautilus.game.arcade.game.minigames.dragons.kits.*; import nautilus.game.arcade.game.minigames.dragons.kits.*;
import nautilus.game.arcade.game.minigames.dragons.DragonData;
import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.Kit;
import nautilus.game.arcade.kit.Perk; import nautilus.game.arcade.kit.Perk;
import nautilus.game.arcade.kit.perks.PerkSparkler; import nautilus.game.arcade.kit.perks.PerkSparkler;
@ -174,7 +175,7 @@ public class Dragons extends SoloGame
for (DragonData data : _dragons.values()) for (DragonData data : _dragons.values())
{ {
data.Target(); data.Target();
data.Update(); data.Move();
} }
} }

View File

@ -0,0 +1,316 @@
package nautilus.game.arcade.game.minigames.escape;
import java.util.ArrayList;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilMath;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.GameType;
import nautilus.game.arcade.events.GameStateChangeEvent;
import nautilus.game.arcade.game.SoloGame;
import nautilus.game.arcade.game.Game.GameState;
import nautilus.game.arcade.game.GameTeam.PlayerState;
import nautilus.game.arcade.game.minigames.escape.DragonEscapeData;
import nautilus.game.arcade.game.minigames.quiver.kits.KitBrawler;
import nautilus.game.arcade.game.standalone.bridge.kits.KitBeserker;
import nautilus.game.arcade.kit.Kit;
public class DragonEscape extends SoloGame
{
private ArrayList<DragonScore> _ranks = new ArrayList<DragonScore>();
private ArrayList<String> _lastScoreboard = new ArrayList<String>();
private Location _dragon;
private ArrayList<Location> _waypoints;
private DragonEscapeData _dragonData;
public DragonEscape(ArcadeManager manager)
{
super(manager, GameType.DragonEscape,
new Kit[]
{
new KitBrawler(manager)
},
new String[]
{
"Douglas the Dragon is after you!",
"RUN!!!!!!!!!!",
"Last player alive wins!"
});
this.DamagePvP = false;
this.HungerSet = 20;
}
@Override
public void ParseData()
{
_dragon = WorldData.GetDataLocs("RED").get(0);
_waypoints = new ArrayList<Location>();
//Order Waypoints
Location last = _dragon;
while (!WorldData.GetDataLocs("BLACK").isEmpty())
{
Location best = null;
double bestDist = 0;
//Get Best
for (Location loc : WorldData.GetDataLocs("BLACK"))
{
double dist = UtilMath.offset(loc, last);
if (best == null || dist < bestDist)
{
best = loc;
bestDist = dist;
}
}
_waypoints.add(best);
WorldData.GetDataLocs("BLACK").remove(best);
best.subtract(new Vector(0,1,0));
last = best;
}
}
@EventHandler
public void SpawnDragon(GameStateChangeEvent event)
{
if (event.GetState() != GameState.Prepare)
return;
this.CreatureAllowOverride = true;
EnderDragon dragon = _dragon.getWorld().spawn(_dragon, EnderDragon.class);
this.CreatureAllowOverride = false;
dragon.setCustomName(ChatColor.YELLOW + C.Bold + "Douglas the Dragon");
_dragonData = new DragonEscapeData(this, dragon, _waypoints.get(0));
}
@EventHandler
public void MoveDragon(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
if (_dragonData == null)
return;
_dragonData.Target = _waypoints.get(Math.min(_waypoints.size()-1, (GetWaypointIndex(_dragonData.Location) + 1)));
_dragonData.Move();
Manager.GetExplosion().BlockExplosion(UtilBlock.getInRadius(_dragonData.Location, 10d).keySet(), _dragonData.Location);
}
@EventHandler
public void UpdateScores(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST)
return;
if (_dragonData == null)
return;
double dragonScore = GetScore(_dragonData.Dragon);
for (Player player : GetPlayers(true))
{
double playerScore = GetScore(player);
if (player.getLocation().getY() < 50)
player.damage(50);
if (dragonScore > playerScore)
{
player.damage(50);
}
else
{
SetScore(player, playerScore);
}
}
}
public void SetScore(Player player, double playerScore)
{
//Rank
for (DragonScore score : _ranks)
{
if (score.Player.equals(player))
{
score.Score = playerScore;
return;
}
}
_ranks.add(new DragonScore(player, playerScore));
}
public double GetScore(Entity ent)
{
int index = GetWaypointIndex(ent.getLocation());
double score = 10000 * index;
score -= UtilMath.offset(ent.getLocation(), _waypoints.get(Math.min(_waypoints.size()-1, index+1)));
return score;
}
public int GetWaypointIndex(Location loc)
{
int best = -1;
double bestDist = 0;
for (int i=0 ; i<_waypoints.size() ; i++)
{
Location waypoint = _waypoints.get(i);
double dist = UtilMath.offset(waypoint, loc);
if (best == -1 || dist < bestDist)
{
best = i;
bestDist = dist;
}
}
return best;
}
private void SortScores()
{
for (int i=0 ; i<_ranks.size() ; i++)
{
for (int j=_ranks.size()-1 ; j>0 ; j--)
{
if (_ranks.get(j).Score > _ranks.get(j-1).Score)
{
DragonScore temp = _ranks.get(j);
_ranks.set(j, _ranks.get(j-1));
_ranks.set(j-1, temp);
}
}
}
}
@Override
@EventHandler
public void ScoreboardUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST)
return;
//Wipe Last
for (String string : _lastScoreboard)
GetScoreboard().resetScores(Bukkit.getOfflinePlayer(string));
_lastScoreboard.clear();
SortScores();
//Write New
for (int i=0 ; i<_ranks.size() ; i++)
{
DragonScore score = _ranks.get(i);
ChatColor col = ChatColor.GREEN;
if (!IsAlive(score.Player))
col = ChatColor.RED;
String out = i+1 + " " + col + score.Player.getName();
if (out.length() >= 16)
out = out.substring(0, 15);
_lastScoreboard.add(out);
GetObjectiveSide().getScore(Bukkit.getOfflinePlayer(out)).setScore(16-i);
}
}
@Override
public Location GetSpectatorLocation()
{
if (SpectatorSpawn == null)
{
SpectatorSpawn = new Location(this.WorldData.World, 0,0,0);
}
Vector vec = new Vector(0,0,0);
double count = 0;
for (Player player : GetPlayers(true))
{
count++;
vec.add(player.getLocation().toVector());
}
if (count == 0)
count++;
vec.multiply(1d/count);
SpectatorSpawn.setX(vec.getX());
SpectatorSpawn.setY(vec.getY() + 10);
SpectatorSpawn.setZ(vec.getZ());
return SpectatorSpawn;
}
@Override
public void EndCheck()
{
if (!IsLive())
return;
if (GetPlayers(true).size() <= 0)
{
//Announce
AnnounceEnd(_places);
//Gems
if (_places.size() >= 1)
AddGems(_places.get(0), 20, "1st Place", false);
if (_places.size() >= 2)
AddGems(_places.get(1), 15, "2nd Place", false);
if (_places.size() >= 3)
AddGems(_places.get(2), 10, "3rd Place", false);
for (Player player : GetPlayers(false))
if (player.isOnline())
AddGems(player, 10, "Participation", false);
//End
SetState(GameState.End);
}
}
}

View File

@ -0,0 +1,72 @@
package nautilus.game.arcade.game.minigames.escape;
import mineplex.core.common.util.UtilAlg;
import org.bukkit.Location;
import org.bukkit.entity.EnderDragon;
import org.bukkit.util.Vector;
public class DragonEscapeData
{
public DragonEscape Host;
public EnderDragon Dragon;
public Location Target = null;
public Location Location = null;
public float Pitch = 0;
public Vector Velocity = new Vector(0,0,0);
public DragonEscapeData(DragonEscape host, EnderDragon dragon, Location target)
{
Host = host;
Dragon = dragon;
Location temp = dragon.getLocation();
temp.setPitch(UtilAlg.GetPitch(UtilAlg.getTrajectory(dragon.getLocation(), target)));
dragon.teleport(temp);
Velocity = dragon.getLocation().getDirection().setY(0).normalize();
Pitch = UtilAlg.GetPitch(dragon.getLocation().getDirection());
Location = dragon.getLocation();
}
public void Move()
{
Turn();
double timeSpeed = 0.16 + (System.currentTimeMillis() - Host.GetStateTime())/3000000d;
System.out.println(timeSpeed);
Location.add(Velocity.clone().multiply(timeSpeed));
Location.add(0, -Pitch, 0);
Location.setPitch(-1 * Pitch);
Location.setYaw(180 + UtilAlg.GetYaw(Velocity));
Dragon.teleport(Location);
}
private void Turn()
{
//Pitch
float desiredPitch = UtilAlg.GetPitch(UtilAlg.getTrajectory(Location, Target));
if (desiredPitch < Pitch) Pitch = (float)(Pitch - 0.05);
if (desiredPitch > Pitch) Pitch = (float)(Pitch + 0.05);
if (Pitch > 0.5) Pitch = 0.5f;
if (Pitch < -0.5) Pitch = -0.5f;
//Flat
Vector desired = UtilAlg.getTrajectory2d(Location, Target);
desired.subtract(UtilAlg.Normalize(new Vector(Velocity.getX(), 0, Velocity.getZ())));
desired.multiply(0.2);
Velocity.add(desired);
//Speed
UtilAlg.Normalize(Velocity);
}
}

View File

@ -0,0 +1,15 @@
package nautilus.game.arcade.game.minigames.escape;
import org.bukkit.entity.Player;
public class DragonScore
{
public org.bukkit.entity.Player Player;
public double Score;
public DragonScore(Player player, double i)
{
Player = player;
Score = i;
}
}

View File

@ -0,0 +1,40 @@
package nautilus.game.arcade.game.minigames.escape.kits;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import mineplex.core.itemstack.ItemStackFactory;
import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.kit.Kit;
import nautilus.game.arcade.kit.KitAvailability;
import nautilus.game.arcade.kit.Perk;
import nautilus.game.arcade.kit.perks.*;
public class KitLeaper extends Kit
{
public KitLeaper(ArcadeManager manager)
{
super(manager, "Jumper", KitAvailability.Free,
new String[]
{
"Leap to avoid falling to your death!"
},
new Perk[]
{
new PerkLeap("Leap", 1.2, 1.2, 8000)
},
EntityType.ZOMBIE,
new ItemStack(Material.STONE_AXE));
}
@Override
public void GiveItems(Player player)
{
player.getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.STONE_AXE));
}
}

View File

@ -18,16 +18,16 @@ public class KitLeaper extends Kit
{ {
public KitLeaper(ArcadeManager manager) public KitLeaper(ArcadeManager manager)
{ {
super(manager, "Leaper", KitAvailability.Free, super(manager, "Jumper", KitAvailability.Free,
new String[] new String[]
{ {
"Evade and kill using your powerful leap!" "Evade and kill using your double jump!"
}, },
new Perk[] new Perk[]
{ {
new PerkLeap("Leap", 1.2, 1.0, 8000) new PerkDoubleJump("Double Jump", 0.9, 0.9, true)
}, },
EntityType.ZOMBIE, EntityType.ZOMBIE,
new ItemStack(Material.IRON_AXE)); new ItemStack(Material.IRON_AXE));

View File

@ -16,7 +16,7 @@ public class KitArcher extends Kit
{ {
public KitArcher(ArcadeManager manager) public KitArcher(ArcadeManager manager)
{ {
super(manager, "Archer", KitAvailability.Free, super(manager, "Archer", KitAvailability.Green,
new String[] new String[]
{ {

View File

@ -19,7 +19,7 @@ public class KitFrosty extends Kit
{ {
public KitFrosty(ArcadeManager manager) public KitFrosty(ArcadeManager manager)
{ {
super(manager, "Frosty", KitAvailability.Free, super(manager, "Frosty", KitAvailability.Blue,
new String[] new String[]
{ {

View File

@ -1,152 +0,0 @@
package nautilus.game.arcade.game.minigames.undeadescape;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilTime;
import org.bukkit.Location;
import org.bukkit.entity.EnderDragon;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
public class GiantData
{
public UndeadEscape Host;
public EnderDragon Dragon;
public Entity TargetEntity = null;
public Location Target = null;
public Location Location = null;
public float Pitch = 0;
public Vector Velocity = new Vector(0,0,0);
public double RangeBest = 1000;
public long RangeTime = 0;
public GiantData(UndeadEscape host, EnderDragon dragon)
{
Host = host;
Dragon = dragon;
Velocity = dragon.getLocation().getDirection().setY(0).normalize();
Pitch = UtilAlg.GetPitch(dragon.getLocation().getDirection());
Location = dragon.getLocation();
}
public void Update()
{
Turn();
Location.add(Velocity);
Location.add(0, -Pitch, 0);
Location.setPitch(-1 * Pitch);
Location.setYaw(180 + UtilAlg.GetYaw(Velocity));
Dragon.teleport(Location);
}
private void Turn()
{
//Pitch
float desiredPitch = UtilAlg.GetPitch(UtilAlg.getTrajectory(Location, Target));
if (desiredPitch < Pitch) Pitch = (float)(Pitch - 0.05);
if (desiredPitch > Pitch) Pitch = (float)(Pitch + 0.05);
if (Pitch > 0.5) Pitch = 0.5f;
if (Pitch < -0.5) Pitch = -0.5f;
//Flat
Vector desired = UtilAlg.getTrajectory2d(Location, Target);
desired.subtract(UtilAlg.Normalize(new Vector(Velocity.getX(), 0, Velocity.getZ())));
desired.multiply(0.075);
Velocity.add(desired);
//Speed
UtilAlg.Normalize(Velocity);
}
public void Target()
{
if (TargetEntity != null)
{
if (!TargetEntity.isValid())
{
TargetEntity = null;
}
else
{
Target = TargetEntity.getLocation().subtract(0, 8, 0);
}
return;
}
if (Target == null)
{
TargetSky();
}
if (UtilMath.offset(Location, Target) < 4)
{
//Target Player
if (Target.getY() >= Host.GetSpectatorLocation().getY())
{
TargetPlayer();
}
//Target Sky
else
{
TargetSky();
}
}
TargetTimeout();
}
public void TargetTimeout()
{
if (UtilMath.offset(Location, Target)+1 < RangeBest)
{
RangeTime = System.currentTimeMillis();
RangeBest = UtilMath.offset(Location, Target);
}
else
{
if (UtilTime.elapsed(RangeTime, 10000))
{
TargetSky();
}
}
}
public void TargetSky()
{
RangeBest = 9000;
RangeTime = System.currentTimeMillis();
Target = Host.GetSpectatorLocation().clone().add(50 - UtilMath.r(100), 20 + UtilMath.r(30), 50 - UtilMath.r(100));
}
public void TargetPlayer()
{
RangeBest = 9000;
RangeTime = System.currentTimeMillis();
Player player = Host.GetPlayers(true).get(UtilMath.r(Host.GetPlayers(true).size()));
Target = player.getLocation();
Target.add(UtilAlg.getTrajectory(Location, Target).multiply(4));
}
public void HitByArrow()
{
TargetSky();
}
}

View File

@ -1,245 +0,0 @@
package nautilus.game.arcade.game.minigames.undeadescape;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.entity.Creature;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Giant;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.util.Vector;
import mineplex.core.common.util.UtilAction;
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.GameType;
import nautilus.game.arcade.game.SoloGame;
import nautilus.game.arcade.game.standalone.bridge.kits.KitBeserker;
import nautilus.game.arcade.kit.Kit;
public class UndeadEscape extends SoloGame
{
private Location _giantStart;
private Location _giantEnd;
private Creature _giant = null;
public UndeadEscape(ArcadeManager manager)
{
super(manager, GameType.UndeadEscape,
new Kit[]
{
new KitBeserker(manager)
},
new String[]
{
"RUN!!!!!!!"
});
this.DamagePvP = false;
}
@Override
public void ParseData()
{
if (!WorldData.GetDataLocs("BLACK").isEmpty())
_giantStart = WorldData.GetDataLocs("BLACK").get(0);
if (!WorldData.GetDataLocs("WHITE").isEmpty())
_giantEnd = WorldData.GetDataLocs("WHITE").get(0);
}
@EventHandler
public void GiantTarget(EntityTargetEvent event)
{
if (_giant == null)
return;
if (event.getEntity().equals(_giant))
event.setCancelled(true);
}
@EventHandler
public void GiantDamage(EntityDamageEvent event)
{
if (_giant == null)
return;
if (event.getEntity().equals(_giant))
event.setCancelled(true);
}
@EventHandler
public void GiantCombust(EntityCombustEvent event)
{
if (_giant == null)
return;
if (event.getEntity().equals(_giant))
event.setCancelled(true);
}
@EventHandler
public void GiantMove(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
if (GetState() != GameState.Live)
return;
if (!UtilTime.elapsed(GetStateTime(), 5000))
return;
if (_giant == null || !_giant.isValid())
{
if (_giant != null)
_giant.remove();
CreatureAllowOverride = true;
_giant = _giantStart.getWorld().spawn(_giantStart, Giant.class);
CreatureAllowOverride = false;
}
//Move
double rate = 0.075 + ((System.currentTimeMillis() - this.GetStateTime())/100000d);
Location target = _giant.getLocation().add(UtilAlg.getTrajectory(_giantStart, _giantEnd).multiply(rate));
_giant.teleport(target);
/*
EntityCreature ec = ((CraftCreature)_giant).getHandle();
Navigation nav = ec.getNavigation();
Location loc = _giant.getLocation().add(UtilAlg.getTrajectory(_giantStart, _giantEnd).multiply(1));
nav.a(loc.getX(), loc.getY(), loc.getZ(), 2f + Math.min(2f, (float)()));
*/
}
@EventHandler
public void GiantGroan(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST)
return;
if (GetState() != GameState.Live)
return;
if (_giant == null)
return;
if (Math.random() > 0.75)
return;
_giant.getWorld().playSound(_giant.getEyeLocation(), Sound.ZOMBIE_IDLE, 5f, 0.5f + (float)(Math.random()));
}
@EventHandler
public void GiantKill(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST)
return;
if (_giant == null)
return;
for (Player player : GetPlayers(true))
{
if (UtilMath.offset2d(player, _giant) < 7)
{
player.damage(50);
}
}
}
@EventHandler
public void GiantBlocks(UpdateEvent event)
{
if (event.getType() != UpdateType.FAST)
return;
if (GetState() != GameState.Live)
return;
if (_giant == null)
return;
for (int x=-7 ; x<=7 ; x++)
{
for (int z=-7 ; z<=7 ; z++)
{
for (int y=0 ; y<=15 ; y++)
{
Block block = _giant.getWorld().getBlockAt(
_giant.getLocation().getBlockX()+x,
_giant.getLocation().getBlockY()+y,
_giant.getLocation().getBlockZ()+z);
if (block.getTypeId() == 0)
continue;
final Material mat = block.getType();
final byte data = block.getData();
final Location loc = block.getLocation().add(0.5, 0.5, 0.5);
block.setTypeId(0);
Manager.GetPlugin().getServer().getScheduler().runTaskLater(Manager.GetPlugin(), new Runnable()
{
public void run()
{
FallingBlock fall = loc.getWorld().spawnFallingBlock(loc, mat, data);
Vector vec = UtilAlg.getTrajectory(_giant, fall);
if (vec.getY() < 0) vec.setY(vec.getY() * -1);
vec.add(new Vector(0.2 - Math.random()*0.4,0.2 - Math.random()*0.4,0.2 - Math.random()*0.4));
UtilAction.velocity(fall, vec, 0.75 + 0.25*Math.random(), false, 0, 0.4 + 0.20*Math.random(), 10, false);
}
}, 1);
}
}
}
}
@Override
public Location GetSpectatorLocation()
{
if (SpectatorSpawn == null)
{
SpectatorSpawn = new Location(this.WorldData.World, 0,0,0);
}
Vector vec = new Vector(0,0,0);
double count = 0;
for (Player player : GetPlayers(true))
{
count++;
vec.add(player.getLocation().toVector());
}
vec.multiply(1d/count);
SpectatorSpawn.setX(vec.getX());
SpectatorSpawn.setY(vec.getY() + 10);
SpectatorSpawn.setZ(vec.getZ());
return SpectatorSpawn;
}
//@Override
//public void EndCheck()
//{}
}

View File

@ -76,14 +76,12 @@ public class SuperSmash extends SoloGame
this.DamageTeamSelf = true; this.DamageTeamSelf = true;
this.HungerSet = 20; this.HungerSet = 20;
this.PrepareFreeze = false;
this.CompassEnabled = true; this.CompassEnabled = true;
this.SpawnDistanceRequirement = 16; this.SpawnDistanceRequirement = 16;
this.InventoryOpen = true; this.InventoryOpen = false;
} }
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)

View File

@ -105,6 +105,6 @@ public class KitBlaze extends SmashKit
@Override @Override
public int GetCost() public int GetCost()
{ {
return 8000; return 6000;
} }
} }

View File

@ -32,9 +32,9 @@ public class KitSnowman extends SmashKit
new Perk[] new Perk[]
{ {
new PerkSmashStats(6, 1.4, 0.4, 6), new PerkSmashStats(5, 1.4, 0.4, 6),
new PerkDoubleJump("Double Jump", 0.9, 0.9, false), new PerkDoubleJump("Double Jump", 0.9, 0.9, false),
new PerkDamageSnow(3, 1.5), new PerkDamageSnow(3, 1.25),
new PerkArcticAura(), new PerkArcticAura(),
new PerkBlizzard(), new PerkBlizzard(),
new PerkIcePath(), new PerkIcePath(),
@ -91,6 +91,6 @@ public class KitSnowman extends SmashKit
@Override @Override
public int GetCost() public int GetCost()
{ {
return 6000; return 5000;
} }
} }

View File

@ -31,7 +31,7 @@ public class KitWitherSkeleton extends SmashKit
new Perk[] new Perk[]
{ {
new PerkSmashStats(6, 1.1, 0.3, 6), new PerkSmashStats(6, 1.2, 0.3, 6),
new PerkDoubleJump("Double Jump", 0.9, 0.9, false), new PerkDoubleJump("Double Jump", 0.9, 0.9, false),
new PerkWitherSkull(), new PerkWitherSkull(),
new PerkWitherImage(), new PerkWitherImage(),

View File

@ -46,7 +46,7 @@ public class PerkBlizzard extends Perk
if (!Kit.HasKit(player)) if (!Kit.HasKit(player))
continue; continue;
player.setExp((float) Math.min(0.999, player.getExp()+0.008)); player.setExp((float) Math.min(0.999, player.getExp()+0.007));
} }
} }

View File

@ -1,6 +1,7 @@
package nautilus.game.arcade.kit.perks; package nautilus.game.arcade.kit.perks;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import org.bukkit.Location; import org.bukkit.Location;
@ -15,6 +16,7 @@ import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C; import mineplex.core.common.util.C;
import mineplex.core.common.util.F; import mineplex.core.common.util.F;
@ -32,7 +34,8 @@ import nautilus.game.arcade.kit.Perk;
public class PerkWitherSkull extends Perk public class PerkWitherSkull extends Perk
{ {
private HashMap<WitherSkull, Player> _active = new HashMap<WitherSkull, Player>(); private HashMap<WitherSkull, Vector> _active = new HashMap<WitherSkull, Vector>();
private HashSet<Player> _ignoreControl = new HashSet<Player>();
public PerkWitherSkull() public PerkWitherSkull()
{ {
@ -69,14 +72,17 @@ public class PerkWitherSkull extends Perk
//Fire //Fire
WitherSkull skull = player.launchProjectile(WitherSkull.class); WitherSkull skull = player.launchProjectile(WitherSkull.class);
skull.setDirection(player.getLocation().getDirection()); skull.setDirection(player.getLocation().getDirection());
_active.put(skull, player); _active.put(skull, player.getLocation().getDirection());
//Sound //Sound
player.getWorld().playSound(player.getLocation(), Sound.WITHER_SHOOT, 1f, 1f); player.getWorld().playSound(player.getLocation(), Sound.WITHER_SHOOT, 1f, 1f);
//Inform //Inform
UtilPlayer.message(player, F.main("Skill", "You launched " + F.skill(GetName()) + ".")); UtilPlayer.message(player, F.main("Skill", "You launched " + F.skill(GetName()) + "."));
//Control
_ignoreControl.remove(player);
} }
@EventHandler @EventHandler
@ -90,7 +96,7 @@ public class PerkWitherSkull extends Perk
while (skullIterator.hasNext()) while (skullIterator.hasNext())
{ {
WitherSkull skull = skullIterator.next(); WitherSkull skull = skullIterator.next();
Player player = _active.get(skull); Player player = (Player)skull.getShooter();
if (!skull.isValid()) if (!skull.isValid())
{ {
@ -99,18 +105,17 @@ public class PerkWitherSkull extends Perk
continue; continue;
} }
if (player.isBlocking()) if (player.isBlocking() && !_ignoreControl.contains(player))
{ {
skull.setDirection(player.getLocation().getDirection()); skull.setDirection(player.getLocation().getDirection());
skull.setVelocity(player.getLocation().getDirection().multiply(0.6)); skull.setVelocity(player.getLocation().getDirection().multiply(0.6));
_active.put(skull, player.getLocation().getDirection().multiply(0.6));
} }
else else
{ {
Explode(skull, skull.getLocation(), player); _ignoreControl.add(player);
skull.setDirection(_active.get(skull));
skullIterator.remove(); skull.setVelocity(_active.get(skull));
skull.remove();
continue;
} }
} }
} }
@ -138,8 +143,6 @@ public class PerkWitherSkull extends Perk
event.SetCancelled("Wither Skull Cancel"); event.SetCancelled("Wither Skull Cancel");
} }
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void DirectHitDamage(CustomDamageEvent event) public void DirectHitDamage(CustomDamageEvent event)
{ {

View File

@ -695,6 +695,28 @@ public class GameFlagManager implements Listener
} }
} }
} }
@EventHandler
public void WorldWeather(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC)
return;
Game game = Manager.GetGame();
if (game == null) return;
if (!game.WorldWeatherEnabled)
{
if (game.WorldData != null)
{
if (game.WorldData.World != null)
{
game.WorldData.World.setStorm(false);
game.WorldData.World.setThundering(false);
}
}
}
}
@EventHandler @EventHandler
public void WorldWaterDamage(UpdateEvent event) public void WorldWaterDamage(UpdateEvent event)