3.0.0-SNAPSHOT-U22

+ Completed Boss Create command
+ Fixed all API methods so that when you create a boss it will now save to the file
This commit is contained in:
AMinecraftDev 2018-10-09 21:23:40 +08:00
parent 69cb000d1a
commit 41dbd03dab
13 changed files with 226 additions and 17 deletions

View File

@ -46,6 +46,7 @@
</dependencies>
<build>
<finalName>${parent.artifactId}-1.13.x</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
@ -60,6 +61,7 @@
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<relocations>
<relocation>
<pattern>org.bstats</pattern>

View File

@ -11,6 +11,7 @@ import net.aminecraftdev.custombosses.managers.files.BossItemFileManager;
import net.aminecraftdev.custombosses.managers.BossMechanicManager;
import net.aminecraftdev.custombosses.managers.files.BossesFileManager;
import net.aminecraftdev.custombosses.utils.IReloadable;
import net.aminecraftdev.custombosses.utils.Message;
import net.aminecraftdev.custombosses.utils.command.SubCommandService;
import org.bstats.bukkit.Metrics;
import org.bukkit.configuration.file.FileConfiguration;
@ -43,23 +44,28 @@ public class CustomBosses extends JavaPlugin implements IReloadable {
System.out.println("Boss API loaded (took " + (System.currentTimeMillis() - beginMs) + "ms)");
beginMs = System.currentTimeMillis();
loadFileManagersAndHandlers();
this.bossEntityContainer = new BossEntityContainer();
this.bossMechanicManager = new BossMechanicManager(this);
this.bossCommandManager = new BossCommandManager(new BossCmd(), this);
System.out.println("Managers and Containers loaded (took " + (System.currentTimeMillis() - beginMs) + "ms)");
beginMs = System.currentTimeMillis();
loadFileManagersAndHandlers();
System.out.println("File Handlers and File Managers loaded (took " + (System.currentTimeMillis() - beginMs) + "ms)");
beginMs = System.currentTimeMillis();
this.bossCommandManager = new BossCommandManager(new BossCmd(), this);
this.bossCommandManager.load();
System.out.println("All commands and listeners loaded (took " + (System.currentTimeMillis() - beginMs) + "ms)");
beginMs = System.currentTimeMillis();
reload();
saveMessagesToFile();
System.out.println("Reloaded all fields (took " + (System.currentTimeMillis() - beginMs) + "ms) and plugin is now loaded. Took a total of " + (System.currentTimeMillis() - startMs) + "ms.");
System.out.println("Reloaded all fields, saved messages (took " + (System.currentTimeMillis() - beginMs) + "ms) and plugin is now loaded. Took a total of " + (System.currentTimeMillis() - startMs) + "ms.");
}
@Override
@ -69,6 +75,19 @@ public class CustomBosses extends JavaPlugin implements IReloadable {
this.bossMechanicManager.load();
this.lang = this.langFileHandler.loadFile();
Message.setFile(getLang());
}
private void saveMessagesToFile() {
FileConfiguration lang = getLang();
for(Message message : Message.values()) {
if(!lang.contains(message.getPath())) {
lang.set(message.getPath(), message.getDefault());
}
}
this.langFileHandler.saveFile(lang);
}
private void loadFileManagersAndHandlers() {

View File

@ -43,6 +43,24 @@ public class BossAPI {
Panel.setPlugin(plugin);
}
/**
* Used to register a Boss Entity into
* the plugin after it has been created
* using the BossAPI#createBaseBossEntity
* method or by manually creating a BossEntity.
*
* @param name - Name for the boss section.
* @param bossEntity - The boss section.
* @return false if it failed, true if it saved successfully.
*/
public static boolean registerBossEntity(String name, BossEntity bossEntity) {
if(name == null || bossEntity == null) return false;
PLUGIN.getBossEntityContainer().saveData(name, bossEntity);
PLUGIN.getBossesFileManager().save();
return true;
}
/**
* Used to get the Boss configuration section name
* from a BossEntity instance.
@ -74,6 +92,11 @@ public class BossAPI {
String input = entityTypeInput.split(":")[0];
EntityFinder entityFinder = EntityFinder.get(input);
if(PLUGIN.getBossEntityContainer().exists(name)) {
Debug.BOSS_NAME_EXISTS.debug(name);
return null;
}
if (entityFinder == null) return null;
List<MainStatsElement> mainStatsElements = new ArrayList<>(Arrays.asList(new MainStatsElement()));
@ -99,6 +122,8 @@ public class BossAPI {
return null;
}
PLUGIN.getBossesFileManager().save();
return bossEntity;
}

View File

@ -1,23 +1,76 @@
package net.aminecraftdev.custombosses.commands.boss;
import net.aminecraftdev.custombosses.api.BossAPI;
import net.aminecraftdev.custombosses.container.BossEntityContainer;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.utils.EntityFinder;
import net.aminecraftdev.custombosses.utils.Message;
import net.aminecraftdev.custombosses.utils.Permission;
import net.aminecraftdev.custombosses.utils.StringUtils;
import net.aminecraftdev.custombosses.utils.command.SubCommand;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.EntityType;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 02-Oct-18
*
* TODO
*/
public class BossCreateCmd extends SubCommand {
public BossCreateCmd() {
private BossEntityContainer bossEntityContainer;
public BossCreateCmd(BossEntityContainer bossEntityContainer) {
super("create");
this.bossEntityContainer = bossEntityContainer;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!Permission.create.hasPermission(sender)) {
Message.Boss_Create_NoPermission.msg(sender);
return;
}
switch (args.length) {
case 2:
List<EntityFinder> availableEntities = new ArrayList<>(Arrays.asList(EntityFinder.values()));
String list = StringUtils.get().appendList(availableEntities);
Message.Boss_Create_NoEntitySpecified.msg(sender, list);
return;
case 3:
String name = args[1];
String entityTypeInput = args[2];
if(this.bossEntityContainer.exists(name)) {
Message.Boss_Create_NameAlreadyExists.msg(sender, name);
return;
}
EntityFinder entityFinder = EntityFinder.get(entityTypeInput);
if(entityFinder == null) {
Message.Boss_Create_EntityTypeNotFound.msg(sender, entityTypeInput);
return;
}
BossEntity bossEntity = BossAPI.createBaseBossEntity(name, entityTypeInput);
if(bossEntity == null) {
Message.Boss_Create_SomethingWentWrong.msg(sender);
return;
}
Message.Boss_Create_SuccessfullyCreated.msg(sender, name, entityFinder.getFancyName());
return;
default:
Message.Boss_Create_InvalidArgs.msg(sender);
}
}
}

View File

@ -0,0 +1,31 @@
package net.aminecraftdev.custombosses.commands.boss;
import net.aminecraftdev.custombosses.managers.files.BossesFileManager;
import net.aminecraftdev.custombosses.utils.command.SubCommand;
import org.bukkit.command.CommandSender;
/**
* @author Charles Cullen
* @version 1.0.0
* @since 09-Oct-18
*/
public class BossDebugCmd extends SubCommand {
private BossesFileManager bossesFileManager;
public BossDebugCmd(BossesFileManager bossesFileManager) {
super("debug");
this.bossesFileManager = bossesFileManager;
}
@Override
public void execute(CommandSender sender, String[] args) {
StringBuilder stringBuilder = new StringBuilder();
this.bossesFileManager.getBossEntities().forEach((name, entity) -> stringBuilder.append(name).append(", "));
System.out.println("CURRENT BOSSES: " +
"\n" + stringBuilder.toString());
}
}

View File

@ -1,6 +1,5 @@
package net.aminecraftdev.custombosses.container;
import com.google.common.collect.Maps;
import net.aminecraftdev.custombosses.entity.BossEntity;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.IContainer;
@ -14,7 +13,7 @@ import java.util.Map;
* @version 1.0.0
* @since 18-Jul-18
*/
public class BossEntityContainer implements IContainer<Map<String, BossEntity>> {
public class BossEntityContainer implements IContainer<Map<String, BossEntity>, String> {
private Map<String, BossEntity> container = new HashMap<>();
@ -55,4 +54,9 @@ public class BossEntityContainer implements IContainer<Map<String, BossEntity>>
public void clearContainer() {
this.container.clear();
}
@Override
public boolean exists(String string) {
return this.container.containsKey(string);
}
}

View File

@ -1,9 +1,9 @@
package net.aminecraftdev.custombosses.managers;
import net.aminecraftdev.custombosses.CustomBosses;
import net.aminecraftdev.custombosses.commands.boss.*;
import net.aminecraftdev.custombosses.utils.Debug;
import net.aminecraftdev.custombosses.utils.ILoadable;
import net.aminecraftdev.custombosses.utils.IReloadable;
import net.aminecraftdev.custombosses.utils.command.SubCommandService;
/**
@ -15,9 +15,9 @@ public class BossCommandManager implements ILoadable {
private SubCommandService<?> commandService;
private boolean hasBeenLoaded = false;
private IReloadable customBosses;
private CustomBosses customBosses;
public BossCommandManager(SubCommandService<?> commandService, IReloadable customBosses) {
public BossCommandManager(SubCommandService<?> commandService, CustomBosses customBosses) {
this.commandService = commandService;
this.customBosses = customBosses;
}
@ -29,7 +29,8 @@ public class BossCommandManager implements ILoadable {
return;
}
this.commandService.registerSubCommand(new BossCreateCmd());
this.commandService.registerSubCommand(new BossCreateCmd(this.customBosses.getBossEntityContainer()));
this.commandService.registerSubCommand(new BossDebugCmd(this.customBosses.getBossesFileManager()));
this.commandService.registerSubCommand(new BossDropTableCmd());
this.commandService.registerSubCommand(new BossEditCmd());
this.commandService.registerSubCommand(new BossHelpCmd());

View File

@ -9,6 +9,8 @@ import net.aminecraftdev.custombosses.utils.IReloadable;
import net.aminecraftdev.custombosses.utils.ISavable;
import java.io.File;
import java.util.List;
import java.util.Map;
/**
* @author Charles Cullen
@ -46,4 +48,8 @@ public class BossesFileManager implements ILoadable, ISavable, IReloadable {
public BossEntity getBossEntity(String name) {
return this.bossEntityContainer.getData().getOrDefault(name, null);
}
public Map<String, BossEntity> getBossEntities() {
return this.bossEntityContainer.getData();
}
}

View File

@ -95,6 +95,11 @@ public enum EntityFinder {
this.customEntityHandler = null;
}
@Override
public String toString() {
return this.fancyName;
}
public LivingEntity spawnNewLivingEntity(String input, Location location) {
if(this.customEntityHandler != null) {
LivingEntity livingEntity;

View File

@ -5,7 +5,7 @@ package net.aminecraftdev.custombosses.utils;
* @version 1.0.0
* @since 18-Jul-18
*/
public interface IContainer<StorageType> {
public interface IContainer<StorageType, KeyType> {
StorageType getData();
@ -13,4 +13,6 @@ public interface IContainer<StorageType> {
void clearContainer();
boolean exists(KeyType keyType);
}

View File

@ -15,14 +15,22 @@ import org.bukkit.inventory.ItemStack;
*/
public enum Message {
Boss_Create_EntityTypeNotFound("&c&l(!) &cThe specified entity type {0} was not found. If you think this is an error please contact &fAMinecraftDev&c."),
Boss_Create_InvalidArgs("&c&l(!) &cYou must use &n/boss create [name] [entity] &c to create a boss."),
Boss_Create_NameAlreadyExists("&c&l(!) &cA boss already exists with the name {0}."),
Boss_Create_NoEntitySpecified("&c&l(!) &cNo entity type was specified. Make sure to add an entity type! Possible entity types are: \n&7{0}"),
Boss_Create_NoPermission("&c&l(!) &cYou do not have access to this command."),
Boss_Create_SomethingWentWrong("&c&l(!) &cSomething went wrong in the API class while finalising the boss creation."),
Boss_Create_SuccessfullyCreated("&e&lCustomBosses &8» &7A boss has successfully been created with the name &f{0}&7 and the entity type &f{1}&7."),
Boss_Help_Page1(
"&8&m----*--------&6&l[ &e&lBoss Help &7(Page 1) &6&l]&8&m--------*----\n" +
"&e/boss help (page) &8» &7Displays boss commands.\n" +
"&e/boss create [name] &8» &7Start the creation of a boss.\n" +
"&e/boss create [name] [entity] &8» &7Start the creation of a boss.\n" +
"&e/boss edit [name] &8» &7Edit the specified boss.\n" +
"&e/boss info [name] &8» &7Shows information on the specified boss.\n" +
"&e/gang nearby (radius) &8» &7Shows the nearby bosses.\n" +
"&e/gang reload &8» &7Reloads the boss plugin.\n" +
"&e/boss nearby (radius) &8» &7Shows the nearby bosses.\n" +
"&e/boss reload &8» &7Reloads the boss plugin.\n" +
"&7\n" +
"&7Use /boss help 2 to view the next page.\n" +
"&8&m----*-----------------------------------*----"),
@ -35,7 +43,6 @@ public enum Message {
"&e/boss items &8» &7Shows all current custom items.\n" +
"&e/boss skills &8» &7Shows all current set skills.\n" +
"&7\n" +
"&7\n" +
"&8&m----*-----------------------------------*----"),
Boss_Reload_NoPermission("&c&l(!) &cYou do not have access to this command."),

View File

@ -10,6 +10,7 @@ import org.bukkit.command.CommandSender;
*/
public enum Permission {
create("boss.create"),
reload("boss.reload");
@Getter private String permission;

View File

@ -2,6 +2,10 @@ package net.aminecraftdev.custombosses.utils;
import org.bukkit.ChatColor;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* @author Charles Cullen
* @version 1.0.0
@ -19,6 +23,55 @@ public class StringUtils {
return ChatColor.translateAlternateColorCodes('&', string);
}
public <T> String appendList(List<T> list) {
Queue<T> queue = new LinkedList<>(list);
StringBuilder stringBuilder = new StringBuilder();
while(!queue.isEmpty()) {
T object = queue.poll();
if(object == null) continue;
stringBuilder.append(object.toString());
if(queue.isEmpty()) {
stringBuilder.append(".");
} else {
stringBuilder.append(", ");
}
}
return stringBuilder.toString();
}
public String formatString(String string) {
string = string.toLowerCase();
StringBuilder stringBuilder = new StringBuilder();
if(string.contains(" ")) {
for(String z : string.split(" ")) {
stringBuilder.append(Character.toUpperCase(z.charAt(0))).append(z.substring(1).toLowerCase());
}
} else if(string.contains("_")) {
String[] split = string.split("_");
for(int i = 0; i < split.length; i++) {
String z = split[i];
stringBuilder.append(Character.toUpperCase(z.charAt(0))).append(z.substring(1).toLowerCase());
if(i != (split.length - 1)) {
stringBuilder.append(" ");
}
}
} else {
return Character.toUpperCase(string.charAt(0)) + string.substring(1).toLowerCase();
}
return stringBuilder.toString();
}
public static StringUtils get() {
return INSTANCE;
}