package com.comze_instancelabs.mobescape.V1_7;
import java.lang.reflect.Field;
import java.util.HashMap;
import net.minecraft.server.v1_7_R1.EntityTypes;
import net.minecraft.server.v1_7_R1.PacketPlayOutWorldEvent;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.craftbukkit.v1_7_R1.CraftWorld;
import org.bukkit.craftbukkit.v1_7_R1.entity.CraftPlayer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
import com.comze_instancelabs.mobescape.Kits;
import com.comze_instancelabs.mobescape.Main;
import com.comze_instancelabs.mobescape.mobtools.Tools;
import com.comze_instancelabs.mobescape.AbstractDragon;
public class V1_7Dragon implements AbstractDragon {
public static HashMap<String, MEDragon> dragons = new HashMap<String, MEDragon>();
public static boolean registerEntities() {
try {
Class entityTypeClass = EntityTypes.class;
Field c = entityTypeClass.getDeclaredField("c");
c.setAccessible(true);
HashMap c_map = (HashMap) c.get(null);
c_map.put("MEWither", MEWither.class);
Field d = entityTypeClass.getDeclaredField("d");
d.setAccessible(true);
HashMap d_map = (HashMap) d.get(null);
d_map.put(MEWither.class, "MEWither");
Field e = entityTypeClass.getDeclaredField("e");
e.setAccessible(true);
HashMap e_map = (HashMap) e.get(null);
e_map.put(Integer.valueOf(64), MEWither.class);
Field f = entityTypeClass.getDeclaredField("f");
f.setAccessible(true);
HashMap f_map = (HashMap) f.get(null);
f_map.put(MEWither.class, Integer.valueOf(64));
Field g = entityTypeClass.getDeclaredField("g");
g.setAccessible(true);
HashMap g_map = (HashMap) g.get(null);
g_map.put("MEWither", Integer.valueOf(64));
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
try {
Class entityTypeClass = EntityTypes.class;
Field c = entityTypeClass.getDeclaredField("c");
c.setAccessible(true);
HashMap c_map = (HashMap) c.get(null);
c_map.put("MEDragon", MEDragon.class);
Field d = entityTypeClass.getDeclaredField("d");
d.setAccessible(true);
HashMap d_map = (HashMap) d.get(null);
d_map.put(MEDragon.class, "MEDragon");
Field e = entityTypeClass.getDeclaredField("e");
e.setAccessible(true);
HashMap e_map = (HashMap) e.get(null);
e_map.put(Integer.valueOf(63), MEDragon.class);
Field f = entityTypeClass.getDeclaredField("f");
f.setAccessible(true);
HashMap f_map = (HashMap) f.get(null);
f_map.put(MEDragon.class, Integer.valueOf(63));
Field g = entityTypeClass.getDeclaredField("g");
g.setAccessible(true);
HashMap g_map = (HashMap) g.get(null);
g_map.put("MEDragon", Integer.valueOf(63));
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
public void playBlockBreakParticles(final Location loc, final Material m, final Player... players) {
@SuppressWarnings("deprecation")
PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(2001, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), m.getId(), false);
for (final Player p : players) {
((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet);
}
}
public MEDragon spawnEnderdragon(Main m, String arena, Location t) {
/*
* if(dragons.containsKey(arena)){ return dragons.get(arena); }
*/
m.getLogger().info("DRAGON SPAWNED " + arena + " " + t.toString());
Object w = ((CraftWorld) t.getWorld()).getHandle();
if (m.getDragonWayPoints(arena) == null) {
m.getLogger().severe("You forgot to set any FlyPoints! You need to have min. 2 and one of them has to be at finish.");
return null;
}
MEDragon t_ = new MEDragon(m, arena, t, (net.minecraft.server.v1_7_R1.World) ((CraftWorld) t.getWorld()).getHandle(), m.getDragonWayPoints(arena));
((net.minecraft.server.v1_7_R1.World) w).addEntity(t_, CreatureSpawnEvent.SpawnReason.CUSTOM);
t_.setCustomName(m.dragon_name);
return t_;
}
public BukkitTask start(final Main m, final String arena) {
m.ingame.put(arena, true);
m.astarted.put(arena, false);
m.getLogger().info("STARTED");
// start countdown timer
if (m.start_announcement) {
Bukkit.getServer().broadcastMessage(m.starting + " " + Integer.toString(m.start_countdown));
}
Bukkit.getServer().getScheduler().runTaskLater(m, new Runnable() {
public void run() {
// clear hostile mobs on start:
for (Player p : m.arenap.keySet()) {
p.playSound(p.getLocation(), Sound.CAT_MEOW, 1, 0);
if (m.arenap.get(p).equalsIgnoreCase(arena)) {
for (Entity t : p.getNearbyEntities(64, 64, 64)) {
if (t.getType() == EntityType.ZOMBIE || t.getType() == EntityType.SKELETON || t.getType() == EntityType.CREEPER || t.getType() == EntityType.CAVE_SPIDER || t.getType() == EntityType.SPIDER || t.getType() == EntityType.WITCH || t.getType() == EntityType.GIANT) {
t.remove();
}
}
break;
}
}
}
}, 20L);
int t = Bukkit.getServer().getScheduler().runTaskTimerAsynchronously(m, new Runnable() {
public void run() {
if (!m.countdown_count.containsKey(arena)) {
m.countdown_count.put(arena, m.start_countdown);
}
int count = m.countdown_count.get(arena);
for (Player p : m.arenap.keySet()) {
if (m.arenap.get(p).equalsIgnoreCase(arena)) {
p.sendMessage(m.starting_in + count + m.starting_in2);
}
}
count--;
m.countdown_count.put(arena, count);
if (count < 0) {
m.countdown_count.put(arena, m.start_countdown);
if (m.start_announcement) {
Bukkit.getServer().broadcastMessage(m.started);
}
m.astarted.put(arena, true);
// update sign
Bukkit.getServer().getScheduler().runTask(m, new Runnable() {
public void run() {
Sign s = m.getSignFromArena(arena);
if (s != null) {
s.setLine(1, m.sign_second_ingame);
s.update();
}
}
});
for (final Player p : m.arenap.keySet()) {
if (m.arenap.get(p).equalsIgnoreCase(arena)) {
if (p.isOnline()) {
if (m.pkit.containsKey(p)) {
String kit = m.pkit.get(p);
if (kit.equalsIgnoreCase("jumper")) {
Kits.giveJumperKit(m, p);
} else if (kit.equalsIgnoreCase("warper")) {
Kits.giveWarperKit(m, p);
} else if (kit.equalsIgnoreCase("tnt")) {
Kits.giveTNTKit(m, p);
}
m.pkit.remove(p);
}
}
}
}
Bukkit.getServer().getScheduler().cancelTask(m.countdown_id.get(arena));
}
}
}, 0, 20).getTaskId();
m.countdown_id.put(arena, t);
Bukkit.getScheduler().runTask(m, new Runnable() {
public void run() {
try {
boolean cont = true;
if (m.getDragonSpawn(arena) != null) {
for (Entity e : m.getNearbyEntities(m.getDragonSpawn(arena), 40)) {
if (e.getType() == EntityType.ENDER_DRAGON) {
cont = false;
}
}
}
if (cont) {
if (m.getDragonSpawn(arena) != null) {
dragons.put(arena, spawnEnderdragon(m, arena, m.getDragonSpawn(arena)));
} else {
dragons.put(arena, spawnEnderdragon(m, arena, m.getSpawn(arena)));
}
}
} catch (Exception e) {
m.stop(m.h.get(arena), arena);
return;
}
}
});
final int d = 1;
BukkitTask id__ = null;
id__ = Bukkit.getServer().getScheduler().runTaskTimerAsynchronously(m, new Runnable() {
@Override
public void run() {
try {
for (final Player p : m.arenap.keySet()) {
if (p.isOnline()) {
if (m.arenap.get(p).equalsIgnoreCase(arena)) {
m.arenap_.put(p.getName(), arena);
if (m.die_behind_mob) {
Vector vv = dragons.get(arena).getCurrentPosition();
Vector vv_ = dragons.get(arena).getCurrentPositionNext();
Location dragon = new Location(p.getWorld(), dragons.get(arena).locX, dragons.get(arena).locY, dragons.get(arena).locZ);
Location l = new Location(p.getWorld(), vv.getX(), vv.getY(), vv.getZ());
Location l_ = new Location(p.getWorld(), vv_.getX(), vv_.getY(), vv_.getZ());
if (p.getLocation().distance(l) - dragon.distance(l) > 10 && p.getLocation().distance(l_) - dragon.distance(l_) > 10) {
m.simulatePlayerFall(p);
}
}
}
}
}
final Location l = m.getSpawn(arena);
if (m.dragon_move_increment.containsKey(arena)) {
m.dragon_move_increment.put(arena, m.dragon_move_increment.get(arena) + 0.35D);
} else {
m.dragon_move_increment.put(arena, 0.25D);
}
Location l1 = m.getHighBoundary(arena);
Location l2 = m.getLowBoundary(arena);
int length1 = l1.getBlockX() - l2.getBlockX();
int length2 = l1.getBlockY() - l2.getBlockY();
int length3 = l1.getBlockZ() - l2.getBlockZ();
boolean f = false;
boolean f_ = false;
if (l2.getBlockX() > l1.getBlockX()) {
length1 = l2.getBlockX() - l1.getBlockX();
f = true;
}
if (l2.getBlockZ() > l1.getBlockZ()) {
length3 = l2.getBlockZ() - l1.getBlockZ();
f_ = true;
}
if (!dragons.containsKey(arena)) {
return;
}
if (dragons.get(arena) == null) {
return;
}
Vector v = dragons.get(arena).getNextPosition();
if (v != null && dragons.get(arena) != null) {
dragons.get(arena).setPosition(v.getX(), v.getY(), v.getZ());
}
if (dragons.get(arena) == null) {
return;
}
V1_7Dragon.destroyStatic(m, l1, l2, arena, length2);
} catch (Exception e) {
e.printStackTrace();
}
Bukkit.getScheduler().runTask(m, new Runnable() {
public void run() {
// TODO reminder
m.updateScoreboard(arena);
}
});
}
}, 3 + 20 * m.start_countdown, 3);
m.h.put(arena, id__);
m.tasks.put(arena, id__);
return id__;
}
public void removeEnderdragon(String arena) {
try {
removeEnderdragon(dragons.get(arena));
dragons.put(arena, null);
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop(final Main m, BukkitTask t, final String arena) {
Tools t_ = new Tools();
t_.stop(m, t, arena, false, false, "dragon");
}
public void removeEnderdragon(MEDragon t) {
if (t != null) {
t.getBukkitEntity().remove();
}
}
public Block[] getLoc(Main m, final Location l, String arena, int i, int j, Location l2) {
Block[] b = new Block[4];
b[0] = l.getWorld().getBlockAt(new Location(l.getWorld(), dragons.get(arena).locX + (m.destroy_radius / 2) - i, dragons.get(arena).locY + j - 1, dragons.get(arena).locZ + 3));
b[1] = l.getWorld().getBlockAt(new Location(l.getWorld(), dragons.get(arena).locX + (m.destroy_radius / 2) - i, dragons.get(arena).locY + j - 1, dragons.get(arena).locZ - 3));
b[2] = l.getWorld().getBlockAt(new Location(l.getWorld(), dragons.get(arena).locX + 3, dragons.get(arena).locY + j - 1, dragons.get(arena).locZ + (m.destroy_radius / 2) - i));
b[3] = l.getWorld().getBlockAt(new Location(l.getWorld(), dragons.get(arena).locX - 3, dragons.get(arena).locY + j - 1, dragons.get(arena).locZ + (m.destroy_radius / 2) - i));
return b;
}
public static void destroyStatic(final Main m, final Location l, final Location l2, String arena, int length2) {
Tools.destroy(m, l, l2, arena, length2, "dragon", false, false);
}
public void destroy(final Main m, final Location l, final Location l2, String arena, int length2) {
Tools.destroy(m, l, l2, arena, length2, "dragon", false, false);
}
}