Update: 添加RadioManager/RadioDownloadListener/UpdateChecker/WelcomeManager等新功能模块

This commit is contained in:
ypsdf1
2026-05-14 21:03:03 +08:00
parent 677fea7de1
commit 8b73031ef0
46 changed files with 23884 additions and 2001 deletions
+989
View File
@@ -0,0 +1,989 @@
Index: .gitattributes
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/.gitattributes b/.gitattributes
--- a/.gitattributes (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/.gitattributes (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -1,6 +1,5 @@
+*.md text=auto encoding=UTF-8
*.png binary
*.jpg binary
*.jpeg binary
-*.gif binary
-*.ico binary
-*.bmp binary
\ No newline at end of file
+*.gif binary
\ No newline at end of file
Index: src/main/java/Sdf1_login/ConfigManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/Sdf1_login/ConfigManager.java b/src/main/java/Sdf1_login/ConfigManager.java
--- a/src/main/java/Sdf1_login/ConfigManager.java (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/java/Sdf1_login/ConfigManager.java (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -312,6 +312,14 @@
requesterPointsReward = parseInt(
m.getOrDefault("报单人积分奖励", "10"),
10);
+ garbageEnabled = Boolean.parseBoolean(
+ m.getOrDefault("垃圾站_启用", "true"));
+ garbageInterval = parseInt(
+ m.getOrDefault("垃圾站_清理间隔秒",
+ "300"), 300);
+ garbageMaxRounds = parseInt(
+ m.getOrDefault("垃圾站_保留轮数",
+ "1"), 1);
}
@@ -331,12 +339,10 @@
L.add("挂机超时秒数=" + afkTimeout);
// 垃圾站设置
L.add("# ---- 垃圾站 ----");
- L.add("垃圾站_启用: "
- + garbageEnabled);
- L.add("垃圾站_清理间隔秒: "
- + garbageInterval);
- L.add("垃圾站_保留轮数: "
- + garbageMaxRounds);
+ L.add("垃圾站_启用=" + garbageEnabled);
+ L.add("垃圾站_清理间隔秒=" + garbageInterval);
+ L.add("垃圾站_保留轮数=" + garbageMaxRounds);
+
writeLines(file, L);
}
@@ -364,6 +370,11 @@
L.add("基础经济奖励=" + baseEconomyReward);
L.add("经济奖励每评分=" + providerEconomyPerScore);
L.add("报单人积分奖励=" + requesterPointsReward);
+ L.add("# ---- 垃圾站 ----");
+ L.add("垃圾站_启用=true");
+ L.add("垃圾站_清理间隔秒=300");
+ L.add("垃圾站_保留轮数=1");
+
writeLines(f, L);
}
Index: src/main/java/Sdf1_login/DatabaseManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/Sdf1_login/DatabaseManager.java b/src/main/java/Sdf1_login/DatabaseManager.java
--- a/src/main/java/Sdf1_login/DatabaseManager.java (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/java/Sdf1_login/DatabaseManager.java (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -201,7 +201,18 @@
+ "active INTEGER DEFAULT 1,"
+ "join_time INTEGER DEFAULT 0"
+ ")");
-
+ // 垃圾回收站物品表
+ st.execute("CREATE TABLE IF NOT EXISTS "
+ + "items ("
+ + "id INTEGER PRIMARY KEY "
+ + "AUTOINCREMENT,"
+ + "player_name TEXT NOT NULL,"
+ + "item_data TEXT DEFAULT '',"
+ + "amount INTEGER DEFAULT 1,"
+ + "create_time INTEGER DEFAULT 0"
+ + ")");
+ safeAdd(st, "menu_snowball",
+ "INTEGER DEFAULT 1");
st.close();
logger.info("[Sdf1_login] 数据库初始化完成");
} catch (Exception e) {
Index: src/main/java/Sdf1_login/GUIManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/Sdf1_login/GUIManager.java b/src/main/java/Sdf1_login/GUIManager.java
--- a/src/main/java/Sdf1_login/GUIManager.java (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/java/Sdf1_login/GUIManager.java (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -489,6 +489,12 @@
"§e设置密码"));
g.setItem(16, mkItem(Material.BARRIER,
"§c删除用户", "§7二次验证删除"));
+ // 雪球菜单检测(slot 14)
+ g.setItem(14, mkItem(
+ Material.SNOWBALL,
+ "§e§l雪球菜单",
+ "§7点击为该玩家发放菜单雪球"));
+
g.setItem(22, mkItem(Material.ARROW, "§7返回"));
p.openInventory(g);
}
Index: src/main/java/Sdf1_login/GarbageManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/Sdf1_login/GarbageManager.java b/src/main/java/Sdf1_login/GarbageManager.java
--- a/src/main/java/Sdf1_login/GarbageManager.java (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/java/Sdf1_login/GarbageManager.java (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -231,26 +231,26 @@
public void saveItem(ItemStack stack) {
{
- try {
- String data =
- stackToBase64(stack);
- if (data.isEmpty()) return;
- PreparedStatement ps = db.prepareStatement(
- "INSERT INTO items "
- + "(item_data, amount, "
- + "round, create_time) "
- + "VALUES (?,?,?,?)");
- ps.setString(1, data);
- ps.setInt(2, stack.getAmount());
- ps.setInt(3, currentRound);
- ps.setLong(4,
- System.currentTimeMillis());
- ps.executeUpdate();
- ps.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }}
+ try {
+ String data =
+ stackToBase64(stack);
+ if (data.isEmpty()) return;
+ PreparedStatement ps = db.prepareStatement(
+ "INSERT INTO items "
+ + "(item_data, amount, "
+ + "round, create_time) "
+ + "VALUES (?,?,?,?)");
+ ps.setString(1, data);
+ ps.setInt(2, stack.getAmount());
+ ps.setInt(3, currentRound);
+ ps.setLong(4,
+ System.currentTimeMillis());
+ ps.executeUpdate();
+ ps.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }}
private int deleteOldItems(int beforeRound) {
try {
@@ -381,6 +381,38 @@
.get("amount")).intValue();
ItemStack stack = base64ToStack(data);
if (stack != null) {
+ try {
+ byte[] bytes =
+ stack.serializeAsBytes();
+ String b64 = java.util.Base64
+ .getEncoder()
+ .encodeToString(bytes);
+ int len = b64.length();
+ String f = len > 15
+ ? b64.substring(10, 15) : "短";
+ String m = len >= 5
+ ? b64.substring(len / 2,
+ Math.min(len / 2 + 5, len))
+ : "短";
+ String b = len > 10
+ ? b64.substring(len - 10, len - 5)
+ : "短";
+ plugin.getLogger().info(
+ "[垃圾站加载] ID#" + id
+ + " " + stack.getType()
+ + " x" + amount
+ + " base64[" + len + "]"
+ + " 前=" + f
+ + " 中=" + m
+ + " 后=" + b);
+ } catch (Exception ex) {
+ plugin.getLogger().warning(
+ "[垃圾站加载] 序列化异常: "
+ + ex.getMessage());
+ }
+ }
+
+ if (stack != null) {
stack.setAmount(amount);
ItemMeta im =
stack.getItemMeta();
@@ -431,6 +463,10 @@
g.setItem(51, mk(Material.ARROW,
"§7已是最后一页"));
}
+ // 52格:返回按钮
+ g.setItem(52, mk(Material.ARROW,
+ "§7返回",
+ "§7返回主菜单"));
p.openInventory(g);
}
@@ -459,6 +495,12 @@
openRecyclePage(p, page + 1);
return true;
}
+ // 52:返回
+ if (slot == 52) {
+ plugin.getGui().openMain(p);
+ return true;
+ }
+
// 50/52/53:不处理
if (slot >= 49 && slot <= 53)
return true;
Index: src/main/java/Sdf1_login/GiftManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/Sdf1_login/GiftManager.java b/src/main/java/Sdf1_login/GiftManager.java
--- a/src/main/java/Sdf1_login/GiftManager.java (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/java/Sdf1_login/GiftManager.java (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -155,55 +155,18 @@
}
public boolean canClaim(Player p, int stage) {
- Map<String, Object> user = plugin.getDb()
- .getUser(p.getName());
- if (user.isEmpty()) return false;
- int curStage = ((Number) user.getOrDefault(
- "gift_stage", 0)).intValue();
- if (stage > curStage + 1) return false;
- if (stage < 1 || stage > stages.size())
- return false;
- String claimed = (String) user.getOrDefault(
- "gift_claimed", "");
- if (claimed.contains("[" + stage + "]"))
- return false;
-
- // debug 绕过:检查 tasks_completed
- String completed = (String) user.getOrDefault(
- "tasks_completed", "");
- if (completed.contains("[" + stage + "]"))
- return true;
-
- // 正常条件检查
- long dbTime = ((Number) user.getOrDefault(
- "total_online_time", 0L)).longValue();
- long sessionTime = 0;
- Object lastObj = plugin.getDb().getField(
- p.getName(), "last_online_check");
- if (lastObj != null && plugin.getLoggedIn()
- .contains(p.getName())) {
- long last = ((Number) lastObj).longValue();
- if (last > 0) {
- sessionTime =
- System.currentTimeMillis() - last;
- }
- }
- long onlineTime = dbTime + sessionTime;
- int broken = ((Number) user.getOrDefault(
- "blocks_broken", 0)).intValue();
- int placed = ((Number) user.getOrDefault(
- "blocks_placed", 0)).intValue();
+ String name = p.getName();
+ int curStage = ((Number) plugin.getDb()
+ .getField(name, "gift_stage"))
+ .intValue();
+ String claimed = (String) plugin.getDb()
+ .getField(name, "gift_claimed");
+ if (claimed == null) claimed = "";
+ return curStage >= stage
+ && !claimed.contains(
+ String.valueOf(stage));
+ }
- switch (stage) {
- case 1: return true;
- case 2: return onlineTime >= 3600000;
- case 3: return broken >= 100
- && onlineTime >= 86400000L;
- case 4: return (broken + placed) >= 300
- && onlineTime >= 604800000L;
- default: return false;
- }
- }
public void claimReward(Player p, int stage) {
if (!canClaim(p, stage)) return;
Index: src/main/java/Sdf1_login/Main.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/Sdf1_login/Main.java b/src/main/java/Sdf1_login/Main.java
--- a/src/main/java/Sdf1_login/Main.java (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/java/Sdf1_login/Main.java (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -196,6 +196,8 @@
getCommand("sdf1debug").setExecutor(this);
if (getCommand("oa") != null)
getCommand("oa").setExecutor(this);
+ if (getCommand("menu") != null)
+ getCommand("menu").setExecutor(this);
getServer().getPluginManager()
@@ -1099,6 +1101,9 @@
return;
}
}
+ if (isFrozen(p)) {
+ p.setAllowFlight(true);
+ }
if (!"manual".equals(config.approvalMode)
&& !db.userExists(name)) {
@@ -1238,36 +1243,82 @@
private static final String MENU_SNOWBALL_TAG =
"sdf1_menu";
+ // 雪球菜单
public void giveMenuSnowball(Player p) {
- // 检查背包里是否已有菜单雪球
+ // 检查开关
+ Object val = db.getField(
+ p.getName(), "menu_snowball");
+ if (val != null) {
+ int on = val instanceof Number
+ ? ((Number) val).intValue()
+ : 1;
+ if (on == 0) {
+ return; // 开关关了,不发放
+ }
+ }
+ // 检查是否已有
for (ItemStack it : p.getInventory()
.getContents()) {
if (isMenuSnowball(it)) {
- return; // 已有,不重复发
+ return;
}
}
- // 没有则发放
+ // 发放
ItemStack snow = new ItemStack(
Material.SNOWBALL);
ItemMeta im = snow.getItemMeta();
if (im != null) {
im.setDisplayName(
"§e§l[菜单] §f右键打开主菜单");
- List<String> lore = new ArrayList<>();
+ List<String> lore =
+ new ArrayList<>();
lore.add("§7右键点击打开功能菜单");
lore.add("§8" + MENU_SNOWBALL_TAG);
im.setLore(lore);
snow.setItemMeta(im);
}
- // 放到最后一个空格,避免覆盖
- int emptySlot =
- p.getInventory()
- .firstEmpty();
- if (emptySlot >= 0) {
+ int slot = p.getInventory()
+ .firstEmpty();
+ if (slot >= 0) {
+ p.getInventory().setItem(
+ slot, snow);
+ } else {
+ p.getWorld().dropItemNaturally(
+ p.getLocation(), snow);
+ }
+ }
+
+ /**
+ * 手动发放雪球菜单(绕过开关检查)
+ */
+ public void forceGiveMenuSnowball(
+ Player p) {
+ // 只检查是否已有
+ for (ItemStack it : p.getInventory()
+ .getContents()) {
+ if (isMenuSnowball(it)) {
+ return;
+ }
+ }
+ ItemStack snow = new ItemStack(
+ Material.SNOWBALL);
+ ItemMeta im = snow.getItemMeta();
+ if (im != null) {
+ im.setDisplayName(
+ "§e§l[菜单] §f右键打开主菜单");
+ List<String> lore =
+ new ArrayList<>();
+ lore.add("§7右键点击打开功能菜单");
+ lore.add("§8" + MENU_SNOWBALL_TAG);
+ im.setLore(lore);
+ snow.setItemMeta(im);
+ }
+ int slot = p.getInventory()
+ .firstEmpty();
+ if (slot >= 0) {
p.getInventory().setItem(
- emptySlot, snow);
+ slot, snow);
} else {
- // 背包满,丢在地上
p.getWorld().dropItemNaturally(
p.getLocation(), snow);
}
@@ -1296,21 +1347,24 @@
@EventHandler
public void onMove(PlayerMoveEvent e) {
Player p = e.getPlayer();
+ if (!isFrozen(p)) return;
+
Location from = e.getFrom();
Location to = e.getTo();
- if (isFrozen(p)) {
- if (to != null && (from.getX() != to.getX()
- || from.getY() != to.getY()
- || from.getZ() != to.getZ())) {
- e.setTo(e.getFrom());
- }
+ if (to == null) return;
+
+ // 允许转头(无位移)
+ if (from.getBlockX() == to.getBlockX()
+ && from.getBlockY() == to.getBlockY()
+ && from.getBlockZ() == to.getBlockZ()) {
return;
}
- if (to != null && (from.getX() != to.getX()
- || from.getY() != to.getY()
- || from.getZ() != to.getZ())) {
- afk.recordAction(p.getUniqueId());
- }
+
+ // 有位移 → 取消
+ e.setCancelled(true);
+
+ // 防止"服务器未启用飞行"踢出
+ p.setAllowFlight(true);
}
@EventHandler
@@ -1484,7 +1538,8 @@
- // ===== Inventory Click =====
+ // ===== Inventory Click =====
+ // ===== Inventory Click =====
@EventHandler
public void onInvClick(InventoryClickEvent e) {
if (!(e.getWhoClicked() instanceof Player))
@@ -1494,12 +1549,41 @@
e.setCancelled(true);
return;
}
- String title =
- e.getView().getTitle();
+ String title = e.getView().getTitle();
int slot = e.getRawSlot();
- if (needsPasswordChange.contains(p.getName())
- && !title.equals("§6§l任务面板")) {
+ // Shift+点击背包物品 → 存入垃圾箱
+ if (e.isShiftClick()
+ && e.getClickedInventory() != null
+ && e.getClickedInventory()
+ == p.getInventory()
+ && e.getCurrentItem() != null
+ && e.getCurrentItem().getType()
+ != Material.AIR
+ && !isMenuSnowball(
+ e.getCurrentItem())
+ && title.equals(
+ "§6§l垃圾回收站")) {
+ e.setCancelled(true);
+ ItemStack clicked =
+ e.getCurrentItem().clone();
+ garbage.saveItem(clicked);
+ e.getInventory().setItem(
+ e.getSlot(), null);
+ Bukkit.getScheduler()
+ .runTaskLater(this,
+ () -> {
+ garbage.openRecyclePage(p,
+ garbage.getRecyclePage(
+ p.getName()));
+ }, 1L);
+ return;
+ }
+
+ if (needsPasswordChange
+ .contains(p.getName())
+ && !title.equals(
+ "§6§l任务面板")) {
e.setCancelled(true);
p.sendMessage("§c请先修改密码!");
return;
@@ -1516,12 +1600,15 @@
TicketManager.T_TICKET_ADMIN)
|| title.equals(
TicketManager.T_TICKET_DETAIL)
- || title.equals("§d§l服务商面板")
- || title.equals("§6§l抢单大厅")
+ || title.equals(
+ "§d§l服务商面板")
+ || title.equals(
+ "§6§l抢单大厅")
|| title.equals(
"§b§l我处理中的工单")) {
e.setCancelled(true);
- ticket.handleClick(p, title, slot);
+ ticket.handleClick(
+ p, title, slot);
return;
}
@@ -1539,96 +1626,67 @@
ItemStack inSlot =
e.getInventory().getItem(slot);
- ItemStack onCursor = e.getCursor();
+ ItemStack cursor = e.getCursor();
- // 1. 格子里是垃圾站物品 → 取出
- if (isTrashDisplayItem(inSlot)) {
- e.setCancelled(true);
- try {
- List<String> lore =
- inSlot.getItemMeta()
- .getLore();
- String numStr =
- lore.get(0)
- .replace(
- "§7ID: #", "")
- .trim();
- int dbId = Integer
- .parseInt(numStr);
- // 先从DB删除
- if (garbage.removeItem(
- dbId)) {
- // 再给玩家(去掉ID lore)
- ItemStack give =
- inSlot.clone();
- ItemMeta gm =
- give.getItemMeta();
- if (gm != null) {
- List<String> newLore =
- new ArrayList<>();
- // 保留原始lore(跳过ID和数量行)
- if (lore.size() > 2) {
- for (int li = 2;
- li < lore
- .size();
- li++) {
- newLore.add(
- lore.get(
- li));
- }
- }
- gm.setLore(
- newLore.isEmpty()
- ? null
- : newLore);
+ // ===== 取出 =====
+ if (inSlot != null
+ && inSlot.hasItemMeta()
+ && inSlot.getItemMeta().hasLore()) {
+ List<String> lore =
+ inSlot.getItemMeta().getLore();
+ if (lore != null && !lore.isEmpty()
+ && lore.get(0)
+ .startsWith("§7ID: #")) {
+ e.setCancelled(true);
+ try {
+ String numStr = lore.get(0)
+ .replace("§7ID: #", "")
+ .trim();
+ int dbId =
+ Integer.parseInt(numStr);
+ if (garbage.removeItem(dbId)) {
+ ItemStack give =
+ inSlot.clone();
+ ItemMeta gm =
+ give.getItemMeta();
+ gm.setLore(null);
give.setItemMeta(gm);
- }
- p.getInventory()
- .addItem(give);
- // 清空格子
- e.getInventory()
- .setItem(slot,
- null);
- }
- } catch (Exception ex) {
- p.sendMessage("§c取出失败");
- }
- return;
+ p.getInventory()
+ .addItem(give);
+ e.getInventory()
+ .setItem(slot, null);
+ }
+ } catch (Exception ex) {
+ p.sendMessage("§c取出失败");
+ }
+ return;
+ }
}
- // 2. 格子空 + 手上有物品 → 放入
- if ((inSlot == null
- || inSlot.getType()
- == Material.AIR)
- && onCursor != null
- && onCursor.getType()
+ // ===== 光标存入 =====
+ if (cursor != null
+ && cursor.getType()
!= Material.AIR
- && !isMenuSnowball(
- onCursor)) {
- // 不取消!让物品自然进入格子
- Bukkit.getScheduler()
- .runTaskLater(this,
- () -> {
- ItemStack after =
- e.getInventory()
- .getItem(
- slot);
- if (after != null
- && after.getType()
- != Material.AIR) {
- garbage.saveItem(
- after
- .clone());
- e.getInventory()
- .setItem(
- slot,
- null);
- }
- }, 1L);
+ && !isMenuSnowball(cursor)) {
+ ItemStack toSave = cursor.clone();
+ getLogger().info(
+ "[垃圾站] 存入: "
+ + toSave.getType()
+ + " x" + toSave.getAmount());
+ garbage.saveItem(toSave);
+ e.setCancelled(true);
+ Bukkit.getScheduler().runTaskLater(
+ this, () -> {
+ p.getOpenInventory()
+ .setCursor(null);
+ garbage.openRecyclePage(p,
+ garbage.getRecyclePage(
+ p.getName()));
+ }, 1L);
return;
}
- // 3. 其他情况
+ // 默认取消
e.setCancelled(true);
return;
}
@@ -1806,6 +1864,7 @@
p.closeInventory();
p.sendMessage("§e请输入邀请码:");
}
+
return;
}
@@ -1828,6 +1887,7 @@
.replace("§e", "")
.replace("§a", ""));
}
+
return;
}
@@ -1856,7 +1916,18 @@
p.closeInventory();
p.sendMessage("§e输入" + tgt
+ "的临时密码:");
- } else if (slot == 16) {
+ } else if (slot == 14) {
+ Player tp = Bukkit.getPlayer(tgt);
+ if (tp != null && tp.isOnline()) {
+ forceGiveMenuSnowball(tp);
+ p.sendMessage("§a已发放雪球菜单给 "
+ + tgt);
+ } else {
+ p.sendMessage("§c玩家不在线");
+ }
+
+
+ } else if (slot == 16) {
chatInput.getState(p).type =
ChatInputManager.InputType
.ADMIN_DELETE_CONFIRM;
@@ -1866,8 +1937,11 @@
p.sendMessage(config.msg(
"admin_delete_confirm"));
}
+
return;
+
}
+
// 积分商城
if (title.startsWith("§d§l积分商城")) {
@@ -1958,43 +2032,45 @@
// 回收站拖拽
if (t.equals("§6§l垃圾回收站")) {
- for (int rawSlot : e.getRawSlots()) {
- if (rawSlot >= 49
- && rawSlot <= 53) {
+ for (int rawSlot :
+ e.getRawSlots()) {
+ if (rawSlot >= 49) {
e.setCancelled(true);
return;
}
}
- // 0-48:不取消,延迟存DB
+ // 0-48允许拖入,不取消
+ // 延迟2tick后扫描格子
+ final Player fp = p;
Bukkit.getScheduler()
- .runTaskLater(this, () -> {
- for (int rawSlot :
- e.getRawSlots()) {
- if (rawSlot < 0
- || rawSlot >= 49)
- continue;
- ItemStack item =
- e.getInventory()
- .getItem(
- rawSlot);
- if (item != null
- && item.getType()
- != Material.AIR
- && !isMenuSnowball(
- item)) {
- garbage.saveItem(
- item.clone());
- e.getInventory()
- .setItem(
- rawSlot,
- null);
- }
- }
- }, 1L);
+ .runTaskLater(this,
+ () -> {
+ Inventory top = fp
+ .getOpenInventory()
+ .getTopInventory();
+ for (int rawSlot :
+ e.getRawSlots()) {
+ if (rawSlot < 0
+ || rawSlot >= 49)
+ continue;
+ ItemStack item =
+ top.getItem(rawSlot);
+ if (item != null
+ && item.getType()
+ != Material.AIR
+ && !isMenuSnowball(
+ item)) {
+ garbage.saveItem(
+ item.clone());
+ top.setItem(
+ rawSlot, null);
+ }
+ }
+ }, 2L);
return;
}
-
+ //服务商工单系统
if (t.equals(TicketManager.T_TICKET_MAIN)
|| t.equals(
TicketManager.T_TICKET_CREATE)
@@ -2050,6 +2126,38 @@
+ count + " 个掉落物");
return true;
}
+ // /menu 开关雪球菜单
+ if (cmdName.equals("menu")) {
+ if (!(sender instanceof Player)) {
+ sender.sendMessage(
+ "§c仅玩家可用");
+ return true;
+ }
+ Player p2 = (Player) sender;
+ if (args.length == 0) {
+ p2.sendMessage(
+ "§e用法: /menu <开/关>");
+ return true;
+ }
+ String arg = args[0];
+ if (arg.equals("开")) {
+ db.setField(p2.getName(),
+ "menu_snowball", 1);
+ p2.sendMessage(
+ "§a雪球菜单已开启,"
+ + "下次进入将发放");
+ } else if (arg.equals("关")) {
+ db.setField(p2.getName(),
+ "menu_snowball", 0);
+ p2.sendMessage(
+ "§c雪球菜单已关闭,"
+ + "下次进入不再发放");
+ } else {
+ p2.sendMessage(
+ "§e用法: /menu <开/关>");
+ }
+ return true;
+ }
if (cmdName.equals("reg")
|| cmdName.equals("注册")) {
@@ -2461,9 +2569,9 @@
sender.sendMessage(
"§e§l================================");
}
- }
+ }
- // pw / password
+ // pw / password
if (sub.equals("pw")
|| sub.equals("password")) {
if (!(sender instanceof Player)) {
@@ -2790,6 +2898,29 @@
}
return true;
}
+ // give - 手动发放雪球菜单
+ if (sub.equals("give")) {
+ if (args.length < 2) {
+ sender.sendMessage(
+ "§e用法: /sdf1_login give <玩家名>");
+ return true;
+ }
+ Player tp = Bukkit.getPlayer(
+ args[1]);
+ if (tp == null || !tp.isOnline()) {
+ sender.sendMessage(
+ "§c玩家不在线: "
+ + args[1]);
+ return true;
+ }
+ forceGiveMenuSnowball(tp);
+ tp.sendMessage(
+ "§a管理员已为您发放菜单雪球");
+ sender.sendMessage(
+ "§a已发放雪球菜单给 "
+ + args[1]);
+ return true;
+ }
// shopadd
if (sub.equals("shopadd")) {
@@ -3052,4 +3183,4 @@
return list;
}
-}
+}
\ No newline at end of file
Index: src/main/java/Sdf1_login/TicketManager.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/java/Sdf1_login/TicketManager.java b/src/main/java/Sdf1_login/TicketManager.java
--- a/src/main/java/Sdf1_login/TicketManager.java (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/java/Sdf1_login/TicketManager.java (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -1014,39 +1014,27 @@
openDetail(p, id);
return true;
}
- // 管理员:标记完结(自己在处理)
- if (adm(p) && "processing".equals(st)
+ // 管理员:标记完结(已回复状态)
+ if (adm(p) && "replied".equals(st)
&& asg.equals("admin")) {
- Map<String, Object> tk =
- plugin.getDb().getTicket(id);
- String tkType = sv(tk, "type");
- if (TYPE_DELETE.equals(tkType)) {
- approveDeleteTicket(p, id);
- return true;
- }
- plugin.getDb().completeTicket(id);
- p.sendMessage("§a工单 #" + id
- + " 已标记完结");
- openDetail(p, id);
- return true;
- }
- // 管理员:标记完结(已回复状态)
- if (adm(p) && "replied".equals(st)
- && asg.equals("admin")) {
- Map<String, Object> tk =
- plugin.getDb().getTicket(id);
- String tkType = sv(tk, "type");
- if (TYPE_DELETE.equals(tkType)) {
- approveDeleteTicket(p, id);
- return true;
- }
- plugin.getDb().completeTicket(id);
- p.sendMessage("§a工单 #" + id
- + " 已标记完结");
- openDetail(p, id);
- return true;
+
+ // 管理员:标记完结(已回复状态)
+ if (adm(p) && "replied".equals(st)
+ && asg.equals("admin")) {
+ Map<String, Object> tk =
+ plugin.getDb().getTicket(id);
+ String tkType = sv(tk, "type");
+ if (TYPE_DELETE.equals(tkType)) {
+ approveDeleteTicket(p, id);
+ return true;
+ }
+ plugin.getDb().completeTicket(id);
+ p.sendMessage("§a工单 #" + id
+ + " 已标记完结");
+ openDetail(p, id);
+ return true;
+ }
}
-
// 服务商:抢单
if (plugin.getDb()
.isServiceProvider(p.getName())
Index: src/main/resources/plugin.yml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
--- a/src/main/resources/plugin.yml (revision 145b392112786b20534254a7a38d716657c962ab)
+++ b/src/main/resources/plugin.yml (revision 87de2e12c81f5a5e04825113e7835aca09e0fd09)
@@ -84,3 +84,6 @@
垃圾清理:
description: 手动清理掉落物
usage: /垃圾清理
+ menu:
+ description: 雪球菜单开关控制
+ usage: /menu <开/关>
\ No newline at end of file