3.0.0-SNAPSHOT-U12

Finished setting up all mechanics, and finished the manager. Added HealthMechanic, NameMechanic, PotionMechanic, WeaponMechanic and fixed SettingsMechanic as well as adding a PotionEffectConverter
This commit is contained in:
AMinecraftDev 2018-06-27 23:43:25 +08:00
parent bebb0ba00c
commit be824fe0c1
20 changed files with 432 additions and 90 deletions

View File

@ -1,7 +1,8 @@
package net.aminecraftdev.custombosses;
import lombok.Getter;
import net.aminecraftdev.custombosses.managers.ItemStackManager;
import net.aminecraftdev.custombosses.managers.BossItemFileManager;
import net.aminecraftdev.custombosses.managers.BossMechanicManager;
import net.aminecraftdev.custombosses.utils.IReloadable;
import org.bukkit.plugin.java.JavaPlugin;
@ -12,13 +13,16 @@ import org.bukkit.plugin.java.JavaPlugin;
*/
public class CustomBosses extends JavaPlugin implements IReloadable {
@Getter private ItemStackManager itemStackManager;
@Getter private BossMechanicManager bossMechanicManager;
@Getter private BossItemFileManager itemStackManager;
@Override
public void onEnable() {
this.itemStackManager = new ItemStackManager(this);
this.itemStackManager = new BossItemFileManager(this);
reload();
this.bossMechanicManager.load();
}

View File

@ -4,6 +4,7 @@ import com.google.gson.annotations.Expose;
import lombok.Getter;
import lombok.Setter;
import net.aminecraftdev.custombosses.entity.elements.*;
import net.aminecraftdev.custombosses.utils.potion.holder.PotionEffectHolder;
import java.util.List;
@ -14,19 +15,19 @@ import java.util.List;
*/
public class BossEntity {
@Expose private final List<PotionElement> potions;
@Expose private final MainStatsElement mainStats;
@Expose private final EquipmentElement equipment;
@Expose private final MessagesElement messages;
@Expose private final CommandsElement commands;
@Expose private final SkillsElement skills;
@Expose private final HandsElement hands;
@Expose private final DropsElement drops;
@Expose @Getter private final List<PotionEffectHolder> potions;
@Expose @Getter private final MainStatsElement mainStats;
@Expose @Getter private final EquipmentElement equipment;
@Expose @Getter private final MessagesElement messages;
@Expose @Getter private final CommandsElement commands;
@Expose @Getter private final SkillsElement skills;
@Expose @Getter private final HandsElement hands;
@Expose @Getter private final DropsElement drops;
@Expose @Getter @Setter private String spawnItem;
@Expose @Getter @Setter private boolean editing;
public BossEntity(boolean editing, MainStatsElement mainStats, String spawnItem, EquipmentElement equipment, HandsElement hands, List<PotionElement> potions,
public BossEntity(boolean editing, MainStatsElement mainStats, String spawnItem, EquipmentElement equipment, HandsElement hands, List<PotionEffectHolder> potions,
SkillsElement skills, DropsElement drops, MessagesElement messages, CommandsElement commands) {
this.editing = editing;
this.mainStats = mainStats;
@ -39,36 +40,4 @@ public class BossEntity {
this.messages = messages;
this.commands = commands;
}
public MainStatsElement getMainStats() {
return mainStats;
}
public EquipmentElement getEquipment() {
return equipment;
}
public HandsElement getHands() {
return hands;
}
public List<PotionElement> getPotions() {
return potions;
}
public SkillsElement getSkills() {
return skills;
}
public DropsElement getDrops() {
return drops;
}
public MessagesElement getMessages() {
return messages;
}
public CommandsElement getCommands() {
return commands;
}
}

View File

@ -1,18 +0,0 @@
package net.aminecraftdev.custombosses.entity.elements;
import com.google.gson.annotations.Expose;
import lombok.Getter;
import lombok.Setter;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 14-May-18
*/
public class PotionElement {
@Expose @Getter @Setter private String type;
@Expose @Getter @Setter private int leve;
@Expose @Getter @Setter private long duration;
}

View File

@ -5,7 +5,7 @@ import net.aminecraftdev.custombosses.utils.ILoadable;
import net.aminecraftdev.custombosses.utils.IReloadable;
import net.aminecraftdev.custombosses.utils.ISavable;
import net.aminecraftdev.custombosses.utils.itemstack.ItemStackConverter;
import net.aminecraftdev.custombosses.utils.itemstack.ItemStackFileHandler;
import net.aminecraftdev.custombosses.utils.itemstack.handlers.ItemStackFileHandler;
import net.aminecraftdev.custombosses.utils.itemstack.holder.ItemStackHolder;
import org.bukkit.plugin.java.JavaPlugin;
@ -18,14 +18,14 @@ import java.util.Map;
* @version 1.0.0
* @since 03-Jun-18
*/
public class ItemStackManager implements ILoadable, ISavable, IReloadable {
public class BossItemFileManager implements ILoadable, ISavable, IReloadable {
@Getter private final ItemStackConverter itemStackConverter = new ItemStackConverter();
private Map<String, ItemStackHolder> itemStackHolders = new HashMap<>();
private ItemStackFileHandler itemStackFileHandler;
public ItemStackManager(JavaPlugin javaPlugin) {
public BossItemFileManager(JavaPlugin javaPlugin) {
File file = new File(javaPlugin.getDataFolder(), "items.json");
this.itemStackFileHandler = new ItemStackFileHandler(javaPlugin, file, true);

View File

@ -0,0 +1,59 @@
package net.aminecraftdev.custombosses.managers;
import net.aminecraftdev.custombosses.CustomBosses;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.mechanics.*;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.ILoadable;
import net.aminecraftdev.custombosses.utils.IMechanic;
import java.util.LinkedList;
import java.util.Queue;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class BossMechanicManager implements ILoadable {
private final CustomBosses customBosses;
private Queue<IMechanic> mechanicQueue;
public BossMechanicManager(CustomBosses customBosses) {
this.customBosses = customBosses;
}
@Override
public void load() {
this.mechanicQueue = new LinkedList<>();
this.mechanicQueue.add(new EntityTypeMechanic());
this.mechanicQueue.add(new NameMechanic());
this.mechanicQueue.add(new HealthMechanic());
this.mechanicQueue.add(new EquipmentMechanic(this.customBosses.getItemStackManager()));
this.mechanicQueue.add(new WeaponMechanic(this.customBosses.getItemStackManager()));
this.mechanicQueue.add(new PotionMechanic());
this.mechanicQueue.add(new SettingsMechanic());
}
public boolean handleMechanicApplication(BossEntity bossEntity, ActiveBossHolder activeBossHolder) {
if(this.mechanicQueue != null && bossEntity != null && activeBossHolder != null) {
Queue<IMechanic> queue = new LinkedList<>(this.mechanicQueue);
while(!queue.isEmpty()) {
IMechanic mechanic = queue.poll();
if(mechanic == null) continue;
if(!mechanic.applyMechanic(bossEntity, activeBossHolder)) {
Debug.MECHANIC_APPLICATION_FAILED.debug(mechanic.getClass().getSimpleName());
return false;
}
}
}
return true;
}
}

View File

@ -3,7 +3,7 @@ package net.aminecraftdev.custombosses.mechanics;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.entity.elements.EquipmentElement;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.managers.ItemStackManager;
import net.aminecraftdev.custombosses.managers.BossItemFileManager;
import net.aminecraftdev.custombosses.utils.IMechanic;
import net.aminecraftdev.custombosses.utils.itemstack.holder.ItemStackHolder;
import org.bukkit.entity.LivingEntity;
@ -17,14 +17,16 @@ import org.bukkit.inventory.ItemStack;
*/
public class EquipmentMechanic implements IMechanic {
private ItemStackManager itemStackManager;
private BossItemFileManager itemStackManager;
public EquipmentMechanic(ItemStackManager itemStackManager) {
public EquipmentMechanic(BossItemFileManager itemStackManager) {
this.itemStackManager = itemStackManager;
}
@Override
public boolean applyMechanic(BossEntity bossEntity, ActiveBossHolder activeBossHolder) {
if(activeBossHolder.getLivingEntity() == null) return false;
LivingEntity livingEntity = activeBossHolder.getLivingEntity();
EquipmentElement equipmentElement = bossEntity.getEquipment();
EntityEquipment entityEquipment = livingEntity.getEquipment();
@ -40,7 +42,6 @@ public class EquipmentMechanic implements IMechanic {
ItemStack itemStack = this.itemStackManager.getItemStackConverter().from(itemStackHolder);
entityEquipment.setHelmet(itemStack);
entityEquipment.setHelmetDropChance(0);
}
}
@ -51,7 +52,6 @@ public class EquipmentMechanic implements IMechanic {
ItemStack itemStack = this.itemStackManager.getItemStackConverter().from(itemStackHolder);
entityEquipment.setChestplate(itemStack);
entityEquipment.setChestplateDropChance(0);
}
}
@ -62,7 +62,6 @@ public class EquipmentMechanic implements IMechanic {
ItemStack itemStack = this.itemStackManager.getItemStackConverter().from(itemStackHolder);
entityEquipment.setLeggings(itemStack);
entityEquipment.setLeggingsDropChance(0);
}
}
@ -73,7 +72,6 @@ public class EquipmentMechanic implements IMechanic {
ItemStack itemStack = this.itemStackManager.getItemStackConverter().from(itemStackHolder);
entityEquipment.setBoots(itemStack);
entityEquipment.setBootsDropChance(0);
}
}

View File

@ -4,16 +4,15 @@ import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.IMechanic;
import net.aminecraftdev.custombosses.utils.StringUtils;
import net.aminecraftdev.custombosses.utils.reader.SpigotYmlReader;
import net.aminecraftdev.custombosses.utils.file.reader.SpigotYmlReader;
import org.bukkit.entity.LivingEntity;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 02-Jun-18
* @since 27-Jun-18
*/
public class StatsMechanic implements IMechanic {
public class HealthMechanic implements IMechanic {
@Override
public boolean applyMechanic(BossEntity bossEntity, ActiveBossHolder activeBossHolder) {
@ -30,17 +29,6 @@ public class StatsMechanic implements IMechanic {
livingEntity.setMaxHealth(maxHealth);
livingEntity.setHealth(maxHealth);
String customName = bossEntity.getMainStats().getDisplayName();
if(customName != null) {
livingEntity.setCustomName(StringUtils.get().translateColor(customName));
livingEntity.setCustomNameVisible(true);
}
livingEntity.setRemoveWhenFarAway(false);
livingEntity.setCanPickupItems(false);
return true;
}
}

View File

@ -0,0 +1,31 @@
package net.aminecraftdev.custombosses.mechanics;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.utils.IMechanic;
import net.aminecraftdev.custombosses.utils.StringUtils;
import org.bukkit.entity.LivingEntity;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class NameMechanic implements IMechanic {
@Override
public boolean applyMechanic(BossEntity bossEntity, ActiveBossHolder activeBossHolder) {
if(activeBossHolder.getLivingEntity() == null) return false;
LivingEntity livingEntity = activeBossHolder.getLivingEntity();
String customName = bossEntity.getMainStats().getDisplayName();
if(customName != null) {
livingEntity.setCustomName(StringUtils.get().translateColor(customName));
livingEntity.setCustomNameVisible(true);
}
return true;
}
}

View File

@ -0,0 +1,38 @@
package net.aminecraftdev.custombosses.mechanics;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.utils.IMechanic;
import net.aminecraftdev.custombosses.utils.potion.PotionEffectConverter;
import net.aminecraftdev.custombosses.utils.potion.holder.PotionEffectHolder;
import org.bukkit.entity.LivingEntity;
import java.util.List;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class PotionMechanic implements IMechanic {
private PotionEffectConverter potionEffectConverter;
public PotionMechanic() {
this.potionEffectConverter = new PotionEffectConverter();
}
@Override
public boolean applyMechanic(BossEntity bossEntity, ActiveBossHolder activeBossHolder) {
if(activeBossHolder.getLivingEntity() == null) return false;
LivingEntity livingEntity = activeBossHolder.getLivingEntity();
List<PotionEffectHolder> potionElements = bossEntity.getPotions();
if(potionElements != null && !potionElements.isEmpty()) {
potionElements.forEach(potionElement -> livingEntity.addPotionEffect(this.potionEffectConverter.from(potionElement)));
}
return true;
}
}

View File

@ -0,0 +1,49 @@
package net.aminecraftdev.custombosses.mechanics;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.IMechanic;
import net.aminecraftdev.custombosses.utils.StringUtils;
import net.aminecraftdev.custombosses.utils.file.reader.SpigotYmlReader;
import net.aminecraftdev.custombosses.utils.version.VersionHandler;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.EntityEquipment;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 02-Jun-18
*/
public class SettingsMechanic implements IMechanic {
private VersionHandler versionHandler;
public SettingsMechanic() {
this.versionHandler = new VersionHandler();
}
@Override
public boolean applyMechanic(BossEntity bossEntity, ActiveBossHolder activeBossHolder) {
if(activeBossHolder.getLivingEntity() == null) return false;
LivingEntity livingEntity = activeBossHolder.getLivingEntity();
EntityEquipment entityEquipment = livingEntity.getEquipment();
livingEntity.setRemoveWhenFarAway(false);
livingEntity.setCanPickupItems(false);
entityEquipment.setHelmetDropChance(0.0F);
entityEquipment.setChestplateDropChance(0.0F);
entityEquipment.setLeggingsDropChance(0.0F);
entityEquipment.setBootsDropChance(0.0F);
if(this.versionHandler.canUseOffHand()) {
entityEquipment.setItemInMainHandDropChance(0.0F);
entityEquipment.setItemInOffHandDropChance(0.0F);
} else {
entityEquipment.setItemInHandDropChance(0.0F);
}
return true;
}
}

View File

@ -0,0 +1,65 @@
package net.aminecraftdev.custombosses.mechanics;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.entity.elements.HandsElement;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.managers.BossItemFileManager;
import net.aminecraftdev.custombosses.utils.IMechanic;
import net.aminecraftdev.custombosses.utils.version.VersionHandler;
import net.aminecraftdev.custombosses.utils.itemstack.holder.ItemStackHolder;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.inventory.ItemStack;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class WeaponMechanic implements IMechanic {
private BossItemFileManager itemStackManager;
private VersionHandler versionHandler;
public WeaponMechanic(BossItemFileManager itemStackManager) {
this.itemStackManager = itemStackManager;
this.versionHandler = new VersionHandler();
}
@Override
public boolean applyMechanic(BossEntity bossEntity, ActiveBossHolder activeBossHolder) {
if(activeBossHolder.getLivingEntity() == null) return false;
LivingEntity livingEntity = activeBossHolder.getLivingEntity();
EntityEquipment entityEquipment = livingEntity.getEquipment();
HandsElement handsElement = bossEntity.getHands();
String mainHand = handsElement.getMainHand();
String offHand = handsElement.getOffHand();
if(mainHand != null) {
ItemStackHolder itemStackHolder = this.itemStackManager.getItemStackHolder(mainHand);
if(itemStackHolder != null) {
ItemStack itemStack = this.itemStackManager.getItemStackConverter().from(itemStackHolder);
if(this.versionHandler.canUseOffHand()) {
entityEquipment.setItemInMainHand(itemStack);
} else {
entityEquipment.setItemInHand(itemStack);
}
}
}
if(offHand != null && this.versionHandler.canUseOffHand()) {
ItemStackHolder itemStackHolder = this.itemStackManager.getItemStackHolder(offHand);
if(itemStackHolder != null) {
ItemStack itemStack = this.itemStackManager.getItemStackConverter().from(itemStackHolder);
entityEquipment.setItemInOffHand(itemStack);
}
}
return false;
}
}

View File

@ -11,6 +11,7 @@ public enum Debug {
NULL_ENTITY_TYPE("The {0} boss or minion has got an invalid entity type."),
MAX_HEALTH("You cannot set the max health higher than {0}. You can adjust your max health in the spigot.yml file and restart your server to increase this."),
MECHANIC_APPLICATION_FAILED("Some mechanics have failed to be applied. It got stuck at {0} mechanic."),
ATTEMPTED_TO_SPAWN_WHILE_DISABLED("The {0} boss/minion attempted to spawn while editing is enabled.");

View File

@ -0,0 +1,46 @@
package net.aminecraftdev.custombosses.utils;
import lombok.Getter;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public enum Versions {
v1_7_R3(1, "1.7.9"),
v1_7_R4(2, "1.7.10"),
v1_8_R1(3, "1.8"),
v1_8_R2(4, "1.8.3"),
v1_8_R3(5, "1.8.9"),
v1_9_R1(6, "1.9"),
v1_9_R2(7, "1.9.4"),
v1_10_R1(8, "1.10"),
v1_11_R1(9, "1.11.2"),
v1_12_R1(10, "1.12.1");
@Getter private String displayVersion, bukkitVersion;
private int weight;
Versions(int weight, String displayVersion) {
this.weight = weight;
this.displayVersion = displayVersion;
this.bukkitVersion = name();
}
public boolean isHigherThan(Versions input) {
return this.weight >= input.weight;
}
public static Versions getVersion(String input) {
for(Versions versions : values()) {
if(versions.getBukkitVersion().equalsIgnoreCase(input)) {
return versions;
}
}
return null;
}
}

View File

@ -1,4 +1,4 @@
package net.aminecraftdev.custombosses.utils.reader;
package net.aminecraftdev.custombosses.utils.file.reader;
import net.aminecraftdev.custombosses.utils.IYmlReader;
import net.aminecraftdev.custombosses.utils.file.FileUtils;

View File

@ -1,4 +1,4 @@
package net.aminecraftdev.custombosses.utils.itemstack;
package net.aminecraftdev.custombosses.utils.itemstack.handlers;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

View File

@ -0,0 +1,41 @@
package net.aminecraftdev.custombosses.utils.potion;
import net.aminecraftdev.custombosses.utils.IConverter;
import net.aminecraftdev.custombosses.utils.potion.converters.PotionEffectTypeConverter;
import net.aminecraftdev.custombosses.utils.potion.holder.PotionEffectHolder;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class PotionEffectConverter implements IConverter<PotionEffectHolder, PotionEffect> {
private PotionEffectTypeConverter potionEffectTypeConverter;
public PotionEffectConverter() {
this.potionEffectTypeConverter = new PotionEffectTypeConverter();
}
@Override
public PotionEffectHolder to(PotionEffect potionEffect) {
PotionEffectType potionEffectType = potionEffect.getType();
int duration = potionEffect.getDuration();
int level = potionEffect.getAmplifier();
return new PotionEffectHolder(this.potionEffectTypeConverter.to(potionEffectType), level+1, duration/20);
}
@Override
public PotionEffect from(PotionEffectHolder potionHolder) {
String potionEffectType = potionHolder.getType();
Integer duration = potionHolder.getDuration();
Integer level = potionHolder.getLevel();
if(potionEffectType != null && duration != null && level != null) return new PotionEffect(this.potionEffectTypeConverter.from(potionEffectType), level-1, (duration*20));
return null;
}
}

View File

@ -0,0 +1,22 @@
package net.aminecraftdev.custombosses.utils.potion.converters;
import net.aminecraftdev.custombosses.utils.IConverter;
import org.bukkit.potion.PotionEffectType;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class PotionEffectTypeConverter implements IConverter<String, PotionEffectType> {
@Override
public String to(PotionEffectType potionEffectType) {
return potionEffectType.getName().toUpperCase();
}
@Override
public PotionEffectType from(String s) {
return PotionEffectType.getByName(s);
}
}

View File

@ -0,0 +1,22 @@
package net.aminecraftdev.custombosses.utils.potion.holder;
import com.google.gson.annotations.Expose;
import lombok.Getter;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class PotionEffectHolder {
@Expose @Getter private String type;
@Expose @Getter private Integer level, duration;
public PotionEffectHolder(String type, Integer level, Integer duration) {
this.type = type;
this.level = level;
this.duration = duration;
}
}

View File

@ -0,0 +1,27 @@
package net.aminecraftdev.custombosses.utils.version;
import net.aminecraftdev.custombosses.utils.Versions;
import org.bukkit.Bukkit;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 27-Jun-18
*/
public class VersionHandler {
private Versions version;
public VersionHandler() {
String v = Bukkit.getServer().getClass().getPackage().getName();
v = v.substring(v.lastIndexOf(".") + 1);
this.version = Versions.getVersion(v);
}
public boolean canUseOffHand() {
return this.version.isHigherThan(Versions.v1_9_R1);
}
}

View File

@ -19,7 +19,7 @@
</modules>
<properties>
<plugin.version>3.0.0-SNAPSHOT-U11</plugin.version>
<plugin.version>3.0.0-SNAPSHOT-U12</plugin.version>
<plugin.name>CustomBosses</plugin.name>
<plugin.main>net.aminecraftdev.custombosses.CustomBosses</plugin.main>
<plugin.author>AMinecraftDev</plugin.author>