From ccf6cda59a7f5b5ba2d3da920d05aa0030f35a6b Mon Sep 17 00:00:00 2001 From: Andreas Troelsen Date: Tue, 3 Jul 2018 18:13:01 +0200 Subject: [PATCH] Add support for ocelot pets. By default, a raw fish will turn into a pet ocelot, but the item type is configurable. --- .../garbagemule/MobArena/ArenaListener.java | 16 ++++++ .../garbagemule/MobArena/ArenaMasterImpl.java | 9 +++- .../garbagemule/MobArena/MonsterManager.java | 49 ++++++++++++------- .../com/garbagemule/MobArena/SpawnsPets.java | 27 +++++++++- src/main/resources/res/global-settings.yml | 1 + 5 files changed, 81 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/garbagemule/MobArena/ArenaListener.java b/src/main/java/com/garbagemule/MobArena/ArenaListener.java index 7945830..834d15d 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaListener.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaListener.java @@ -29,6 +29,7 @@ import org.bukkit.entity.AnimalTamer; import org.bukkit.entity.Entity; import org.bukkit.entity.Horse; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Ocelot; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.entity.Slime; @@ -596,6 +597,9 @@ public class ArenaListener else if (damager instanceof Wolf && arena.hasPet(damager)) { damager = (Player) ((Wolf) damager).getOwner(); } + else if (damager instanceof Ocelot && arena.hasPet(damager)) { + damager = (Player) ((Ocelot) damager).getOwner(); + } // If the damager was a player, add to kills. if (damager instanceof Player) { @@ -694,6 +698,9 @@ public class ArenaListener if (damagee instanceof Wolf && arena.hasPet(damagee)) { onPetDamage(event, (Wolf) damagee, damager); } + else if (damagee instanceof Ocelot && arena.hasPet(damagee)) { + onPetDamage(event, (Ocelot) damagee, damager); + } // Mount else if (damagee instanceof AbstractHorse && monsters.hasMount(damagee)) { onMountDamage(event, (Horse) damagee, damager); @@ -745,6 +752,10 @@ public class ArenaListener event.setCancelled(true); } + private void onPetDamage(EntityDamageEvent event, Ocelot pet, Entity damager) { + event.setCancelled(true); + } + private void onMountDamage(EntityDamageEvent event, Horse mount, Entity damager) { event.setCancelled(true); } @@ -777,6 +788,11 @@ public class ArenaListener ArenaPlayerStatistics aps = arena.getArenaPlayer(p).getStats(); aps.add("dmgDone", event.getDamage()); } + else if (damager instanceof Ocelot && arena.hasPet(damager)) { + Player p = (Player) ((Ocelot) damager).getOwner(); + ArenaPlayerStatistics aps = arena.getArenaPlayer(p).getStats(); + aps.add("dmgDone", event.getDamage()); + } //TODO add in check for player made golems doing damage else if (damager instanceof LivingEntity) { if (!monsterInfight) diff --git a/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java b/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java index 7980e9d..0ddf65b 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java @@ -57,7 +57,7 @@ public class ArenaMasterImpl implements ArenaMaster this.classes = new HashMap<>(); this.allowedCommands = new HashSet<>(); - this.spawnsPets = new SpawnsPets(Material.BONE); + this.spawnsPets = new SpawnsPets(Material.BONE, Material.RAW_FISH); this.enabled = config.getBoolean("global-settings.enabled", true); } @@ -266,14 +266,19 @@ public class ArenaMasterImpl implements ArenaMaster private void loadPetItems(ConfigurationSection settings) { String wolf = settings.getString("pet-items.wolf", ""); + String ocelot = settings.getString("pet-items.ocelot", ""); Material wolfMaterial = Material.getMaterial(wolf.toUpperCase()); + Material ocelotMaterial = Material.getMaterial(ocelot.toUpperCase()); if (wolfMaterial == null && !wolf.isEmpty()) { plugin.getLogger().warning("Unknown item type for wolf pet item: " + wolf); } + if (ocelotMaterial == null && !ocelot.isEmpty()) { + plugin.getLogger().warning("Unknown item type for ocelot pet item: " + ocelot); + } - spawnsPets = new SpawnsPets(wolfMaterial); + spawnsPets = new SpawnsPets(wolfMaterial, ocelotMaterial); } /** diff --git a/src/main/java/com/garbagemule/MobArena/MonsterManager.java b/src/main/java/com/garbagemule/MobArena/MonsterManager.java index c597298..f9ab87e 100644 --- a/src/main/java/com/garbagemule/MobArena/MonsterManager.java +++ b/src/main/java/com/garbagemule/MobArena/MonsterManager.java @@ -4,6 +4,7 @@ import com.garbagemule.MobArena.healthbar.HealthBar; import com.garbagemule.MobArena.waves.MABoss; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Ocelot; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.inventory.ItemStack; @@ -19,26 +20,29 @@ import java.util.Set; public class MonsterManager { private Set monsters, sheep, golems; - private Set pets; + private Set petWolves; + private Set petOcelots; private Map bosses; private Map> suppliers; private Set mounts; public MonsterManager() { - this.monsters = new HashSet<>(); - this.sheep = new HashSet<>(); - this.golems = new HashSet<>(); - this.pets = new HashSet<>(); - this.bosses = new HashMap<>(); - this.suppliers = new HashMap<>(); - this.mounts = new HashSet<>(); + this.monsters = new HashSet<>(); + this.sheep = new HashSet<>(); + this.golems = new HashSet<>(); + this.petWolves = new HashSet<>(); + this.petOcelots = new HashSet<>(); + this.bosses = new HashMap<>(); + this.suppliers = new HashMap<>(); + this.mounts = new HashSet<>(); } public void reset() { monsters.clear(); sheep.clear(); golems.clear(); - pets.clear(); + petWolves.clear(); + petOcelots.clear(); bosses.clear(); suppliers.clear(); mounts.clear(); @@ -53,7 +57,8 @@ public class MonsterManager removeAll(monsters); removeAll(sheep); removeAll(golems); - removeAll(pets); + removeAll(petWolves); + removeAll(petOcelots); removeAll(bosses.keySet()); removeAll(suppliers.keySet()); removeAll(mounts); @@ -73,7 +78,8 @@ public class MonsterManager if (monsters.remove(e)) { sheep.remove(e); golems.remove(e); - pets.remove(e); + petWolves.remove(e); + petOcelots.remove(e); suppliers.remove(e); MABoss boss = bosses.remove(e); if (boss != null) { @@ -118,26 +124,33 @@ public class MonsterManager return golems.remove(e); } - public Set getPets() { - return pets; - } - public void addPet(Wolf w) { - pets.add(w); + petWolves.add(w); + } + + public void addPet(Ocelot o) { + petOcelots.add(o); } public boolean hasPet(Entity e) { - return pets.contains(e); + return petWolves.contains(e) || petOcelots.contains(e); } public void removePets(Player p) { - for (Wolf w : pets) { + for (Wolf w : petWolves) { if (w == null || !(w.getOwner() instanceof Player) || !w.getOwner().getName().equals(p.getName())) continue; w.setOwner(null); w.remove(); } + for (Ocelot o : petOcelots) { + if (o == null || !(o.getOwner() instanceof Player) || !o.getOwner().getName().equals(p.getName())) + continue; + + o.setOwner(null); + o.remove(); + } } public void addMount(LivingEntity e) { diff --git a/src/main/java/com/garbagemule/MobArena/SpawnsPets.java b/src/main/java/com/garbagemule/MobArena/SpawnsPets.java index 80f9f64..720ca42 100644 --- a/src/main/java/com/garbagemule/MobArena/SpawnsPets.java +++ b/src/main/java/com/garbagemule/MobArena/SpawnsPets.java @@ -3,6 +3,7 @@ package com.garbagemule.MobArena; import com.garbagemule.MobArena.framework.Arena; import org.bukkit.Material; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Ocelot; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; import org.bukkit.inventory.PlayerInventory; @@ -10,9 +11,11 @@ import org.bukkit.inventory.PlayerInventory; public class SpawnsPets { private final Material wolfMaterial; + private final Material ocelotMaterial; - SpawnsPets(Material wolfMaterial) { + SpawnsPets(Material wolfMaterial, Material ocelotMaterial) { this.wolfMaterial = wolfMaterial; + this.ocelotMaterial = ocelotMaterial; } void spawn(Arena arena) { @@ -29,6 +32,7 @@ public class SpawnsPets { return; } spawnWolfPets(player, arena); + spawnOcelotPets(player, arena); } private void spawnWolfPets(Player player, Arena arena) { @@ -52,4 +56,25 @@ public class SpawnsPets { inv.setItem(index, null); } + private void spawnOcelotPets(Player player, Arena arena) { + if (ocelotMaterial == null) { + return; + } + PlayerInventory inv = player.getInventory(); + int index = inv.first(ocelotMaterial); + if (index == -1) { + return; + } + + int amount = inv.getItem(index).getAmount(); + for (int i = 0; i < amount; i++) { + Ocelot ocelot = (Ocelot) arena.getWorld().spawnEntity(player.getLocation(), EntityType.OCELOT); + ocelot.setTamed(true); + ocelot.setOwner(player); + arena.getMonsterManager().addPet(ocelot); + } + + inv.setItem(index, null); + } + } diff --git a/src/main/resources/res/global-settings.yml b/src/main/resources/res/global-settings.yml index b0c0fdf..5bf3b99 100644 --- a/src/main/resources/res/global-settings.yml +++ b/src/main/resources/res/global-settings.yml @@ -4,3 +4,4 @@ update-notification: true prefix: '&a[MobArena] ' pet-items: wolf: bone + ocelot: raw_fish