11package com .azortis .combatlog .listener ;
22
33import com .azortis .combatlog .managers .CombatManager ;
4- import org .bukkit .entity .EntityType ;
5- import org .bukkit .entity .Player ;
6- import org .bukkit .entity .Projectile ;
4+ import org .bukkit .Bukkit ;
5+ import org .bukkit .Location ;
6+ import org .bukkit .Material ;
7+ import org .bukkit .entity .*;
78import org .bukkit .event .EventHandler ;
89import org .bukkit .event .EventPriority ;
910import org .bukkit .event .Listener ;
11+ import org .bukkit .event .entity .CreatureSpawnEvent ;
1012import org .bukkit .event .entity .EntityDamageByBlockEvent ;
1113import org .bukkit .event .entity .EntityDamageByEntityEvent ;
1214import org .bukkit .event .entity .EntityDamageEvent ;
13- import org .bukkit .event .player .PlayerCommandPreprocessEvent ;
14- import org .bukkit .event . player . PlayerJoinEvent ;
15- import org . bukkit . event . player . PlayerQuitEvent ;
16- import org . bukkit . event . player . PlayerTeleportEvent ;
15+ import org .bukkit .event .player .* ;
16+ import org .bukkit .inventory . ItemStack ;
17+
18+ import java . util .* ;
1719
1820public class CombatListener implements Listener {
1921 private final CombatManager manager ;
20-
22+ private Map < UUID , Set < Creeper >> creeperSpawner = new HashMap <>();
2123 public CombatListener (CombatManager manager ) {
2224 this .manager = manager ;
2325 }
@@ -27,8 +29,6 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
2729 if (event .getEntityType () != EntityType .PLAYER ) return ;
2830 Player player = (Player ) event .getEntity ();
2931 Player damager = null ;
30-
31-
3232 switch (event .getCause ()) {
3333 case MAGIC :
3434 case PROJECTILE :
@@ -43,7 +43,10 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
4343 damager = (Player ) event .getDamager ();
4444 break ;
4545 case ENTITY_EXPLOSION :
46- // todo: track who spawns creepers
46+ if (event .getDamager ().getType () != EntityType .CREEPER ) return ;
47+ for (Player spawner : Bukkit .getOnlinePlayers ()) {
48+ if (creeperSpawner .get (spawner .getUniqueId ()).contains (event .getDamager ())) damager = spawner ;
49+ }
4750 break ;
4851 default :
4952 break ;
@@ -56,30 +59,47 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
5659
5760 @ EventHandler (priority = EventPriority .MONITOR , ignoreCancelled = true )
5861 public void onEntityDamageEvent (EntityDamageEvent event ) {
59-
6062 }
6163
6264 @ EventHandler (priority = EventPriority .MONITOR , ignoreCancelled = true )
6365 public void onEntityBlockDamageEvent (EntityDamageByBlockEvent event ) {
64-
66+ if ( event . getEntity (). getType () != EntityType . PLAYER ) return ;
6567 }
6668
6769 @ EventHandler (priority = EventPriority .HIGHEST , ignoreCancelled = true )
6870 public void onPlayerTeleport (PlayerTeleportEvent event ) {
71+
6972 }
7073
7174 @ EventHandler (priority = EventPriority .MONITOR , ignoreCancelled = true )
7275 public void onPlayerJoin (PlayerJoinEvent event ) {
76+
7377 }
7478
7579 @ EventHandler (priority = EventPriority .MONITOR )
7680 public void onPlayerLeave (PlayerQuitEvent event ) {
81+ creeperSpawner .remove (event .getPlayer ().getUniqueId ());
7782 }
7883
7984 @ EventHandler (priority = EventPriority .HIGHEST , ignoreCancelled = true )
8085 public void onPlayerCommand (PlayerCommandPreprocessEvent event ) {
8186
8287 }
8388
89+ @ EventHandler (priority = EventPriority .MONITOR , ignoreCancelled = true )
90+ public void onPlayerInteract (PlayerInteractEvent event ) {
91+ if (event .getItem ().getType () == Material .CREEPER_SPAWN_EGG ) return ;
92+ if (event .getClickedBlock ().getType () == Material .AIR ) return ;
93+ Creeper creeper = (Creeper ) event .getPlayer ().getWorld ().spawnEntity (event .getClickedBlock ().getLocation ().add (0 , 1 , 0 ), EntityType .CREEPER , CreatureSpawnEvent .SpawnReason .EGG );
94+ Player player = event .getPlayer ();
95+ if (!creeperSpawner .containsKey (player .getUniqueId ())) creeperSpawner .put (player .getUniqueId (), new HashSet <>());
96+ creeperSpawner .get (player .getUniqueId ()).add (creeper );
97+ }
8498
85- }
99+ @ EventHandler (priority = EventPriority .HIGHEST , ignoreCancelled = true )
100+ public void onEntitySpawn (CreatureSpawnEvent event ) {
101+ if (event .getSpawnReason () != CreatureSpawnEvent .SpawnReason .EGG ) return ;
102+ if (event .getEntity ().getType () != EntityType .CREEPER ) return ;
103+ if (!(creeperSpawner .containsKey (event .getLocation ()))) return ;
104+ }
105+ }
0 commit comments