package org.ultralogger.logger.sql;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.CreeperPowerEvent;
import org.bukkit.event.entity.EntityBreakDoorEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityInteractEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityTameEvent;
import org.bukkit.event.entity.ExpBottleEvent;
import org.bukkit.event.entity.PigZapEvent;
import org.bukkit.event.entity.PotionSplashEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.inventory.ItemStack;
public class EntityLogger implements Listener,Runnable{
private SQL manager;
/*
* TODO: Change table Lay-out or split into multiple tables to make it more efficient for full logging and scripts
*/
public EntityLogger(SQL sql){
manager=sql;
Thread t = new Thread(this,"[UltraLogger] - SQL Entity Logger");
t.start();
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent1(CreatureSpawnEvent e){
Entity i =e.getEntity();
if(i==null)
return;
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`reason`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Spawn','"+e.getSpawnReason().name()+"',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent2(CreeperPowerEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Lightning',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent2a(PigZapEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','PigZap',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent3(EntityBreakDoorEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','BrokeDoor',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent4(EntityDamageEvent e){
Entity i =e.getEntity();
int dmg = e.getDamage();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`amount`,`reason`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Damage(HalfHearth)',"+ dmg +",'"+e.getCause().name()+"',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent5(EntityDeathEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Death',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEntityExplode(EntityExplodeEvent e){
Entity i =e.getEntity();
if(i==null){
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+e.getLocation().getWorld().getName()+"','Unknown','Explode',"+toSQLquery(e.getLocation())+")");
}
else{
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Explode',"+toSQLquery(i.getLocation())+")");
}
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent7(EntityInteractEvent e){
Block i =e.getBlock();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`reason`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Spawn','"+"Item="+ new ItemStack(i.getTypeId())+"',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent8(EntityRegainHealthEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`amount`,`reason`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Regen(HalfHearth)',"+ e.getAmount() +",'"+e.getRegainReason().name()+"',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent9(EntityTameEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`reason`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','Spawn','"+"Owner="+e.getOwner().getName()+"',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent10(ExpBottleEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','ThrowXP',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent11(PotionSplashEvent e){
Entity i =e.getPotion();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','ThrowPotion',"+toSQLquery(i.getLocation())+")");
}
@EventHandler (priority = EventPriority.MONITOR)
public void onEvent12(ProjectileHitEvent e){
Entity i =e.getEntity();
manager.query("INSERT INTO `"+manager.getprefix()+"_entity`(`time`,`world`,`entityname`,`event`,`x`,`y`,`z`) VALUES (NOW(),'"+i.getWorld().getName()+"','"+i.toString()+"','ProjectileHit',"+toSQLquery(i.getLocation())+")");
}
/*
* TODO: Add more entity events
* TODO: Move to another file where it can be called from as it is used in multiple Loggers
*/
public String toSQLquery(Location loc){
String s =loc.getBlockX()+","+loc.getBlockY()+","+loc.getBlockZ();
return s;
}
@Override
public void run() {
manager.register(this);
//Create the def entity table
manager.query("CREATE TABLE IF NOT EXISTS `"+manager.getprefix()+"_entity` (`prim_key` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,`time` DATETIME NOT NULL,`world` VARCHAR(255) NOT NULL," +
"`entityname` VARCHAR(255) NOT NULL,`event` VARCHAR(255) NOT NULL,`amount` BIGINT,`reason` VARCHAR(255),`x` INT NOT NULL,`y` INT NOT NULL, `z` INT NOT NULL,PRIMARY KEY (prim_key)) COLLATE='utf8_general_ci'");
}
}