3.0.0-SNAPSHOT-U32

+ Continued working on drop tables, got all file management done
+ Started working on 1/3 of the drop table types
+ Added DeadBossHolder to handle drop tables easier
+ Added RandomUtils to make random number obtaining easier
This commit is contained in:
AMinecraftDev 2018-10-25 20:55:48 +08:00
parent 0f66facf41
commit fe451b5b0b
19 changed files with 427 additions and 26 deletions

View File

@ -4,20 +4,15 @@ import lombok.Getter;
import net.aminecraftdev.custombosses.api.BossAPI;
import net.aminecraftdev.custombosses.commands.BossCmd;
import net.aminecraftdev.custombosses.container.BossEntityContainer;
import net.aminecraftdev.custombosses.file.BossesFileHandler;
import net.aminecraftdev.custombosses.file.ConfigFileHandler;
import net.aminecraftdev.custombosses.file.EditorFileHandler;
import net.aminecraftdev.custombosses.file.LangFileHandler;
import net.aminecraftdev.custombosses.managers.*;
import net.aminecraftdev.custombosses.managers.files.BossCommandFileManager;
import net.aminecraftdev.custombosses.managers.files.BossItemFileManager;
import net.aminecraftdev.custombosses.managers.files.BossMessagesFileManager;
import net.aminecraftdev.custombosses.managers.files.BossesFileManager;
import net.aminecraftdev.custombosses.managers.files.*;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.IReloadable;
import net.aminecraftdev.custombosses.utils.Message;
import net.aminecraftdev.custombosses.utils.ServerUtils;
import net.aminecraftdev.custombosses.utils.command.SubCommandService;
import net.aminecraftdev.custombosses.utils.file.YmlFileHandler;
import net.aminecraftdev.custombosses.utils.version.VersionHandler;
import org.bstats.bukkit.Metrics;
@ -33,10 +28,11 @@ import org.bukkit.plugin.java.JavaPlugin;
*/
public class CustomBosses extends JavaPlugin implements IReloadable {
@Getter private BossMessagesFileManager bossMessagesFileManager;
@Getter private BossCommandFileManager bossCommandFileManager;
@Getter private BossItemFileManager itemStackManager;
@Getter private MessagesFileManager bossMessagesFileManager;
@Getter private CommandsFileManager bossCommandFileManager;
@Getter private DropTableFileManager dropTableFileManager;
@Getter private BossesFileManager bossesFileManager;
@Getter private ItemsFileManager itemStackManager;
@Getter private BossEntityContainer bossEntityContainer;
@Getter private BossMechanicManager bossMechanicManager;
@ -83,6 +79,7 @@ public class CustomBosses extends JavaPlugin implements IReloadable {
this.bossesFileManager.reload();
this.bossCommandFileManager.reload();
this.bossMessagesFileManager.reload();
this.dropTableFileManager.reload();
this.bossCommandManager = new BossCommandManager(new BossCmd(), this);
this.bossListenerManager = new BossListenerManager(this);
@ -108,6 +105,7 @@ public class CustomBosses extends JavaPlugin implements IReloadable {
this.bossCommandFileManager.reload();
this.bossesFileManager.reload();
this.itemStackManager.reload();
this.dropTableFileManager.reload();
this.bossMechanicManager.load();
@ -122,10 +120,11 @@ public class CustomBosses extends JavaPlugin implements IReloadable {
}
private void loadFileManagersAndHandlers() {
this.itemStackManager = new BossItemFileManager(this);
this.itemStackManager = new ItemsFileManager(this);
this.bossesFileManager = new BossesFileManager(this);
this.bossCommandFileManager = new BossCommandFileManager(this);
this.bossMessagesFileManager = new BossMessagesFileManager(this);
this.bossCommandFileManager = new CommandsFileManager(this);
this.bossMessagesFileManager = new MessagesFileManager(this);
this.dropTableFileManager = new DropTableFileManager(this);
this.langFileHandler = new LangFileHandler(this);
this.editorFileHandler = new EditorFileHandler(this);

View File

@ -0,0 +1,18 @@
package net.aminecraftdev.custombosses.droptable;
import com.google.gson.annotations.Expose;
import lombok.Getter;
import lombok.Setter;
import net.aminecraftdev.custombosses.droptable.elements.RewardsTableElement;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class DropTable {
@Expose @Getter @Setter private String dropType;
@Expose @Getter @Setter private RewardsTableElement rewards;
}

View File

@ -0,0 +1,20 @@
package net.aminecraftdev.custombosses.droptable.elements;
import com.google.gson.annotations.Expose;
import lombok.Getter;
import lombok.Setter;
import net.aminecraftdev.custombosses.droptable.elements.RewardsTableElement;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class DropTableElement extends RewardsTableElement {
@Expose @Getter @Setter private Map<String, Double> dropRewards;
@Expose @Getter @Setter private Integer dropMaxDrops;
}

View File

@ -0,0 +1,20 @@
package net.aminecraftdev.custombosses.droptable.elements;
import com.google.gson.annotations.Expose;
import lombok.Getter;
import lombok.Setter;
import net.aminecraftdev.custombosses.droptable.elements.GiveTableSubElement;
import net.aminecraftdev.custombosses.droptable.elements.RewardsTableElement;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class GiveTableElement extends RewardsTableElement {
@Expose @Getter @Setter private Map<String, GiveTableSubElement> giveRewards;
}

View File

@ -0,0 +1,20 @@
package net.aminecraftdev.custombosses.droptable.elements;
import com.google.gson.annotations.Expose;
import lombok.Getter;
import lombok.Setter;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class GiveTableSubElement {
@Expose @Getter @Setter private Map<String, Double> items;
@Expose @Getter @Setter private Integer maxDrops;
@Expose @Getter @Setter private Boolean randomDrops;
}

View File

@ -0,0 +1,9 @@
package net.aminecraftdev.custombosses.droptable.elements;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class RewardsTableElement {
}

View File

@ -0,0 +1,19 @@
package net.aminecraftdev.custombosses.droptable.elements;
import com.google.gson.annotations.Expose;
import lombok.Getter;
import lombok.Setter;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class SprayTableElement extends RewardsTableElement {
@Expose @Getter @Setter private Map<String, Double> sprayRewards;
@Expose @Getter @Setter private Integer sprayMaxDistance, sprayMaxDrops;
}

View File

@ -0,0 +1,76 @@
package net.aminecraftdev.custombosses.file;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import net.aminecraftdev.custombosses.droptable.DropTable;
import net.aminecraftdev.custombosses.utils.file.FileHandler;
import net.aminecraftdev.custombosses.utils.itemstack.holder.ItemStackHolder;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class DropTableFileHandler extends FileHandler<Map<String, DropTable>> {
private static final Gson GSON = new GsonBuilder()
.setPrettyPrinting()
.excludeFieldsWithoutExposeAnnotation()
.create();
public DropTableFileHandler(JavaPlugin javaPlugin, boolean saveResource, File file) {
super(javaPlugin, saveResource, file);
}
@Override
public Map<String, DropTable> loadFile() {
Map<String, DropTable> dropTableMap = new HashMap<>();
createFile();
try {
FileReader fileReader = new FileReader(getFile());
JsonObject jsonObject = GSON.fromJson(fileReader, JsonObject.class);
fileReader.close();
if(jsonObject != null) {
jsonObject.entrySet().forEach(entry -> {
String id = entry.getKey();
DropTable dropTable = GSON.fromJson(entry.getValue(), DropTable.class);
dropTableMap.put(id, dropTable);
});
}
} catch (IOException ex) {
ex.printStackTrace();
}
return dropTableMap;
}
@Override
public void saveFile(Map<String, DropTable> stringDropTableMap) {
try {
FileWriter fileWriter = new FileWriter(getFile());
Type type = new TypeToken<Map<String, ItemStackHolder>>(){}.getType();
fileWriter.write(GSON.toJson(new HashMap<>(stringDropTableMap), type));
fileWriter.flush();
fileWriter.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

View File

@ -0,0 +1,27 @@
package net.aminecraftdev.custombosses.holder;
import lombok.Getter;
import net.aminecraftdev.custombosses.entity.BossEntity;
import org.bukkit.Location;
import java.util.Map;
import java.util.UUID;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class DeadBossHolder {
@Getter private final Map<UUID, Double> sortedDamageMap;
@Getter private final BossEntity bossEntity;
@Getter private final Location location;
public DeadBossHolder(BossEntity bossEntity, Location deathLocation, Map<UUID, Double> sortedDamageMap) {
this.location = deathLocation;
this.bossEntity = bossEntity;
this.sortedDamageMap = sortedDamageMap;
}
}

View File

@ -1,11 +1,14 @@
package net.aminecraftdev.custombosses.listeners.after;
import net.aminecraftdev.custombosses.CustomBosses;
import net.aminecraftdev.custombosses.droptable.DropTable;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.events.BossDeathEvent;
import net.aminecraftdev.custombosses.events.PreBossDeathEvent;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.holder.DeadBossHolder;
import net.aminecraftdev.custombosses.managers.BossEntityManager;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.NumberUtils;
import net.aminecraftdev.custombosses.utils.ServerUtils;
import org.bukkit.Bukkit;
@ -65,6 +68,7 @@ public class BossDeathListener implements Listener {
BossEntity bossEntity = activeBossHolder.getBossEntity();
Location location = event.getLocation();
Map<UUID, Double> mapOfDamage = this.bossEntityManager.getSortedMapOfDamage(activeBossHolder);
List<String> commands = this.bossEntityManager.getOnDeathCommands(bossEntity);
List<String> messages = this.bossEntityManager.getOnDeathMessage(bossEntity);
int messageRadius = this.bossEntityManager.getOnDeathMessageRadius(bossEntity);
@ -79,7 +83,6 @@ public class BossDeathListener implements Listener {
if(messages != null) {
if(positionsMessage != null) {
Map<UUID, Double> mapOfDamage = this.bossEntityManager.getSortedMapOfDamage(activeBossHolder);
List<String> finalPositionsMessage = new ArrayList<>();
int current = 1;
@ -132,10 +135,16 @@ public class BossDeathListener implements Listener {
}
});
//TODO: Handle DropTable
DeadBossHolder deadBossHolder = new DeadBossHolder(bossEntity, location, mapOfDamage);
BossDeathEvent bossDeathEvent = new BossDeathEvent(activeBossHolder);
DropTable dropTable = this.bossEntityManager.getDropTable(bossEntity);
if(dropTable == null) {
Debug.FAILED_TO_FIND_DROP_TABLE.debug(activeBossHolder.getName(), bossEntity.getDrops().getDropTable());
return;
}
this.bossEntityManager.handleDropTable(dropTable, deadBossHolder);
ServerUtils.get().callEvent(bossDeathEvent);
}

View File

@ -0,0 +1,69 @@
package net.aminecraftdev.custombosses.managers;
import net.aminecraftdev.custombosses.CustomBosses;
import net.aminecraftdev.custombosses.api.BossAPI;
import net.aminecraftdev.custombosses.droptable.elements.SprayTableElement;
import net.aminecraftdev.custombosses.managers.files.ItemsFileManager;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.RandomUtils;
import net.aminecraftdev.custombosses.utils.itemstack.holder.ItemStackHolder;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class BossDropTableManager {
private ItemsFileManager itemsFileManager;
public BossDropTableManager(CustomBosses plugin) {
this.itemsFileManager = plugin.getItemStackManager();
}
public List<ItemStack> getSprayItems(SprayTableElement sprayTableElement) {
Map<String, Double> rewards = sprayTableElement.getSprayRewards();
List<ItemStack> customDrops = new ArrayList<>();
Integer maxDropsElement = sprayTableElement.getSprayMaxDrops();
if(maxDropsElement == null) maxDropsElement = -1;
final int maxDrops = maxDropsElement;
for(Map.Entry<String, Double> entry : rewards.entrySet()) {
if(maxDrops > 0) {
if(customDrops.size() >= maxDrops) return customDrops;
}
double chance = entry.getValue();
String itemName = entry.getKey();
double randomNumber = RandomUtils.get().getRandomDecimalNumber();
if(randomNumber > chance) continue;
ItemStackHolder itemStackHolder = BossAPI.getStoredItemStack(itemName);
if(itemStackHolder == null) {
Debug.FAILED_TO_LOAD_CUSTOM_ITEM.debug(itemName);
continue;
}
ItemStack itemStack = this.itemsFileManager.getItemStackConverter().from(itemStackHolder);
if(itemStack == null) {
Debug.FAILED_TO_LOAD_CUSTOM_ITEM.debug(itemName);
continue;
}
customDrops.add(itemStack);
}
return customDrops;
}
}

View File

@ -2,12 +2,13 @@ package net.aminecraftdev.custombosses.managers;
import net.aminecraftdev.custombosses.CustomBosses;
import net.aminecraftdev.custombosses.api.BossAPI;
import net.aminecraftdev.custombosses.droptable.DropTable;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.holder.ActiveBossHolder;
import net.aminecraftdev.custombosses.managers.files.BossCommandFileManager;
import net.aminecraftdev.custombosses.managers.files.BossItemFileManager;
import net.aminecraftdev.custombosses.managers.files.BossMessagesFileManager;
import net.aminecraftdev.custombosses.holder.DeadBossHolder;
import net.aminecraftdev.custombosses.managers.files.BossesFileManager;
import net.aminecraftdev.custombosses.managers.files.DropTableFileManager;
import net.aminecraftdev.custombosses.managers.files.ItemsFileManager;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.itemstack.holder.ItemStackHolder;
import org.bukkit.Location;
@ -26,11 +27,13 @@ public class BossEntityManager {
private static final List<ActiveBossHolder> ACTIVE_BOSS_HOLDERS = new ArrayList<>();
private BossItemFileManager bossItemFileManager;
private DropTableFileManager dropTableFileManager;
private BossMechanicManager bossMechanicManager;
private ItemsFileManager bossItemFileManager;
private BossesFileManager bossesFileManager;
public BossEntityManager(CustomBosses customBosses) {
this.dropTableFileManager = customBosses.getDropTableFileManager();
this.bossMechanicManager = customBosses.getBossMechanicManager();
this.bossItemFileManager = customBosses.getItemStackManager();
this.bossesFileManager = customBosses.getBossesFileManager();
@ -211,4 +214,30 @@ public class BossEntityManager {
return playerDamage / onePercent;
}
public DropTable getDropTable(BossEntity bossEntity) {
return this.dropTableFileManager.getDropTable(bossEntity.getDrops().getDropTable());
}
public void handleDropTable(DropTable dropTable, DeadBossHolder deadBossHolder) {
String dropType = dropTable.getDropType();
BossEntity bossEntity = deadBossHolder.getBossEntity();
String tableName = bossEntity.getDrops().getDropTable();
if(dropType == null) {
Debug.FAILED_TO_FIND_DROP_TABLE_TYPE.debug(tableName);
return;
}
if(dropType.equalsIgnoreCase("SPRAY")) {
} else if(dropType.equalsIgnoreCase("GIVE")) {
} else if(dropType.equalsIgnoreCase("DROP")) {
} else {
Debug.FAILED_TO_FIND_DROP_TABLE_TYPE.debug(tableName);
return;
}
}
}

View File

@ -16,12 +16,12 @@ import java.util.Map;
* @version 1.0.0
* @since 17-Oct-18
*/
public class BossCommandFileManager implements ILoadable, ISavable, IReloadable {
public class CommandsFileManager implements ILoadable, ISavable, IReloadable {
private Map<String, List<String>> commandsMap = new HashMap<>();
private CommandsFileHandler commandsFileHandler;
public BossCommandFileManager(CustomBosses customBosses) {
public CommandsFileManager(CustomBosses customBosses) {
File file = new File(customBosses.getDataFolder(), "commands.json");
this.commandsFileHandler = new CommandsFileHandler(customBosses, true, file);

View File

@ -0,0 +1,52 @@
package net.aminecraftdev.custombosses.managers.files;
import net.aminecraftdev.custombosses.droptable.DropTable;
import net.aminecraftdev.custombosses.file.DropTableFileHandler;
import net.aminecraftdev.custombosses.utils.ILoadable;
import net.aminecraftdev.custombosses.utils.IReloadable;
import net.aminecraftdev.custombosses.utils.ISavable;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class DropTableFileManager implements ILoadable, ISavable, IReloadable {
private Map<String, DropTable> dropTableMap = new HashMap<>();
private DropTableFileHandler dropTableFileHandler;
public DropTableFileManager(JavaPlugin javaPlugin) {
File file = new File(javaPlugin.getDataFolder(), "droptables.json");
this.dropTableFileHandler = new DropTableFileHandler(javaPlugin, true, file);
}
@Override
public void load() {
this.dropTableMap = this.dropTableFileHandler.loadFile();
}
@Override
public void reload() {
load();
}
@Override
public void save() {
this.dropTableFileHandler.saveFile(this.dropTableMap);
}
public DropTable getDropTable(String name) {
return this.dropTableMap.getOrDefault(name, null);
}
public Map<String, DropTable> getDropTables() {
return new HashMap<>(this.dropTableMap);
}
}

View File

@ -18,14 +18,14 @@ import java.util.Map;
* @version 1.0.0
* @since 03-Jun-18
*/
public class BossItemFileManager implements ILoadable, ISavable, IReloadable {
public class ItemsFileManager implements ILoadable, ISavable, IReloadable {
@Getter private final ItemStackConverter itemStackConverter = new ItemStackConverter();
private Map<String, ItemStackHolder> itemStackHolders = new HashMap<>();
private ItemStackFileHandler itemStackFileHandler;
public BossItemFileManager(JavaPlugin javaPlugin) {
public ItemsFileManager(JavaPlugin javaPlugin) {
File file = new File(javaPlugin.getDataFolder(), "items.json");
this.itemStackFileHandler = new ItemStackFileHandler(javaPlugin, file, true);

View File

@ -16,12 +16,12 @@ import java.util.Map;
* @version 1.0.0
* @since 17-Oct-18
*/
public class BossMessagesFileManager implements ILoadable, ISavable, IReloadable {
public class MessagesFileManager implements ILoadable, ISavable, IReloadable {
private Map<String, List<String>> messagesMap = new HashMap<>();
private MessagesFileHandler messagesFileHandler;
public BossMessagesFileManager(CustomBosses customBosses) {
public MessagesFileManager(CustomBosses customBosses) {
File file = new File(customBosses.getDataFolder(), "messages.json");
this.messagesFileHandler = new MessagesFileHandler(customBosses, true, file);

View File

@ -20,6 +20,8 @@ public enum Debug {
ATTEMPTED_TO_UPDATE_PLUGIN("Something has attempted to update the PLUGIN variable in the BossAPI class while it is already initialized."),
ATTEMPTED_TO_SPAWN_WHILE_DISABLED("A boss/minion attempted to spawn while editing is enabled."),
FAILED_TO_FIND_DROP_TABLE("The {0} boss has been killed however the specified drop table {1} wasn't found."),
FAILED_TO_FIND_DROP_TABLE_TYPE("The {0} drop table type was not a valid drop table. Valid types are 'SPRAY', 'DROP', 'GIVE'."),
FAILED_ATTEMPT_TO_SPAWN_BOSS("A boss has attempted to spawn but cannot spawn for the following reason: \n{0}"),
FAILED_ATTEMPT_TO_STACK_BOSSES("A boss has failed to stack on top of another boss under the {0} boss configuration."),
FAILED_TO_SAVE_THE_NEW_BOSS("The {0} with EntityType boss was successfully created but failed to save."),

View File

@ -0,0 +1,32 @@
package net.aminecraftdev.custombosses.utils;
import java.util.Random;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 25-Oct-18
*/
public class RandomUtils {
private static RandomUtils INSTANCE = new RandomUtils();
private Random random = new Random();
public int getRandomNumber() {
return this.random.nextInt(100);
}
public double getRandomDecimalNumber() {
double amount = getRandomNumber();
amount += this.random.nextDouble();
return amount;
}
public static RandomUtils get() {
return INSTANCE;
}
}

View File

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