Add support for ocelot pets.

By default, a raw fish will turn into a pet ocelot, but the item type is configurable.
This commit is contained in:
Andreas Troelsen 2018-07-03 18:13:01 +02:00
parent 63d2c552a6
commit ccf6cda59a
5 changed files with 81 additions and 21 deletions

View File

@ -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)

View File

@ -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);
}
/**

View File

@ -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<LivingEntity> monsters, sheep, golems;
private Set<Wolf> pets;
private Set<Wolf> petWolves;
private Set<Ocelot> petOcelots;
private Map<LivingEntity,MABoss> bosses;
private Map<LivingEntity,List<ItemStack>> suppliers;
private Set<LivingEntity> 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<Wolf> 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) {

View File

@ -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);
}
}

View File

@ -4,3 +4,4 @@ update-notification: true
prefix: '&a[MobArena] '
pet-items:
wolf: bone
ocelot: raw_fish