Mineplex2018-withcommit/Plugins/Nautilus.Game.MineKart/src/nautilus/game/minekart/item/KartItemManager.java
2014-10-31 15:40:40 +11:00

376 lines
9.3 KiB
Java

package nautilus.game.minekart.item;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import org.bukkit.Sound;
import org.bukkit.entity.Egg;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.MiniPlugin;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.core.updater.UpdateType;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import nautilus.game.minekart.gp.GPBattle;
import nautilus.game.minekart.item.KartItemActive.ActiveType;
import nautilus.game.minekart.item.control.Collision;
import nautilus.game.minekart.item.control.Movement;
import nautilus.game.minekart.kart.Kart;
import nautilus.game.minekart.kart.KartManager;
import nautilus.game.minekart.kart.crash.Crash_Explode;
public class KartItemManager extends MiniPlugin
{
public KartManager KartManager;
private HashMap<Integer, ArrayList<KartItemType>> _itemSelection = new HashMap<Integer, ArrayList<KartItemType>>();
private HashSet<KartItemActive> _kartItems = new HashSet<KartItemActive>();
private HashSet<KartItemEntity> _worldItems = new HashSet<KartItemEntity>();
public KartItemManager(JavaPlugin plugin, KartManager kartManager)
{
super("Kart Item Manager", plugin);
KartManager = kartManager;
}
@EventHandler
public void UseItem(PlayerDropItemEvent event)
{
Kart kart = KartManager.GetKart(event.getPlayer());
if (kart == null) return;
event.setCancelled(true);
KartItemActive active = kart.GetItemActive();
if (active != null)
{
if (active.Use())
{
//Depleted
kart.SetItemActive(null);
//Due to Auto-Activate
ItemDecrement(kart);
GetKartItems().remove(active);
//Sound
kart.GetDriver().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundMain(), 2f, 1f);
}
return;
}
KartItemType type = kart.GetItemStored();
if (type != null)
{
if (kart.GetItemCycles() > 10)
{
kart.SetItemCycles(kart.GetItemCycles() - 3);
return;
}
else if (kart.GetItemCycles() <= 0)
{
type.GetAction().Use(this, kart);
//Sound
kart.GetDriver().playSound(kart.GetDriver().getLocation(), kart.GetKartType().GetSoundMain(), 2f, 1f);
}
}
}
@EventHandler
public void CancelPickup(PlayerPickupItemEvent event)
{
for (KartItemEntity item : GetWorldItems())
if (item.GetEntity() != null && item.GetEntity().equals(event.getItem()))
{
event.setCancelled(true);
return;
}
//Not Map Item
event.setCancelled(true);
event.getItem().remove();
}
@EventHandler
public void CancelTarget(EntityTargetEvent event)
{
event.setCancelled(true);
}
@EventHandler
public void EggHit(EntityDamageEvent event)
{
if (!(event instanceof EntityDamageByEntityEvent))
return;
EntityDamageByEntityEvent eventEE = (EntityDamageByEntityEvent)event;
if (!(eventEE.getDamager() instanceof Egg))
return;
Egg egg = (Egg)eventEE.getDamager();
if (egg.getShooter() == null)
return;
if (!(egg.getShooter() instanceof Player))
return;
if (!(event.getEntity() instanceof Player))
return;
Player damager = (Player)egg.getShooter();
Player damagee = (Player)event.getEntity();
Kart kart = KartManager.GetKart(damagee);
if (kart == null) return;
new Crash_Explode(kart, 0.3f, false);
//Inform
if (damager.equals(damagee))
{
UtilPlayer.message(damagee, F.main("MK", "You hit yourself with " + F.item("Egg Blaster") + "."));
}
else
{
UtilPlayer.message(damagee, F.main("MK", F.elem(damager.getName()) + " hit you with " + F.item("Egg Blaster") + "."));
UtilPlayer.message(damager, F.main("MK", "You hit " + F.elem(damagee.getName()) + " with " + F.item("Egg Blaster") + "."));
}
}
@EventHandler
public void KartItemCycle(UpdateEvent event)
{
if (event.getType() != UpdateType.FASTEST)
return;
for (Kart kart : KartManager.GetKarts().values())
{
if (kart.GetItemCycles() > 0)
{
//Selected
if (kart.GetItemCycles() < 10)
{
//End Sound
if (kart.GetItemCycles()%3 == 0)
kart.GetDriver().playSound(kart.GetDriver().getLocation(), Sound.NOTE_PLING, 0.4f, 2f);
}
//Random
else
{
//Sound
kart.GetDriver().playSound(kart.GetDriver().getLocation(), Sound.NOTE_PLING, 0.2f, 1f + (10 - (kart.GetItemCycles()%10)) *0.05f);
KartItemType next = GetNewItem(kart);
//Ensure it doesnt cycle item twice in a row
while (next.equals(kart.GetItemStored()))
next = GetNewItem(kart);
kart.SetItemStored(next);
}
kart.SetItemCycles(kart.GetItemCycles() - 1);
//Auto Activate
if (kart.GetItemCycles() == 0)
{
if (kart.GetItemStored() == KartItemType.Banana ||
kart.GetItemStored() == KartItemType.BananaBunch ||
kart.GetItemStored() == KartItemType.SingleGreenShell ||
kart.GetItemStored() == KartItemType.DoubleGreenShell ||
kart.GetItemStored() == KartItemType.TripleGreenShell ||
kart.GetItemStored() == KartItemType.SingleRedShell ||
kart.GetItemStored() == KartItemType.DoubleRedShell ||
kart.GetItemStored() == KartItemType.TripleRedShell)
{
kart.GetItemStored().GetAction().Use(this, kart);
}
}
}
//Remove Stored, if active is gone
else if (kart.GetItemActive() == null && kart.GetItemStored() != null)
{
ItemDecrement(kart);
}
}
}
public void ItemDecrement(Kart kart)
{
if (kart.GetItemStored() == KartItemType.Banana ||
kart.GetItemStored() == KartItemType.SingleGreenShell ||
kart.GetItemStored() == KartItemType.SingleRedShell)
{
kart.SetItemStored(null);
}
if (kart.GetItemStored() == KartItemType.BananaBunch)
{
ItemStack item = kart.GetDriver().getInventory().getItem(3);
if (item == null || item.getAmount() == 1)
{
kart.SetItemStored(null);
}
else
{
item.setAmount(item.getAmount() - 1);
kart.GetItemStored().GetAction().Use(this, kart);
}
}
if (kart.GetItemStored() == KartItemType.DoubleGreenShell)
{
kart.SetItemStored(KartItemType.SingleGreenShell);
kart.GetItemStored().GetAction().Use(this, kart);
}
if (kart.GetItemStored() == KartItemType.TripleGreenShell)
{
kart.SetItemStored(KartItemType.DoubleGreenShell);
kart.GetItemStored().GetAction().Use(this, kart);
}
if (kart.GetItemStored() == KartItemType.DoubleRedShell)
{
kart.SetItemStored(KartItemType.SingleRedShell);
kart.GetItemStored().GetAction().Use(this, kart);
}
if (kart.GetItemStored() == KartItemType.TripleRedShell)
{
kart.SetItemStored(KartItemType.DoubleRedShell);
kart.GetItemStored().GetAction().Use(this, kart);
}
}
@EventHandler
public void KartItemUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
for (KartItemActive active : GetKartItems())
{
if (active.GetType() == ActiveType.Behind)
Movement.Behind(active.GetKart(), active.GetEntities());
if (active.GetType() == ActiveType.Orbit)
Movement.Orbit(active.GetKart(), active.GetEntities());
if (active.GetType() == ActiveType.Trail)
Movement.Trail(active.GetKart(), active.GetEntities());
}
}
@EventHandler
public void WorldItemUpdate(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
HashSet<KartItemEntity> remove = new HashSet<KartItemEntity>();
for (KartItemEntity item : GetWorldItems())
{
if (item.GetTrack() == null || item.GetTrack().GetWorld() == null)
{
remove.add(item);
continue;
}
if (remove.contains(item))
continue;
if (item.TickUpdate())
remove.add(item);
//Collide with Items
KartItemEntity other = Collision.CollideItem(item, GetWorldItems());
if (other != null)
{
remove.add(item);
remove.add(other);
}
//Collide with Players
if (Collision.CollidePlayer(item, KartManager.GetKarts().values()))
remove.add(item);
}
for (KartItemEntity item : remove)
{
if (item.GetHost() != null)
{
item.GetHost().GetEntities().remove(item);
if (item.GetHost().GetEntities().isEmpty())
{
item.GetHost().GetKart().SetItemActive(null);
GetKartItems().remove(item.GetHost());
}
}
item.Clean();
_worldItems.remove(item);
}
}
public void RegisterKartItem(KartItemActive item)
{
_kartItems.add(item);
}
public void RegisterWorldItem(KartItemEntity item)
{
_worldItems.add(item);
}
public HashSet<KartItemActive> GetKartItems()
{
return _kartItems;
}
public HashSet<KartItemEntity> GetWorldItems()
{
return _worldItems;
}
public KartItemType GetNewItem(Kart kart)
{
if (Math.random() > 1 - kart.GetKartType().GetKartItem().GetChance())
return kart.GetKartType().GetKartItem();
int pos = kart.GetLapPlace();
if (kart.GetGP() instanceof GPBattle)
pos = -1;
if (!_itemSelection.containsKey(pos))
_itemSelection.put(pos, KartItemType.GetItem(pos));
ArrayList<KartItemType> itemBag = _itemSelection.get(pos);
return itemBag.get(UtilMath.r(itemBag.size()));
}
}