测试版

This commit is contained in:
yaohunya 2024-07-23 03:14:28 +08:00
parent acab27f283
commit 1c6c59b9a0
12 changed files with 219 additions and 159 deletions

View File

@ -46,9 +46,9 @@ public class LevelExpansion extends PlaceholderExpansion {
public String onPlaceholderRequest(Player player, String indentifier) {
if (indentifier.equalsIgnoreCase("expbl")) {
if(Main.serverManage.getExpMultiplicity() <= 1.0){
return "0.00%";
return "0.00";
}
return (Main.serverManage.getExpMultiplicity() * 100)+"%";
return (Main.serverManage.getExpMultiplicity() * 100)+"";
}else if (indentifier.equalsIgnoreCase("level")) {
return ""+DLevelAPI.getPlayerLevel(player);
}else if(indentifier.equalsIgnoreCase("exp")){

View File

@ -1,5 +1,6 @@
package me.Demon.DemonLevels;
import me.Demon.DemonLevels.command.MainCmd;
import me.Demon.DemonLevels.listener.MobDeath;
import me.Demon.DemonLevels.listener.JoinEvent;
import me.Demon.DemonLevels.listener.UpgradePrompt;
@ -27,9 +28,10 @@ public class Main extends JavaPlugin {
@Override
public void onEnable() {
plugin = this;
DemonAPI.sendConsoleMessage("§f[§6!§f] §aAuRechargeData ("+plugin.getServer().getVersion()+") §f开始加载");
DemonAPI.sendConsoleMessage("§f[§6!§f] §aDemonLevels ("+plugin.getServer().getVersion()+") §f开始加载");
loadConfigData();
serverManage = new ServerManage(getConfig());
getCommand("dlevel").setExecutor(new MainCmd());
getServer().getPluginManager().registerEvents(new MobDeath(),this);
getServer().getPluginManager().registerEvents(new JoinEvent(),this);
getServer().getPluginManager().registerEvents(new UpgradePrompt(),this);

View File

@ -2,12 +2,11 @@ package me.Demon.DemonLevels.api;
import com.yaohun.playermanage.PlayerManage;
import me.Demon.DemonLevels.Main;
import me.Demon.DemonLevels.data.ChangExpEvant;
import me.Demon.DemonLevels.data.PlayerData;
import me.Demon.DemonLevels.event.ChangExpEvant;
import me.Demon.DemonLevels.event.UpLevelEvant;
import me.Demon.DemonLevels.listener.MobDeath;
import me.Demon.DemonLevels.util.ScriptEngineAPI;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@ -84,7 +83,6 @@ public abstract class DLevelAPI {
if(level >= levelKey) {
String expFormat = list.get(i).getKey();
expFormat = expFormat.replace("%level%", String.valueOf(level));
System.out.println("[调试 - 等级] 所需经验等级公式: "+expFormat);
return ScriptEngineAPI.getExpFormat(expFormat);
}
}
@ -140,7 +138,7 @@ public abstract class DLevelAPI {
playerData.setTotalExp(playerData.getTotalExp().add(addExp)); // 增加玩家总经验
int level = playerData.getLevel(); // 获取玩家当前等级
BigInteger needExp = DLevelAPI.getLevelNeedExp(level); // 获取玩家升级所需经验
playerData.setExp(playerData.getExp().add(addExp)); // 增加玩家当前经验
addExp = playerData.getExp().add(addExp); // 增加玩家当前经验
// 循环检查是否有足够的经验来升级
while (addExp.compareTo(needExp) >= 0) {
// 检查level是否小于0如果是则退出循环
@ -275,4 +273,8 @@ public abstract class DLevelAPI {
}
}.runTaskLater(Main.plugin, 2L);
}
public static String getRankTitle(int level){
return Main.configYml.getRankTitle(level);
}
}

View File

@ -4,6 +4,7 @@ import com.yaohun.playermanage.PlayerManage;
import me.Demon.DemonLevels.Main;
import me.Demon.DemonLevels.api.DLevelAPI;
import me.Demon.DemonLevels.data.PlayerData;
import me.Demon.DemonLevels.manage.ServerManage;
import me.Demon.DemonLevels.util.GameUtil;
import me.Demon.DemonPlugin.DemonAPI;
import org.bukkit.Bukkit;
@ -40,82 +41,32 @@ public class MainCmd implements CommandExecutor , TabCompleter {
sender.sendMessage("§r");
return true;
}
if(args.length == 3){
String name = args[1];
String uuid = PlayerManage.getNameToUuid(name);
if(uuid.equalsIgnoreCase("无数据")){
DemonAPI.sendMessage(sender,"未查询到该玩家的UUID.");
return true;
}
Player player = Bukkit.getPlayer(name);
int value = GameUtil.convertInt(args[2]);
if(value <= 1){
DemonAPI.sendMessage(sender,"操作数值最低不得 §d低于1");
return true;
}
if(player == null) {
DemonAPI.sendMessage(sender,"目标玩家不在线.");
return true;
}
if(args[0].equalsIgnoreCase("give")){
DLevelAPI.addExp(player,value);
DemonAPI.sendMessage(sender,"给予 §6"+name+" §a经验: §d+"+value);
}else if(args[0].equalsIgnoreCase("take")){
DLevelAPI.takeExp(player,value);
DemonAPI.sendMessage(sender,"扣除 §6"+name+" §a经验: §d-"+value);
}else if(args[0].equalsIgnoreCase("setlevel")){
DLevelAPI.setPlayerLevel(player,value);
DemonAPI.sendMessage(sender,"设置 §6"+name+" §a等级: §dLv."+value);
}else if(args[0].equalsIgnoreCase("settotal")){
BigInteger bigInteger = new BigInteger(args[2]);
DLevelAPI.setTotalExp(player,bigInteger);
DemonAPI.sendMessage(sender,"设置 §6"+name+" §a总经验: §d"+value);
}
if(args.length == 1 && args[0].equalsIgnoreCase("reload")){
Main.plugin.reloadLoadData();
DemonAPI.sendMessage(sender,"配置文件均已重新载入.");
return true;
}
if(args.length == 2 && args[0].equalsIgnoreCase("look")){
String playerName = args[1];
String uuid = PlayerManage.getNameToUuid(playerName);
if(uuid.equalsIgnoreCase("无数据")){
DemonAPI.sendMessage(sender,"未查询到该玩家的UUID.");
return true;
}
Player player = Bukkit.getPlayer(playerName);
if(player == null) {
PlayerData data = new PlayerData(uuid);
DemonAPI.sendMessage(sender,"玩家 §e"+playerName+" §a的等级信息:");
int playerLevel = data.getLevel();
sender.sendMessage("§f- §a等级: §dLv."+playerLevel);
sender.sendMessage("§f- §a经验: §d"+data.getExp().toString()+"§a/§d"+ DLevelAPI.getLevelNeedExp(playerLevel));
sender.sendMessage("§f- §a等级: §dLv."+data.getTotalExp().toString());
}else{
PlayerData data = Main.serverManage.getPlayerData(uuid);
DemonAPI.sendMessage(sender,"玩家 §e"+playerName+" §a的等级信息:");
int playerLevel = data.getLevel();
sender.sendMessage("§f- §a等级: §dLv."+playerLevel);
sender.sendMessage("§f- §a经验: §d"+data.getExp().toString()+"§a/§d"+ DLevelAPI.getLevelNeedExp(playerLevel));
sender.sendMessage("§f- §a等级: §dLv."+data.getTotalExp().toString());
if(args.length == 1 && args[0].equalsIgnoreCase("save")){
ServerManage serverManage = Main.serverManage;
for (String uuid : serverManage.getDataHashMap().keySet()){
serverManage.getDataHashMap().get(uuid).savePlayerData();
}
DemonAPI.sendMessage(sender,"玩家数据已保存.");
return true;
}
if(args[0].equalsIgnoreCase("dexp")){
if(args.length >= 2){
double doubleExp = GameUtil.convertDouble(args[1]);
long defaultTime = 7 * 24 * 60 * 60 * 1000L; // 默认开启经验倍率时间7天
if(args.length == 3){
if(args.length >= 3){
defaultTime = GameUtil.convertInt(args[2]) * 60 * 60 * 1000L;
}
long expMultipleTime = System.currentTimeMillis() + defaultTime; // 本次经验倍率持续时间
if(doubleExp >= 1.1) {
// 将时间戳转换为 LocalDateTime
LocalDateTime dateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(expMultipleTime), ZoneId.systemDefault());
// 定义日期时间格式化模式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM月dd日HH时mm分");
// 格式化日期时间
String formattedDate = dateTime.format(formatter);
Main.serverManage.setExpMultiplicity(doubleExp,expMultipleTime);
for (Player p : Bukkit.getOnlinePlayers()) {
DemonAPI.sendMessage(p, "当前经验获取倍率为: §e§l"+doubleExp*100+"%");
p.sendTitle("§d§l"+doubleExp*100+"%","§f持续时间: §a"+formattedDate);
p.sendTitle("§d§l"+doubleExp*100+"%","§f持续时间: §a"+GameUtil.formatTime(defaultTime));
p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
}
}
@ -138,7 +89,60 @@ public class MainCmd implements CommandExecutor , TabCompleter {
}
return true;
}
if(args.length == 3){
String name = args[1];
String uuid = PlayerManage.getNameToUuid(name);
if(uuid.equalsIgnoreCase("无数据")){
DemonAPI.sendMessage(sender,"未查询到该玩家的UUID.");
return true;
}
Player player = Bukkit.getPlayer(name);
int value = GameUtil.convertInt(args[2]);
if(player == null) {
DemonAPI.sendMessage(sender,"目标玩家不在线.");
return true;
}
if(args[0].equalsIgnoreCase("give")){
DLevelAPI.addExp(player,value);
DemonAPI.sendMessage(sender,"给予 §6"+name+" §a经验: §d+"+value);
}else if(args[0].equalsIgnoreCase("take")){
DLevelAPI.takeExp(player,value);
DemonAPI.sendMessage(sender,"扣除 §6"+name+" §a经验: §d-"+value);
}else if(args[0].equalsIgnoreCase("setlevel")){
DLevelAPI.setPlayerLevel(player,value);
DemonAPI.sendMessage(sender,"设置 §6"+name+" §a等级: §dLv."+value);
}else if(args[0].equalsIgnoreCase("settotal")){
BigInteger bigInteger = new BigInteger(args[2]);
DLevelAPI.setTotalExp(player,bigInteger);
DemonAPI.sendMessage(sender,"设置 §6"+name+" §a总经验: §d"+bigInteger.toString());
}
return true;
}
if(args.length == 2 && args[0].equalsIgnoreCase("look")){
String playerName = args[1];
String uuid = PlayerManage.getNameToUuid(playerName);
if(uuid.equalsIgnoreCase("无数据")){
DemonAPI.sendMessage(sender,"未查询到该玩家的UUID.");
return true;
}
Player player = Bukkit.getPlayer(playerName);
if(player == null) {
PlayerData data = new PlayerData(uuid);
DemonAPI.sendMessage(sender,"玩家 §e"+playerName+" §a的等级信息:");
int playerLevel = data.getLevel();
sender.sendMessage("§f- §a等级: §dLv."+playerLevel);
sender.sendMessage("§f- §a经验: §d"+data.getExp().toString()+"§a/§d"+ DLevelAPI.getLevelNeedExp(playerLevel));
sender.sendMessage("§f- §a等级: §d"+data.getTotalExp().toString());
}else{
PlayerData data = Main.serverManage.getPlayerData(uuid);
DemonAPI.sendMessage(sender,"玩家 §e"+playerName+" §a的等级信息:");
int playerLevel = data.getLevel();
sender.sendMessage("§f- §a等级: §dLv."+playerLevel);
sender.sendMessage("§f- §a经验: §d"+data.getExp().toString()+"§a/§d"+ DLevelAPI.getLevelNeedExp(playerLevel));
sender.sendMessage("§f- §a等级: §d"+data.getTotalExp().toString());
}
return true;
}
return false;
}
@ -150,9 +154,12 @@ public class MainCmd implements CommandExecutor , TabCompleter {
completions.add("look");
completions.add("give");
completions.add("take");
completions.add("set");
completions.add("setlevel");
completions.add("settotal");
completions.add("kmob");
}else if(args.length == 2){
String[] onlinePlayers = Bukkit.getOnlinePlayers().stream().map(HumanEntity::getName).toArray(String[]::new);
completions.addAll(Arrays.asList(onlinePlayers));
}else if(args.length == 3){
completions.add("单位小时");
completions.add("经验");

View File

@ -1,36 +0,0 @@
package me.Demon.DemonLevels.data;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
public class ChangExpEvant extends Event {
private static HandlerList handlers = new HandlerList();
private final Player player;
private final int exp;
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
public ChangExpEvant(Player player, int exp) {
this.player = player;
this.exp = exp;
}
public Player getPlayer() {
return player;
}
public int getExp() {
return exp;
}
}

View File

@ -90,10 +90,26 @@ public class PlayerData {
if(player != null) {
System.out.println("[日志 - 等级] 玩家 " + player.getName() + " 已创建档案数据.");
yml.set("name",player.getName());
// 判断玩家之前是否存在等级数据
FileConfiguration config = Main.plugin.getConfig();
String str = "levelstats."+player.getName()+".";
if(config.getInt(str+"level") >= 1){
int dlevel = config.getInt(str+"level");
int exp = config.getInt(str+"exp");
int totalExp = config.getInt(str+"totalExp");
yml.set("level", dlevel);
yml.set("exp", exp);
yml.set("totalExp", totalExp);
}else{
yml.set("level", 1);
yml.set("exp", 0);
yml.set("totalExp", 1);
}
}else {
yml.set("level", 1);
yml.set("exp", 0);
yml.set("totalExp", 1);
}
yml.set("level",1);
yml.set("exp",0);
yml.set("totalExp",1);
this.file = file;
this.fileConfiguration = yml;
saveFile();

View File

@ -39,8 +39,9 @@ public class MobDeath implements Listener {
// 获取服务器当前经验倍率
double serverDouble = Main.serverManage.getExpMultiplicity();
// 检测服务器经验倍率时间是否关闭
if(Main.serverManage.isExpMultipleTime()){
Main.serverManage.setExpMultiplicity(1.0);
if(serverDouble >= 1.1 && Main.serverManage.isExpMultipleTime()){
Main.serverManage.setExpMultiplicity(1.0,System.currentTimeMillis());
System.out.println("[调试 - 等级] 经验倍率已恢复默认1.0");
serverDouble = 1.0;
for (Player p :Bukkit.getOnlinePlayers()) {
DemonAPI.sendMessage(p,"经验倍率加成已结束!已经恢复默认倍率。");
@ -62,7 +63,7 @@ public class MobDeath implements Listener {
int exp = (int) (mobsManage.getExp() * serverDouble * att_expAddition);
// 假设serverDouble = 2.0 att_expAddition = 1.50;
// 则结果将会是 2.0 + 1.5 = 3.5 但实际上是 1.0 + 0.5 = 1.5
double magnificationDisplay = (serverDouble + att_expAddition) - 2; // 获取玩家当前倍率
double magnificationDisplay = (serverDouble + (att_expAddition - 1)); // 获取玩家当前倍率
// 判断玩家是否在队伍之中
boolean isTeamExit = false;
Map<TeamData, Double> teamMap = new HashMap<>();
@ -153,7 +154,8 @@ public class MobDeath implements Listener {
public static void experienceGainTips(Player p,int exp,int magnificationDisplayString){
String playName = "§8§l[ §b"+p.getName()+" §8§l]";
String nowexp = "§8§l[ §e§lLv."+111+" §c§l"+111+"§f§l/§a§l"+111+" §8§l]";
PlayerData playerData = Main.serverManage.getPlayerData(p.getUniqueId().toString());
String nowexp = "§8§l[ §e§lLv."+playerData.getLevel()+" §c§l"+playerData.getExp().toString()+"§f§l/§a§l"+DLevelAPI.getLevelNeedExp(playerData.getLevel()).toString()+" §8§l]";
String addExp = "§8§l[ §d§l+" + exp + " §8§l]";
if(magnificationDisplayString >= 1){
addExp = "§8§l[ §d§l++" + exp + "++ §8§l]";

View File

@ -24,7 +24,11 @@ public class ServerManage {
if(expMultipleTime <= 0){
expMultipleTime = System.currentTimeMillis() + (1000 * 60);
}
expMultiplicity = yml.getDouble("DoubleExp",1.0);
DemonAPI.sendConsoleMessage("§f[§a!§f] §f倍率持续时间 §8> §6"+DemonAPI.LongToStringData(expMultipleTime,"yyyy年MM月dd日"));
expMultiplicity = yml.getDouble("DoubleExp");
if(expMultiplicity <= 0){
expMultiplicity = 1.0;
}
DemonAPI.sendConsoleMessage("§f[§a!§f] §f全服经验倍率 §8> §6"+(expMultiplicity*100)+"%");
if(Bukkit.getPluginManager().getPlugin("DemonVipSystem") != null){
LinkDemonVipSystem = true;
@ -47,7 +51,8 @@ public class ServerManage {
return expMultiplicity;
}
public void setExpMultiplicity(double expMultiplicity) {
public void setExpMultiplicity(double expMultiplicity,long expMultipleTime) {
this.expMultipleTime = expMultipleTime;
this.expMultiplicity = expMultiplicity;
FileConfiguration yml = Main.plugin.getConfig();
yml.set("ExpMultipleTime",this.expMultipleTime);

View File

@ -1,5 +1,15 @@
package me.Demon.DemonLevels.util;
import me.Demon.DemonLevels.Main;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
public abstract class GameUtil {
public static int convertInt(String string){
@ -17,4 +27,23 @@ public abstract class GameUtil {
return 1.0;
}
}
public static String formatTime(long millis) {
// 转换毫秒为秒
long seconds = millis / 1000;
// 计算天小时和分钟
long days = seconds / (24 * 3600);
long hours = (seconds % (24 * 3600)) / 3600;
long minutes = (seconds % 3600) / 60;
// 判断时间长度的范围并格式化输出
if (days > 0) {
return String.format("%d天%d小时", days, hours);
} else if (hours > 0) {
return String.format("%d小时%d分钟", hours, minutes);
} else {
return String.format("%d分钟", minutes);
}
}
}

View File

@ -1,37 +1,37 @@
CustonName:
105: "§9§l极§d§l限§c§l斗§e§l神"
100: "§9§l极§d§l限§c§l斗§e§l"
100: "§9§l极§d§l限§c§l斗§e§l"
90: "§c封号斗魂"
80: "§6魂斗"
70: "§d圣"
60: "§e帝"
50: "§c王"
40: "§6宗"
30: "§5尊"
20: "§3大师"
10: "§2师"
0: "§7士"
80: "§6魂斗"
70: "§d圣"
60: "§e帝"
50: "§c王"
40: "§6宗"
30: "§5尊"
20: "§3大师"
10: "§2师"
0: "§7士"
NeelUpExp:
0: "%level% * 100"
1: "%level% * 100"
5: "%level% * 200"
10: "%level% * 400"
15: "%level% * 800"
20: "%level% * 1000"
25: "%level% * 1500"
30: "%level% * 5000"
35: "%level% * 6500"
40: "%level% * 8000"
45: "%level% * 10000"
50: "%level% * 12000"
55: "%level% * 14000"
60: "%level% * 15000"
65: "%level% * 20000"
70: "%level% * 25000"
75: "%level% * 100000"
80: "%level% * 200000"
85: "%level% * 400000"
90: "%level% * 600000"
95: "%level% * 1200000"
30: "%level% * 2500"
35: "%level% * 4500"
40: "%level% * 6000"
45: "%level% * 7000"
50: "%level% * 8000"
55: "%level% * 10000"
60: "%level% * 12000"
65: "%level% * 16000"
70: "%level% * 20000"
75: "%level% * 400000"
80: "%level% * 100000"
85: "%level% * 200000"
90: "%level% * 400000"
95: "%level% * 1000000"
100: "%level% * 3000000"
105: "%level% * 5000000"
110: "%level% * 8000000"
@ -81,7 +81,6 @@ MobKillExp:
星斗森林_10000翠魔鸟: 800~1500
星斗森林_10000化蛇: 800~1500
星斗森林_10000青影狮鹫: 800~1500
经验猪: 2500~5000
极寒冰域_1000炽眼猪妖: 500~800
极寒冰域_1000三足金乌: 500~800
极寒冰域_1000极寒九婴: 500~800
@ -97,20 +96,50 @@ MobKillExp:
冰火两仪眼_10000暗黑邪神虎: 1200~1800
冰火两仪眼_10000冰碧蝎: 1200~1800
冰火两仪眼_10000翠魔鸟: 1200~1800
冰火两仪眼_奇茸通天菊: 100~800
冰火两仪眼_八瓣仙兰: 100~800
冰火两仪眼_相思断肠红: 100~800
冰火两仪眼_水仙玉肌骨: 100~800
杀戮都市_风灵狼: 3000~5000
杀戮都市_鬼藤: 3000~5000
杀戮都市_疾风魔狼: 3000~5000
杀戮都市_曼陀罗蛇: 3000~5000
杀戮都市_粉红娘娘: 3000~5000
杀戮都市_冰蚕: 3000~5000
杀戮都市_鬼虎: 3000~5000c
杀戮都市_四眼鳞甲兽: 3000~5000
杀戮都市_魔暝鹿: 3000~5000
杀戮都市_杀戮暴徒: 5000~7000
杀戮都市_堕落暴徒: 4000~6000
武魂殿_巡逻魂师: 6000~9000
武魂殿_魂师喽啰: 7000~10000
冰火两仪眼_奇茸通天菊: 1000~1800
冰火两仪眼_八瓣仙兰: 1000~1800
冰火两仪眼_相思断肠红: 1000~1800
冰火两仪眼_水仙玉肌骨: 1000~1800
冰火两仪眼_烈火杏娇疏: 1000~1800
杀戮都市_风灵狼: 1800~2500
杀戮都市_鬼藤: 1800~2500
杀戮都市_疾风魔狼: 1800~2500
杀戮都市_曼陀罗蛇: 1800~2500
杀戮都市_粉红娘娘: 1800~2500
杀戮都市_冰蚕: 1800~2500
杀戮都市_鬼虎: 1800~2500
杀戮都市_四眼鳞甲兽: 1800~2500
杀戮都市_魔暝鹿: 1800~2500
杀戮都市_杀戮暴徒: 2000~2500
杀戮都市_堕落暴徒: 2000~2500
武魂殿魂师_守卫魂师: 2000~3000
武魂殿魂师_巡逻魂师: 2250~3000
武魂殿魂师_殿堂魂师: 2500~3000
武魂殿魂师_精英魂师: 3000~4000
封神一考_魂兽: 3000~4000
封神二考_魂兽: 3000~4000
封神三考_魂兽: 3000~4000
封神一考_考官: 5000~10000
封神二考_考官: 5000~10000
封神三考_考官: 5000~10000
封神四考_魂兽: 3500~4500
封神五考_魂兽: 3500~4500
封神六考_魂兽: 3500~4500
封神七考_魂兽: 4000~5000
封神八考_魂兽: 4000~5000
封神九考_魂兽: 4000~5000
封神四考_考官: 5000~10000
封神五考_考官: 5000~10000
封神六考_考官: 5000~10000
封神七考_考官: 5000~10000
封神八考_考官: 5000~10000
天使神域_圣殿护卫: 7000~10000
天使神域_天翼圣卫: 7000~10000
天使神域_星辰守卫: 8000~11000
天使神域_银羽神卫: 8000~11000
神域灵兽_御金玲龙: 6000~9000
神域灵兽_神御玲龙: 6000~9000
经验灵兽_1: 1000~2500
经验灵兽_2: 2500~3500
活动魂兽1: 1000~2500
活动魂兽2: 2500~3500

View File

@ -0,0 +1,4 @@
# 多倍经验
DoubleExp: 1.0
# 多倍经验持续时间
ExpMultipleTime: -1

View File

@ -1,6 +1,6 @@
name: DemonLevels
main: me.Demon.DemonLevels.Main
version: 1.4.3
version: 2.1.6
depend: [DemonTeam]
commands:
dlevel: