From e412c2cc05cfc56154f54f0a75bbf63e0fe48186 Mon Sep 17 00:00:00 2001 From: Sam Date: Mon, 21 Aug 2017 21:11:13 +0100 Subject: [PATCH] Gem Hunter Mount Skins --- .../moba/HeroSkinCategoryPage.java | 4 +- .../moba/HeroSkinGadgetPage.java | 2 +- .../mineplex/core/gadget/GadgetManager.java | 24 +- .../gemhunters/GemHuntersMountGadget.java | 28 ++ .../gemhunters/GemHuntersMountType.java | 55 ++++ .../moba/{ => skins}/HeroSkinGadget.java | 3 +- .../moba/{ => skins}/HeroSkinGadgetData.java | 3 +- .../core/gadget/types/GameModifierGadget.java | 2 +- .../mineplex/core/reward/RewardManager.java | 2 +- .../arcade/game/games/moba/kit/HeroKit.java | 2 +- .../src/mineplex/gemhunters/GemHunters.java | 8 +- .../gemhunters/death/DeathModule.java | 49 +-- .../mineplex/gemhunters/mount/GHMount.java | 23 -- .../mineplex/gemhunters/mount/MountData.java | 44 ++- .../gemhunters/mount/MountModule.java | 282 +++++++++++++++++- .../persistence/PersistenceModule.java | 11 +- 16 files changed, 462 insertions(+), 80 deletions(-) create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountGadget.java create mode 100644 Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountType.java rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/{ => skins}/HeroSkinGadget.java (96%) rename Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/{ => skins}/HeroSkinGadgetData.java (87%) delete mode 100644 Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/GHMount.java diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinCategoryPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinCategoryPage.java index fb7c28275..acb901856 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinCategoryPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinCategoryPage.java @@ -20,8 +20,8 @@ import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.cosmetic.ui.page.GadgetPage; import mineplex.core.cosmetic.ui.page.gamemodifiers.GameCosmeticCategoryPage; import mineplex.core.donation.DonationManager; -import mineplex.core.gadget.gadgets.gamemodifiers.moba.HeroSkinGadget; -import mineplex.core.gadget.gadgets.gamemodifiers.moba.HeroSkinGadgetData; +import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadget; +import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadgetData; import mineplex.core.shop.item.ShopItem; public class HeroSkinCategoryPage extends GadgetPage diff --git a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinGadgetPage.java b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinGadgetPage.java index b710b9a22..e3493189d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinGadgetPage.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/cosmetic/ui/page/gamemodifiers/moba/HeroSkinGadgetPage.java @@ -11,7 +11,7 @@ import mineplex.core.cosmetic.CosmeticManager; import mineplex.core.cosmetic.ui.CosmeticShop; import mineplex.core.cosmetic.ui.page.GadgetPage; import mineplex.core.donation.DonationManager; -import mineplex.core.gadget.gadgets.gamemodifiers.moba.HeroSkinGadgetData; +import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadgetData; import mineplex.core.shop.item.ShopItem; public class HeroSkinGadgetPage extends GadgetPage diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java index c334aec20..ec959c3db 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/GadgetManager.java @@ -101,9 +101,11 @@ import mineplex.core.gadget.gadgets.flag.FlagType; import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticCategory; import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticManager; import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticType; +import mineplex.core.gadget.gadgets.gamemodifiers.gemhunters.GemHuntersMountGadget; +import mineplex.core.gadget.gadgets.gamemodifiers.gemhunters.GemHuntersMountType; import mineplex.core.gadget.gadgets.gamemodifiers.minestrike.GameModifierMineStrikeSkin; import mineplex.core.gadget.gadgets.gamemodifiers.minestrike.MineStrikeSkin; -import mineplex.core.gadget.gadgets.gamemodifiers.moba.HeroSkinGadget; +import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadget; import mineplex.core.gadget.gadgets.gamemodifiers.moba.emblems.EmblemGadget; import mineplex.core.gadget.gadgets.gamemodifiers.moba.emblems.EmblemType; import mineplex.core.gadget.gadgets.gamemodifiers.moba.shopmorph.ShopMorphGadget; @@ -776,6 +778,26 @@ public class GadgetManager extends MiniPlugin }; } }; + + new GameCosmeticType(this, GameDisplay.GemHunters) + { + @Override + public void addCategories() + { + new GameCosmeticCategory(this, "Mount Skins", new ItemStack(Material.SADDLE), false) + { + @Override + public void addGadgets() + { + for (GemHuntersMountType type : GemHuntersMountType.values()) + { + addGameGadget(new GemHuntersMountGadget(getManager(), this, type)); + } + } + }; + } + }; + for (GadgetType gadgetType : GadgetType.values()) { if (!_gadgets.containsKey(gadgetType)) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountGadget.java new file mode 100644 index 000000000..ee9b7f02e --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountGadget.java @@ -0,0 +1,28 @@ +package mineplex.core.gadget.gadgets.gamemodifiers.gemhunters; + +import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticCategory; +import mineplex.core.gadget.types.GameModifierGadget; + +public class GemHuntersMountGadget extends GameModifierGadget +{ + + private final GemHuntersMountType _type; + + public GemHuntersMountGadget(GadgetManager manager, GameCosmeticCategory category, GemHuntersMountType type) + { + super(manager, category, type.getName() + " Mount", new String[] { + C.cGray + "Changed your active Mount", + C.cGray + "in " + F.greenElem("Gem Hunters") + "to " + type.getName() + ".", + }, -7, type.getMaterial(), type.getMaterialData()); + + _type = type; + } + + public GemHuntersMountType getType() + { + return _type; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountType.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountType.java new file mode 100644 index 000000000..a6aeca4ff --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/gemhunters/GemHuntersMountType.java @@ -0,0 +1,55 @@ +package mineplex.core.gadget.gadgets.gamemodifiers.gemhunters; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Horse.Variant; + +import mineplex.core.disguise.DisguiseManager; +import mineplex.core.utils.UtilVariant; + +public enum GemHuntersMountType +{ + + DONKEY("Donkey", Material.CHEST) + { + @Override + public Horse spawn(Location location, DisguiseManager manager) + { + return UtilVariant.spawnHorse(location, Variant.DONKEY); + } + }; + + private final String _name; + private final Material _material; + private final byte _materialData; + + GemHuntersMountType(String name, Material material) + { + this(name, material, 0); + } + + GemHuntersMountType(String name, Material material, int materialData) + { + _name = name; + _material = material; + _materialData = (byte) materialData; + } + + public abstract Horse spawn(Location location, DisguiseManager manager); + + public String getName() + { + return _name; + } + + public Material getMaterial() + { + return _material; + } + + public byte getMaterialData() + { + return _materialData; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/HeroSkinGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/skins/HeroSkinGadget.java similarity index 96% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/HeroSkinGadget.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/skins/HeroSkinGadget.java index 6aa9afb3d..2c5325780 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/HeroSkinGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/skins/HeroSkinGadget.java @@ -1,4 +1,4 @@ -package mineplex.core.gadget.gadgets.gamemodifiers.moba; +package mineplex.core.gadget.gadgets.gamemodifiers.moba.skins; import java.util.ArrayList; import java.util.HashMap; @@ -15,7 +15,6 @@ import mineplex.core.common.skin.SkinData; import mineplex.core.common.util.C; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticCategory; -import mineplex.core.gadget.types.GadgetType; import mineplex.core.gadget.types.GameModifierGadget; import mineplex.core.game.GameDisplay; import mineplex.core.google.GoogleSheetsManager; diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/HeroSkinGadgetData.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/skins/HeroSkinGadgetData.java similarity index 87% rename from Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/HeroSkinGadgetData.java rename to Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/skins/HeroSkinGadgetData.java index 89171c3cd..eb7df252a 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/HeroSkinGadgetData.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/gamemodifiers/moba/skins/HeroSkinGadgetData.java @@ -1,6 +1,7 @@ -package mineplex.core.gadget.gadgets.gamemodifiers.moba; +package mineplex.core.gadget.gadgets.gamemodifiers.moba.skins; import mineplex.core.common.skin.SkinData; +import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadget; import mineplex.core.reward.RewardRarity; public class HeroSkinGadgetData diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GameModifierGadget.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GameModifierGadget.java index d2de35a7b..3afd9c193 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GameModifierGadget.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/types/GameModifierGadget.java @@ -27,7 +27,7 @@ public class GameModifierGadget extends Gadget if (message) { - UtilPlayer.message(player, F.main("Gadget", "You enabled " + F.elem(getName()) + ".")); + UtilPlayer.message(player, F.main("Gadget", "You enabled " + F.name(getName()) + " (" + F.name(_category.getCategoryName()) + ").")); } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java b/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java index 1730921da..225a47e10 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/reward/RewardManager.java @@ -60,7 +60,7 @@ import mineplex.core.gadget.gadgets.doublejump.DoubleJumpSpring; import mineplex.core.gadget.gadgets.doublejump.DoubleJumpStorm; import mineplex.core.gadget.gadgets.flag.FlagType; import mineplex.core.gadget.gadgets.gamemodifiers.minestrike.MineStrikeSkin; -import mineplex.core.gadget.gadgets.gamemodifiers.moba.HeroSkinGadget; +import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadget; import mineplex.core.gadget.gadgets.gamemodifiers.moba.shopmorph.ShopMorphType; import mineplex.core.gadget.gadgets.hat.HatType; import mineplex.core.gadget.gadgets.item.ItemBatGun; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/kit/HeroKit.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/kit/HeroKit.java index 67a9f445f..17466df50 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/kit/HeroKit.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/moba/kit/HeroKit.java @@ -18,7 +18,7 @@ import mineplex.core.common.util.UtilItem; import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilServer; import mineplex.core.disguise.disguises.DisguisePlayer; -import mineplex.core.gadget.gadgets.gamemodifiers.moba.HeroSkinGadget; +import mineplex.core.gadget.gadgets.gamemodifiers.moba.skins.HeroSkinGadget; import mineplex.core.game.GameDisplay; import mineplex.core.itemstack.ItemBuilder; import mineplex.core.recharge.Recharge; diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java index ab31ea615..410034ebb 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/GemHunters.java @@ -80,6 +80,7 @@ import mineplex.gemhunters.loot.InventoryModule; import mineplex.gemhunters.loot.LootModule; import mineplex.gemhunters.map.ItemMapModule; import mineplex.gemhunters.moderation.ModerationModule; +import mineplex.gemhunters.mount.MountModule; import mineplex.gemhunters.persistence.PersistenceModule; import mineplex.gemhunters.playerstatus.PlayerStatusModule; import mineplex.gemhunters.quest.QuestModule; @@ -247,8 +248,7 @@ public class GemHunters extends JavaPlugin // Menus new MenuManager(this); - // Gadgets, used for mounts, lots of managers for something really small - // :( + // Gadgets CastleManager castleManager = new CastleManager(this, clientManager, hologramManager, false); MountManager mountManager = new MountManager(this, clientManager, donationManager, blockRestore, disguiseManager); PetManager petManager = new PetManager(this, clientManager, donationManager, inventoryManager, disguiseManager, creature, blockRestore); @@ -261,8 +261,7 @@ public class GemHunters extends JavaPlugin cosmeticManager.setActive(false); cosmeticManager.setHideParticles(true); cosmeticManager.disableTeamArmor(); - gadgetManager.setGadgetEnabled(false); - + // Tutorials TextTutorialManager tutorialManager = new TextTutorialManager(this, donationManager, new TaskManager(this, clientManager)); tutorialManager.addTutorial(new GemHuntersTutorial()); @@ -282,6 +281,7 @@ public class GemHunters extends JavaPlugin require(ItemMapModule.class); require(JoinModule.class); require(ModerationModule.class); + require(MountModule.class); require(PersistenceModule.class); require(PlayerStatusModule.class); require(QuestModule.class); diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/DeathModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/DeathModule.java index 367f5f5e8..cf5a05dcc 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/DeathModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/death/DeathModule.java @@ -1,20 +1,11 @@ package mineplex.gemhunters.death; -import com.google.common.collect.Sets; -import mineplex.core.MiniPlugin; -import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.common.util.C; -import mineplex.core.common.util.UtilPlayer; -import mineplex.core.common.util.UtilServer; -import mineplex.core.common.util.UtilTextMiddle; -import mineplex.core.common.util.UtilTime; -import mineplex.core.stats.StatsManager; -import mineplex.core.updater.UpdateType; -import mineplex.core.updater.event.UpdateEvent; -import mineplex.gemhunters.death.event.PlayerCustomRespawnEvent; -import mineplex.gemhunters.playerstatus.PlayerStatusModule; -import mineplex.gemhunters.playerstatus.PlayerStatusType; -import mineplex.gemhunters.spawn.SpawnModule; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Material; @@ -33,11 +24,22 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import com.google.common.collect.Sets; + +import mineplex.core.MiniPlugin; +import mineplex.core.ReflectivelyCreateMiniPlugin; +import mineplex.core.common.util.C; +import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTextMiddle; +import mineplex.core.common.util.UtilTime; +import mineplex.core.stats.StatsManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.gemhunters.death.event.PlayerCustomRespawnEvent; +import mineplex.gemhunters.playerstatus.PlayerStatusModule; +import mineplex.gemhunters.playerstatus.PlayerStatusType; +import mineplex.gemhunters.spawn.SpawnModule; /** * This module handles anything to do with a players death @@ -46,9 +48,8 @@ import java.util.UUID; public class DeathModule extends MiniPlugin { - // Some items like the cash out item (and for some reason players drop - // bones?) don't need to be dropped to avoid duplication. - private static final Set DISALLOWED_DROPS = Sets.newHashSet(Material.EMERALD, Material.MAP, Material.BONE, Material.STAINED_GLASS_PANE); + // Don't need to be dropped to avoid duplication. + private static final Set DISALLOWED_DROPS = Sets.newHashSet(Material.EMERALD, Material.MAP, Material.STAINED_GLASS_PANE); private static final int DEATH_ANIMATION_TIME = 7000; private static final int DEATH_ANIMATION_COUNTDOWN = 2000; @@ -240,7 +241,7 @@ public class DeathModule extends MiniPlugin _toRemove.remove(event.getPlayer().getUniqueId()); } - private boolean isRespawning(Entity player) + public boolean isRespawning(Entity player) { return _toRemove.containsKey(player.getUniqueId()); } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/GHMount.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/GHMount.java deleted file mode 100644 index f63d2d958..000000000 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/GHMount.java +++ /dev/null @@ -1,23 +0,0 @@ -package mineplex.gemhunters.mount; - -import org.bukkit.entity.LivingEntity; - -import mineplex.core.disguise.disguises.DisguiseLiving; - -public class GHMount -{ - - private final LivingEntity _entity; - private final DisguiseLiving _disguise; - - public GHMount(LivingEntity entity, DisguiseLiving disguise) - { - _entity = entity; - _disguise = disguise; - } - - public LivingEntity getEntity() - { - return _entity; - } -} diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountData.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountData.java index ea08c0083..eed694267 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountData.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountData.java @@ -1,11 +1,51 @@ package mineplex.gemhunters.mount; -import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; public class MountData { - private LivingEntity _entity; + private final Player _player; + private Horse _entity; + private long _cooldown; + private ItemStack _item; + MountData(Player player) + { + _player = player; + } + public Player getPlayer() + { + return _player; + } + + public void onSpawn(Horse entity, long cooldown, ItemStack item) + { + _entity = entity; + _cooldown = cooldown; + _item = item; + } + + public void onRemove() + { + _entity = null; + } + + public Horse getEntity() + { + return _entity; + } + + public long getCooldown() + { + return _cooldown; + } + + public ItemStack getItem() + { + return _item; + } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountModule.java index dcac93f38..62458c0f3 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/mount/MountModule.java @@ -1,16 +1,44 @@ package mineplex.gemhunters.mount; import java.util.UUID; +import java.util.concurrent.TimeUnit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Horse.Variant; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDeathEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.HorseInventory; +import org.bukkit.inventory.ItemStack; +import mineplex.core.Managers; import mineplex.core.MiniClientPlugin; import mineplex.core.ReflectivelyCreateMiniPlugin; -import mineplex.core.common.util.UtilEvent; -import mineplex.core.common.util.UtilEvent.ActionType; +import mineplex.core.command.CommandBase; +import mineplex.core.common.Rank; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilMath; +import mineplex.core.disguise.DisguiseManager; import mineplex.core.gadget.GadgetManager; +import mineplex.core.gadget.gadgets.gamemodifiers.GameCosmeticManager; +import mineplex.core.gadget.gadgets.gamemodifiers.gemhunters.GemHuntersMountGadget; +import mineplex.core.game.GameDisplay; +import mineplex.core.recharge.Recharge; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; +import mineplex.core.utils.UtilVariant; import mineplex.gemhunters.loot.LootItem; import mineplex.gemhunters.loot.LootModule; @@ -18,6 +46,12 @@ import mineplex.gemhunters.loot.LootModule; public class MountModule extends MiniClientPlugin { + private static final ItemStack SADDLE = new ItemStack(Material.SADDLE); + private static final int HEALTH = 40; + private static final int MAX_DIST = 25 * 25; + private static final int MIN_DIST = 4 * 4; + + private final DisguiseManager _disguise; private final LootModule _loot; private final GadgetManager _gadget; @@ -25,24 +59,42 @@ public class MountModule extends MiniClientPlugin { super("Mount"); + _disguise = require(DisguiseManager.class); _loot = require(LootModule.class); _gadget = require(GadgetManager.class); } + @Override + public void addCommands() + { + addCommand(new CommandBase(this, Rank.DEVELOPER, "showmethemounts") + { + + @Override + public void Execute(Player caller, String[] args) + { + Managers.require(GameCosmeticManager.class).getGadgetFrom("Donkey Mount").enable(caller); + } + }); + } + @Override protected MountData addPlayer(UUID uuid) { - return new MountData(); + return null; + } + + @EventHandler + public void playerJoin(PlayerJoinEvent event) + { + Player player = event.getPlayer(); + + Set(player, new MountData(player)); } @EventHandler public void playerInteract(PlayerInteractEvent event) { - if (event.isCancelled() || !UtilEvent.isAction(event, ActionType.R)) - { - return; - } - Player player = event.getPlayer(); LootItem lootItem = _loot.fromItemStack(player.getItemInHand()); @@ -52,12 +104,6 @@ public class MountModule extends MiniClientPlugin } String metadata = lootItem.getMetadata(); - - if (!metadata.startsWith("MOUNT")) - { - return; - } - String[] split = metadata.split(" "); if (split.length < 2) @@ -65,8 +111,214 @@ public class MountModule extends MiniClientPlugin return; } - int cooldown = Integer.parseInt(split[1]) * 1000; + String cooldownString = split[1]; + long cooldown; + try + { + cooldown = TimeUnit.MINUTES.toMillis(Integer.parseInt(cooldownString)); + } + catch (IllegalArgumentException e) + { + return; + } + if (!Recharge.Instance.usable(player, getName(), true) || !Recharge.Instance.use(player, "Mount Interact", 250, false, false)) + { + return; + } + + MountData data = Get(player); + + if (data.getEntity() != null) + { + player.sendMessage(F.main(_moduleName, "You already have an active mount.")); + return; + } + + Location location = player.getLocation().add(0, 1, 0); + GemHuntersMountGadget gadget = (GemHuntersMountGadget) _gadget.getGameCosmeticManager().getActiveCosmetic( + player, + GameDisplay.GemHunters, + "Mount Skins" + ); + + Horse horse; + + if (gadget == null) + { + horse = UtilVariant.spawnHorse(location, Variant.HORSE); + } + else + { + horse = gadget.getType().spawn(location, _disguise); + } + + String name = player.getName(); + horse.setCustomName(name + "'" + (name.charAt(name.length() - 1) == 's' ? "" : "s") + " Mount"); + horse.setCustomNameVisible(true); + horse.setJumpStrength(1); + horse.getInventory().setSaddle(SADDLE); + horse.getInventory().setArmor(new ItemStack(lootItem.getItemStack().getType())); + horse.setDomestication(1); + horse.setMaxDomestication(1); + horse.setOwner(player); + horse.setTamed(true); + horse.setMaxHealth(HEALTH); + horse.setHealth(HEALTH); + UtilEnt.vegetate(player); + + data.onSpawn(horse, cooldown, lootItem.getItemStack()); + player.sendMessage(F.main(_moduleName, "You spawned your " + F.name(getName()) + ".")); + } + + @EventHandler + public void horseDeath(EntityDeathEvent event) + { + if (!(event.getEntity() instanceof Horse)) + { + return; + } + + Horse horse = (Horse) event.getEntity(); + + for (MountData data : GetValues()) + { + if (data.getEntity() == null || !horse.equals(data.getEntity())) + { + continue; + } + + event.getDrops().clear(); + event.setDroppedExp(0); + Recharge.Instance.use(data.getPlayer(), getName(), data.getCooldown(), true, true); + Recharge.Instance.Get(data.getPlayer()).get(getName()).Item = data.getItem(); + return; + } + } + + @EventHandler + public void playerDeath(PlayerDeathEvent event) + { + Player player = event.getEntity(); + + for (MountData data : GetValues()) + { + if (!player.equals(data.getPlayer()) || data.getEntity() == null) + { + continue; + } + + data.getEntity().remove(); + return; + } + } + + @EventHandler(priority = EventPriority.LOWEST) + public void playerQuit(PlayerQuitEvent event) + { + Player player = event.getPlayer(); + + for (MountData data : GetValues()) + { + if (!player.equals(data.getPlayer()) || data.getEntity() == null) + { + continue; + } + + data.getEntity().remove(); + return; + } + } + + @EventHandler + public void update(UpdateEvent event) + { + if (event.getType() != UpdateType.FASTER) + { + return; + } + + for (MountData data : GetValues()) + { + Player player = data.getPlayer(); + Horse horse = data.getEntity(); + + if (horse == null) + { + continue; + } + else if (horse.isDead() || !horse.isValid()) + { + data.onRemove(); + } + + double offset = UtilMath.offsetSquared(player, horse); + + if (offset > MAX_DIST) + { + horse.teleport(player); + } + else if (offset > MIN_DIST) + { + UtilEnt.CreatureMove(horse, player.getLocation(), 2); + } + } + } + + @EventHandler + public void horseInteract(PlayerInteractEntityEvent event) + { + if (!(event.getRightClicked() instanceof Horse)) + { + return; + } + + Player player = event.getPlayer(); + Horse horse = (Horse) event.getRightClicked(); + + for (MountData data : GetValues()) + { + if (player.equals(data.getPlayer()) || !horse.equals(data.getEntity())) + { + continue; + } + + player.sendMessage(F.main(_moduleName, "This is not your mount.")); + event.setCancelled(true); + return; + } + } + + @EventHandler + public void horseDamage(EntityDamageByEntityEvent event) + { + Entity damager = event.getDamager(); + Entity damaged = event.getEntity(); + + if (!(damager instanceof Player && damaged instanceof Horse)) + { + return; + } + + for (MountData data : GetValues()) + { + if (!damager.equals(data.getPlayer()) || !damaged.equals(data.getEntity())) + { + continue; + } + + event.setCancelled(true); + return; + } + } + + @EventHandler + public void horseInventoryClick(InventoryClickEvent event) + { + if (event.getClickedInventory() != null && event.getClickedInventory() instanceof HorseInventory) + { + event.setCancelled(true); + } } } diff --git a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java index aeaf4da47..6e51a9985 100644 --- a/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java +++ b/Plugins/mineplex-game-gemhunters/src/mineplex/gemhunters/persistence/PersistenceModule.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.List; import mineplex.core.common.util.UtilServer; +import mineplex.gemhunters.death.DeathModule; import mineplex.serverdata.Region; import org.bukkit.Location; import org.bukkit.entity.Player; @@ -37,6 +38,7 @@ public class PersistenceModule extends MiniPlugin private final CoreClientManager _client; private final CashOutModule _cashOut; + private final DeathModule _death; private final EconomyModule _economy; private final QuestModule _quest; private final InventoryModule _inventory; @@ -51,6 +53,7 @@ public class PersistenceModule extends MiniPlugin _client = require(CoreClientManager.class); _cashOut = require(CashOutModule.class); + _death = require(DeathModule.class); _quest = require(QuestModule.class); _economy = require(EconomyModule.class); _inventory = require(InventoryModule.class); @@ -75,7 +78,11 @@ public class PersistenceModule extends MiniPlugin Player player = event.getPlayer(); CoreClient client = _client.Get(player); - if (_cashOut.isAboutToCashOut(player)) + if (_death.isRespawning(player)) + { + return; + } + else if (_cashOut.isAboutToCashOut(player)) { runAsync(() -> { @@ -119,7 +126,7 @@ public class PersistenceModule extends MiniPlugin }); } - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.HIGHEST) public void playerDeath(PlayerDeathEvent event) { Player player = event.getEntity();