From 5d3150573c41f230df4bc89d7f61f95bcc72f01e Mon Sep 17 00:00:00 2001 From: TheUnknownCod3r <114740383+TheUnknownCod3r@users.noreply.github.com> Date: Sun, 23 Jul 2023 13:54:09 +0100 Subject: [PATCH 01/10] Init 1.20 Support --- README | 5 + pom.xml | 27 +- src/main/assembly/package.xml | 3 +- .../org/dynmap/mobs/DynmapMobsPlugin.java | 1010 +++++++++++++---- src/main/resources/8x8/allay.png | Bin 0 -> 185 bytes src/main/resources/8x8/axolotl.png | Bin 0 -> 156 bytes src/main/resources/8x8/bee.png | Bin 0 -> 1898 bytes src/main/resources/8x8/camel.png | Bin 0 -> 154 bytes src/main/resources/8x8/chest-boat.png | Bin 0 -> 215 bytes src/main/resources/8x8/cod.png | Bin 0 -> 210 bytes src/main/resources/8x8/drowned.png | Bin 0 -> 253 bytes src/main/resources/8x8/frog.png | Bin 0 -> 219 bytes src/main/resources/8x8/glowsquid.png | Bin 0 -> 506 bytes src/main/resources/8x8/goat.png | Bin 1920 -> 324 bytes src/main/resources/8x8/hoglin.png | Bin 0 -> 1973 bytes src/main/resources/8x8/illusioner.png | Bin 0 -> 1674 bytes src/main/resources/8x8/panda.png | Bin 0 -> 1543 bytes src/main/resources/8x8/parrot.png | Bin 0 -> 292 bytes src/main/resources/8x8/phantom.png | Bin 0 -> 226 bytes src/main/resources/8x8/piglin.png | Bin 0 -> 1268 bytes src/main/resources/8x8/pillager.png | Bin 0 -> 1025 bytes src/main/resources/8x8/pufferfish.png | Bin 0 -> 248 bytes src/main/resources/8x8/ravager.png | Bin 0 -> 1593 bytes src/main/resources/8x8/salmon.png | Bin 0 -> 230 bytes src/main/resources/8x8/sniffer.png | Bin 0 -> 248 bytes src/main/resources/8x8/strider.png | Bin 0 -> 1312 bytes src/main/resources/8x8/tadpole.png | Bin 0 -> 164 bytes src/main/resources/8x8/traderllama.png | Bin 0 -> 1060 bytes src/main/resources/8x8/tropicalfish.png | Bin 0 -> 224 bytes src/main/resources/8x8/vanilladolphin.png | Bin 0 -> 1933 bytes src/main/resources/8x8/vanillafox.png | Bin 0 -> 1353 bytes src/main/resources/8x8/vanillagoat.png | Bin 0 -> 324 bytes src/main/resources/8x8/vanillaturtle.png | Bin 0 -> 215 bytes src/main/resources/8x8/wandering_trader.png | Bin 0 -> 1797 bytes src/main/resources/8x8/warden.png | Bin 0 -> 141 bytes src/main/resources/8x8/zoglin.png | Bin 0 -> 1650 bytes src/main/resources/8x8/zombiepigman.png | Bin 1134 -> 1757 bytes src/main/resources/allay.png | Bin 0 -> 254 bytes src/main/resources/axolotl.png | Bin 0 -> 258 bytes src/main/resources/bee.png | Bin 0 -> 2727 bytes src/main/resources/camel.png | Bin 0 -> 132 bytes src/main/resources/chest-boat.png | Bin 0 -> 285 bytes src/main/resources/cod.png | Bin 0 -> 389 bytes src/main/resources/config.yml | 209 ++-- src/main/resources/drowned.png | Bin 0 -> 286 bytes src/main/resources/frog.png | Bin 0 -> 402 bytes src/main/resources/glowsquid.png | Bin 0 -> 1561 bytes src/main/resources/goat.png | Bin 2193 -> 778 bytes src/main/resources/hoglin.png | Bin 0 -> 2395 bytes src/main/resources/illusioner.png | Bin 0 -> 2255 bytes src/main/resources/panda.png | Bin 0 -> 2129 bytes src/main/resources/parrot.png | Bin 0 -> 672 bytes src/main/resources/phantom.png | Bin 0 -> 240 bytes src/main/resources/piglin.png | Bin 0 -> 1419 bytes src/main/resources/pillager.png | Bin 0 -> 1062 bytes src/main/resources/plugin.yml | 1 + src/main/resources/pufferfish.png | Bin 0 -> 510 bytes src/main/resources/ravager.png | Bin 0 -> 2178 bytes src/main/resources/salmon.png | Bin 0 -> 444 bytes src/main/resources/sniffer.png | Bin 0 -> 277 bytes src/main/resources/strider.png | Bin 0 -> 1761 bytes src/main/resources/tadpole.png | Bin 0 -> 139 bytes src/main/resources/traderllama.png | Bin 0 -> 1187 bytes src/main/resources/tropicalfish.png | Bin 0 -> 410 bytes src/main/resources/vanilladolphin.png | Bin 0 -> 2245 bytes src/main/resources/vanillafox.png | Bin 0 -> 1385 bytes src/main/resources/vanillagoat.png | Bin 0 -> 778 bytes src/main/resources/vanillaturtle.png | Bin 0 -> 296 bytes src/main/resources/wandering_trader.png | Bin 0 -> 2359 bytes src/main/resources/warden.png | Bin 0 -> 239 bytes src/main/resources/zoglin.png | Bin 0 -> 2213 bytes src/main/resources/zombiepigman.png | Bin 1196 -> 1847 bytes 72 files changed, 949 insertions(+), 306 deletions(-) create mode 100644 src/main/resources/8x8/allay.png create mode 100644 src/main/resources/8x8/axolotl.png create mode 100644 src/main/resources/8x8/bee.png create mode 100644 src/main/resources/8x8/camel.png create mode 100644 src/main/resources/8x8/chest-boat.png create mode 100644 src/main/resources/8x8/cod.png create mode 100644 src/main/resources/8x8/drowned.png create mode 100644 src/main/resources/8x8/frog.png create mode 100644 src/main/resources/8x8/glowsquid.png create mode 100644 src/main/resources/8x8/hoglin.png create mode 100644 src/main/resources/8x8/illusioner.png create mode 100644 src/main/resources/8x8/panda.png create mode 100644 src/main/resources/8x8/parrot.png create mode 100644 src/main/resources/8x8/phantom.png create mode 100644 src/main/resources/8x8/piglin.png create mode 100644 src/main/resources/8x8/pillager.png create mode 100644 src/main/resources/8x8/pufferfish.png create mode 100644 src/main/resources/8x8/ravager.png create mode 100644 src/main/resources/8x8/salmon.png create mode 100644 src/main/resources/8x8/sniffer.png create mode 100644 src/main/resources/8x8/strider.png create mode 100644 src/main/resources/8x8/tadpole.png create mode 100644 src/main/resources/8x8/traderllama.png create mode 100644 src/main/resources/8x8/tropicalfish.png create mode 100644 src/main/resources/8x8/vanilladolphin.png create mode 100644 src/main/resources/8x8/vanillafox.png create mode 100644 src/main/resources/8x8/vanillagoat.png create mode 100644 src/main/resources/8x8/vanillaturtle.png create mode 100644 src/main/resources/8x8/wandering_trader.png create mode 100644 src/main/resources/8x8/warden.png create mode 100644 src/main/resources/8x8/zoglin.png create mode 100644 src/main/resources/allay.png create mode 100644 src/main/resources/axolotl.png create mode 100644 src/main/resources/bee.png create mode 100644 src/main/resources/camel.png create mode 100644 src/main/resources/chest-boat.png create mode 100644 src/main/resources/cod.png create mode 100644 src/main/resources/drowned.png create mode 100644 src/main/resources/frog.png create mode 100644 src/main/resources/glowsquid.png create mode 100644 src/main/resources/hoglin.png create mode 100644 src/main/resources/illusioner.png create mode 100644 src/main/resources/panda.png create mode 100644 src/main/resources/parrot.png create mode 100644 src/main/resources/phantom.png create mode 100644 src/main/resources/piglin.png create mode 100644 src/main/resources/pillager.png create mode 100644 src/main/resources/pufferfish.png create mode 100644 src/main/resources/ravager.png create mode 100644 src/main/resources/salmon.png create mode 100644 src/main/resources/sniffer.png create mode 100644 src/main/resources/strider.png create mode 100644 src/main/resources/tadpole.png create mode 100644 src/main/resources/traderllama.png create mode 100644 src/main/resources/tropicalfish.png create mode 100644 src/main/resources/vanilladolphin.png create mode 100644 src/main/resources/vanillafox.png create mode 100644 src/main/resources/vanillagoat.png create mode 100644 src/main/resources/vanillaturtle.png create mode 100644 src/main/resources/wandering_trader.png create mode 100644 src/main/resources/warden.png create mode 100644 src/main/resources/zoglin.png diff --git a/README b/README index e69de29..d629391 100644 --- a/README +++ b/README @@ -0,0 +1,5 @@ +Dynmap-mobs for 1.18+ + +HOW TO COMPILE: +use Maven to package with mvn package + diff --git a/pom.xml b/pom.xml index f277758..e47371d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,8 +28,8 @@ maven-compiler-plugin 2.0.2 - 1.6 - 1.6 + 1.8 + 1.8 @@ -42,7 +42,7 @@ bukkit-repo - http://hub.spigotmc.org/nexus/content/groups/public/ + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -50,24 +50,31 @@ dynmap-repo - http://repo.mikeprimm.com/ + https://repo.mikeprimm.com/ - org.bukkit - bukkit - 1.11-R0.1-SNAPSHOT + org.spigotmc + spigot-api + 1.18.2-R0.1-SNAPSHOT + + + org.bstats + bstats-bukkit + 3.0.0 + compile + us.dynmap dynmap-api - 2.2-SNAPSHOT + 3.4-SNAPSHOT UTF-8 - 1.4 - \ No newline at end of file + 1.7 + diff --git a/src/main/assembly/package.xml b/src/main/assembly/package.xml index b46e0f3..6cf6f13 100644 --- a/src/main/assembly/package.xml +++ b/src/main/assembly/package.xml @@ -1,4 +1,5 @@ - + bin false diff --git a/src/main/java/org/dynmap/mobs/DynmapMobsPlugin.java b/src/main/java/org/dynmap/mobs/DynmapMobsPlugin.java index 2081a4c..0ee5657 100644 --- a/src/main/java/org/dynmap/mobs/DynmapMobsPlugin.java +++ b/src/main/java/org/dynmap/mobs/DynmapMobsPlugin.java @@ -1,48 +1,28 @@ package org.dynmap.mobs; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.OfflinePlayer; -import org.bukkit.Server; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.configuration.file.FileConfiguration; -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.Skeleton; -import org.bukkit.entity.Horse.Variant; -import org.bukkit.entity.Skeleton.SkeletonType; -import org.bukkit.entity.Villager; +import org.bukkit.entity.*; import org.bukkit.entity.Villager.Profession; -import org.bukkit.entity.Wolf; -import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.server.PluginEnableEvent; -import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; import org.dynmap.DynmapAPI; +import org.dynmap.markers.Marker; import org.dynmap.markers.MarkerAPI; import org.dynmap.markers.MarkerIcon; import org.dynmap.markers.MarkerSet; -import org.dynmap.markers.Marker; + +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.util.*; +import java.util.logging.Level; +import java.util.logging.Logger; public class DynmapMobsPlugin extends JavaPlugin { private static Logger log; @@ -50,7 +30,9 @@ public class DynmapMobsPlugin extends JavaPlugin { DynmapAPI api; MarkerAPI markerapi; FileConfiguration cfg; - MarkerSet set; + MarkerSet mset; + MarkerSet hset; + MarkerSet pset; MarkerSet vset; double res; /* Position resolution */ long updperiod; @@ -72,7 +54,9 @@ public class DynmapMobsPlugin extends JavaPlugin { int updates_per_tick = 20; int vupdates_per_tick = 20; - HashMap lookup_cache = new HashMap(); + HashMap mlookup_cache = new HashMap(); + HashMap hlookup_cache = new HashMap(); + HashMap plookup_cache = new HashMap(); HashMap vlookup_cache = new HashMap(); @Override @@ -126,97 +110,143 @@ public void init() { } } }; - MobMapping mobs[]; - - private MobMapping configmobs[] = { - // Mo'Creatures - new MobMapping("horse", "org.bukkit.entity.Animals", "Horse", "net.minecraft.server.MoCEntityHorse"), - new MobMapping("fireogre", "org.bukkit.entity.Monster", "Fire Ogre", "net.minecraft.server.MoCEntityFireOgre"), - new MobMapping("caveogre", "org.bukkit.entity.Monster", "Cave Ogre", "net.minecraft.server.MoCEntityCaveOgre"), - new MobMapping("ogre", "org.bukkit.entity.Monster", "Ogre", "net.minecraft.server.MoCEntityOgre"), - new MobMapping("boar", "org.bukkit.entity.Pig", "Boar", "net.minecraft.server.MoCEntityBoar"), - new MobMapping("polarbear", "org.bukkit.entity.Animals", "Polar Bear", "net.minecraft.server.MoCEntityPolarBear"), - new MobMapping("bear", "org.bukkit.entity.Animals", "Bear", "net.minecraft.server.MoCEntityBear"), - new MobMapping("duck", "org.bukkit.entity.Chicken", "Duck", "net.minecraft.server.MoCEntityDuck"), - new MobMapping("bigcat", "org.bukkit.entity.Animals", "Big Cat", "net.minecraft.server.MoCEntityBigCat"), - new MobMapping("deer", "org.bukkit.entity.Animals", "Deer", "net.minecraft.server.MoCEntityDeer"), - new MobMapping("wildwolf", "org.bukkit.entity.Monster", "Wild Wolf", "net.minecraft.server.MoCEntityWWolf"), - new MobMapping("flamewraith", "org.bukkit.entity.Monster", "Wraith", "net.minecraft.server.MoCEntityFlameWraith"), - new MobMapping("wraith", "org.bukkit.entity.Monster", "Wraith", "net.minecraft.server.MoCEntityWraith"), - new MobMapping("bunny", "org.bukkit.entity.Animals", "Bunny", "net.minecraft.server.MoCEntityBunny"), - new MobMapping("bird", "org.bukkit.entity.Animals", "Bird", "net.minecraft.server.MoCEntityBird"), - new MobMapping("fox", "org.bukkit.entity.Animals", "Bird", "net.minecraft.server.MoCEntityFox"), - new MobMapping("werewolf", "org.bukkit.entity.Monster", "Werewolf", "net.minecraft.server.MoCEntityWerewolf"), - new MobMapping("shark", "org.bukkit.entity.WaterMob", "Shark", "net.minecraft.server.MoCEntityShark"), - new MobMapping("dolphin", "org.bukkit.entity.WaterMob", "Shark", "net.minecraft.server.MoCEntityDolphin"), - new MobMapping("fishy", "org.bukkit.entity.WaterMob", "Fishy", "net.minecraft.server.MoCEntityFishy"), - new MobMapping("kitty", "org.bukkit.entity.Animals", "Kitty", "net.minecraft.server.MoCEntityKitty"), - new MobMapping("hellrat", "org.bukkit.entity.Monster", "Hell Rat", "net.minecraft.server.MoCEntityHellRat"), - new MobMapping("rat", "org.bukkit.entity.Monster", "Rat", "net.minecraft.server.MoCEntityRat"), - new MobMapping("mouse", "org.bukkit.entity.Animals", "Mouse", "net.minecraft.server.MoCEntityMouse"), - new MobMapping("scorpion", "org.bukkit.entity.Monster", "Scorpion", "net.minecraft.server.MoCEntityScorpion"), - new MobMapping("turtle", "org.bukkit.entity.Animals", "Turtle", "net.minecraft.server.MoCEntityTurtle"), - new MobMapping("crocodile", "org.bukkit.entity.Animals", "Crocodile", "net.minecraft.server.MoCEntityCrocodile"), - new MobMapping("ray", "org.bukkit.entity.WaterMob", "Ray", "net.minecraft.server.MoCEntityRay"), - new MobMapping("jellyfish", "org.bukkit.entity.WaterMob", "Jelly Fish", "net.minecraft.server.MoCEntityJellyFish"), - new MobMapping("goat", "org.bukkit.entity.Animals", "Goat", "net.minecraft.server.MoCEntityGoat"), - new MobMapping("snake", "org.bukkit.entity.Animals", "Snake", "net.minecraft.server.MoCEntitySnake"), - new MobMapping("ostrich", "org.bukkit.entity.Animals", "Ostrich", "net.minecraft.server.MoCEntityOstrich"), - // Standard hostile - new MobMapping("elderguardian", "org.bukkit.entity.ElderGuardian", "Elder Guardian"), - new MobMapping("witherskeleton", "org.bukkit.entity.WitherSkeleton", "Wither Skeleton"), - new MobMapping("stray", "org.bukkit.entity.Stray", "Stray"), - new MobMapping("husk", "org.bukkit.entity.Husk", "Husk"), - new MobMapping("zombievillager", "org.bukkit.entity.ZombieVillager", "Zombie Villager"), - new MobMapping("evoker", "org.bukkit.entity.Evoker", "Evoker"), - new MobMapping("vex", "org.bukkit.entity.Vex", "Vex"), - new MobMapping("vindicator", "org.bukkit.entity.Vindicator", "Vindicator"), - new MobMapping("creeper", "org.bukkit.entity.Creeper", "Creeper"), - new MobMapping("skeleton", "org.bukkit.entity.Skeleton", "Skeleton"), - new MobMapping("giant", "org.bukkit.entity.Giant", "Giant"), - new MobMapping("ghast", "org.bukkit.entity.Ghast", "Ghast"), - new MobMapping("zombiepigman", "org.bukkit.entity.PigZombie", "Zombie Pigman"), - new MobMapping("zombie", "org.bukkit.entity.Zombie", "Zombie"), /* Must be last zombie type */ - new MobMapping("enderman", "org.bukkit.entity.Enderman", "Enderman"), - new MobMapping("cavespider", "org.bukkit.entity.CaveSpider", "Cave Spider"), - new MobMapping("spider", "org.bukkit.entity.Spider", "Spider"), /* Must be last spider type */ - new MobMapping("spiderjockey", "org.bukkit.entity.Spider", "Spider Jockey"), /* Must be just after spider */ - new MobMapping("silverfish", "org.bukkit.entity.Silverfish", "Silverfish"), - new MobMapping("blaze", "org.bukkit.entity.Blaze", "Blaze"), - new MobMapping("magmacube", "org.bukkit.entity.MagmaCube", "Magma Cube"), - new MobMapping("slime", "org.bukkit.entity.Slime", "Slime"), /* Must be last slime type */ - new MobMapping("enderdragon", "org.bukkit.entity.EnderDragon", "Ender Dragon"), - new MobMapping("wither", "org.bukkit.entity.Wither", "Wither"), - new MobMapping("witch", "org.bukkit.entity.Witch", "Witch"), - new MobMapping("endermite", "org.bukkit.entity.Endermite", "Endermite"), - new MobMapping("guardian", "org.bukkit.entity.Guardian", "Guardian"), - new MobMapping("shulker", "org.bukkit.entity.Shulker", "Shulker"), - // Standard passive - new MobMapping("skeletonhorse", "org.bukkit.entity.SkeletonHorse", "Skeleton Horse"), - new MobMapping("zombiehorse", "org.bukkit.entity.ZombieHorse", "Zombie Horse"), - new MobMapping("donkey", "org.bukkit.entity.Donkey", "Donkey"), - new MobMapping("mule", "org.bukkit.entity.Mule", "Mule"), - new MobMapping("bat", "org.bukkit.entity.Bat", "Bat"), - new MobMapping("pig", "org.bukkit.entity.Pig", "Pig"), - new MobMapping("sheep", "org.bukkit.entity.Sheep", "Sheep"), - new MobMapping("cow", "org.bukkit.entity.Cow", "Cow"), - new MobMapping("chicken", "org.bukkit.entity.Chicken", "Chicken"), - new MobMapping("chickenjockey", "org.bukkit.entity.Chicken", "Chicken Jockey"), /* Must be just after chicken */ - new MobMapping("squid", "org.bukkit.entity.Squid", "Squid"), - new MobMapping("wolf", "org.bukkit.entity.Wolf", "Wolf"), - new MobMapping("tamedwolf", "org.bukkit.entity.Wolf", "Wolf"), /* Must be just after wolf */ - new MobMapping("mooshroom", "org.bukkit.entity.MushroomCow", "Mooshroom"), - new MobMapping("snowgolem", "org.bukkit.entity.Snowman", "Snow Golem"), - new MobMapping("ocelot", "org.bukkit.entity.Ocelot", "Ocelot"), - new MobMapping("cat", "org.bukkit.entity.Ocelot", "Cat"), /* Must be just after ocelot */ - new MobMapping("golem", "org.bukkit.entity.IronGolem", "Iron Golem"), - new MobMapping("vanillahorse", "org.bukkit.entity.Horse", "Horse"), - new MobMapping("rabbit", "org.bukkit.entity.Rabbit", "Rabbit"), - new MobMapping("vanillapolarbear", "org.bukkit.entity.PolarBear", "Polar Bear"), - new MobMapping("llama", "org.bukkit.entity.Llama", "Llama"), - new MobMapping("villager", "org.bukkit.entity.Villager", "Villager") + + MobMapping mocreat_mobs[]; + MobMapping hostile_mobs[]; + MobMapping passive_mobs[]; + MobMapping vehicles[]; + + private Map mocreat_mobicons = new HashMap(); + private Map hostile_mobicons = new HashMap(); + private Map passive_mobicons = new HashMap(); + private Map vehicleicons = new HashMap(); + + private MobMapping config_mocreat_mobs[] = { + // Mo'Creatures + new MobMapping("horse", "org.bukkit.entity.Animals", "Horse", "net.minecraft.server.MoCEntityHorse"), + new MobMapping("fireogre", "org.bukkit.entity.Monster", "Fire Ogre", "net.minecraft.server.MoCEntityFireOgre"), + new MobMapping("caveogre", "org.bukkit.entity.Monster", "Cave Ogre", "net.minecraft.server.MoCEntityCaveOgre"), + new MobMapping("ogre", "org.bukkit.entity.Monster", "Ogre", "net.minecraft.server.MoCEntityOgre"), + new MobMapping("boar", "org.bukkit.entity.Pig", "Boar", "net.minecraft.server.MoCEntityBoar"), + new MobMapping("polarbear", "org.bukkit.entity.Animals", "Polar Bear", "net.minecraft.server.MoCEntityPolarBear"), + new MobMapping("bear", "org.bukkit.entity.Animals", "Bear", "net.minecraft.server.MoCEntityBear"), + new MobMapping("duck", "org.bukkit.entity.Chicken", "Duck", "net.minecraft.server.MoCEntityDuck"), + new MobMapping("bigcat", "org.bukkit.entity.Animals", "Big Cat", "net.minecraft.server.MoCEntityBigCat"), + new MobMapping("deer", "org.bukkit.entity.Animals", "Deer", "net.minecraft.server.MoCEntityDeer"), + new MobMapping("wildwolf", "org.bukkit.entity.Monster", "Wild Wolf", "net.minecraft.server.MoCEntityWWolf"), + new MobMapping("flamewraith", "org.bukkit.entity.Monster", "Flame Wraith", "net.minecraft.server.MoCEntityFlameWraith"), + new MobMapping("wraith", "org.bukkit.entity.Monster", "Wraith", "net.minecraft.server.MoCEntityWraith"), + new MobMapping("bunny", "org.bukkit.entity.Animals", "Bunny", "net.minecraft.server.MoCEntityBunny"), + new MobMapping("bird", "org.bukkit.entity.Animals", "Bird", "net.minecraft.server.MoCEntityBird"), + new MobMapping("fox", "org.bukkit.entity.Animals", "Fox", "net.minecraft.server.MoCEntityFox"), + new MobMapping("werewolf", "org.bukkit.entity.Monster", "Werewolf", "net.minecraft.server.MoCEntityWerewolf"), + new MobMapping("shark", "org.bukkit.entity.WaterMob", "Shark", "net.minecraft.server.MoCEntityShark"), + new MobMapping("dolphin", "org.bukkit.entity.WaterMob", "Shark", "net.minecraft.server.MoCEntityDolphin"), + new MobMapping("fishy", "org.bukkit.entity.WaterMob", "Fishy", "net.minecraft.server.MoCEntityFishy"), + new MobMapping("kitty", "org.bukkit.entity.Animals", "Kitty", "net.minecraft.server.MoCEntityKitty"), + new MobMapping("hellrat", "org.bukkit.entity.Monster", "Hell Rat", "net.minecraft.server.MoCEntityHellRat"), + new MobMapping("rat", "org.bukkit.entity.Monster", "Rat", "net.minecraft.server.MoCEntityRat"), + new MobMapping("mouse", "org.bukkit.entity.Animals", "Mouse", "net.minecraft.server.MoCEntityMouse"), + new MobMapping("scorpion", "org.bukkit.entity.Monster", "Scorpion", "net.minecraft.server.MoCEntityScorpion"), + new MobMapping("turtle", "org.bukkit.entity.Animals", "Turtle", "net.minecraft.server.MoCEntityTurtle"), + new MobMapping("crocodile", "org.bukkit.entity.Animals", "Crocodile", "net.minecraft.server.MoCEntityCrocodile"), + new MobMapping("ray", "org.bukkit.entity.WaterMob", "Ray", "net.minecraft.server.MoCEntityRay"), + new MobMapping("jellyfish", "org.bukkit.entity.WaterMob", "Jelly Fish", "net.minecraft.server.MoCEntityJellyFish"), + new MobMapping("goat", "org.bukkit.entity.Animals", "Goat", "net.minecraft.server.MoCEntityGoat"), + new MobMapping("snake", "org.bukkit.entity.Animals", "Snake", "net.minecraft.server.MoCEntitySnake"), + new MobMapping("ostrich", "org.bukkit.entity.Animals", "Ostrich", "net.minecraft.server.MoCEntityOstrich") + }; + + private MobMapping config_hostile_mobs[] = { + // Standard hostile + new MobMapping("elderguardian", "org.bukkit.entity.ElderGuardian", "Elder Guardian"), + new MobMapping("witherskeleton", "org.bukkit.entity.WitherSkeleton", "Wither Skeleton"), + new MobMapping("stray", "org.bukkit.entity.Stray", "Stray"), + new MobMapping("husk", "org.bukkit.entity.Husk", "Husk"), + new MobMapping("zombievillager", "org.bukkit.entity.ZombieVillager", "Zombie Villager"), + new MobMapping("evoker", "org.bukkit.entity.Evoker", "Evoker"), + new MobMapping("vex", "org.bukkit.entity.Vex", "Vex"), + new MobMapping("vindicator", "org.bukkit.entity.Vindicator", "Vindicator"), + new MobMapping("creeper", "org.bukkit.entity.Creeper", "Creeper"), + new MobMapping("skeleton", "org.bukkit.entity.Skeleton", "Skeleton"), + new MobMapping("giant", "org.bukkit.entity.Giant", "Giant"), + new MobMapping("ghast", "org.bukkit.entity.Ghast", "Ghast"), + new MobMapping("drowned", "org.bukkit.entity.Drowned", "Drowned"), + new MobMapping("phantom", "org.bukkit.entity.Phantom", "Phantom"), + new MobMapping("zombiepigman", "org.bukkit.entity.PigZombie", "Zombified Piglin"), + new MobMapping("zombie", "org.bukkit.entity.Zombie", "Zombie"), /* Must be last zombie type */ + new MobMapping("enderman", "org.bukkit.entity.Enderman", "Enderman"), + new MobMapping("cavespider", "org.bukkit.entity.CaveSpider", "Cave Spider"), + new MobMapping("spider", "org.bukkit.entity.Spider", "Spider"), /* Must be last spider type */ + new MobMapping("spiderjockey", "org.bukkit.entity.Spider", "Spider Jockey"), /* Must be just after spider */ + new MobMapping("silverfish", "org.bukkit.entity.Silverfish", "Silverfish"), + new MobMapping("blaze", "org.bukkit.entity.Blaze", "Blaze"), + new MobMapping("magmacube", "org.bukkit.entity.MagmaCube", "Magma Cube"), + new MobMapping("slime", "org.bukkit.entity.Slime", "Slime"), /* Must be last slime type */ + new MobMapping("enderdragon", "org.bukkit.entity.EnderDragon", "Ender Dragon"), + new MobMapping("wither", "org.bukkit.entity.Wither", "Wither"), + new MobMapping("witch", "org.bukkit.entity.Witch", "Witch"), + new MobMapping("endermite", "org.bukkit.entity.Endermite", "Endermite"), + new MobMapping("guardian", "org.bukkit.entity.Guardian", "Guardian"), + new MobMapping("shulker", "org.bukkit.entity.Shulker", "Shulker"), + new MobMapping("ravager", "org.bukkit.entity.Ravager", "Ravager"), + new MobMapping("illusioner", "org.bukkit.entity.Illusioner", "Illusioner"), + new MobMapping("pillager", "org.bukkit.entity.Pillager", "Pillager"), + new MobMapping("piglin", "org.bukkit.entity.Piglin", "Piglin"), + new MobMapping("hoglin", "org.bukkit.entity.Hoglin", "Hoglin"), + new MobMapping("zoglin", "org.bukkit.entity.Zoglin", "Zoglin"), + new MobMapping("warden", "org.bukkit.entity.Warden", "Warden") + }; + + private MobMapping config_passive_mobs[] = { + // Standard passive + new MobMapping("skeletonhorse", "org.bukkit.entity.SkeletonHorse", "Skeleton Horse"), + new MobMapping("zombiehorse", "org.bukkit.entity.ZombieHorse", "Zombie Horse"), + new MobMapping("donkey", "org.bukkit.entity.Donkey", "Donkey"), + new MobMapping("mule", "org.bukkit.entity.Mule", "Mule"), + new MobMapping("bat", "org.bukkit.entity.Bat", "Bat"), + new MobMapping("pig", "org.bukkit.entity.Pig", "Pig"), + new MobMapping("sheep", "org.bukkit.entity.Sheep", "Sheep"), + new MobMapping("cow", "org.bukkit.entity.Cow", "Cow"), + new MobMapping("chicken", "org.bukkit.entity.Chicken", "Chicken"), + new MobMapping("chickenjockey", "org.bukkit.entity.Chicken", "Chicken Jockey"), /* Must be just after chicken */ + new MobMapping("squid", "org.bukkit.entity.Squid", "Squid"), + new MobMapping("wolf", "org.bukkit.entity.Wolf", "Wolf"), + new MobMapping("tamedwolf", "org.bukkit.entity.Wolf", "Wolf"), /* Must be just after wolf */ + new MobMapping("mooshroom", "org.bukkit.entity.MushroomCow", "Mooshroom"), + new MobMapping("snowgolem", "org.bukkit.entity.Snowman", "Snow Golem"), + new MobMapping("ocelot", "org.bukkit.entity.Ocelot", "Ocelot"), + new MobMapping("cat", "org.bukkit.entity.Cat", "Cat"), + new MobMapping("golem", "org.bukkit.entity.IronGolem", "Iron Golem"), + new MobMapping("vanillahorse", "org.bukkit.entity.Horse", "Horse"), + new MobMapping("rabbit", "org.bukkit.entity.Rabbit", "Rabbit"), + new MobMapping("vanillapolarbear", "org.bukkit.entity.PolarBear", "Polar Bear"), + new MobMapping("llama", "org.bukkit.entity.Llama", "Llama"), + new MobMapping("traderllama", "org.bukkit.entity.TraderLlama", "Trader Llama"), + new MobMapping("wandering_trader", "org.bukkit.entity.WanderingTrader", "Wandering Trader"), + new MobMapping("villager", "org.bukkit.entity.Villager", "Villager"), + new MobMapping("vanilladolphin", "org.bukkit.entity.Dolphin", "Dolphin"), + new MobMapping("cod", "org.bukkit.entity.Cod", "Cod"), + new MobMapping("salmon", "org.bukkit.entity.Salmon", "Salmon"), + new MobMapping("pufferfish", "org.bukkit.entity.PufferFish", "Pufferfish"), + new MobMapping("tropicalfish", "org.bukkit.entity.TropicalFish", "Tropical Fish"), + new MobMapping("vanillaturtle", "org.bukkit.entity.Turtle", "Turtle"), + new MobMapping("parrot", "org.bukkit.entity.Parrot", "Parrot"), + new MobMapping("panda", "org.bukkit.entity.Panda", "Panda"), + new MobMapping("vanillafox", "org.bukkit.entity.Fox", "Fox" ), + new MobMapping("bee", "org.bukkit.entity.Bee", "Bee" ), + new MobMapping("strider", "org.bukkit.entity.Strider", "Strider"), + new MobMapping("glowsquid", "org.bukkit.entity.GlowSquid", "Glow Squid"), + new MobMapping("vanillagoat", "org.bukkit.entity.Goat", "Goat"), + new MobMapping("axolotl", "org.bukkit.entity.Axolotl", "Axolotl"), + new MobMapping("camel", "org.bukkit.entity.Camel", "Camel"), + new MobMapping("frog", "org.bukkit.entity.Frog", "Frog"), + new MobMapping("tadpole", "org.bukkit.entity.Tadpole", "Tadpole"), + new MobMapping("allay", "org.bukkit.entity.Allay", "Allay"), + new MobMapping("sniffer", "org.bukkit.entity.Sniffer", Sniffer") }; - private MobMapping configvehicles[] = { + + private MobMapping config_vehicles[] = { // Command Minecart new MobMapping("command-minecart", "org.bukkit.entity.minecart.CommandMinecart", "Command Minecart"), // Explosive Minecart @@ -232,10 +262,11 @@ public void init() { // Storage Minecart new MobMapping("storage-minecart", "org.bukkit.entity.minecart.StorageMinecart", "Storage Minecart"), // Boat - new MobMapping("boat", "org.bukkit.entity.Boat", "Boat") + new MobMapping("boat", "org.bukkit.entity.Boat", "Boat"), + //Boat Chest + new MobMapping("chest-boat", "org.bukkit.entity.ChestBoat", "Boat with Chest") }; - MobMapping vehicles[]; - + public static void info(String msg) { log.log(Level.INFO, msg); } @@ -243,7 +274,7 @@ public static void severe(String msg) { log.log(Level.SEVERE, msg); } - private class MobUpdate implements Runnable { + private class MoCreatMobUpdate implements Runnable { Map newmap = new HashMap(); /* Build new map */ ArrayList worldsToDo = null; List mobsToDo = null; @@ -251,7 +282,7 @@ private class MobUpdate implements Runnable { World curWorld = null; public void run() { - if(stop || (mobs == null) || (mobs.length == 0) || (set == null)) { + if(stop || mocreat_mobs == null || mocreat_mobs.length == 0 || mset == null ) { return; } // If needed, prime world list @@ -261,13 +292,13 @@ public void run() { while (mobsToDo == null) { if (worldsToDo.isEmpty()) { // Now, review old map - anything left is gone - for(Marker oldm : mobicons.values()) { + for(Marker oldm : mocreat_mobicons.values()) { oldm.deleteMarker(); } // And replace with new map - mobicons = newmap; + mocreat_mobicons = newmap; // Schedule next run - getServer().getScheduler().scheduleSyncDelayedTask(DynmapMobsPlugin.this, new MobUpdate(), updperiod); + getServer().getScheduler().scheduleSyncDelayedTask(DynmapMobsPlugin.this, new MoCreatMobUpdate(), updperiod); return; } else { @@ -302,11 +333,11 @@ public void run() { if(clsid == null) clsid = le.getClass().getName(); - Integer idx = lookup_cache.get(clsid); + Integer idx = mlookup_cache.get(clsid); if(idx == null) { - for(i = 0; i < mobs.length; i++) { - if((mobs[i].mobclass != null) && mobs[i].mobclass.isInstance(le)){ - if (mobs[i].entclsid == null) { + for(i = 0; i < mocreat_mobs.length; i++) { + if((mocreat_mobs[i].mobclass != null) && mocreat_mobs[i].mobclass.isInstance(le)){ + if (mocreat_mobs[i].entclsid == null) { break; } else if(gethandle != null) { @@ -315,79 +346,434 @@ else if(gethandle != null) { obcentity = gethandle.invoke(le); } catch (Exception x) { } - if ((mobs[i].entclass != null) && (obcentity != null) && (mobs[i].entclass.isInstance(obcentity))) { + if ((mocreat_mobs[i].entclass != null) && (obcentity != null) && (mocreat_mobs[i].entclass.isInstance(obcentity))) { break; } } } } - lookup_cache.put(clsid, i); + mlookup_cache.put(clsid, i); } else { i = idx; } - if(i >= mobs.length) { + if(i >= mocreat_mobs.length) { continue; } String label = null; - if(mobs[i].mobid.equals("spider")) { /* Check for jockey */ + + if(i >= mocreat_mobs.length) { + continue; + } + if(label == null) { + label = mocreat_mobs[i].label; + } + + if (le.getCustomName() != null) { + label = le.getCustomName() + " (" + label + ")"; + } + + Location loc = le.getLocation(); + Block blk = null; + if(hideifshadow < 15) { + blk = loc.getBlock(); + if(blk.getLightLevel() <= hideifshadow) { + continue; + } + } + if(hideifundercover < 15) { + if(blk == null) blk = loc.getBlock(); + if(blk.getLightFromSky() <= hideifundercover) { + continue; + } + } + /* See if we already have marker */ + double x = Math.round(loc.getX() / res) * res; + double y = Math.round(loc.getY() / res) * res; + double z = Math.round(loc.getZ() / res) * res; + Marker m = mocreat_mobicons.remove(le.getEntityId()); + if(nolabels) { + label = ""; + } + else if(inc_coord) { + label = label + " [" + (int)x + "," + (int)y + "," + (int)z + "]"; + } + if(m == null) { /* Not found? Need new one */ + m = mset.createMarker("mocreat_mob"+le.getEntityId(), label, curWorld.getName(), x, y, z, mocreat_mobs[i].icon, false); + } + else { /* Else, update position if needed */ + m.setLocation(curWorld.getName(), x, y, z); + m.setLabel(label); + m.setMarkerIcon(mocreat_mobs[i].icon); + } + if (m != null) { + newmap.put(le.getEntityId(), m); /* Add to new map */ + } + } + getServer().getScheduler().scheduleSyncDelayedTask(DynmapMobsPlugin.this, this, 1); + } + } + + private class HostileMobUpdate implements Runnable { + Map newmap = new HashMap(); /* Build new map */ + ArrayList worldsToDo = null; + List mobsToDo = null; + int mobIndex = 0; + World curWorld = null; + + public void run() { + if(stop || hostile_mobs == null || hostile_mobs.length == 0 || hset == null ) { + return; + } + // If needed, prime world list + if (worldsToDo == null) { + worldsToDo = new ArrayList(getServer().getWorlds()); + } + while (mobsToDo == null) { + if (worldsToDo.isEmpty()) { + // Now, review old map - anything left is gone + for(Marker oldm : hostile_mobicons.values()) { + oldm.deleteMarker(); + } + // And replace with new map + hostile_mobicons = newmap; + // Schedule next run + getServer().getScheduler().scheduleSyncDelayedTask(DynmapMobsPlugin.this, new HostileMobUpdate(), updperiod); + return; + } + else { + curWorld = worldsToDo.remove(0); // Get next world + mobsToDo = curWorld.getLivingEntities(); // Get living entities + mobIndex = 0; + if ((mobsToDo != null) && mobsToDo.isEmpty()) { + mobsToDo = null; + } + } + } + // Process up to limit per tick + for (int cnt = 0; cnt < updates_per_tick; cnt++) { + if (mobIndex >= mobsToDo.size()) { + mobsToDo = null; + break; + } + // Get next entity + LivingEntity le = mobsToDo.get(mobIndex); + mobIndex++; + + int i; + + /* See if entity is mob we care about */ + String clsid = null; + if(gethandle != null) { + try { + clsid = gethandle.invoke(le).getClass().getName(); + } catch (Exception x) { + } + } + + if(clsid == null) + clsid = le.getClass().getName(); + Integer idx = hlookup_cache.get(clsid); + if(idx == null) { + for(i = 0; i < hostile_mobs.length; i++) { + if((hostile_mobs[i].mobclass != null) && hostile_mobs[i].mobclass.isInstance(le)){ + if (hostile_mobs[i].entclsid == null) { + break; + } + else if(gethandle != null) { + Object obcentity = null; + try { + obcentity = gethandle.invoke(le); + } catch (Exception x) { + } + if ((hostile_mobs[i].entclass != null) && (obcentity != null) && (hostile_mobs[i].entclass.isInstance(obcentity))) { + break; + } + } + } + } + hlookup_cache.put(clsid, i); + } + else { + i = idx; + } + if(i >= hostile_mobs.length) { + continue; + } + + String label = null; + if(hostile_mobs[i].mobid.equals("spider")) { /* Check for jockey */ if(le.getPassenger() != null) { /* Has passenger? */ - i = findNext(i, "spiderjockey"); /* Make jockey */ + i = findNext(i, "spiderjockey", hostile_mobs); /* Make jockey */ + } + } + + if(i >= hostile_mobs.length) { + continue; + } + if(label == null) { + label = hostile_mobs[i].label; + } + + if (le.getCustomName() != null) { + label = le.getCustomName() + " (" + label + ")"; + } + + Location loc = le.getLocation(); + Block blk = null; + if(hideifshadow < 15) { + blk = loc.getBlock(); + if(blk.getLightLevel() <= hideifshadow) { + continue; + } + } + if(hideifundercover < 15) { + if(blk == null) blk = loc.getBlock(); + if(blk.getLightFromSky() <= hideifundercover) { + continue; } } - else if(mobs[i].mobid.equals("chicken")) { /* Check for jockey */ + /* See if we already have marker */ + double x = Math.round(loc.getX() / res) * res; + double y = Math.round(loc.getY() / res) * res; + double z = Math.round(loc.getZ() / res) * res; + Marker m = hostile_mobicons.remove(le.getEntityId()); + if(nolabels) { + label = ""; + } + else if(inc_coord) { + label = label + " [" + (int)x + "," + (int)y + "," + (int)z + "]"; + } + if(m == null) { /* Not found? Need new one */ + m = hset.createMarker("hostile_mob"+le.getEntityId(), label, curWorld.getName(), x, y, z, hostile_mobs[i].icon, false); + } + else { /* Else, update position if needed */ + m.setLocation(curWorld.getName(), x, y, z); + m.setLabel(label); + m.setMarkerIcon(hostile_mobs[i].icon); + } + if (m != null) { + newmap.put(le.getEntityId(), m); /* Add to new map */ + } + } + getServer().getScheduler().scheduleSyncDelayedTask(DynmapMobsPlugin.this, this, 1); + } + } + + private class PassiveMobUpdate implements Runnable { + Map newmap = new HashMap(); /* Build new map */ + ArrayList worldsToDo = null; + List mobsToDo = null; + int mobIndex = 0; + World curWorld = null; + + public void run() { + if(stop || passive_mobs == null || passive_mobs.length == 0 || pset == null ) { + return; + } + // If needed, prime world list + if (worldsToDo == null) { + worldsToDo = new ArrayList(getServer().getWorlds()); + } + while (mobsToDo == null) { + if (worldsToDo.isEmpty()) { + // Now, review old map - anything left is gone + for(Marker oldm : passive_mobicons.values()) { + oldm.deleteMarker(); + } + // And replace with new map + passive_mobicons = newmap; + // Schedule next run + getServer().getScheduler().scheduleSyncDelayedTask(DynmapMobsPlugin.this, new PassiveMobUpdate(), updperiod); + return; + } + else { + curWorld = worldsToDo.remove(0); // Get next world + mobsToDo = curWorld.getLivingEntities(); // Get living entities + mobIndex = 0; + if ((mobsToDo != null) && mobsToDo.isEmpty()) { + mobsToDo = null; + } + } + } + // Process up to limit per tick + for (int cnt = 0; cnt < updates_per_tick; cnt++) { + if (mobIndex >= mobsToDo.size()) { + mobsToDo = null; + break; + } + // Get next entity + LivingEntity le = mobsToDo.get(mobIndex); + mobIndex++; + + int i; + + /* See if entity is mob we care about */ + String clsid = null; + if(gethandle != null) { + try { + clsid = gethandle.invoke(le).getClass().getName(); + } catch (Exception x) { + } + } + + if(clsid == null) + clsid = le.getClass().getName(); + Integer idx = plookup_cache.get(clsid); + if(idx == null) { + for(i = 0; i < passive_mobs.length; i++) { + if((passive_mobs[i].mobclass != null) && passive_mobs[i].mobclass.isInstance(le)){ + if (passive_mobs[i].entclsid == null) { + break; + } + else if(gethandle != null) { + Object obcentity = null; + try { + obcentity = gethandle.invoke(le); + } catch (Exception x) { + } + if ((passive_mobs[i].entclass != null) && (obcentity != null) && (passive_mobs[i].entclass.isInstance(obcentity))) { + break; + } + } + } + } + plookup_cache.put(clsid, i); + } + else { + i = idx; + } + if(i >= passive_mobs.length) { + continue; + } + + String label = null; + if(passive_mobs[i].mobid.equals("chicken")) { /* Check for jockey */ if(le.getPassenger() != null) { /* Has passenger? */ - i = findNext(i, "chickenjockey"); /* Make jockey */ + i = findNext(i, "chickenjockey", passive_mobs); /* Make jockey , passive_mobs*/ } } - else if(mobs[i].mobid.equals("wolf")) { /* Check for tamed wolf */ + else if(passive_mobs[i].mobid.equals("wolf")) { /* Check for tamed wolf */ Wolf wolf = (Wolf)le; if(wolf.isTamed()) { - i = findNext(i, "tamedwolf"); + i = findNext(i, "tamedwolf", passive_mobs); AnimalTamer t = wolf.getOwner(); if((t != null) && (t instanceof OfflinePlayer)) { label = "Wolf (" + ((OfflinePlayer)t).getName() + ")"; } } } - else if(mobs[i].mobid.equals("ocelot")) { /* Check for tamed ocelot */ - Ocelot cat = (Ocelot)le; + else if(passive_mobs[i].mobid.equals("cat")) { /* Check for tamed cat */ + Cat cat = (Cat)le; if(cat.isTamed()) { - i = findNext(i, "cat"); + i = findNext(i, "cat", passive_mobs); AnimalTamer t = cat.getOwner(); if((t != null) && (t instanceof OfflinePlayer)) { label = "Cat (" + ((OfflinePlayer)t).getName() + ")"; } } } - else if(mobs[i].mobid.equals("villager")) { + else if(passive_mobs[i].mobid.equals("vanillahorse")) { /* Check for tamed horse */ + Horse horse = (Horse)le; + if(horse.isTamed()) { + i = findNext(i, "vanillahorse", passive_mobs); + AnimalTamer t = horse.getOwner(); + if((t != null) && (t instanceof OfflinePlayer)) { + label = "Horse (" + ((OfflinePlayer)t).getName() + ")"; + } + } + } + else if(passive_mobs[i].mobid.equals("traderllama")) { /* Check for tamed traderllama */ + TraderLlama traderllama = (TraderLlama)le; + if(traderllama.isTamed()) { + i = findNext(i, "traderllama", passive_mobs); + AnimalTamer t = traderllama.getOwner(); + if((t != null) && (t instanceof OfflinePlayer)) { + label = "TraderLlama (" + ((OfflinePlayer)t).getName() + ")"; + } + } + } + else if(passive_mobs[i].mobid.equals("llama")) { /* Check for tamed llama */ + Llama llama = (Llama)le; + if(llama.isTamed()) { + i = findNext(i, "llama", passive_mobs); + AnimalTamer t = llama.getOwner(); + if((t != null) && (t instanceof OfflinePlayer)) { + label = "Llama (" + ((OfflinePlayer)t).getName() + ")"; + } + } + } + else if(passive_mobs[i].mobid.equals("parrot")) { /* Check for tamed parrot */ + Parrot parrot = (Parrot)le; + if(parrot.isTamed()) { + i = findNext(i, "parrot", passive_mobs); + AnimalTamer t = parrot.getOwner(); + if((t != null) && (t instanceof OfflinePlayer)) { + label = "Parrot (" + ((OfflinePlayer)t).getName() + ")"; + } + } + } + else if(passive_mobs[i].mobid.equals("villager")) { Villager v = (Villager)le; Profession p = v.getProfession(); if(p != null) { switch(p) { - case BLACKSMITH: - label = "Blacksmith"; + case NONE: + label = "Villager"; + break; + case ARMORER: + label = "Armorer"; break; case BUTCHER: label = "Butcher"; break; + case CARTOGRAPHER: + label = "Cartographer"; + break; + case CLERIC: + label = "Cleric"; + break; case FARMER: label = "Farmer"; break; + case FISHERMAN: + label = "Fisherman"; + break; + case FLETCHER: + label = "Fletcher"; + break; + case LEATHERWORKER: + label = "Leatherworker"; + break; case LIBRARIAN: label = "Librarian"; break; + case MASON: + label = "Mason"; + break; case NITWIT: label = "Nitwit"; break; - case PRIEST: - label = "Priest"; + case SHEPHERD: + label = "Shepherd"; + break; + case TOOLSMITH: + label = "Toolsmith"; + break; + case WEAPONSMITH: + label = "Weaponsmith"; break; } } } - else if(mobs[i].mobid.equals("vanillahorse") || mobs[i].mobid.equals("donkey") || mobs[i].mobid.equals("mule") || mobs[i].mobid.equals("zombiehorse") || mobs[i].mobid.equals("skeletonhorse")) { /* Check for rider */ + else if(passive_mobs[i].mobid.equals("vanillahorse") + || passive_mobs[i].mobid.equals("llama") + || passive_mobs[i].mobid.equals("traderllama") + || passive_mobs[i].mobid.equals("donkey") + || passive_mobs[i].mobid.equals("mule") + || passive_mobs[i].mobid.equals("zombiehorse") + || passive_mobs[i].mobid.equals("skeletonhorse")) { /* Check for rider */ if(le.getPassenger() != null) { /* Has passenger? */ Entity e = le.getPassenger(); if (e instanceof Player) { @@ -395,12 +781,18 @@ else if(mobs[i].mobid.equals("vanillahorse") || mobs[i].mobid.equals("donkey") | } } } - if(i >= mobs.length) { + + if(i >= passive_mobs.length) { continue; } if(label == null) { - label = mobs[i].label; + label = passive_mobs[i].label; } + + if (le.getCustomName() != null) { + label = le.getCustomName() + " (" + label + ")"; + } + Location loc = le.getLocation(); Block blk = null; if(hideifshadow < 15) { @@ -419,7 +811,7 @@ else if(mobs[i].mobid.equals("vanillahorse") || mobs[i].mobid.equals("donkey") | double x = Math.round(loc.getX() / res) * res; double y = Math.round(loc.getY() / res) * res; double z = Math.round(loc.getZ() / res) * res; - Marker m = mobicons.remove(le.getEntityId()); + Marker m = passive_mobicons.remove(le.getEntityId()); if(nolabels) { label = ""; } @@ -427,12 +819,12 @@ else if(inc_coord) { label = label + " [" + (int)x + "," + (int)y + "," + (int)z + "]"; } if(m == null) { /* Not found? Need new one */ - m = set.createMarker("mob"+le.getEntityId(), label, curWorld.getName(), x, y, z, mobs[i].icon, false); + m = pset.createMarker("passive_mob"+le.getEntityId(), label, curWorld.getName(), x, y, z, passive_mobs[i].icon, false); } else { /* Else, update position if needed */ m.setLocation(curWorld.getName(), x, y, z); m.setLabel(label); - m.setMarkerIcon(mobs[i].icon); + m.setMarkerIcon(passive_mobs[i].icon); } if (m != null) { newmap.put(le.getEntityId(), m); /* Add to new map */ @@ -574,10 +966,9 @@ else if(vinc_coord) { } } - private Map mobicons = new HashMap(); - private Map vehicleicons = new HashMap(); - - private int findNext(int idx, String mobid) { + + + private int findNext(int idx, String mobid, MobMapping[] mobs) { idx++; if ((idx < mobs.length) && mobs[idx].mobid.equals(mobid)) { return idx; @@ -665,17 +1056,30 @@ private void activate() { /* Load configuration */ if(reload) { reloadConfig(); - if(set != null) { - set.deleteMarkerSet(); - set = null; + if(mset != null) { + mset.deleteMarkerSet(); + mset = null; + } + if(hset != null) { + hset.deleteMarkerSet(); + hset = null; + } + if(pset != null) { + pset.deleteMarkerSet(); + pset = null; } if(vset != null) { vset.deleteMarkerSet(); vset = null; } - mobicons.clear(); + mocreat_mobicons.clear(); + hostile_mobicons.clear(); + passive_mobicons.clear(); vehicleicons.clear(); - lookup_cache.clear(); + mlookup_cache.clear(); + hlookup_cache.clear(); + plookup_cache.clear(); + vlookup_cache.clear(); } else { reload = true; @@ -685,62 +1089,62 @@ private void activate() { cfg.options().copyDefaults(true); /* Load defaults, if needed */ this.saveConfig(); /* Save updates, if needed */ - /* Now, check which mobs are enabled */ + /* Now, check which mo'creatures mobs are enabled */ Set> clsset = new HashSet>(); int cnt = 0; - for(int i = 0; i < configmobs.length; i++) { - configmobs[i].init(); - configmobs[i].enabled = cfg.getBoolean("mobs." + configmobs[i].mobid, false); - configmobs[i].icon = markerapi.getMarkerIcon("mobs." + configmobs[i].mobid); + for(int i = 0; i < config_mocreat_mobs.length; i++) { + config_mocreat_mobs[i].init(); + config_mocreat_mobs[i].enabled = cfg.getBoolean("mocreat_mobs." + config_mocreat_mobs[i].mobid, false); + config_mocreat_mobs[i].icon = markerapi.getMarkerIcon("mocreat_mobs." + config_mocreat_mobs[i].mobid); InputStream in = null; if(tinyicons) - in = getClass().getResourceAsStream("/8x8/" + configmobs[i].mobid + ".png"); + in = getClass().getResourceAsStream("/8x8/" + config_mocreat_mobs[i].mobid + ".png"); if(in == null) - in = getClass().getResourceAsStream("/" + configmobs[i].mobid + ".png"); + in = getClass().getResourceAsStream("/" + config_mocreat_mobs[i].mobid + ".png"); if(in != null) { - if(configmobs[i].icon == null) - configmobs[i].icon = markerapi.createMarkerIcon("mobs." + configmobs[i].mobid, configmobs[i].label, in); + if(config_mocreat_mobs[i].icon == null) + config_mocreat_mobs[i].icon = markerapi.createMarkerIcon("mocreat_mobs." + config_mocreat_mobs[i].mobid, config_mocreat_mobs[i].label, in); else /* Update image */ - configmobs[i].icon.setMarkerIconImage(in); + config_mocreat_mobs[i].icon.setMarkerIconImage(in); } - if(configmobs[i].icon == null) { - configmobs[i].icon = markerapi.getMarkerIcon(MarkerIcon.DEFAULT); + if(config_mocreat_mobs[i].icon == null) { + config_mocreat_mobs[i].icon = markerapi.getMarkerIcon(MarkerIcon.DEFAULT); } - if(configmobs[i].enabled) { + if(config_mocreat_mobs[i].enabled) { cnt++; } } /* Make list of just enabled mobs */ - mobs = new MobMapping[cnt]; - for(int i = 0, j = 0; i < configmobs.length; i++) { - if(configmobs[i].enabled) { - mobs[j] = configmobs[i]; + mocreat_mobs = new MobMapping[cnt]; + for(int i = 0, j = 0; i < config_mocreat_mobs.length; i++) { + if(config_mocreat_mobs[i].enabled) { + mocreat_mobs[j] = config_mocreat_mobs[i]; j++; - clsset.add(configmobs[i].mobclass); + clsset.add(config_mocreat_mobs[i].mobclass); } } hideifshadow = cfg.getInt("update.hideifshadow", 15); hideifundercover = cfg.getInt("update.hideifundercover", 15); /* Now, add marker set for mobs (make it transient) */ - if(mobs.length > 0) { - set = markerapi.getMarkerSet("mobs.markerset"); - if(set == null) - set = markerapi.createMarkerSet("mobs.markerset", cfg.getString("layer.name", "Mobs"), null, false); + if(mocreat_mobs.length > 0) { + mset = markerapi.getMarkerSet("mocreat_mobs.markerset"); + if(mset == null) + mset = markerapi.createMarkerSet("mocreat_mobs.markerset", cfg.getString("mocreatlayer.name", "Mo'Creatures Mobs"), null, false); else - set.setMarkerSetLabel(cfg.getString("layer.name", "Mobs")); - if(set == null) { + mset.setMarkerSetLabel(cfg.getString("mocreatlayer.name", "Mo'Creatures Mobs")); + if(mset == null) { severe("Error creating marker set"); return; } - set.setLayerPriority(cfg.getInt("layer.layerprio", 10)); - set.setHideByDefault(cfg.getBoolean("layer.hidebydefault", false)); - int minzoom = cfg.getInt("layer.minzoom", 0); + mset.setLayerPriority(cfg.getInt("mocreatlayer.layerprio", 10)); + mset.setHideByDefault(cfg.getBoolean("mocreatlayer.hidebydefault", false)); + int minzoom = cfg.getInt("mocreatlayer.minzoom", 0); if(minzoom > 0) /* Don't call if non-default - lets us work with pre-0.28 dynmap */ - set.setMinZoom(minzoom); - tinyicons = cfg.getBoolean("layer.tinyicons", false); - nolabels = cfg.getBoolean("layer.nolabels", false); - inc_coord = cfg.getBoolean("layer.inc-coord", false); + mset.setMinZoom(minzoom); + tinyicons = cfg.getBoolean("mocreatlayer.tinyicons", false); + nolabels = cfg.getBoolean("mocreatlayer.nolabels", false); + inc_coord = cfg.getBoolean("mocreatlayer.inc-coord", false); /* Get position resolution */ res = cfg.getDouble("update.resolution", 1.0); /* Set up update job - based on period */ @@ -749,45 +1153,192 @@ private void activate() { updperiod = (long)(per*20.0); updates_per_tick = cfg.getInt("update.mobs-per-tick", 20); stop = false; - getServer().getScheduler().scheduleSyncDelayedTask(this, new MobUpdate(), updperiod); - info("Enable layer for mobs"); + getServer().getScheduler().scheduleSyncDelayedTask(this, new MoCreatMobUpdate(), updperiod); + info("Enable layer for mo'creatures mobs"); } else { - info("Layer for mobs disabled"); + info("Layer for mo'creatures mobs disabled"); } + + + /* Now, check which hostile mobs are enabled */ + clsset = new HashSet>(); + cnt = 0; + for(int i = 0; i < config_hostile_mobs.length; i++) { + config_hostile_mobs[i].init(); + config_hostile_mobs[i].enabled = cfg.getBoolean("hostile_mobs." + config_hostile_mobs[i].mobid, false); + config_hostile_mobs[i].icon = markerapi.getMarkerIcon("hostile_mobs." + config_hostile_mobs[i].mobid); + InputStream in = null; + if(tinyicons) + in = getClass().getResourceAsStream("/8x8/" + config_hostile_mobs[i].mobid + ".png"); + if(in == null) + in = getClass().getResourceAsStream("/" + config_hostile_mobs[i].mobid + ".png"); + if(in != null) { + if(config_hostile_mobs[i].icon == null) + config_hostile_mobs[i].icon = markerapi.createMarkerIcon("hostile_mobs." + config_hostile_mobs[i].mobid, config_hostile_mobs[i].label, in); + else /* Update image */ + config_hostile_mobs[i].icon.setMarkerIconImage(in); + } + if(config_hostile_mobs[i].icon == null) { + config_hostile_mobs[i].icon = markerapi.getMarkerIcon(MarkerIcon.DEFAULT); + } + if(config_hostile_mobs[i].enabled) { + cnt++; + } + } + /* Make list of just enabled mobs */ + hostile_mobs = new MobMapping[cnt]; + for(int i = 0, j = 0; i < config_hostile_mobs.length; i++) { + if(config_hostile_mobs[i].enabled) { + hostile_mobs[j] = config_hostile_mobs[i]; + j++; + clsset.add(config_hostile_mobs[i].mobclass); + } + } + + hideifshadow = cfg.getInt("update.hideifshadow", 15); + hideifundercover = cfg.getInt("update.hideifundercover", 15); + /* Now, add marker set for mobs (make it transient) */ + if(hostile_mobs.length > 0) { + hset = markerapi.getMarkerSet("hostile_mobs.markerset"); + if(hset == null) + hset = markerapi.createMarkerSet("hostile_mobs.markerset", cfg.getString("hostilelayer.name", "Mo'Creatures Mobs"), null, false); + else + hset.setMarkerSetLabel(cfg.getString("hostilelayer.name", "Mo'Creatures Mobs")); + if(hset == null) { + severe("Error creating marker set"); + return; + } + hset.setLayerPriority(cfg.getInt("hostilelayer.layerprio", 10)); + hset.setHideByDefault(cfg.getBoolean("hostilelayer.hidebydefault", false)); + int minzoom = cfg.getInt("hostilelayer.minzoom", 0); + if(minzoom > 0) /* Don't call if non-default - lets us work with pre-0.28 dynmap */ + hset.setMinZoom(minzoom); + tinyicons = cfg.getBoolean("hostilelayer.tinyicons", false); + nolabels = cfg.getBoolean("hostilelayer.nolabels", false); + inc_coord = cfg.getBoolean("hostilelayer.inc-coord", false); + /* Get position resolution */ + res = cfg.getDouble("update.resolution", 1.0); + /* Set up update job - based on period */ + double per = cfg.getDouble("update.period", 5.0); + if(per < 2.0) per = 2.0; + updperiod = (long)(per*20.0); + updates_per_tick = cfg.getInt("update.mobs-per-tick", 20); + stop = false; + getServer().getScheduler().scheduleSyncDelayedTask(this, new HostileMobUpdate(), updperiod); + info("Enable layer for hostile mobs"); + } + else { + info("Layer for hostile mobs disabled"); + } + + + + /* Now, check which passive mobs are enabled */ + clsset = new HashSet>(); + cnt = 0; + for(int i = 0; i < config_passive_mobs.length; i++) { + config_passive_mobs[i].init(); + config_passive_mobs[i].enabled = cfg.getBoolean("passive_mobs." + config_passive_mobs[i].mobid, false); + config_passive_mobs[i].icon = markerapi.getMarkerIcon("passive_mobs." + config_passive_mobs[i].mobid); + InputStream in = null; + if(tinyicons) + in = getClass().getResourceAsStream("/8x8/" + config_passive_mobs[i].mobid + ".png"); + if(in == null) + in = getClass().getResourceAsStream("/" + config_passive_mobs[i].mobid + ".png"); + if(in != null) { + if(config_passive_mobs[i].icon == null) + config_passive_mobs[i].icon = markerapi.createMarkerIcon("passive_mobs." + config_passive_mobs[i].mobid, config_passive_mobs[i].label, in); + else /* Update image */ + config_passive_mobs[i].icon.setMarkerIconImage(in); + } + if(config_passive_mobs[i].icon == null) { + config_passive_mobs[i].icon = markerapi.getMarkerIcon(MarkerIcon.DEFAULT); + } + if(config_passive_mobs[i].enabled) { + cnt++; + } + } + /* Make list of just enabled mobs */ + passive_mobs = new MobMapping[cnt]; + for(int i = 0, j = 0; i < config_passive_mobs.length; i++) { + if(config_passive_mobs[i].enabled) { + passive_mobs[j] = config_passive_mobs[i]; + j++; + clsset.add(config_passive_mobs[i].mobclass); + } + } + + hideifshadow = cfg.getInt("update.hideifshadow", 15); + hideifundercover = cfg.getInt("update.hideifundercover", 15); + /* Now, add marker set for mobs (make it transient) */ + if(passive_mobs.length > 0) { + pset = markerapi.getMarkerSet("passive_mobs.markerset"); + if(pset == null) + pset = markerapi.createMarkerSet("passive_mobs.markerset", cfg.getString("passivelayer.name", "Mo'Creatures Mobs"), null, false); + else + pset.setMarkerSetLabel(cfg.getString("passivelayer.name", "Mo'Creatures Mobs")); + if(pset == null) { + severe("Error creating marker set"); + return; + } + pset.setLayerPriority(cfg.getInt("passivelayer.layerprio", 10)); + pset.setHideByDefault(cfg.getBoolean("passivelayer.hidebydefault", false)); + int minzoom = cfg.getInt("passivelayer.minzoom", 0); + if(minzoom > 0) /* Don't call if non-default - lets us work with pre-0.28 dynmap */ + pset.setMinZoom(minzoom); + tinyicons = cfg.getBoolean("passivelayer.tinyicons", false); + nolabels = cfg.getBoolean("passivelayer.nolabels", false); + inc_coord = cfg.getBoolean("passivelayer.inc-coord", false); + /* Get position resolution */ + res = cfg.getDouble("update.resolution", 1.0); + /* Set up update job - based on period */ + double per = cfg.getDouble("update.period", 5.0); + if(per < 2.0) per = 2.0; + updperiod = (long)(per*20.0); + updates_per_tick = cfg.getInt("update.mobs-per-tick", 20); + stop = false; + getServer().getScheduler().scheduleSyncDelayedTask(this, new PassiveMobUpdate(), updperiod); + info("Enable layer for passive mobs"); + } + else { + info("Layer for passive mobs disabled"); + } + + /* Now, check which vehicles are enabled */ clsset = new HashSet>(); cnt = 0; - for(int i = 0; i < configvehicles.length; i++) { - configvehicles[i].init(); - configvehicles[i].enabled = cfg.getBoolean("vehicles." + configvehicles[i].mobid, false); - configvehicles[i].icon = markerapi.getMarkerIcon("vehicles." + configvehicles[i].mobid); + for(int i = 0; i < config_vehicles.length; i++) { + config_vehicles[i].init(); + config_vehicles[i].enabled = cfg.getBoolean("vehicles." + config_vehicles[i].mobid, false); + config_vehicles[i].icon = markerapi.getMarkerIcon("vehicles." + config_vehicles[i].mobid); InputStream in = null; if(tinyicons) - in = getClass().getResourceAsStream("/8x8/" + configvehicles[i].mobid + ".png"); + in = getClass().getResourceAsStream("/8x8/" + config_vehicles[i].mobid + ".png"); if(in == null) - in = getClass().getResourceAsStream("/" + configvehicles[i].mobid + ".png"); + in = getClass().getResourceAsStream("/" + config_vehicles[i].mobid + ".png"); if(in != null) { - if(configvehicles[i].icon == null) - configvehicles[i].icon = markerapi.createMarkerIcon("vehicles." + configvehicles[i].mobid, configvehicles[i].label, in); + if(config_vehicles[i].icon == null) + config_vehicles[i].icon = markerapi.createMarkerIcon("vehicles." + config_vehicles[i].mobid, config_vehicles[i].label, in); else /* Update image */ - configvehicles[i].icon.setMarkerIconImage(in); + config_vehicles[i].icon.setMarkerIconImage(in); } - if(configvehicles[i].icon == null) { - configvehicles[i].icon = markerapi.getMarkerIcon(MarkerIcon.DEFAULT); + if(config_vehicles[i].icon == null) { + config_vehicles[i].icon = markerapi.getMarkerIcon(MarkerIcon.DEFAULT); } - if(configvehicles[i].enabled) { + if(config_vehicles[i].enabled) { cnt++; } } /* Make list of just enabled vehicles */ vehicles = new MobMapping[cnt]; - for(int i = 0, j = 0; i < configvehicles.length; i++) { - if(configvehicles[i].enabled) { - vehicles[j] = configvehicles[i]; + for(int i = 0, j = 0; i < config_vehicles.length; i++) { + if(config_vehicles[i].enabled) { + vehicles[j] = config_vehicles[i]; j++; - clsset.add(configvehicles[i].mobclass); + clsset.add(config_vehicles[i].mobclass); } } /* Now, add marker set for vehicles (make it transient) */ @@ -824,21 +1375,34 @@ private void activate() { info("Layer for vehicles disabled"); } - info("version " + this.getDescription().getVersion() + " is activated"); + info("version 1.7 is activated"); } public void onDisable() { - if(set != null) { - set.deleteMarkerSet(); - set = null; + if(mset != null) { + mset.deleteMarkerSet(); + mset = null; + } + if(hset != null) { + hset.deleteMarkerSet(); + hset = null; + } + if(pset != null) { + pset.deleteMarkerSet(); + pset = null; } if(vset != null) { vset.deleteMarkerSet(); vset = null; } - mobicons.clear(); + mocreat_mobicons.clear(); + hostile_mobicons.clear(); + passive_mobicons.clear(); vehicleicons.clear(); - lookup_cache.clear(); + mlookup_cache.clear(); + hlookup_cache.clear(); + plookup_cache.clear(); + vlookup_cache.clear(); stop = true; } diff --git a/src/main/resources/8x8/allay.png b/src/main/resources/8x8/allay.png new file mode 100644 index 0000000000000000000000000000000000000000..2caffbc7505e54a1a6ec228715f1cb54b7f9289e GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfECYN(T(^As{O|w&n&1BqeEJ;y z`LEU8uN`mycs%*x^z?Vm>pwI9{O|qqzu?dRTf4+}@JoxpGB|YjH z&=6}+7sn8e>$1m=GagXjVRjIVNwIokpX2ea^u&+UDZgU2F6fNEq)@w~UoXI0@T5pg kyqKf4;PH-?v+r2Nn|^1!y~^9R8)yuJr>mdKI;Vst01Tj3zyJUM literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/axolotl.png b/src/main/resources/8x8/axolotl.png new file mode 100644 index 0000000000000000000000000000000000000000..b99927cca53ab72d5a36e22c81bec67e5781c6e2 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U4x&b~Ru3LBhfAr|Zx;4MIZ2h-) z-|y$opI*BBVae>*D;B=*%suts!Hb0pe^05oKDqT;oXJePg9)-gjar^Ajv*Y^lQ~$K z+DsG@7@EChT;K5MS1c zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YslIlipQFr;5jV(Hg@JLKZ18wAF;D})7{rl7#lZ3{D{$} zQ~02}qlUj&M33e#A7Zg$-`6X4y;tqME$_0Ah*UJ&soRyg0^@~Hy16al7W@aSW!?$5 z!o>o_D$u-e7ek2{(eC7_Ql?IAz6%wY=((}r&0N?`nmXac#VrVMQ)dA@)i?zn1*kcY z`Pf2JZ<_iFDKu9CCliDXM1Q%>cf@~lA3?p3)FrZdVgQx$pwmJg;|IY zM+H6^mb3GG0RakuE13>#oQnWQdFaL-p~=gE7a6SuKm-?2BsvNRV0j;qKjIZRl!FW2 zgb-qopdp1EUGy=;7$uG#mBopdAW=kAl4N!2HE2{()ucIba%f>8#Uv(aN-1Y3%@Ccj zJA)(Vi!XQiD_rrCORse0g7hiAgc6GsEve+n)m4;#ja5w5nrd#;kV?(B&|;IOEw$W{ zYu$CM1GIvwmDmg>=%vWRIqmHG5TLO9f*+VF0v0<3pq}1l(LP?p$O|rh# zf%RNkzUufkDsqdYu$YRElYsFUbum>oh}>ecpYOIL(vg$W+>Wk$?;*G3M7HME-{!ZF z(RjDEAoE*BI^IlqF{vKs(3Ypa+4#qoZDz@jGYxe;)>4I9JchJuX~X$L;$k)+=W9`I zx}I>v6^>$0ta<514?p&Fw*hE4)-<|Jayf&x$9d`iN6WQPH6Ao2?U;AZsQVL=w(ydI#4U%J`Vv|sJb9!$PU)34 z=vXUB6s39-W1hC*G<0LM>^52btpX)IHK;pL(;XizO%HLW!&Rd@oNRv0-+yPEd0F?L zj5CjQu3Sq+55D*V^iJ@r;)rlE3+U>O7OjUQ9U@ARTvJx#cqN*o$OAi{@ak4Bn z)6g#uU-Wh7qnE@_nr=5+q}E^7Z+NSxX3Z;ox3?j6J_R6o3xNk{z(=_6w-c$h6Kr0> z^pwg@1F4jnJgVgGDJ`LaKfQ+F@F)>s>fuE8^NsnjlQCj&JiB$nf^$vJR?SD#>@Lf( z!7dP(j#2im>4^G%VpykZpi7n}Pg(1lAfYHa;}LS*9mF5AO5cn*nrD06bs@!3t7m`Z z-KgzpjGu2z!dYv%mQ!R>uI+m*sXYlij>j`lKJvHGG-I>dd->J0d)QmMEpk1r&)+lY z)aZH}Jsrwnw$JjEXOv-R@9+xa)bNPAbB=V!00*txm*gcM7v1u|C4TjR-AI}*-JgKr zn4q&Cjgj)z%D0hw+*JD#$b3%_%%eNv252n=ORzr;?=3Aq!_-xYdvZBfN4U)HbZ(EM z&iW(B`=HVNbJB1{cQZ5@C#Q1L_kfXcy4Y9tX0002_Nkl4Nfj91> z6-q1_Rg%A7W}(Y+*+zsxpX0MGKfZ}3!JmB4bv`*gk5LK&`Q6JotUaMC8bK(Ln!(zt z!ok)(gBKHVeK%yZ(;?Eg$&wLyG9lJC7}hSh?7Sk|S03wo88@3yS=7i=4|g2U?qxW) zGlXTEytkS}g9i|0P%Fe=k2tL+mTe*%RzOs(GoMOgKLKDqHQ3*+vmiZ`=aWXR7mH-6 kN@*noz;ktkni2*9|8$jNZrp2}ssI2007*qoM6N<$g7JosK>z>% literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/camel.png b/src/main/resources/8x8/camel.png new file mode 100644 index 0000000000000000000000000000000000000000..a5d02f7b2e5d955a8090a74da5ead3dc72e6bd6d GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U4x&b~RuFs#pc>eJ2haEFNZ0LE} z9`xeWt`{@&-mYl6fA_AHq0YrPL1=qUHL$b8lEnWAsp9}1$Ny$ za6sY9CdUbmE7Y`m9Z%dk+Uj^>kI59r6A=>`9T^yQ2eKDj|GrrWsE5JR)z4*}Q$iB} D^QAwg literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/chest-boat.png b/src/main/resources/8x8/chest-boat.png new file mode 100644 index 0000000000000000000000000000000000000000..c4514521efa1388aa07c0c639296b302378eb6f3 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf0t0+PT#s)KKE5^S;hj@+vgP+K zaIH(V?@v-XxGwP0#f#_8om-fz)RFCQ{y;-suzHx2N=$%lX^drdgiTw%=Z*z|J6FbR zn&aPCnO6|+oaL{UlNM7QrTzKW^ID+cj-D=#Asp9bJKcp2DDWJ)CUCoDR@{&O&V`F6 zyE*MR9sJ8md4tNdqf4&7Ui(&G`t literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/cod.png b/src/main/resources/8x8/cod.png new file mode 100644 index 0000000000000000000000000000000000000000..354fafa42ad1c8d306ace8acdac1b4bd0ae42b62 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt3( zJ<}BT2#__-o-U3d8o|j2*!py}{_v+Jv0v|7_jmtBV~J2fj{>)K@)1lf>AN!)YcY5p xFlbZpU_TKzLo*;zq~Ugkzya+}c>@CmhWQW8SGw$aITvUggQu&X%Q~loCII83Jy!q# literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/drowned.png b/src/main/resources/8x8/drowned.png new file mode 100644 index 0000000000000000000000000000000000000000..634bfdb2a0c4ae6bf882d0d7a1ef2343d378f71c GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7? zo@t7E1jw2^PZ!4!iST5DS%((fWKpV}X8O}Fi(yg29-Rdo9vmlvv=TV7S2CYsJUL;m ztHUHlC6+17t5}U1mQ*b;pTHf&C)m_+NK)bHU-|XSf-W5A*gP4Y+IANO$=_jBQef^_ oAXLy=@Kj;3!Y2VB%~%=9z}XNHB=*bZDbQvHPgg&ebxsLQ08pw-SpWb4 literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/frog.png b/src/main/resources/8x8/frog.png new file mode 100644 index 0000000000000000000000000000000000000000..3c8104e93db0c5040433292c615c966096ab5e5e GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxfyaRkfT-^(NPIpC~E^)oSIAcea z9^PJYCI6Uu;ezLIq z>7liAIwNPbN8H)DG}ymI3TP~2NswPKgTu2MX+Vyhr;B3<$92<##~BYO2rwHkhrgV# z>;IBUSEf3d$JHOB1S*g1aNUq@Up+&*_s0Vd-Y{>)RcvR)no?VLFI)0X-se4&=6A-9 R3qX??JYD@<);T3K0RXWHSO@?B literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/glowsquid.png b/src/main/resources/8x8/glowsquid.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f32e8a228c051b006afd24ffacaf5a23f6dadc GIT binary patch literal 506 zcmVCdN0>+g*t-V3rty6Jk6NB<=ts zXe)=Uw2Zbu{XXHm%@o?0%VEw@+A65$&ajuS8i|6EqP*s>X8ep~VE|u8Y|GeoF1z z1u-Sev!{0u0wM@Ll6!@HJwXf!OUC^k<@_ciKZxl#nB5Nb<2FiEK`Q0882o7Rv07)? z?O+)?-PJJJOp<%KETRyUaBP$Iry7#yvzOl`VB6@IJ^ZDQcx~JK9gRt8DjV?_YE(s8 zc#L(Op*=+!S~tvm5hbSKx-Qd+iJHz34TV`m;z+j+%UlWz76S`;EsE#5$jJ@%i<>;Y zy^Zv|q~Rx?(666j>i_WMIE9Rczn!3*2_Sx`eC0(k!QIp<$*nXyr5us@l$Q_Fysxy7 wh7*Ts!|1^@s64^wR}0003CNkl1}ZYDaZ zFkwi*n5ct4VUXXz?~tF69Vf#C$Uwk`!P&tC5fW%?U!g#&E0$ClJmTOEJf`Y?OuPNqfp@bgWy@<{Kc=?`8R3{0leDJPjM>gQ;}Xl&8x_K2bg(=?GN7`q16>;u(t z9O{pCQpq@mVGvIw2v&l%Z&NJfQFEs`7Ve1i;u%RjiDiwMO@@SPpM2p0WxKXoF6ec; z4By{SV=*qTt}kgdo7|MjXo{k+qo>$EIHc2gCX>x@bo>v%FFlfuV1hcyG5`Po07*qo IM6N<$f_USNn*aa+ literal 1920 zcmeAS@N?(olHy`uVBq!ia0vp^96-#@!3HEvBYEN&7+6#?ot*4;w{ZwxsHt-wtf?3~tw2<>^uV;t0Q@+FRDphr7#?)Ps-2 zeEoIW^1kJB>*sN|U2Nksx6YCb?U=TD-Q4pkQztJMn=;S0>(b^c-pp54zx30cc>1i6 z-a*mt=UzXQ?czB7cH+B#e&3Y$S9RaH*s0`yAWu}bR`Lf=;F&Ag+q^~gv;Y2)xt;CK zXPFO|%~+ULGfl6ZBUEwmxVo*MqCIEd1+CYjYdQ9?+3dNIroTNgo>}6= zCT?CkDY5AML;e23?S}vP^=6lTc@x_l@q5nFoyj}+JMU?K3)$Cce|_s0nGfC@;@9u= zOsr@9(f{jG4O4}D;Fpz?YD?}tcaM)>D{_zR9&7c*g5})4zq3jWt7RlMUi_;1dd3N5 zi|eK7LYtR}H@pw~vE@eci-{{v1ZO@-d~ndKcGb-IS%qQGTJE0S95wR{lX8E`{^e(% zG_W_=Z&|x%1?$;MR_4Zw#6Ee4XXmY3>3D11tjIv_zeY2yG^s-(OFwbbpk-ctaHmXJ^T3QdEPBc{Vza*4%x6-oz@$r_PP2ziX7X>c0 zKEA$S|H+LJ_Q5w9|Hvn8eq$h=F1%!e`Hk6cIJ^&99pq!>D$2DI)w*1(@%8f_|I!dK zE5CqGe;jHxIs(t#d@uFuZ2!NuSsT2yzbN}(Ff@sNE3CjSoKb3i$!>Xew*4DEn^SDN zf1G=}FFU*BPvPg@yWP3R%{Js6+ji*3jrALK|KtWSStnF=OCL)jtD3T0W_7{<%0 zysz^gL|(WRbZg_{rLTTAUQkv$Xn(@)%%zFrc$d_ ztNmA_R=rmLuTNJ=*EuJ?{>vzT+NwaXBFyU8ao6C0nSjf?q z)g@w)x93k@7G!qf*o`mB%gbWsJe}56VKuKy-J|n;xBrpjkBphN&)f4O?uXijWz1jy zO%^t=vU-rK(^l!(JO>&-wJ%) zFLkT!gI~=v<3-)uUJ1zwU1)HLjG^-#NH>h?X&sHg;q@=(~U%$M(T(8_%FTW^V-_X+1 zQs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGM+A&d(_YnQv!qWCK=;B8adEq9GES z24q2W4bJ(w1x2aF#UL9Dp%x&Ep{w^V%1i}@1=vL}^~hrA>H{+JOY(v7Qk0qOnOBlp z1hfpQ8|EF{DxhZB=!1e5DX1aw2o?oKq#c)yK0Hy_aqT)?rwB|Z`#oJ8LpWq*`%Y&u z1q!&FukE=fSa_jTBGyHqrDy(w?HW(AH+^oruP%6JmWPnKuyKF({mfnBu~$Q{X8pVJ zJ%2az{_jm!e@#8Q#DCHkjn!P)Jh!B}*W14IK2^3q(P-|+TFb>-#rC-EKJlT>rs(gV z1RJSGkNEya@@i;V2An>+Ie%-ik4W$|*2-_K-<>pkb=j|NjefFS`{sF1j)J|6$Gq0) zC?3mN+OeC{Pp#qS{k?%&2bXSCRIiaS+RAXy%%XG0O7>S%{gkX?XTArec~4hAmvv4F FO#peqGr#}< diff --git a/src/main/resources/8x8/hoglin.png b/src/main/resources/8x8/hoglin.png new file mode 100644 index 0000000000000000000000000000000000000000..97990d4c1857a5c3be16752414f0a59b08797acc GIT binary patch literal 1973 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xMh6!2G`|B%&lJv0R~`C_gPTCsm=O zvLIC-M6eAi0j^w{(#qVMD5IX4f+{+rS}+mA!#<(*@Ul8UDm zd6^x#^8cUNXLf1*Gsjl(>sf72*nH8=??p@MZ8Ps~+2hgi_WM82{>yY&b;G8)yR04y z|M^why#4b2d%t_n3#3y|frcuzAn48~sJw0Po<7nf4PN4b7H@DusE}Cvk zUrq%0K6qv;F7^1BVcfEYiQI~lI1@}tY)p!u{aNzXVeQvTs!@l|iGF$%XX>$7`+9#z zlfo6XPq&76(>74`^_!B_tjLZ^5eDD<@bI+SnTiE#48o^L9s<5 z=!r(eA(LG%e0dCyO)N)jv3Flx-*C({b&CJC$jzti+GUEhVwNQQ z5)a>_x$wv&tW-lATh$PRjS{uB5Uf zKl86X`1X&x=~vOBSYwT2(-!P_&$VE|&g^Y0o2Kn9iruVgq}FN_qWt!e$g3_#$LP+j z7uVh0UgTeDoK?R>I$kqdvi@ zj8D&>_gKVJy01OswXxWl_fLd>E&hAI#?16gv&_!EhLqEO7I7tqMT_=bIVK~cZs1Tg2P!cKH?q`3r?vXQLa_OKc0i2rJEt_-yi^ zXT`n+{r76O&b(a|eVbv!!{ok$XLG8Io|$iYdGgKsx|*LZpZWQO_jF2K<`ZXNVEP;26XL2UC!?riYGbMA>g|^r z3p^r=85s1GL71^(seKtxkiEpy*OmPVn>4F5AEV5t z8laG|r;B3<$937Rjl2g87!KVKa*+M;|K_f*Oc5E{Ik)5%m~<@hvcLSof7Y7@UAZ?& d=Qh6o%3avb^vY^S(g~n;22WQ%mvv4FO#t>bRKfrN literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/illusioner.png b/src/main/resources/8x8/illusioner.png new file mode 100644 index 0000000000000000000000000000000000000000..f3202ccdd18452f8981708533a2759eebafceef5 GIT binary patch literal 1674 zcmV;526g#~P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YuvLq)A{O1%t0+Lvd!y4fm`1nqirn;HwnXqH3 z-YY1T5F%4ctM<>|UHyfNwKvLGA6#@!<1*1iPM8F}t~HW2^Z70t?;mn?J}^XrQP!(# zTR%Z=p9S7*dH$3uU$&jF4bd??FBv{m*5a-Nx^C;{iss zuqUjz35mutj9mmCNR)(eJp&Jk!JNe5$wEKJPMzrm-kDw4>9pnY35C*bE4T}zEhl@) z%E5F+d5q`4oEq*5A{0AoIx?elFVfex5vN5+|N7W4me@~ zV-;*>+(l6&2HKqrRZ7&U&9P8{i-sF}jLZcn4_Oe;k&7$}a8qXwVycn=CJI;+i23+J zbKf}kD-^JEC1^6i7-7W^xB8jz|J=t=?;~`HbU0YSFCH-sHwJU#2`vypePe1TzVlXZ zaiiae6|iO}%mD{XIxiF1(i2-Uc^2qdZIoWALB4JSfCzhAI70#kv?HAeQsyk#WSd>~IpmmALHHC?Y;nbxP-01yt5l?ab=9jHYOJYILnt-VY;(=G&|*s+ zvDT%VZoBKghaP)6tZi05S)+@&U$aJ=wZWK~dj4SzV((ujXp|E>I0IvB2#ou|00No^ zXF8BEJeV7t>BvY5%V3S{Ag9t`3=En^Y&#w99_D_@o3iFV@y6enQ-iuc!JHb@ZRURD z?I*0&G&_n+f<_h&Oto|rw#FP1{yI+Hyk0LLC>l#<9JA4!jpi`FIo4^;H0L_LL5bB% z=^jm<6BCoRQ>I7Gja3Xdx5Tt*d6Y@@a^N2SqeG)+z?0N}Q8v=5_3QMAMk+%}Y8f!?Kmo zWnQ+jnhSE$&A!&s`f3hdwk{=&cs;)Q3ktOCbs$?u2iyMZGMAzoy%xHSv>e9P1gWql z3L;*sP@q4k<8wZ$Q-EH39FirWeMs(!f|LhHxXly+E**i?Im zxR;o3)nL@hIXjpOD(W;ee)zl$m9S*lw1YFt9ZcOV6mrQ@pBgajDNf;dVSkI(PBeW| z8^JvzJg8?oYHPb{q?AK{ybn}23Y|+ghwrEs`sp}<$omaiHgCV5;)198h*>Fq#YeZg z%M;r-``x(>R*}&VCq_W4FU4XWiq?tvMynif(C<}IjL_~ZI}3}CRakc2a6GBY3`V&cm9`)Wh#*e(8cO_0=vhR4UUTOHX6m1vzYfU%1i#%QK9#i}R?wxh|9PK{I zD~L~rb!yN}s5v`1MwH$#-7i5@LNC}uOplL6?pj)2)0d3%1 U`(xVqEdT%j07*qoM6N<$g2A{CKL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/panda.png b/src/main/resources/8x8/panda.png new file mode 100644 index 0000000000000000000000000000000000000000..79874f51537c0171882c20176f71a2e5fe9c1d0d GIT binary patch literal 1543 zcmV+i2Kf1jP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1YumgFc5{O1&N1SGK@2eZ64H<;s3u-MMTl~p~{ zom3^VEJUD?M5_AF-%b664{OoNSRY(;PUB;uiJTw=JwJ0MZN~Sju0Ox&)%Aj*63j9m zU0wDGdV4SMX6cW2z4Cea3Cq#B^KvMCXNIus!g3@$^|YQ5_4XlvC?a=TU|P!vmp|vCLt3{9DL=jEE6% z#03RFXSGp!mInE<93Vv4+X4&;7|@Qyk|XVzJrUv< zz)u2l7Q+V^AZxjhYT!o1fgDr=_Qo1d!iHChXZKyio%H7FgBWsF7scoUFA$%-|~ zTI;O0!A6^$IOD8y&b!{Dk{55h_0D@AeDo}wuH)~LPf4ZRFPHg84jIkjw?mGiW zXzrZpK*n%qu5+d%qbMwcHL{(YLY*-%XezO7ba8hx_bqSAn*YQbe_~E`>iz_Cs#CX^ zd-C=LYbA{vMFv5=3VTeoG&HtGN8$iH*^sgL8`r}SM2|N?qwi1QR7lNbuIe`#By|ce za|<;M@#rr8QO5Zra__`X_8IyX|Mi41|SK(HS|3>VxugZDh^m{m79>@cw*oJUGi!xT<8 zyhp0oc>yWzs z;N*ei1fqTy$q7V#KqB}h6xF}-CZvZXEvWVY000JJOGiWi{{a60|De66lK=n!32;bR za{vGi!vFvd!vV){sAK>D00(qQO+^Re2?z`fIc^HKasU7T^+`lQR2b7O!9PyIPyoQ; z-&0aqUPDX#(^Mj15O5*s2n=!o!^{~-JV6=o1STAWz!7wCB4H75!r-C~Ugc6cdAaNj_~&`mfs{^ODxK$|)9Jp9Mq$^o ztW~{!`vb7qd|V_+(j1SUUPTy=i!$&HWYZ{HZEquQwTdljO-+!P` zI0ZoKjOld7a`|qb7-J9uf*>GGGtx982m*uvV+>+GpGl?Ss9L=tNfH1o%VN9zq*y$& t3rfXDV@&UGIN-Vt0Q>zf#u$`}kAE7sWasZ`L*oDd002ovPDHLkV1ll()I9(I literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/parrot.png b/src/main/resources/8x8/parrot.png new file mode 100644 index 0000000000000000000000000000000000000000..e660dc48bfa7e202167fadb6a17e02efb40b027f GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEa{HEjtmUzPnffIy#(?(3p^r= z85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt3(J<}BT2$0E(JY5_^ zG=h^I*!7?3|C@jM-0%O7|FZut-(LEsoy+-v>HG`-)$iW0#LT=By}Z;C1rt3( zJ<}BT2#__wo-U3d8o|jw{{Od+>j@Q*Z03ypz2X14#@PR7=bru_{!FzYQ$SvYFN{Ih z;kZKK1||V@g+fj?w$5hJg51Qv{D)3VGBDi0G$Sj8)xa)-G4IcOMurs|7wl~;nUoAP Op25@A&t;ucLK6V`8AdAr literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/piglin.png b/src/main/resources/8x8/piglin.png new file mode 100644 index 0000000000000000000000000000000000000000..a7142e8a028cebb08d7428b63c76fd1b92b63b31 GIT binary patch literal 1268 zcmV zaB^>EX>4U6ba`-PAZ2)IW&i+q+Rc_-dg~|*hVNO$EWwfxh~;1~&vSM#%byQSoy7TR zPTGqxwS^TS3B7>pwtxRL_YW>!*qqmBA%(Eu^2sO8=-9GfyQIaB=e4fC-{{@(14AW{ zvcHCH+GptXG9db?UvKp;mg&c)BRU+9OM2wqpLRAK3GaHE?=H=8*eEVP!+lk89_S?x}c3?^L@bPrclh!YyGMgj0>C zp7f-bBMjeUM3=}nKh$u9xT{@j)mq#3*<~M4so>_MzNRvIFkDee8N<56h+EN*qa`%M z6bpz|&|J}qqeP5qH}X^|Q=@IjLIo*$-Z(-s7nY$jiJZ8g=p?>3Y8)j=bzs3#Kuw_L zBNrNR(}-8d5V;a8nc$2D$5V5Ul%KT2QEPqa5-oPr3VCr~HAthA>rYq#2(?*L9rYc} zU9Fqt3ao&jjxrl2n3r{Tu_|5GmJH4UJ6*h6_N_s&P6sFvVk?p%0f8luCAHmTlHqZ7H;)M!%c#Qd;}7iv()_~nB7aiX0Wh_NRSkDUM(Gm1#ElAq)#(cMK6OQV;qUTPkn(YQO0o?^4@tf_nUN#uHl?xtv; zB{QV^VKPT-cNM(ux>fOMJnUrG@nu0iJ=mVEjw=d|SG=vnXvZ6d%t8wC;sFbkk70001wNklb8Sgp(0000omb@%^vspb% zL=U?R=@54CCWt6_7sZ_wkM2?jJ8cJ1c91zy2EKG{=fV0&-k*=(@ArN0`@XlFnYz~7 zbGnD3s9t$e%91tU|AAvHKC&-1hT1?U>2(S;{1C!Mp0eo zjeG$YlpCUkOh)xFjAz<}O;Kaxo~>%L5Q8Et8CHzmeX~vjLyyt7B1%ZHldx<|RvnnD zPUW@gtQOVj@vC6W6N!Kcu?jqM&T>UBMmKatviHp_4H^(U8>0_{DkvF{L=FTIW;m#Y zI1UH`!-XS)z+DD>h~wE1`Gg=B79)blkAUW&i8n`|5wlXd>5H6VbQxn?WZ6ok!c>MC zc)eBngKubY_uI3mvHjo8;MYV_)aEvCA9$vw;+p?D1OcO~M z>!~)&F(Lm-EufMvRUY&1xF)=n;Gz3*<#XxDn?Eop}AHT zGi8L4TShiW<^*s_Q8mNz4TBAaqKLBPV%5^1EX8P|!5D@v^22;06d93HNsf$^Fv_J9 zQYbRYr=yWDA5ONo64Dk-XyF!DKjNl3a{Xp7ZQ@yij&TR-X$P60acR-$98033UX!bL zjwRWV%aUMNzqEgqx@98$<8RxIOAhVUhZgB~hcx!L&+n?_QMj@+k@xDwC*ob9tNZ7# zy`kd|5~sFzcDidHcemcYp5J@%Y~{r5;zsR4{N%+z>EOfT&1p)HOKZhiZRPBhAG!4Y zP#@JFXEKkt0rsXWFR!kC|FZEi{;*!JZ>=w_S9Z^RdVcVG|0%cDXH)m6E-GM$>90%Z PjQ=R*)RgopF@66Jh4D+W literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/pufferfish.png b/src/main/resources/8x8/pufferfish.png new file mode 100644 index 0000000000000000000000000000000000000000..e13f1d3b3345e11c16438b99f0c88718093752cf GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt3( zJ<}BT2#__Io-U3d8o|j5Qa(LmfB*kiIsX6t>B@i2H%hg?{cHDfRLS?5%H;j;*H`W{ zZQ2Zm4onJv-u=lj*t^#0?f<2!`vh41HkUWDCNwFy*3WzAsKLmdKI;Vst0NI*RkN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/ravager.png b/src/main/resources/8x8/ravager.png new file mode 100644 index 0000000000000000000000000000000000000000..60cf310c8030a4b3b609ebe0cb1a5a216aef668d GIT binary patch literal 1593 zcmV-92FCe`P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SOKBvMVPH{bv8I=(4;NO1I3ItbK7Q5}tBe-%VQQvU_oT{Z~JaYnV&V z?=Aq0s?aBF_!JV0ckEUK9!QdmalRvWiJNo0ozTzNnLT}gw`ULRY+iDChr(FDHuwid zOHTSTb_1bTkLb4iw$Nmo_`t5U8e2POblG_z<;@D}3T4c&@c@)Ej(I!*|B87SPr?%s zVgX|n@E>@Jp+pR{8#$_!snI#cLIo~5J~?1yE-XV9C2-;*lL9={IDnXHzy(VIYXUKE zUuf7(!(O2X%ayQ`3Caj3J|6Rv@ZUUJQENTdh-}f89WR2sddKA(x6b60zd@Y3TH^bfb}Fwo@`(aM8GkE zpA64g93NnSRJoFA;6}uQ98?2r<4mBjmzAd&tp!A=cnP2er312@Q{+!@5jm7q)EQOv z8Z>Is?8Q5;-uvKtkIF%U3mSX~A%+xkl<1;HA47~W#hf?^T9_uEf=Mx@lrxNGsLnW@ zu_Nb$4>{bShd;s*k96dM^eL`r@gp|VoNP=))uSptkHwHU$aJwwa%Cu`@+o{#35WNsJ9dCoPjZR1ja*W013^V zGaJb{?#y-0Y+@9JGFT(+Q&e=wbIbou;GlEWA1m-99tL@I3!}nELxGd>U}1s_`_{NV=bYQkl91D zmi8%bIz%OIJ#Jb9z?Ys7rS`dI+@fY4=-S^#I@{b2;Qe*d`=!3R%Xd^^mob~j?_upz zdQQKS-Fnh+z{Ro;H5(=d&WO95e~tqD$No~%4*8h6%5h1k4l`o*IeNH;i)MIqN9*T` zb9ellX8ci&{R&bI3nV1qlIe8O>m{)({&<6(+#7$E=R({L9<*S+lZ4y?2sLCL@$5~S z#-P+lvRQ z-ZqhoBzUybs6A*CKhNBW9iA>qDRUEklbG^<@`ye?vXdpZwWAM@8Cvb_!c*0`DkAc> zR_j#~yOP4JT7xFP8Gnu;+u6C$(f7%?vgz&;`M_X$4(v8a&x#8?p>uTS*SR{$4T69c zGm7r+%%4pu%>9XW52%-ScV0?1GcjHIu8I6AgWVU)Oy@{9QetK>`0e|>=*lv-qYLhN zSx7PGBs8)6o(DQLy(AFLQ}(`5Ogx8s>iBzbeD&`7w6Ya>;}-|+TMqc7kG}93R~__^ z4F5%fA0G*BpIE13-n2qruYjwWZSsGhespg0>nu9rYLj<&tMy?^2k_ZlHDnGgr})HGtC!lynp@_aL=$~SnYaLg&DGjA5gfP&ELoRztV)! zdxii200v@9M??Vs0RI60puMM)00009a7bBm000ib000ib0l1NC?EnA(2XskIMF-;v z2n+}-`QHOR0002kNklj6~S z+=#WQ-#S7>5NoNlnFDwLd93V@QZ&L-yd9V1W6fR=SO6DbtM#yX9D@Bt#Bvy(u+@54 z17(WwY&sz~6;Yfqn@&)s7}wyeb3wP)=l%1IO|quj>vMj2MSajo#4?T96%T;r>jFgn rL6m07_x+K$&NV>w^}Q;~QUUw{Qmkes=~;c400000NkvXXu0mjfq3#0O literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/salmon.png b/src/main/resources/8x8/salmon.png new file mode 100644 index 0000000000000000000000000000000000000000..750ab7ebfbfec47c18c32ef188419bce4dd16588 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt3( zJ<}BT2#_`5o-U3d8o|j2*py^){yERQaqyn!-T&!g&lhPiaW0#A@?U&z)}Q?+t}t9? znZUy1oxO6Q)`ri;|Ky|ReX4I-##VOs(W6KIYlWEpH;W{_Xk(nPxWMZX8xIcy$1Kg@ UyjhD*01boFyt=akR{0AspM`~Uy| literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/sniffer.png b/src/main/resources/8x8/sniffer.png new file mode 100644 index 0000000000000000000000000000000000000000..d64296ca5ed4609502ecd718073f0ee8184579e3 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf@&kNAT-#J7pD$DF)R!$v(tJ2a z;rj{q_v=-TRZ2X6@%s6()^ct6Mmf>-6~&*oYrK4Xu}Des!LBxsXxl(PBY!_5%_JA6 z{HUaklAR|GW?8AX_ND$fY?v-7>}#d6uBB>CdC{vUmwY8f7nUpUKC->D++g}-f6aru zHbARgJY5_^IIi;^JI>gkAi#2fmC<&QW%`@_ZuxP{^}inPO=6j|dHyx217*(z!u)Q@ vFJ(C{rrJEEIP8$bme|c#Tv`^&FYo%>pu`-qt))I5XdZ*7tDnm{r-UW|ZYNgFKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+T~YUa^)xt{bv=k1SBCI%fT3`W(TwUIXo`c*GamP zPJX)j5*t|-(m_XHV(NeYHuDdDY;817L-fgei=Rs_afT4>{LP-M8~3ZOKfmbBe!)-) zdYO;DF8d6)E6=F1ri#b#Ym4m-G9x z3rNPP@F#4z3W>!%_9!y1jLYNB;=2)A7AFCB5`8~+W{bDvZRwUfo0nc*Q(>%M2L6_# zr6;}VWryJxMD&dO@}lq#@g{ezow2n#XP2Evro35`dQ4?VFg%b-8N)nUz@?DGXbCN1 ziUo|FVDmsLh7vKd-N?~NnHts67Xl=9Tsfd;E-XVAC2-;bG6?BMqsBp!oJJxzDPT>Y z=8c6$+%)19iims?EScbp29LL9-c$Zg+m2f6rAuVv&J}QRuW7*O%=J60KnS&!Qyuvo z&0OlnUWgSis3Xl06U_FQE)JzEFb5*! zF@m2A5j4Yf z#^?--oDV+aaEBiL2uD29kqgSFxT3|EP-00XpM1)R<$wA!m@}T~%#|uisk*Aw*HB|k zH8<2+ljfQ>-$IKmwY*tdtiG~FH|BoL8ZFj3V{X`mCu>lL@NhwWJJHS=7-L6ZJah(7 z(A+t*k(}esT<6Rt#-dOLYowi=lR9Hy&{bk>w7GjS_eC`Re z-tzViYiAx`6d45dRoHWCrD0>M4)HnWYNZ~)-sS#z`dV+kIsn<}LKd-k=q&p#7|!mr zzYF8in{UCmpg@k&w8EbHFyblj&m;P%zhE%m0P#K6{zgX)OLMM}hLz?X`WD}qHXQ;V z(YAvgweslAUGY&bCDk2J_L6KztB->G2<+EDnNNWE6sXtAZpriBQi}UZ!p%=G_6Iv! zIZhOn9R6_JpPKw!Sc1cZ6^%C)%5z~%X=BxPpGE5;Q zyCJkL811L}$L#WbcKE7~c#&$d4`m!973T=vI&1E;mfYq7w}OA^KDnIjp#QqQW0_up zT&A}Zx+gO!w{n@UxlK6e!fiv&59Mcib5#VIp>VEA{F=*aDjN?I z1Oyd-$gZD7PzbnF&OByDt>;dN=;}QQfK5h!fw9&-@OXz<2}(pnDMjVVL9pEK5D`@6 z%IF86pZLmVhF1vK%=|nJux(D!?x?l^0000H$6>uI>dsk@i~R+|09k8ghcH z3$jv@JPch76&6qFu-B34sxJ#PQ<&UZp|^hJNuU5=V;Ayx1=~!OnBsM3s>Bf%)}s=amY6Ryl(;Qp#zopr08<4oZ2$lO literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/traderllama.png b/src/main/resources/8x8/traderllama.png new file mode 100644 index 0000000000000000000000000000000000000000..341bdc9e85eb3010b96183cea971c34ee3642a36 GIT binary patch literal 1060 zcmaJ=OHUI~6dqGlf+cK}fM}cyM3m5Z^#Pr~;sV!dVvNR}B#L5uL=xi0g)Dsi0F5j(#yH+7ZE<0}nYoXX@B7ZV=bU?SJaw?O zWoHY9VXetAK8@C9_ix^U=4Wk>E~BLr#{*Kx_<)4BLh%6#>L^U{cYd#FvG~1g^+Y;#g3i1tSIu%Gitv zCT3C@X{IQJWny>;kJua%PyrNiTb$I)`Vhirl{F~ZKF#W`De%COOvQkTuHmktnA4|Wlt7WLUqLnMvYJ&* z6G|9miw4Dzw0or*P!RqPRn~jDOxXZb8d&L}76Cr$`AWDkn8unKhg1{v;3yPWql6;gv8lCSAymDzyX&ejP zP_N3B8^^*lzt!K+ZTV};l1}>e(&|Z&aZ$oo}M9o(@n3Z<-n&0iyhytKJ_~9V|T(2%bx3P z_uC39D_gsqu412ax~%neI1B#G%NG_t?&&d$wkTh2Fiu6=&<*4Z^b<@MhAb?eFwT54*hF}iRlvYOi6?!Mb(JjLG~J%08N DF{fDh literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/tropicalfish.png b/src/main/resources/8x8/tropicalfish.png new file mode 100644 index 0000000000000000000000000000000000000000..d673d4af17e62d6fbb528de222ca626bb45bac7c GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt3( zJ<}BT2#_^_o-U3d8o|j2*vi;n{AoAZ*t|Yg?*DuDqJ>&j`^z8JPdInqobPY_-i7j) zStc+|crv}F_5aMOIV-pvtQ>_D78l<9FQ3NRmM6eq$+29e?!W;ChO5iXGQ`_s-vA9~ N@O1TaS?83{1OPQdNa_Fp literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/vanilladolphin.png b/src/main/resources/8x8/vanilladolphin.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c7ea18cadc1f5ec3ee0c7a6ebf769bc707c49d GIT binary patch literal 1933 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9Sn@U{T3*b`J1#c2)=|%1_J8No8QL z5Nr*-pMN_<#I7?xXo;A;LWFyJ*U|N%!O=UVrPdx}^PIf&t(Vx+mp8Ojo>-Z8u9RlK z{c_tX|LR6_wm*yxH<|f8Y!rFflB#chJFvwwxLs?Nr$_aRBm9bLZ&^bh?k-DG4?Ys} z_19_3`9az5 z2SvZ1d;L(hi{td$iSPdTeN*0F)qUq;r;`7HJW<(N$sas{XRc&#^A_39{`*JfcD6g8 zWjb8E0_MCkev|fv@<=De!v*$*d{`SOpW{DG%ABN^h?@~&e zxOwfQ#G>;L_4^CA8~*3ln_c?lO>A?-?>S3%Chy?yyr=ywWM8NK^{roIK6r14U%%5c zv7Yru|F26mOcnBhUsg`4ExGsHJwAS|$UU}utko9_mUH|5&MGymmXX+a@vG|V87Gu2 zu9v0@ZC)bY@ILIvmK(`0CayRUocSQ}!9lOuRWsvf6^1=)xqEtZ)XXzX%Ka((m!Eyo zz}{fLW$m67tY`{W&-owshKp!8HyL;-PDe|ZJc9kuZ zJT2yR?BYwc`n73Q>4LXzuvFBe*Ux+WOGCu0 z`~p7xaj4bk2t0T5z0|L>{r}o#ZSdCqqU?Xc&?Ne;umZbqMydHFyXD#0_HX!XPOmv%n9uL=n) zr~KLTXOoTe29cfda+8-o+56!Q=eM&we`WVdlyGg%^4(gk`;kS$gkP0yF5C5EAxB$Q zmxx8)oM;bXr%1)x0iskIwhq{zr~KGG^L7Z_kgoA8H$xF@OCx zS=hkJ>OroKkLn5IM{}(T!(6{`mCU|yHnxuKKHnnG)n(VrPKk!!T)%3)CTGp59Y(QN z-P=Xanuwl%s$o{XWACBv#VY%nmHJ*d-uu1Jwd^iW?z?E0_Wy^hUx#HxuMn<%EAVx{ z)UCD;el^dG7j?6L-L?18^Ti%d*d_*BZMgqi_NDiuyCvH%Ry2GMJ+JO!EpIOMf1SCM zb-dDlv5Tpn?IRfqD{`c@g@MHeXMsm#F#`iPkj*X3$S`Y;1Oo$;d1gpNNrbPDRdRl= zUSdjqQmS4>ZUIm=1A|S46_A;mT9T+xk(-lOY*k^a1Xf`MWP^nDl@!2AO0sR0B76fB zob!uP6-@OE^^BD4xD*r=Y>HCStb$zJpxS{vTcwPWk^(Dz{qpj1y>er{{GxPyLrY6b zeFGzXBO_g)3f4M@}~A}F;uKc^IAzMZ*|4Ol6PAi^SuhDdB0 zkOk2-IOpdU6r~mygKRK_T7WEuuHL^WGZh#XU>CvEBa5M{56H+b$p^+uQD(AdUP)>Z z&@!lQn0IiifSP5a4+>hOpoYXFSQHqMc3d|4@I+z9wd-`9A~2nt@pN$vk&u+_w+>=9 z6mYrUt||je5Eo)F~jQdidlP S@XD{C4B+YN=d#Wzp$PyoAUe7L literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/vanillafox.png b/src/main/resources/8x8/vanillafox.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b5d5d8eb51f68571d67d783042bc45fc4a2f8f GIT binary patch literal 1353 zcmV-P1-AN$P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1Ywmg^`C{MRaG2?!8^wmurIhtv~Mdq-EQQ+t7#SZO{$R7M(pVZbQy4J@02qdtUZ8(D%QzX~OU}`uW)_ zf>8xZXUR4PJ??RMaX{db%aH3H?a+Ai8ExGC^VreZ{S>^j_bGNJZ@s$@1(~o1gikTr zdY0$0n-RK2#Fyv07kE;0d)>sY_ZoX|YjxQNL@Ll;)W=e04+9T`(#>fBP4O4>b+&{S zvBUz#D%d>G3UOkKXm|EpIdkVWW#Iyd-Zra{))wogE;_Zz7Plxs<8BqiRB{nq6|m-@ zwkH;ze$(_YMD0wLUYOl8J* zHoD0hb3?2HgEGS$vA}GOW#SONa?4Gg9ma|AWY*STt=j-X1m6NM$YswauoDi9N@0~5 zag5+61G#nH9$7;up8hTbCl;;D|V?-T0n%j;1twg>wqlp1^J^sB8Rd# z@gyQaRH7uw!37^AgrH&6sH{%CiUw7UnlwijeUuoY#u!t~$tH&qCMhJP6jMq$!)b=; zjM*6@az5m)9$N6<9$-H=R%6`-^ zyRazJvUw)y)r%pKc(S?$xil@CSCU@6aIJs4;#)~G1POH-4^lE{KH(tGrnUx6e00@vi>LK=q@@)ukBH96Zy=-ZApa?{6{F~v&yI3hFD!W_k2;ji@8V5=K*%#0 z!U{sQekBV%$)2A8IVHUbuzsLm#CPz9oKf0DgJ?0UKT5-or*0xIe*mAD7GZLxl`G%=kk3 zVJ)G{hFd_98^5kczsGUGpzm>L$LCd|{{e5ni~krwok0Kq00v@9M??Vs0RI60puMM) z00009a7bBm000id000id0mpBsWB>pF2XskIMF-;v2n-7k?(wuN0001(NklCQtMt)Be=;LSGlhhqRv(T-#_u_rJ4PypKA;A`TR8~}I&WE3+`Hqh1}ZYDaZFkwi*n5ct4VUXXz?~tF69Vf#C$Uwk`!P&tC5fW%?U!g#& zE0$ClJmTOEJf`Y?OuP zNlnvuYBca&hucz_neEbQxAEozO;73Y^G&q!NbjZT4_+AzOs3N*Cz&kj=V-!cY|-iV zh@uG7G?6G6y9UW_6&$vB2#5KklsR)V!}Q!M0BbEi2L?uhf^8A&~fWsR9l zhJ`=ykgc-``MUF)pvJX*HYNl*(v|qOhZ<*grU=(|IP7&2V)555O-y Wl8#`4I>|Bs00000#LT=By}Z;C1rt3( zJ<}BT2#_@%o-U3d8o|j593jCy|D{E4HgEhZq;4Ut!gq*AY;RZsX9 zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bvvg{@d{bvu*3Ts_759sTg>o9TAGWz~) z9D-2O0|oxwfI!dg>Bge#Z*9bWcFQ=*;yyv_J^86;m1U z9hZ9K&GjIb!Jv#Vdu%XXX_`nvC%1U;%+Qm|sB4x6xv~r(MDQ&DLktEkODtsRa#}kg z#LRPZ5$7~wR+ zbj0cijTn70QvZ3v9J&Hxfx zcg`-4UavcIowF-w6oqK8M$*YC)ENVVrjnLMo4do@FL_g9{uOWfC+1YA?*Cv;b?O## zUwQk6wGzjP!h@h*g*~PhH#D}yM#xA%S?1_M?h}$41DeK?3Ltx+&LFW*P~5f;u^(ko zt9$Ys&C2kS(_$y!Rf%N)ZVK#V2ZoBrP%Oa4XxzdbL#Z z<}SL4)oZ}rs#Q$`+3w|LIyZjrGq-8593MghYAPtb8CZotW?9m}XbZ1h-XqJ*|WaIa46NIv%CJx zEK`dENZn}AxdzCXv%kIPI%UG{#~quwsM8cy%d%nHX^T!ay>spwTTl|Oji8!Y zmNl{7E_uq(yz)E$cgSfbWYQy z@KrjJ6)I-$TqZ@)A0q483l5LGO%~ZTSZEFNqm)#= z1A%{RKT@(@DjJ~y_%Bjp(gj2-6l;}nbp6y*tDC)pA4OT~LV`bj{tM`mIPb2_c-_Na zboDnrV)I8R;NyD$000JJOGiWi{{a60|De66lK=n!32;bRa{vGi!vFvd!vV){sAK>D z00(qQO+^Re2?z`hC#Ey#lK=n!|4BqaR2b6*!B0!VU;x13-?lg1Z0b!a238PMP?wS* z>Qcg>Q(qv2?tP8G56~y**0BORbXF({)DRH@Er}#DG%+WpoZ#Vad^DGIO^wp*;lshfQ9z@uh n9;<75tUida`(58|%0l@cb{=OGxF*Gr00000NkvXXu0mjf3qNDj literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/warden.png b/src/main/resources/8x8/warden.png new file mode 100644 index 0000000000000000000000000000000000000000..73f54eeabaf15b160d91c0443d2e1fc52486f989 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U45&=FTt~|n0yy9{^%38eAik#dc zT-wH*c0Q~Yt|gumGJ$FgJY5_^IIbsqX!~oYbA$#3B?*X$m?R_^a0w+OhzS^^2ow|+ krU)4DCZ!~VnT4@1w60)XcO_hH9Z)ZWr>mdKI;Vst0KIh`n*aa+ literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/zoglin.png b/src/main/resources/8x8/zoglin.png new file mode 100644 index 0000000000000000000000000000000000000000..79f5e19f30507cf5de31fe24ccad4ed74aa8cd39 GIT binary patch literal 1650 zcmV-&295cNP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxmK!My{bv=k1cU&=a(JGT9nA9Q@-Ssr>~zwZ zs#29(~ z^lj@W$ldjV*e%bmawTQk3EL1I!}H?ddCa$7*oN3FIqlyn?)Q>?3VnY}*=D!#`)?~q zMs={qMw!OM8sA}f;q^)Qczhf7LkV|c<~Zf_K6mO&Z^=8eTkdq)a(+#P(ta!WTaLDz z+)d8Mjd_WPF3&FyY|)~huczGgUPJF~tu9%QOnJ2z^;pWBK{3M=&(}O|!N*}P^NzR! zmRNvT1)3RmQ54A_+np>`O4O;%u~0#X)-)p+jVXqwEU=hp%1AofaZ@(}7^>m`ObSqA zh|P(Grr$XI6$NTK01hR` z&MN1ecjAJJE_wFWJMX>t(W8>ESaIS-BuJDLIN0EV4-!I%Aw?4zEzCt9Ma2+fObJdC zOeegZppjBGnX}C<`z$%+m{S3LiY>1AA|;eqQZ7cezeMOCK$o(2M+Ncf0?9`JBHHbwXCTO%1H!uTY#u5;hfdB|? z24*^twPqkUFw@bXD4YRmO`#+FV1GZOs7Lo~R>`Cv(E_qB$E|x=iNUL2!;TE+z(xsY8x1a4f zw_dHp&6StO>RB&*H1Tz4>csY!p{cie-v~`jamy>+Epe+yIg@qx^U3=)8$12$D9P6` zcU1)`HMsde>)SY5>W4>1rFEG`6$pxAc!I!bftX`1ail;fdo-y>@!oUHZrHuFy|)t;E`D%6iaJrL;@)nZSu z+E1zS7XqE8?g&+lD_I@Gk@8N#_40dYdI+1i}%q?@@2u5LxO(`@}gc%1I%nk*{)A_LV2 z8T=HgU$ls;`WIrYaPyz)U;W$=DDB?oaH@UertMA=K$BC#D^y1fRiHiu;TF3hUzAI` zxmL^g&*ko4ee6_!7?|3T{eECoZ;m@`5{J%4<^9e{V&8Q!_lNK)V3f>i5_vntL91@g z*C5p&CdazB5aAQw&h86sX>(0Iw`%hj;i;GS{vtdz>)sr~$%lgL%0D(vqBsoq5StsvE#DBlO!YgGRM zL6ZGm3$Qf%00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000Mc zNliruM{* z{sx_#)Wx`UaB+5WWRk68H{yUSl%XS$B5t+RYV8I?lZG4b-a84{0$e@WoMi^RngKxT z`W66%z4U4ZlF;@mr0Ha`4Z}~|nZtu(BN|NrviKVSIZ4x!4l0|%5*k5e!_8_`JiNT! z1CU1%=Z6+n%Pb`&NmB-$I{==Cmter(dQq%DzsS0-Q&&|+^GA-`C%pbosn#{V4g^Q1 w9h5xFu=;&G&m)Nw+{j_<`@DZFxiGuz02!o2T9@#PrvLx|07*qoM6N<$f>>!000000 literal 0 HcmV?d00001 diff --git a/src/main/resources/8x8/zombiepigman.png b/src/main/resources/8x8/zombiepigman.png index 79c9532246a64668ed6c27afee2ec39c75f993de..ce6af71104d52be32919726fb0df2ec46bf3b188 100644 GIT binary patch delta 1742 zcmV;<1~K{W2;B{kBYy>SdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxw(BMg z{bv*%0+M(Rhv!!ajA~&|SaA~)jqfmak@-pZIDE6Xp@fmPoIhiy z_VNMVUOlkWY02ds3Z>mra1V@@oa{p`dmDc9h|bP$H*C;ezg{oc^@hPJ zmP;1IbL0ZhNz543*-MnFB!G_s)&yeSzRXpH8|r<8 zE|Cr!EBM7DYT(9TZhS)vgiv3Y+6&)nsF%3WFT@HMw0{@O0S8PvPZQbFi7mN!7U)@R zl%A~IpmmALHHC?Y;nbx zP-01yt5l?ab=9jHYOJYILnt-VY;(=G&|*s+vDT%VZoBKghaP*{tSwgGS)&JYzh;dV zYlAU!>G{JN#NOW~Xp|E>I0IvB2#ou|00No^XMZ}7F+7+Xoax9&3d>-P>>#JoU|6ooH>K1c9dHcXxO;<;ei=dH(15+&>g{^fC34fy{ zeV$7nGsjSFNtbqsGU^n{IF<_iOt@Y5kqDP;h^n8mmZio0e00|$i`>4Cu03beZM8fza{L8t*UEX6EHe1hRP(j6Rr^}Pmij5p)ReiU z`Y|H`#*ApBE@iIAJHwY*t%XNNxr{fa;_llcu*XUy?PIo@=HY|1X0}x2DMssL^9_P@ z`xe2{7oX7k*V%%(Z@F9_r)=D(so)%McYkf2LKC}dYCj$3(a>bWEwg2EN!y~GymzB} z%x^)dUa4PaGrT3XJ&7j2cox*FTP?L=2-0MF_Q&4bw(7P6liTts9E)LE%*f`Vry)En z6LWnCs}v_=hlH-na>w%av9)WZ248OPQ}ficlF!~|J)TRCZTnsNN**l@E~_t|{(rWk z>Winp?Wp?V=`S69&Qi0RM{_&lsQDFUA)t@k(lpP5B3yX~l}jtPGlEoo4@bYEA04gp z2FcONNtF55G*NGPi000JJOGiWi{{a60|De66lK=n!32;bR za{vG?BLDy{BLR4&KXw2B00(qQO+^Rf1{(zw1rb&^I{*Lx>PbXFR2b7W&b>~;Pyj&T z!>t617Vu(o>F7c*F>GwEJ^;oSaMjh#MF&@j1JQ*vmJkPnlVf=S7Jp5{KpKN%X(b`0 z#J|Mg)H8p>$+)h&0*L1^&#zY`!Gg~I8GpG=0EAKsr4-d#mGyENfMn>ACj7CFKlTa3 zkduRJ46A_H()peRXg^CtuX|7XrbW>(xNJ2!(i>2zU>%&?=n>egFUf07*qoM6N<$f{p=A_y7O^ delta 1114 zcmV-g1f~1k4ekh#BYy)PX+uL$Nkc;*P;zf(X>4Tx0C)j~RNrgUP!#^!Wu36$i#lf! z2|j3%Ze&w*L!7p2SGvtw>Nd9_NSmf@T$;ut?S8Na*^6&F#dq-sKKTa>*@JI;k`2Zb zVfd_wB24xov!0tYO(#quxIj3VY2fn>*v^3zPn zk}iupt3^^T<$q*FvJCd{A9I89U$Cf@>6@+R5RGk`8BWoBirybNeQ=EC0M)@iUl_eX zxSeoVHshl;enQP8t`R1^=k9cAnC)enmsu$iB^)HYVpOg(Y-#2T1BsgE)9v(7lCYmN zzce#h^W*JMl?3ZC#r5_}M)bP9*V~bk2jew9rzzHdK!5(d_w{m$<$03u>$Dz?)%07E zI#%1;*nHIFV_d2 zyUbnT`nd?LE^;G|!WZ>Ld?E0@Grm4ww{M7Hr+?eN(`4(TFs=Kd|oW;726*? zo`1K1kvrRCtvzjFx{E$mtJ`!gTOI+s53ALm&#Kkk=j4A2c%%FVsUr&3!l7R>0003C zNklR2n z4YR#=icvRMT29jK{Sl3-$P*!OJzuBoP_s-@lPS!qg*sgsP`Z|lFYJd%OcClLqCd5< zJ0l)4JED4hCG2KXxJltD+!Tb_sPX({@T3HCg8%>k diff --git a/src/main/resources/allay.png b/src/main/resources/allay.png new file mode 100644 index 0000000000000000000000000000000000000000..4b69b929aea1a6d0998ad0a484512f307b253391 GIT binary patch literal 254 zcmV^a}}N$CH9{r{%+{Mq{c;^*g!?)-E6|KsQ9lk)!L`~JZ8 z{o&{5X6N~2{QRymjR^n%0C!15K~xyiWsHpu!ypI-KV20{{cZdH&st>8EZdoo+(AUG zHC@TLk_trRwNQcgeqX5khf>P6P=Rv}G%=Y0_yj#{A~(@3(p1Lc2q6>Y5Dq)VcYrYh zFv2iq*3g)n1{Lu38<@}DGjs0!93jSNKig25f!_@}ZRHnxguOl>VNM z<2V3mc3QM^R zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1e?jx;9>{Ld+J1TZ$3zJ_e_rP^c;4^!#oxxae)kR#x*|T~ z`I?5!ujrT0g3Q+ceD8O;***5S)N<2STJ6+hNBZ~Fv+LSRuOkdl zY4DJdMjkrKs1sb9aq^UzW}Z6BtS@SY>UY$_59IzCwP2_%#CXrkAJovD^W7pWIgy1K z5F-viJTC-5Xj+(g4a~HVTbTJmND3jK7G#0b!$J%Q@(3g|yx4t^`$ycI@V~;1{th{} zp!+|Na|=2{?ytE00<~UuMTr}rm4z#&K28YRlw3(GJ%e~AT}`b_VX_1kguLtqD}uSl zTI-1C?nGhbXSZBZFXL+LpiO^-aWQ;CE~M2S7NSa zK{-8MdDNyo))+XgE~w_|dN4Vm$H9I9FKk5!>A3#{KW$$xyPDf z5NrpqPf^b4d;M(Ql026~1LSiXloC_uZ(Po0ti&&eg0iY8}YxHhqY1o~2B8LZNh0S8CAGgIU0B z!~)GwvFkp&G%O7vZ)wD21SFL=P0z9=6ZJZo&#qw2UG1#&_IEZ{cB+_{;td)hDwH-(tI1 zIwS)Dj6*ODBb8^Gu(RA8@y#HtI2jdFFXXjla`WQ+btlF?FKt5XIX*@y<*v4QLQIZ} z<&F9Iq$MM7(T=L0QiOZ6h5u2I@G4fg!q<@<`B+BHRA-DCIlftm+JCdD6Ye;2b!Od) zswv2%0jeNPZOq|9c8fLi-n0kT!Z+MxXQ`ps`5Jx&*xt25=SB*a{hh;*(r!-UMpx3C zf3FVX%DG5tVFVSLWmH|iINYfoSE_xy+#Vhm&-C5{gr@0>*LxF6?CrJz>(1Em+^Y)W z+~ie2ZC2)<)_fHst6j7}+IyL6!`*9wkF{khWZr7L_ogHGO?i$A9OM>At82)4M$_H) zrG-_}XU+UH`E@3lF}5z;k+#!r{ZGW8^3>1qN=fE{|Kglw=hcBvLhWmwJN1sGU$Oo8 zMmH^zn4aWNZpFW*?u~GHbbMQ`726}@K8;J6`x9#yZd*1Fa8UpN00v@9M??Vs0RI60 zpuMM)00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;y6Ac+V`HKaU0008!Nkld>4kkz;F18u=iO&09pZ#ayn%4@&cvn%r!cw zxC#hx22)&8noE>!5GO69iqYPecn>DCl-A=dNL4{;jSm)K4MKpmmdUJSI`h=1upB=RytQ0m@gSEq423?ZNA6n_fJ`B zBv_Lmg2Oq35E>QDQ>#ht-pu&o<9%MQ2(o?+m0I-RSR-}d&QhDZD;1L0a*DiD4WItM{4S*rFOGG~E#~haeh&1A9*9u5cW^&rb9< zJEJ;}e(UnbPY=-#o&l$xl|kU6R$#FLw*n}s@IerQBZLvgW%R9MCl5Rv2KLW9^gzRH zxEyit%dgye(Is0Qz|9nqTm!2SfY6JOr(`FO=j+GsNwk2!qs14q2T ze6xbNI9cZI5oKl*xjE!8+TUF%n5R3)sXGDjEQrTgq8L(qVh^8as~-EEF_U zivIG$1cb&@VZIU3iUnp0X#_g>SHM(arZKG;K7A+f$(lkUAXxN!D|Mt)L{Ur>M?^|c zOaf9^su%#WaZEAMw5x*Voj_?6WhwFAp_?^@REi{4C@ry8U`?Pb1WEZSu`C46ND?im hCjl2L3Zw82{s-`#c}<`iKW_j4002ovPDHLkV1m#M3F!a; literal 0 HcmV?d00001 diff --git a/src/main/resources/camel.png b/src/main/resources/camel.png new file mode 100644 index 0000000000000000000000000000000000000000..e263229d4754f4faed308371d9cb50ed2547d0f1 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWbuaLF_Uze*jeRdWg8%>j z4-^hxvV;{#F_r}R1v5B2yO9RuD0sR!hHzX@PH13sR9zY%?&#>q#FH$ba3CP4NlR@m aBSXFif99{ktyh6+89ZJ6T-G@yGywpU`zL|` literal 0 HcmV?d00001 diff --git a/src/main/resources/chest-boat.png b/src/main/resources/chest-boat.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4115bab51e77894d36a33aee9960e42a36655e GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!cYsfbt9yaZ%y!2WWm^52vX^%U z>|EvLYHN7&P~5X;&z9yWYO2USK9f}*soR&R+8iT4DMQ=URLWRSHP2U}y1LrTKrO^h zZ0XXaCr+H0IC0{&8H=5O#xj-!`2{mLJiCzw-I- zrA6RVg literal 0 HcmV?d00001 diff --git a/src/main/resources/cod.png b/src/main/resources/cod.png new file mode 100644 index 0000000000000000000000000000000000000000..572f492fcf407e58d7ee9a550d0815a1a967dc01 GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt3( zJ<}BT2#_`3JY5_^Ed2LQ*vRb|D01xl|Hu3rIvS@sO%$0uX~lMf87(OX4kUa!mEfc@ z+sIIg=il7p-*??Fu6$zn4J9m3>*xxSZV(u1=Cwd1Aq#mTIt7o)u3e`zBu=!nf z3~5^0aemvOcel=0`7toay0Kn4)wX0NrmdKI;Vst0C