commit 779420568ef0b002e5aab647cdc6554d0a3bf57b
Author: yaohunya <1763917516@qq.com>
Date: Thu Aug 7 17:13:13 2025 +0800
2.0.0
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..3af291a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,42 @@
+
+
+ 4.0.0
+
+ org.example
+ DemonPvpProtect
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+ public-rpg
+ https://repo.aurora-pixels.com/repository/public-rpg/
+
+
+
+
+
+ org.spigotmc
+ spigot-api
+ 1.12.2
+
+
+ me.Demon.DemonPlugin
+ DemonAPI
+ 2.2.9
+
+
+ com.io.yaohun.worldbosshurt
+ WorldBossHurt
+ 1.4.8
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/yaohun/pvpprotect/PvpMain.java b/src/main/java/com/yaohun/pvpprotect/PvpMain.java
new file mode 100644
index 0000000..910d20b
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/PvpMain.java
@@ -0,0 +1,93 @@
+package com.yaohun.pvpprotect;
+
+import com.yaohun.pvpprotect.config.Config;
+import com.yaohun.pvpprotect.data.PlayerData;
+import com.yaohun.pvpprotect.gui.OperateGui;
+import com.yaohun.pvpprotect.listener.PlayerListener;
+import com.yaohun.pvpprotect.manage.PlayerManager;
+import me.Demon.DemonPlugin.Util.DataRefreshUtil;
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitRunnable;
+
+public class PvpMain extends JavaPlugin {
+
+ private static PvpMain instance;
+ private static PlayerManager playerManager;
+
+ @Override
+ public void onEnable() {
+ instance = this;
+ Config.reloadConfig(this);
+ playerManager = new PlayerManager(this);
+ getServer().getPluginManager().registerEvents(new OperateGui(), this);
+ getServer().getPluginManager().registerEvents(new PlayerListener(), this);
+
+ Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> {
+ getPlayerManager().carryOutCheckTime();
+ },100L,20L * 60);
+ DataRefreshUtil.createRefreshDataRecord("PvpProtectDaily");
+ }
+
+ @Override
+ public void onDisable() {
+ getPlayerManager().saveAllPlayerData();
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ if("pvp".equalsIgnoreCase(label)){
+ if (!sender.isOp()) {
+ Player p = (Player) sender;
+ OperateGui.openGui(p);
+ return true;
+ }
+ if (args.length == 0) {
+ sender.sendMessage("");
+ sender.sendMessage("§e------- ======= §6竞技保护 §e======= -------");
+ sender.sendMessage("§2/" + label + " open §f- §2打开界面");
+ sender.sendMessage("§2/" + label + " reload §f- §2重载配置");
+ sender.sendMessage("§2/" + label + " reset §e[玩家/ALL] §f- §2重置保护世界");
+ sender.sendMessage("§e------- ======= §6竞技保护 §e======= -------");
+ return true;
+ }
+ if(args.length == 1 && "open".equalsIgnoreCase(args[0])){
+ Player p = (Player) sender;
+ OperateGui.openGui(p);
+ return true;
+ }
+ if(args.length == 1 && "reload".equalsIgnoreCase(args[0])){
+ Config.reloadConfig(this);
+ sender.sendMessage("[竞技保护] 配置文件已重载完成.");
+ return true;
+ }
+
+ if(args.length >= 1 && "reset".equalsIgnoreCase(args[0])){
+ String name = "all";
+ if(args.length >= 2){
+ name = args[1];
+ }
+ if("all".equalsIgnoreCase(name)) {
+ getPlayerManager().resetAllPlayerData();
+ sender.sendMessage("[竞技保护] 所有玩家的竞技保护时间已重置.");
+ return true;
+ }
+ PlayerData playerData = getPlayerManager().getPlayerData(name);
+ playerData.resetTimeLeft();
+ sender.sendMessage("[竞技保护] 玩家 "+name+" 竞技保护时间已重置.");
+ }
+ }
+ return false;
+ }
+
+ public static PvpMain inst() {
+ return instance;
+ }
+
+ public static PlayerManager getPlayerManager() {
+ return playerManager;
+ }
+}
diff --git a/src/main/java/com/yaohun/pvpprotect/config/Config.java b/src/main/java/com/yaohun/pvpprotect/config/Config.java
new file mode 100644
index 0000000..2b65684
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/config/Config.java
@@ -0,0 +1,43 @@
+package com.yaohun.pvpprotect.config;
+
+import com.yaohun.pvpprotect.PvpMain;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.data.GuiItemData;
+import me.Demon.DemonPlugin.data.LangData;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.HashMap;
+
+public class Config {
+
+ public static int default_hour = 12;
+ public static LangData langData;
+ private static HashMap guiItemDataMap = new HashMap<>();
+
+ public static void reloadConfig(PvpMain plugin){
+ guiItemDataMap.clear();
+ langData = DemonAPI.getLangData("DemonPvpProtect");
+ plugin.reloadConfig();
+ plugin.saveConfig();
+ FileConfiguration config = plugin.getConfig();
+ default_hour = config.getInt("DefaultHour",12);
+ loadGuiItemData(config);
+ }
+
+ private static void loadGuiItemData(FileConfiguration configuration){
+ ConfigurationSection section = configuration.getConfigurationSection("GuiItemData");
+ if(section == null){return;}
+ for (String itemKey : section.getKeys(false)){
+ guiItemDataMap.put(itemKey,new GuiItemData(itemKey,section));
+ }
+ }
+
+ public static ItemStack getItemStack(String itemKey) {
+ if(guiItemDataMap.containsKey(itemKey)){
+ return guiItemDataMap.get(itemKey).getItemStack().clone();
+ }
+ return DemonAPI.getErrItems();
+ }
+}
diff --git a/src/main/java/com/yaohun/pvpprotect/data/PlayerData.java b/src/main/java/com/yaohun/pvpprotect/data/PlayerData.java
new file mode 100644
index 0000000..673905f
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/data/PlayerData.java
@@ -0,0 +1,62 @@
+package com.yaohun.pvpprotect.data;
+
+import com.yaohun.pvpprotect.PvpMain;
+import com.yaohun.pvpprotect.config.Config;
+import com.yaohun.pvpprotect.util.MessageUtil;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+
+import java.io.File;
+
+public class PlayerData {
+ private String playerName;
+ private long timeLeft;
+ private long startTime;
+
+ public PlayerData(String name, FileConfiguration config){
+ this.playerName = name;
+ this.timeLeft = config.getLong(name);
+ if(this.timeLeft == 0){
+ this.resetTimeLeft();
+ }
+ this.startTime = System.currentTimeMillis();
+ }
+
+ public void saveData(){
+ File file = new File(PvpMain.inst().getDataFolder(), "data.yml");
+ FileConfiguration config = YamlConfiguration.loadConfiguration(file);
+ config.set(playerName, timeLeft);
+ }
+
+ public String getPlayerName() {
+ return playerName;
+ }
+
+ public long getTimeLeft() {
+ return timeLeft;
+ }
+
+ public void setTimeLeft(long timeLeft) {
+ this.timeLeft = timeLeft;
+ }
+
+ public void resetTimeLeft(){
+ this.timeLeft = Config.default_hour * 60 * 60 * 1000L;
+ }
+
+ public void resetStartTime(){
+ this.startTime = System.currentTimeMillis();
+ }
+
+ public void timeSpentThisTimeEvent() {
+ long deductionTime = System.currentTimeMillis() - startTime;
+ this.startTime = System.currentTimeMillis();
+ setTimeLeft(getTimeLeft() - deductionTime);
+ if(this.timeLeft <= 0){
+ this.timeLeft = -1000 * 60;
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/pvpprotect/gui/OperateGui.java b/src/main/java/com/yaohun/pvpprotect/gui/OperateGui.java
new file mode 100644
index 0000000..a92cd39
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/gui/OperateGui.java
@@ -0,0 +1,85 @@
+package com.yaohun.pvpprotect.gui;
+
+import com.yaohun.pvpprotect.PvpMain;
+import com.yaohun.pvpprotect.config.Config;
+import com.yaohun.pvpprotect.data.PlayerData;
+import com.yaohun.pvpprotect.manage.PlayerManager;
+import com.yaohun.pvpprotect.util.MessageUtil;
+import com.yaohun.pvpprotect.util.StackUtil;
+import me.Demon.DemonPlugin.Util.CDTimeAPI;
+import me.Demon.DemonPlugin.Util.DataRefreshUtil;
+import me.Demon.DemonPlugin.settings.RefreshData;
+import org.bukkit.Bukkit;
+import org.bukkit.Sound;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.Inventory;
+
+import java.util.UUID;
+
+public class OperateGui implements Listener {
+
+ private static String invTitle = Config.langData.getMessage("invTitle");
+
+ public static void openGui(Player player){
+ PlayerManager playerManager = PvpMain.getPlayerManager();
+ RefreshData refreshData = DataRefreshUtil.getSetting("PvpProtectDaily");
+ if(refreshData != null && !refreshData.isSameDayAsRecord()){
+ refreshData.setRecordTime(System.currentTimeMillis());
+ DataRefreshUtil.SaveRefreshDataRecord(refreshData);
+ playerManager.resetAllPlayerData();
+ }
+ String playerName = player.getName();
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ if(playerData.getTimeLeft() < 1000L){
+ String message = Config.langData.getMessage("insufficientTime");
+ MessageUtil.sendMessage(player,message, Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ Inventory inv = Bukkit.createInventory(null,9,invTitle);
+ inv.setItem(1,Config.getItemStack("ProtectInfo"));
+ inv.setItem(4, StackUtil.startSwitch(player.getName()));
+ inv.setItem(7,StackUtil.timeDisplay(playerData));
+ player.openInventory(inv);
+ }
+
+ @EventHandler
+ public void onclick(InventoryClickEvent e) {
+ int rawSlot = e.getRawSlot();
+ Player p = (Player) e.getWhoClicked();
+ UUID uuid = p.getUniqueId();
+ String playerName = p.getName();
+ if (e.getView().getTitle().equalsIgnoreCase(invTitle)) {
+ e.setCancelled(true);
+ if(e.getRawSlot() == 4) {
+ p.closeInventory();
+ String cdKey = "switchModePvp";
+ if(CDTimeAPI.isCD(uuid,cdKey)){
+ double second = (double) CDTimeAPI.getCD(uuid, cdKey) / 1000L;
+ String message = Config.langData.getMessage("switchCoolDown").replace("{time}",String.format("%.1f",second));
+ MessageUtil.sendMessage(p,message, Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ CDTimeAPI.setPlayerCD(uuid,cdKey,1000L * 10L);
+ PlayerManager playerManager = PvpMain.getPlayerManager();
+ if (playerManager.isPlayerOpened(playerName)) {
+ playerManager.setProtectStats(playerName,false);
+ String message = Config.langData.getMessage("switchModeOff");
+ MessageUtil.sendMessage(p,message, Sound.ENTITY_VILLAGER_NO);
+ } else {
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ if(playerData.getTimeLeft() < 1000L){
+ String message = Config.langData.getMessage("insufficientTime");
+ MessageUtil.sendMessage(p,message, Sound.ENTITY_VILLAGER_NO);
+ return;
+ }
+ playerManager.setProtectStats(playerName,true);
+ String message = Config.langData.getMessage("switchModeOn");
+ MessageUtil.sendMessage(p,message, Sound.BLOCK_COMPARATOR_CLICK);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/pvpprotect/listener/PlayerListener.java b/src/main/java/com/yaohun/pvpprotect/listener/PlayerListener.java
new file mode 100644
index 0000000..2f1f960
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/listener/PlayerListener.java
@@ -0,0 +1,85 @@
+package com.yaohun.pvpprotect.listener;
+
+import com.io.yaohun.worldbosshurt.api.BossHurtAPI;
+import com.yaohun.pvpprotect.PvpMain;
+import com.yaohun.pvpprotect.config.Config;
+import com.yaohun.pvpprotect.manage.PlayerManager;
+import com.yaohun.pvpprotect.util.MessageUtil;
+import org.bukkit.Sound;
+import org.bukkit.World;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.entity.Projectile;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityDamageByEntityEvent;
+
+public class PlayerListener implements Listener {
+ @EventHandler
+ public void onDamageBy(EntityDamageByEntityEvent e) {
+ if (!(e.getEntity() instanceof Player)) {
+ return;
+ }
+ Player damaged = (Player) e.getEntity();
+ Player damager = null;
+
+ // 判断攻击者类型
+ if (e.getDamager() instanceof Player) {
+ damager = (Player) e.getDamager();
+ } else if (e.getDamager() instanceof Projectile) {
+ Projectile projectile = (Projectile) e.getDamager();
+ if (projectile.getShooter() instanceof Player) {
+ damager = (Player) projectile.getShooter();
+ }
+ }
+
+ if (damager == null) {
+ return;
+ }
+
+ World world = damager.getWorld();
+ if ("hsjjc".equalsIgnoreCase(world.getName())) {
+ return;
+ }
+
+ PlayerManager playerManager = PvpMain.getPlayerManager();
+
+ String damagerName = damager.getName();
+ String damagedName = damaged.getName();
+
+ if (playerManager.isPlayerOpened(damagerName)) {
+ e.setCancelled(true);
+ damaged.sendMessage(Config.langData.getMessage("damagerPVP"));
+ return;
+ }
+
+ if (playerManager.isPlayerOpened(damagedName)) {
+ e.setCancelled(true);
+ damager.sendMessage(Config.langData.getMessage("entityPVP"));
+ }
+ }
+
+ @EventHandler
+ public void onBossDiscover(EntityDamageByEntityEvent e) {
+ if (!(e.getDamager() instanceof Player)) {
+ return;
+ }
+ if (e.getEntity() instanceof Player) {
+ return;
+ }
+ Player player = (Player) e.getDamager();
+ String playerName = player.getName();
+ PlayerManager playerManager = PvpMain.getPlayerManager();
+ // 判断玩家是否已开启Pvp保护
+ if(playerManager.isPlayerOpened(playerName)){
+ // 判断玩家攻击目标是否是BOSS
+ Entity entity = e.getEntity();
+ String customName = entity.getCustomName();
+ if (customName != null && BossHurtAPI.isBossExist(customName)) {
+ String message = Config.langData.getMessage("attackBossClose");
+ MessageUtil.sendMessage(player,message, Sound.ENTITY_VILLAGER_YES);
+ playerManager.setProtectStats(playerName,false);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/pvpprotect/manage/PlayerManager.java b/src/main/java/com/yaohun/pvpprotect/manage/PlayerManager.java
new file mode 100644
index 0000000..e93c6a6
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/manage/PlayerManager.java
@@ -0,0 +1,131 @@
+package com.yaohun.pvpprotect.manage;
+
+import com.yaohun.pvpprotect.PvpMain;
+import com.yaohun.pvpprotect.config.Config;
+import com.yaohun.pvpprotect.data.PlayerData;
+import com.yaohun.pvpprotect.util.MessageUtil;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.ConfigurationSection;
+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.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class PlayerManager {
+
+ private final File file;
+ private final FileConfiguration config;
+
+ // 当玩家开启了竞技保护就会例如这里
+ private final HashMap protectStatsMap = new HashMap<>();
+ private final HashMap playerDataMap = new HashMap<>();
+
+ public PlayerManager(PvpMain plugin) {
+ this.file = new File(plugin.getDataFolder(),"data.yml");
+ this.config = YamlConfiguration.loadConfiguration(this.file);
+ }
+
+ public PlayerData getPlayerData(String playerName) {
+ if(!playerDataMap.containsKey(playerName)) {
+ PlayerData playerData = new PlayerData(playerName,this.config);
+ playerDataMap.put(playerName,playerData);
+ return playerData;
+ }
+ return playerDataMap.get(playerName);
+ }
+
+ public void saveAllPlayerData() {
+ for (PlayerData playerData : playerDataMap.values()) {
+ playerData.saveData();
+ }
+ try {
+ config.save(file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void setAllPlayerData(long time) {
+ for (PlayerData playerData : playerDataMap.values()){
+ playerData.setTimeLeft(time);
+ }
+ }
+
+ // 将所有玩家的竞技保护时间重置
+ public void resetAllPlayerData() {
+ saveAllPlayerData();
+ playerDataMap.clear();
+ long defaultTime = Config.default_hour * 1000L * 60 * 60;
+ for (String playerName : config.getKeys(false)) {
+ config.set(playerName, defaultTime);
+ }
+ try {
+ config.save(file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ // 判断玩家是否已开启竞技保护
+ public boolean isPlayerOpened(String playerName) {
+ if(this.protectStatsMap.containsKey(playerName)){
+ return this.protectStatsMap.get(playerName);
+ }
+ return false;
+ }
+ // 设置玩家是否开启竞技保护
+ public void setProtectStats(String playerName, boolean isOpened){
+ this.protectStatsMap.put(playerName,isOpened);
+ // 若是开启竞技保护 将重置玩家数据中的 startTime
+ if(isOpened){
+ PlayerData playerData = getPlayerData(playerName);
+ playerData.resetStartTime();
+ }
+ }
+
+ public List getOpenedList(){
+ List stringList = new ArrayList<>();
+ for (String playerName : protectStatsMap.keySet()) {
+ if(protectStatsMap.get(playerName)){
+ stringList.add(playerName);
+ }
+ }
+ return stringList;
+ }
+
+
+ public void carryOutCheckTime() {
+ // 获取已开启竞技保护的玩家列表
+ List stringList = getOpenedList();
+ if(stringList.isEmpty()){
+ return;
+ }
+ for (String playerName : stringList) {
+ PlayerData playerData = getPlayerData(playerName);
+ if (playerData == null) {
+ continue;
+ }
+ playerData.timeSpentThisTimeEvent();
+ long timeLeft = playerData.getTimeLeft();
+ if (timeLeft < 0) {
+ // 回到主线程再操作 Bukkit API
+ Bukkit.getScheduler().runTask(PvpMain.inst(), () -> {
+ Player player = Bukkit.getPlayer(playerName);
+ if (player != null) {
+ MessageUtil.sendMessage(player, Config.langData.getMessage("insufficientTime"));
+ }
+ setProtectStats(playerName, false);
+ });
+ }
+ }
+ int onSize = stringList.size();
+ if (onSize >= 1) {
+ Bukkit.getConsoleSender().sendMessage("[日志 - 竞技保护] 当前开启保护玩家: " + onSize + "名");
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/pvpprotect/util/MessageUtil.java b/src/main/java/com/yaohun/pvpprotect/util/MessageUtil.java
new file mode 100644
index 0000000..40e5e35
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/util/MessageUtil.java
@@ -0,0 +1,26 @@
+package com.yaohun.pvpprotect.util;
+
+import org.bukkit.Sound;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+public class MessageUtil {
+ public static void sendMessage(CommandSender sender, String message) {
+ if(sender instanceof Player){
+ Player player = (Player) sender;
+ player.sendMessage(message);
+ } else {
+ sender.sendMessage(message);
+ }
+ }
+
+ public static void sendMessage(CommandSender sender, String message, Sound sound) {
+ if(sender instanceof Player){
+ Player player = (Player) sender;
+ player.sendMessage(message);
+ player.playSound(player.getLocation(), sound, 0.8f, 1.2f);
+ } else {
+ sender.sendMessage(message);
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/pvpprotect/util/StackUtil.java b/src/main/java/com/yaohun/pvpprotect/util/StackUtil.java
new file mode 100644
index 0000000..93dddd7
--- /dev/null
+++ b/src/main/java/com/yaohun/pvpprotect/util/StackUtil.java
@@ -0,0 +1,47 @@
+package com.yaohun.pvpprotect.util;
+
+import com.yaohun.pvpprotect.PvpMain;
+import com.yaohun.pvpprotect.config.Config;
+import com.yaohun.pvpprotect.data.PlayerData;
+import com.yaohun.pvpprotect.manage.PlayerManager;
+import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.List;
+
+public class StackUtil {
+
+ public static ItemStack startSwitch(String playName){
+ PlayerManager playerManager = PvpMain.getPlayerManager();
+ ItemStack stack = Config.getItemStack("SwitchButt");
+ ItemMeta meta = stack.getItemMeta();
+ String stats = Config.langData.getMessage("statsOn");
+ if(!playerManager.isPlayerOpened(playName)){
+ stats = Config.langData.getMessage("statsOff");
+ }
+ String itemName = meta.getDisplayName().replace("{stats}",stats);
+ meta.setDisplayName(itemName);
+ meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
+ stack.setItemMeta(meta);
+ return stack;
+ }
+
+ public static ItemStack timeDisplay(PlayerData playerData){
+ ItemStack stack = Config.getItemStack("TimeShow");
+ ItemMeta meta = stack.getItemMeta();
+ List lore = meta.getLore();
+ for (int i = 0; i < lore.size(); i++) {
+ String string = lore.get(i);
+ if(string.contains("{time}")){
+ int second = (int) (playerData.getTimeLeft() / 1000L);
+ string = string.replace("{time}",String.valueOf(second));
+ lore.set(i, string);
+ }
+ }
+ meta.setLore(lore);
+ meta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
+ stack.setItemMeta(meta);
+ return stack;
+ }
+}
diff --git a/src/main/resources/DemonPvpProtect.yml b/src/main/resources/DemonPvpProtect.yml
new file mode 100644
index 0000000..78a2055
--- /dev/null
+++ b/src/main/resources/DemonPvpProtect.yml
@@ -0,0 +1,11 @@
+Message:
+ statsOn: §a開啓
+ statsOff: §c關閉
+ invTitle: §8§l競技保護系統
+ damagerPVP: §7[§6競技保護§7] §f你開啓了競技保護,無法攻擊其他人.
+ entityPVP: §7[§6競技保護§7] §f目標開啓了競技保護,無法對他造成傷害.
+ switchModeOn: '§7[§6競技保護§7] §f模式切換成功: §a開啓'
+ switchModeOff: '§7[§6競技保護§7] §f模式切換成功: §c關閉'
+ switchCoolDown: §7[§6競技保護§7] §f你還需要等待§e[{time}秒]§f才能切換模式.
+ insufficientTime: §7[§6競技保護§7] §c今日的有效時長已用光,無法開啓.
+ attackBossClose: §7[§6競技保護§7] §b因為對世界BOSS造成了傷害,競技保護已自動關閉.
\ No newline at end of file
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
new file mode 100644
index 0000000..43753ee
--- /dev/null
+++ b/src/main/resources/config.yml
@@ -0,0 +1,24 @@
+DefaultHour: 12
+GuiItemData:
+ ProtectInfo:
+ Material: SIGN
+ DisplayName: §7竞技保护系统介绍
+ Lore:
+ - §a§l★§7为§a保护所有玩家§7可进入更高级别猎魂区
+ - §a§l★§7进行猎杀灵兽夺取灵环、材料等内容
+ - §a§l★§7玩家可开启竞技保护,开启后将不会受到
+ - §a§l★§7来自§c其他玩家§7的伤害,但同时也§c无法对其他§7玩家造成伤害。
+ - §a§l★§7每日都会赠送器师§b720分钟§7免费保护时长
+ - §c当你对世界BOSS造成伤害时会自动关闭保护
+ - ' '
+ - §c§l★§7系统处于测试阶段,发现任何Bug请务必联系管理反馈
+ SwitchButt:
+ Material: DIAMOND_SWORD
+ DisplayName: §6当前状态 §7[{stats}§7]
+ Lore:
+ - §a§l★§7点击切换状态
+ TimeShow:
+ Material: GOLD_HELMET
+ DisplayName: §6竞技保护状态查询
+ Lore:
+ - '§a§l★§7剩余时长: §b{time}秒'
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..f628fab
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,6 @@
+name: DemonPvpProtect
+main: com.yaohun.pvpprotect.PvpMain
+version: 2.0.0
+author: yaohun
+commands:
+ pvp:
\ No newline at end of file