From 32631e6c594f213310de70b4981b70a8069769db Mon Sep 17 00:00:00 2001
From: yaohunya <1763917516@qq.com>
Date: Sat, 19 Jul 2025 05:09:22 +0800
Subject: [PATCH] 2.0.0
---
pom.xml | 37 ++++++
.../java/com/yaohun/playermail/MailMain.java | 93 ++++++++++++++++
.../yaohun/playermail/data/PlayerData.java | 90 +++++++++++++++
.../com/yaohun/playermail/gui/MailGui.java | 61 ++++++++++
.../com/yaohun/playermail/gui/ToMailGui.java | 102 +++++++++++++++++
.../playermail/listener/ClickInventory.java | 105 ++++++++++++++++++
.../playermail/listener/PlayerListener.java | 42 +++++++
.../playermail/manage/PlayerManager.java | 37 ++++++
.../com/yaohun/playermail/util/LangUtil.java | 27 +++++
.../Demon/DemonPlayerMail/Api/DMailAPI.java | 46 ++++++++
src/main/resources/plugin.yml | 7 ++
11 files changed, 647 insertions(+)
create mode 100644 pom.xml
create mode 100644 src/main/java/com/yaohun/playermail/MailMain.java
create mode 100644 src/main/java/com/yaohun/playermail/data/PlayerData.java
create mode 100644 src/main/java/com/yaohun/playermail/gui/MailGui.java
create mode 100644 src/main/java/com/yaohun/playermail/gui/ToMailGui.java
create mode 100644 src/main/java/com/yaohun/playermail/listener/ClickInventory.java
create mode 100644 src/main/java/com/yaohun/playermail/listener/PlayerListener.java
create mode 100644 src/main/java/com/yaohun/playermail/manage/PlayerManager.java
create mode 100644 src/main/java/com/yaohun/playermail/util/LangUtil.java
create mode 100644 src/main/java/me/Demon/DemonPlayerMail/Api/DMailAPI.java
create mode 100644 src/main/resources/plugin.yml
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..2ce234d
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+ com.yaohun.main
+ DemonPlayerMail
+ 1.0-SNAPSHOT
+
+
+ 8
+ 8
+ UTF-8
+
+
+
+
+ public-rpg
+ https://repo.aurora-pixels.com/repository/public-rpg/
+
+
+
+
+
+ me.Demon.DemonPlugin
+ DemonAPI
+ 2.2.9
+
+
+ org.spigotmc
+ spigot-api
+ 1.12.2
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/yaohun/playermail/MailMain.java b/src/main/java/com/yaohun/playermail/MailMain.java
new file mode 100644
index 0000000..dc01f59
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/MailMain.java
@@ -0,0 +1,93 @@
+package com.yaohun.playermail;
+
+import com.yaohun.playermail.gui.MailGui;
+import com.yaohun.playermail.gui.ToMailGui;
+import com.yaohun.playermail.listener.ClickInventory;
+import com.yaohun.playermail.listener.PlayerListener;
+import com.yaohun.playermail.manage.PlayerManager;
+import com.yaohun.playermail.util.LangUtil;
+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;
+
+public class MailMain extends JavaPlugin {
+
+ private static MailMain instance;
+ private static PlayerManager playerManager;
+
+ @Override
+ public void onEnable() {
+ instance = this;
+ LangUtil.initLangUtil();
+ playerManager = new PlayerManager();
+ new PlayerListener(this);
+ new ToMailGui(this);
+ getServer().getPluginManager().registerEvents(new ClickInventory(), this);
+ }
+
+ @Override
+ public void onDisable() {
+ getPlayerManager().saveAllPlayerData();
+ saveConfig();
+ }
+
+ @Override
+ public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ if("dpmail".equalsIgnoreCase(label)){
+ if(args.length >= 1 && "open".equalsIgnoreCase(args[0])){
+ if(args.length == 2 && sender.isOp()){
+ String name = args[1];
+ Player player = Bukkit.getPlayer(name);
+ if(player == null){
+ return true;
+ }
+ MailGui.openGui(player);
+ return true;
+ }
+ MailGui.openGui((Player) sender);
+ }
+ if(!sender.isOp()){
+ return true;
+ }
+ if (args.length == 0) {
+ sender.sendMessage("");
+ sender.sendMessage("§e------- ======= §6玩家邮箱 §e======= -------");
+ sender.sendMessage("§2/"+label+" open §e[玩家] §f- §2打开收件箱");
+ sender.sendMessage("§2/"+label+" to §e[玩家] §f- §2打开发件箱");
+ sender.sendMessage("§2/"+label+" save §f- §2保存玩家邮箱");
+ sender.sendMessage("§e------- ======= §6玩家邮箱 §e======= -------");
+ sender.sendMessage("");
+ return true;
+ }
+ if("to".equalsIgnoreCase(args[0])){
+ if(!(sender instanceof Player)){
+ sender.sendMessage("§c控制台无法执行此操作.");
+ return true;
+ }
+ if(args.length == 1){
+ sender.sendMessage("[邮箱] 缺少玩家参数.");
+ return true;
+ }
+ String name = args[1];
+ ToMailGui.openGui((Player) sender,name);
+ return true;
+ }
+ if("save".equalsIgnoreCase(args[0])){
+ getPlayerManager().saveAllPlayerData();
+ sender.sendMessage("[邮箱] 已保存所有玩家数据.");
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static MailMain inst() {
+ return instance;
+ }
+
+ public static PlayerManager getPlayerManager() {
+ return playerManager;
+ }
+}
diff --git a/src/main/java/com/yaohun/playermail/data/PlayerData.java b/src/main/java/com/yaohun/playermail/data/PlayerData.java
new file mode 100644
index 0000000..cf599e7
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/data/PlayerData.java
@@ -0,0 +1,90 @@
+package com.yaohun.playermail.data;
+
+import com.yaohun.playermail.MailMain;
+import me.Demon.DemonPlayerMail.Api.DMailAPI;
+import org.bukkit.Location;
+import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.inventory.ItemStack;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
+public class PlayerData {
+
+ private File file;
+ private FileConfiguration config;
+
+ private String playerName;
+
+ private HashMap stackHashMap = new HashMap<>();
+
+ public PlayerData(String playerName) {
+ this.playerName = playerName;
+ this.file = new File("plugins/AuData/MailData",playerName+".yml");
+ if(!file.exists()) {
+ this.file.getParentFile().mkdirs();
+ this.config = YamlConfiguration.loadConfiguration(this.file);
+ } else {
+ this.config = YamlConfiguration.loadConfiguration(this.file);
+ }
+ loadMailStack();
+ }
+
+ private void loadMailStack(){
+ ConfigurationSection section = config.getConfigurationSection("MailData");
+ if(section == null){
+ return;
+ }
+ for(String key : section.getKeys(false)){
+ long expiryTime = Long.parseLong(key);
+ ItemStack itemStack = section.getItemStack(key);
+ stackHashMap.put(expiryTime,itemStack);
+ }
+ }
+
+ public void saveMailStack(){
+ config.set("MailData",null);
+ if(!stackHashMap.isEmpty()) {
+ long nowTime = System.currentTimeMillis();
+ for (Long key : stackHashMap.keySet()) {
+ if (nowTime >= key) {
+ continue;
+ }
+ ItemStack itemStack = stackHashMap.get(key);
+ config.set("MailData." + key, itemStack);
+ }
+ }
+ try {
+ config.save(file);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ public HashMap getStackHashMap() {
+ return stackHashMap;
+ }
+
+ public int getMailAmount(){
+ return stackHashMap.size();
+ }
+
+ public void resetMailData(){
+ stackHashMap.clear();
+ }
+
+ public ItemStack getMailStack(long expiryTime){
+ return stackHashMap.get(expiryTime);
+ }
+
+ public void removeMailStack(long expiryTime){
+ stackHashMap.remove(expiryTime);
+ }
+
+ public void addMailStack(long expiryTime,ItemStack stack){
+ stackHashMap.put(expiryTime,stack);
+ }
+}
diff --git a/src/main/java/com/yaohun/playermail/gui/MailGui.java b/src/main/java/com/yaohun/playermail/gui/MailGui.java
new file mode 100644
index 0000000..5c621c4
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/gui/MailGui.java
@@ -0,0 +1,61 @@
+package com.yaohun.playermail.gui;
+
+import com.yaohun.playermail.MailMain;
+import com.yaohun.playermail.data.PlayerData;
+import com.yaohun.playermail.manage.PlayerManager;
+import com.yaohun.playermail.util.LangUtil;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.data.NbtItem;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.Sound;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class MailGui {
+
+ private static String invTitle = LangUtil.player_mail_title;
+
+ public static void openGui(Player player){
+ String playerName = player.getName();
+ PlayerManager playerManager = MailMain.getPlayerManager();
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+
+ Inventory inv = Bukkit.createInventory(null,45,invTitle);
+ HashMap stackHashMap = playerData.getStackHashMap();
+ if(!stackHashMap.isEmpty()){
+ for (Long key : stackHashMap.keySet()){
+ ItemStack itemStack = stackHashMap.get(key);
+ NbtItem nbtItem = new NbtItem(itemStack);
+ nbtItem.setLong("itemKey",key);
+ inv.addItem(nbtItem.getItem());
+ }
+ }
+ ItemStack glass = DemonAPI.glass(15,"§7[§a■□■§7]");
+ for (int i = 36; i < 45; i++){
+ inv.setItem(i, glass);
+ }
+ inv.setItem(40,infoStack());
+ player.openInventory(inv);
+ }
+
+ public static ItemStack infoStack() {
+ ItemStack item = new ItemStack(Material.SNOW_BALL);
+ ItemMeta meta = item.getItemMeta();
+ meta.setDisplayName("§a点击一键签收");
+ List lore = new ArrayList<>();
+ lore.add("§e★§7点击将邮件物品全部收取");
+ lore.add("§c★§7请检查背包空位是否充足");
+ meta.setLore(lore);
+ item.setItemMeta(meta);
+ return item;
+ }
+}
diff --git a/src/main/java/com/yaohun/playermail/gui/ToMailGui.java b/src/main/java/com/yaohun/playermail/gui/ToMailGui.java
new file mode 100644
index 0000000..d2ba919
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/gui/ToMailGui.java
@@ -0,0 +1,102 @@
+package com.yaohun.playermail.gui;
+
+import com.yaohun.playermail.MailMain;
+import com.yaohun.playermail.data.PlayerData;
+import com.yaohun.playermail.manage.PlayerManager;
+import com.yaohun.playermail.util.LangUtil;
+import me.Demon.DemonPlayerMail.Api.DMailAPI;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.Util.RandomUtil;
+import me.Demon.DemonPlugin.data.NbtItem;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+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 org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.HashMap;
+
+public class ToMailGui implements Listener {
+
+ public ToMailGui(MailMain plugin){
+ plugin.getServer().getPluginManager().registerEvents(this, plugin);
+ }
+
+ private static String invTitle = "管理员发件箱 - ";
+
+ public static void openGui(Player player,String addressee){
+ Inventory inv = Bukkit.createInventory(null,45,invTitle+addressee);
+ PlayerManager playerManager = MailMain.getPlayerManager();
+ PlayerData playerData = playerManager.getPlayerData(addressee);
+ HashMap stackHashMap = playerData.getStackHashMap();
+ if(!stackHashMap.isEmpty()){
+ for (Long key : stackHashMap.keySet()){
+ ItemStack itemStack = stackHashMap.get(key);
+ NbtItem nbtItem = new NbtItem(itemStack);
+ nbtItem.setLong("itemKey",key);
+ inv.addItem(nbtItem.getItem());
+ }
+ }
+ for (int i=36;i<45;i++){
+ inv.setItem(i, DemonAPI.glass(15,"§7[§a■□■§7]"));
+ }
+ ItemStack stack = new ItemStack(Material.SNOW_BALL);
+ ItemMeta meta = stack.getItemMeta();
+ meta.setDisplayName("§6§l确认发货");
+ stack.setItemMeta(meta);
+ NbtItem nbtItem = new NbtItem(stack);
+ nbtItem.setString("addressee",addressee);
+ inv.setItem(40,nbtItem.getItem());
+ player.openInventory(inv);
+ }
+
+ @EventHandler
+ public void onClick(InventoryClickEvent e){
+ int rawSlot = e.getRawSlot();
+ Player player = (Player) e.getWhoClicked();
+ String playerName = player.getName();
+ Inventory inv = e.getInventory();
+ if(e.getView().getTitle().contains(invTitle)){
+ if(rawSlot >= 36 && rawSlot <= 44) {
+ e.setCancelled(true);
+ if(rawSlot == 40){
+ NbtItem nbtItem = new NbtItem(e.getCurrentItem());
+ String addressee = nbtItem.getString("addressee");
+ PlayerManager playerManager = MailMain.getPlayerManager();
+ PlayerData playerData = playerManager.getPlayerData(addressee);
+ playerData.resetMailData();
+
+ Inventory cacheInv = Bukkit.createInventory(null, 27, "这是一个缓存虚拟器");
+ for (int i = 0; i < 36; i++) {
+ ItemStack item = inv.getItem(i);
+ if (!DemonAPI.itemIsNull(item)) {
+ cacheInv.addItem(item);
+ }
+ }
+ int amount = 0;
+ for (int slot = 0; slot < 27; slot++){
+ ItemStack stack = cacheInv.getItem(slot);
+ if (!DemonAPI.itemIsNull(stack)) {
+ DMailAPI.GiveItem(playerName, stack);
+ amount += stack.getAmount();
+ }
+ }
+ if(amount >= 1) {
+ playerData.saveMailStack();
+ player.closeInventory();
+ player.sendMessage(LangUtil.admin_sent_successfully.replace("{player}",addressee));
+ player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP,0.8f,1.2f);
+ } else {
+ player.closeInventory();
+ player.sendMessage(LangUtil.admin_no_items_sent);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/playermail/listener/ClickInventory.java b/src/main/java/com/yaohun/playermail/listener/ClickInventory.java
new file mode 100644
index 0000000..c5bb69f
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/listener/ClickInventory.java
@@ -0,0 +1,105 @@
+package com.yaohun.playermail.listener;
+
+import com.sun.org.apache.bcel.internal.generic.LOR;
+import com.yaohun.playermail.MailMain;
+import com.yaohun.playermail.data.PlayerData;
+import com.yaohun.playermail.gui.MailGui;
+import com.yaohun.playermail.manage.PlayerManager;
+import com.yaohun.playermail.util.LangUtil;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.data.NbtItem;
+import org.bukkit.Location;
+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 org.bukkit.inventory.ItemStack;
+
+import java.util.HashMap;
+
+public class ClickInventory implements Listener {
+
+ @EventHandler
+ public void onClick(InventoryClickEvent e){
+ int rawSlot = e.getRawSlot();
+ Player player = (Player) e.getWhoClicked();
+ String playerName = player.getName();
+ // 检查视图标题是否与玩家邮件标题匹配
+ if(e.getView().getTitle().equalsIgnoreCase(LangUtil.player_mail_title)){
+ e.setCancelled(true);
+ // 获取玩家位置
+ Location playerLocation = player.getLocation();
+ // 获取玩家管理器实例
+ PlayerManager playerManager = MailMain.getPlayerManager();
+ // 根据玩家名称获取玩家数据
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ // 检查槽位索引是否在玩家库存范围内
+ if(rawSlot >= 0 && rawSlot < 36){
+ // 获取当前点击的物品堆
+ ItemStack stack = e.getCurrentItem();
+ // 如果物品堆为空,则返回
+ if(DemonAPI.itemIsNull(stack)){
+ return;
+ }
+ // 创建NBT物品对象
+ NbtItem nbtItem = new NbtItem(stack);
+ // 如果物品没有'itemKey'键,则返回
+ if (!nbtItem.hasKey("itemKey")) {
+ return;
+ }
+ // 获取物品键值
+ long itemKey = nbtItem.getLong("itemKey");
+ // 根据物品键值获取邮件中的物品堆
+ ItemStack clickStack = playerData.getMailStack(itemKey);
+ // 如果物品堆为空,则返回
+ if (clickStack == null) {
+ return;
+ }
+ // 将物品堆添加到玩家库存中
+ player.getInventory().addItem(clickStack);
+ // 从玩家数据中移除邮件中的物品堆
+ playerData.removeMailStack(itemKey);
+ // 播放比较器点击声音
+ player.playSound(playerLocation, Sound.BLOCK_COMPARATOR_CLICK,1,2);
+ // 打开邮件界面
+ MailGui.openGui(player);
+ return;
+ }
+ // 检查是否点击了特定槽位
+ if(rawSlot == 40){
+ // 获取玩家数据中的物品堆哈希映射
+ HashMap stackHashMap = playerData.getStackHashMap();
+ // 如果哈希映射为空,提示玩家邮件中无物品
+ if(stackHashMap.isEmpty()){
+ player.sendMessage(LangUtil.mail_no_items);
+ player.playSound(playerLocation, Sound.ENTITY_VILLAGER_NO,0.8F,1.4F);
+ return;
+ }
+ // 如果玩家库存没有足够的空槽位,提示玩家背包空间不足
+ if(!DemonAPI.hasEmptyInventorySlots(player,stackHashMap.size())){
+ player.sendMessage(LangUtil.insufficient_backpack_space);
+ player.playSound(playerLocation, Sound.ENTITY_VILLAGER_NO,0.8F,1.4F);
+ return;
+ }
+ // 遍历哈希映射中的物品堆并添加到玩家库存中
+ for (ItemStack stack : stackHashMap.values()){
+ if (stack != null && !DemonAPI.itemIsNull(stack)) {
+ player.getInventory().addItem(stack);
+ }
+ }
+ // 提示玩家邮件签收成功并播放声音
+ player.sendMessage(LangUtil.signed_successfully.replace("{amount}",String.valueOf(stackHashMap.size())));
+ player.playSound(playerLocation, Sound.ENTITY_EXPERIENCE_ORB_PICKUP,0.8F,1.4F);
+ // 重置玩家数据中的邮件数据
+ playerData.resetMailData();
+ // 保存邮件物品堆数据
+ playerData.saveMailStack();
+ // 关闭玩家的界面
+ player.closeInventory();
+ }
+ }
+
+ }
+}
diff --git a/src/main/java/com/yaohun/playermail/listener/PlayerListener.java b/src/main/java/com/yaohun/playermail/listener/PlayerListener.java
new file mode 100644
index 0000000..a3dbfeb
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/listener/PlayerListener.java
@@ -0,0 +1,42 @@
+package com.yaohun.playermail.listener;
+
+import com.yaohun.playermail.MailMain;
+import com.yaohun.playermail.data.PlayerData;
+import com.yaohun.playermail.manage.PlayerManager;
+import com.yaohun.playermail.util.LangUtil;
+import me.Demon.DemonPlayerMail.Api.DMailAPI;
+import net.md_5.bungee.api.chat.ClickEvent;
+import net.md_5.bungee.api.chat.ComponentBuilder;
+import net.md_5.bungee.api.chat.HoverEvent;
+import net.md_5.bungee.api.chat.TextComponent;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerChangedWorldEvent;
+
+public class PlayerListener implements Listener {
+
+ public PlayerListener(MailMain plugin){
+ plugin.getServer().getPluginManager().registerEvents(this,plugin);
+ }
+
+ @EventHandler
+ public void onjoin(PlayerChangedWorldEvent e){
+ Player p = e.getPlayer();
+ String playerName = p.getName();
+ PlayerManager playerManager = MailMain.getPlayerManager();
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+
+ int amountMail = playerData.getMailAmount();
+ if(amountMail >= 1){
+ OpenMail(p, LangUtil.notice_player.replace("{amount}",String.valueOf(amountMail)));
+ }
+ }
+
+ public static void OpenMail (Player player,String message) {
+ TextComponent Click = new TextComponent(message);
+ Click.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§e点击打开邮箱").create()));
+ Click.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/dpmail open"));
+ player.spigot().sendMessage(Click);
+ }
+}
diff --git a/src/main/java/com/yaohun/playermail/manage/PlayerManager.java b/src/main/java/com/yaohun/playermail/manage/PlayerManager.java
new file mode 100644
index 0000000..e68dcbd
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/manage/PlayerManager.java
@@ -0,0 +1,37 @@
+package com.yaohun.playermail.manage;
+
+import com.yaohun.playermail.data.PlayerData;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PlayerManager {
+
+ private Map playerDataMap = new HashMap<>();
+
+ public PlayerManager(){
+ for (Player player : Bukkit.getOnlinePlayers()){
+ if(player.getLevel() >= 50){
+ String playerName = player.getName();
+ PlayerData playerData = new PlayerData(playerName);
+ playerDataMap.put(playerName, playerData);
+ }
+ }
+ }
+
+ public PlayerData getPlayerData(String playerName){
+ if(!playerDataMap.containsKey(playerName)) {
+ PlayerData playerData = new PlayerData(playerName);
+ playerDataMap.put(playerName, playerData);
+ }
+ return playerDataMap.get(playerName);
+ }
+
+ public void saveAllPlayerData(){
+ for (PlayerData playerData : playerDataMap.values()){
+ playerData.saveMailStack();
+ }
+ }
+}
diff --git a/src/main/java/com/yaohun/playermail/util/LangUtil.java b/src/main/java/com/yaohun/playermail/util/LangUtil.java
new file mode 100644
index 0000000..96811d5
--- /dev/null
+++ b/src/main/java/com/yaohun/playermail/util/LangUtil.java
@@ -0,0 +1,27 @@
+package com.yaohun.playermail.util;
+
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.Util.AreaType;
+
+public class LangUtil {
+
+ public static String player_mail_title = "§m§a§i§l§r学院邮箱 - 玩家收件箱";
+ public static String notice_player = "§7[§a§l邮箱§7] §f您的私人邮件箱有§a[{amount}件]§f物品尚未签收! §e[点击签收]";
+ public static String mail_no_items = "§7[§a§l邮箱§7] §f你没有可签收的物品";
+ public static String insufficient_backpack_space = "§7[§a§l邮箱§7] §f背包没有足够的空间放置邮箱物品";
+ public static String signed_successfully = "§7[§a§l邮箱§7] §f成功签收 §a{amount}件 §f物品";
+ public static String admin_no_items_sent = "§7[§a§l邮箱§7] §f你没有可发送的物品";
+ public static String admin_sent_successfully = "§7[§a§l邮箱§7] §f成功发送物品到 §6{player} §f的游戏邮箱中.";
+
+ public static void initLangUtil() {
+ if(DemonAPI.getAreaType() == AreaType.TaiWan){
+ player_mail_title = "§m§a§i§l§r學院郵箱 - 玩家收件箱";
+ notice_player = "§7[§a§l郵箱§7] §f您的私人郵件箱有§a[{amount}件]§f物品尚未簽收! §e[點擊簽收]";
+ mail_no_items = "§7[§a§l郵箱§7] §f你沒有可簽收的物品";
+ insufficient_backpack_space = "§7[§a§l郵箱§7] §f背包沒有足夠的空間放置郵箱物品";
+ signed_successfully = "§7[§a§l郵箱§7] §f成功簽收 §a{amount}件 §f物品";
+ admin_no_items_sent = "§7[§a§l郵箱§7] §f你沒有可發送的物品";
+ admin_sent_successfully = "§7[§a§l郵箱§7] §f成功發送物品到 §6{player} §f的遊戲郵箱中.";
+ }
+ }
+}
diff --git a/src/main/java/me/Demon/DemonPlayerMail/Api/DMailAPI.java b/src/main/java/me/Demon/DemonPlayerMail/Api/DMailAPI.java
new file mode 100644
index 0000000..601c14f
--- /dev/null
+++ b/src/main/java/me/Demon/DemonPlayerMail/Api/DMailAPI.java
@@ -0,0 +1,46 @@
+package me.Demon.DemonPlayerMail.Api;
+
+import com.yaohun.playermail.MailMain;
+import com.yaohun.playermail.data.PlayerData;
+import com.yaohun.playermail.manage.PlayerManager;
+import me.Demon.DemonPlugin.DemonAPI;
+import me.Demon.DemonPlugin.Util.RandomUtil;
+import org.bukkit.Bukkit;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Administrator
+ */
+public class DMailAPI {
+
+ public static void GiveItem(String playerName, ItemStack stack) {
+ PlayerManager playerManager = MailMain.getPlayerManager();
+ PlayerData playerData = playerManager.getPlayerData(playerName);
+ int totalAmount = stack.getAmount();
+ while (totalAmount > 0) {
+ if (totalAmount >= 64) {
+ // 创建一个新的 ItemStack,数量为64
+ ItemStack fullStack = stack.clone();
+ fullStack.setAmount(64);
+ // 给予玩家满的 64 个物品
+ long expiryTime = System.currentTimeMillis() + (1000 * 60 * 60 * 24 * 3) + RandomUtil.getRandomInt(1, 10000);
+ playerData.addMailStack(expiryTime, fullStack);
+ // 减去已处理的数量
+ totalAmount -= 64;
+ } else {
+ // 创建一个新的 ItemStack,数量为剩余的物品数量
+ ItemStack remainingStack = stack.clone();
+ remainingStack.setAmount(totalAmount);
+ // 给予玩家剩余的物品
+ long expiryTime = System.currentTimeMillis() + (1000 * 60 * 60 * 24 * 3) + RandomUtil.getRandomInt(1, 10000);
+ playerData.addMailStack(expiryTime, remainingStack);
+ // 剩余数量为0,结束循环
+ totalAmount = 0;
+ }
+ }
+ }
+}
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
new file mode 100644
index 0000000..6730f34
--- /dev/null
+++ b/src/main/resources/plugin.yml
@@ -0,0 +1,7 @@
+name: DemonPlayerMail
+main: com.yaohun.playermail.MailMain
+version: 2.0.0
+depend:
+ - DemonAPI
+commands:
+ dpmail:
\ No newline at end of file