巴列斯
  
- 威望
- 12
- 精華
- 0
- 貢獻
- 0
- 鑽石
- 0
- 閱讀權限
- 60
- 積分
- 24830
- 在線時間
- 1259 小時
- 相冊
- 0
- 日誌
- 0
- 好友
- 2

|
 | |  |  | 本帖最後由 天堂迷 於 2026-3-1 21:06 編輯
改一改都不會跑GM管理介面出來
用了好久還是查不出所以然
再麻煩大神看一下是什麼問題
核心改好都未報錯誤
模擬器開啟後也沒報錯誤
GM管理介面沒跑出來
src/com/lineage/Server.java ↓↓↓↓↓↓
-----------------------------------------------------------------------------------------------------------------------
package com.lineage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.LogManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;
import com.lineage.commons.system.LanSecurityManager;
import com.lineage.config.Config;
import com.lineage.config.ConfigAlt;
import com.lineage.config.ConfigBad;
import com.lineage.config.ConfigBoxMsg;
import com.lineage.config.ConfigCharSetting;
import com.lineage.config.ConfigCreateMsg;
import com.lineage.config.ConfigDescs;
import com.lineage.config.ConfigIpCheck;
import com.lineage.config.ConfigKill;
import com.lineage.config.ConfigOther;
import com.lineage.config.ConfigRate;
import com.lineage.config.ConfigRecord;
import com.lineage.config.ConfigSQL;
import com.lineage.config.ConfigSkill;
import com.lineage.server.GameServer;
/**
* 服務器啟動
*/
public class Server {
private static final String _log_prop = "./config/logging.properties";
private static final String _log_4j = "./config/log4j.properties";
private static final String _loginfo = "./loginfo";
private static final String _back = "./back";
/**
* MAIN
*
* @param args
* @throws Exception
*/
public static void main(final String[] args) throws Exception {
Calendar date = Calendar.getInstance();
// 1=周日 7=周六
System.out.println(">>>>" + date.get(Calendar.DAY_OF_WEEK));
System.out.println(">>>>" + date.get(Calendar.HOUR_OF_DAY));
// int i1 = 2;
// int i2 = 16;
// System.out.println("CONFIG 資料加載異常!" + (byte)(128) + " " +
// (~(byte)(128)));
// System.out.println("CONFIG 資料加載異常!" + (i1|=i2));
// static
// (>> 1: 除) (<< 1: 乘)
// 1:2 2:4 3:8 4:16 5:32 6:64 7:128 8:256 9:512 10:1024
// System.out.println(Integer.decode("0x42"));
// System.getProperties().list(System.out);// 可用命令
// 測試用核心
try {
// 在核心啟動命令後面加上 test 可以用來作顯示測試
if (args[0.equalsIgnoreCase("test")) {
Config.DEBUG = true;
}
} catch (final Exception e) {
// e.printStackTrace();
}
// 壓縮舊檔案
final CompressFile bean = new CompressFile();
try {
// 建立備份用資料夾
final File file = new File(_back);
if (!file.exists()) {
file.mkdir();
}
final String nowDate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss")
.format(new Date());
bean.zip(_loginfo, "./back/" + nowDate + ".zip");
final File loginfofile = new File(_loginfo);
final String[] loginfofileList = loginfofile.list();
for (final String fileName : loginfofileList) {
final File readfile = new File(_loginfo + "/" + fileName);
if (readfile.exists() && !readfile.isDirectory()) {
readfile.delete();
}
}
} catch (final IOException e) {
System.out.println("資料夾不存在: " + _back + " 已經自動建立!");
}
boolean error = false;
try {
final InputStream is = new BufferedInputStream(new FileInputStream(
_log_prop));
LogManager.getLogManager().readConfiguration(is);
is.close();
} catch (final IOException e) {
System.out.println("檔案遺失: " + _log_prop);
error = true;
}
// 十進制轉二進制
// System.out.println(Integer.toBinaryString(75) + "\n" +
// Integer.toBinaryString(73));
// System.out.println(Integer.toBinaryString(10) + "\n" +
// Integer.toBinaryString(20));
// System.out.println(Integer.toBinaryString(30) + "\n" +
// Integer.toBinaryString(30));
// 二進制轉十進制
// System.out.println(Long.parseLong("00010", 2));
// System.out.println(Long.parseLong("10000", 2));
// System.out.println(Long.parseLong("10010", 2));
try {
PropertyConfigurator.configure(_log_4j);
} catch (final Exception e) {
System.out.println("檔案遺失: " + _log_4j);
System.exit(0);
}
try {
ConfigSkill.load();
Config.load();
ConfigAlt.load();
ConfigCharSetting.load();
ConfigOther.load();
ConfigRate.load();
ConfigSQL.load();
ConfigRecord.load();
ConfigDescs.load();
ConfigBad.load();
ConfigKill.load();
ConfigIpCheck.load();
ConfigBoxMsg.load();
ConfigCreateMsg.load();
} catch (final Exception e) {
System.out.println("CONFIG 資料加載異常!" + e);
error = true;
}
System.out.println(_licence + "\n");
final Log log = LogFactory.getLog(Server.class);
// ManagementFactory.getMemoryMXBean().setVerbose(true);
final String infoX = "\n\r##################################################"
+ "\n\r 服務器 (核心版本:"
+ Config.VER
+ "/"
+ Config.SRCVER
+ ")"
+ "\n\r##################################################";
log.info(infoX);
final File file = new File("./jar");
final String[] fileNameList = file.list();
for (final String fileName : fileNameList) {
final File readfile = new File(fileName);
if (!readfile.isDirectory()) {
log.info("加載引用JAR: " + fileName);
}
}
if (error) {
System.exit(0);
}
// log.info("訊息辨識(色彩涵義): [INFO]資訊");
// log.debug("訊息辨識(色彩涵義): [DEBUG]除錯");
// log.warn("訊息辨識(色彩涵義): [WARN]警告");
// log.error("訊息辨識(色彩涵義): [ERROR]錯誤");
// log.fatal("訊息辨識(色彩涵義): [FATAL]嚴重錯誤");
// SQL讀取初始化
DatabaseFactoryLogin.setDatabaseSettings();
DatabaseFactory.setDatabaseSettings();
DatabaseFactoryLogin.get();
DatabaseFactory.get();
// 安全管理器
final LanSecurityManager securityManager = new LanSecurityManager();
System.setSecurityManager(securityManager);
log.info("加載 安全管理器: LanSecurityManager");
final String osname = System.getProperties().getProperty("os.name");
if (osname.lastIndexOf("Linux") != -1) {
Config.ISUBUNTU = true;
}
// 1. 先執行伺服器初始化
GameServer.getInstance().initialize();
// 2. 伺服器啟動完成後,開啟 GM 管理工具 UI
new PackedTestUI();
}
// licence
private static final String _licence = "Copyright (C) 2014 by DarkForce <[email protected]>\n";
}
src/com/lineage/PackedTestUI.java ↓↓↓↓↓↓
-----------------------------------------------------------------------------------------------------------------------
package com.lineage;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Collection;
import com.lineage.server.model.Instance.L1PcInstance;
import com.lineage.server.world.World;
import com.lineage.server.datatables.ItemTable;
import com.lineage.server.templates.L1Item;
// 引用指令區
import com.lineage.server.command.executor.L1AllBuff;
import com.lineage.server.command.executor.L1CreateItem;
public class PackedTestUI extends JFrame {
// ==========================================
// 基礎元件宣告
// ==========================================
private DefaultListModel<String> playerListModel = new DefaultListModel<>();
private DefaultListModel<String> itemListModel = new DefaultListModel<>();
private java.util.List<L1Item> allItemsBackup = new java.util.ArrayList<>();
private JList<String> playerList;
private JList<String> itemList;
private JTextField txtSearch;
private JTextField txtEnchantLevel;
private JTextField txtAmount;
public PackedTestUI() {
// 視窗基礎設定
setTitle("GM 管理工具 (模組化版本)");
setSize(600, 350);
getContentPane().setLayout(null);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// ==========================================
// 區塊 0:左側玩家清單 (共用)
// ==========================================
initPlayerListSection();
// ==========================================
// 區塊 1:AllBuff 功能區
// ==========================================
initAllBuffModule();
// ==========================================
// 區塊 2:AddItem 功能區
// ==========================================
initAddItemModule();
// ==========================================
// 初始化與顯示
// ==========================================
reloadPlayers();
reloadItems();
// 自動刷新玩家名單
new Timer(5000, e -> reloadPlayers()).start();
getContentPane().revalidate();
getContentPane().repaint();
setVisible(true);
}
/**
* 【共用】初始化玩家列表
*/
private void initPlayerListSection() {
JLabel lblPlayer = new JLabel("線上角色");
lblPlayer.setBounds(15, 10, 100, 15);
getContentPane().add(lblPlayer);
JScrollPane scrollPlayer = new JScrollPane();
scrollPlayer.setBounds(15, 35, 120, 250);
getContentPane().add(scrollPlayer);
playerList = new JList<>(playerListModel);
scrollPlayer.setViewportView(playerList);
}
/**
* 【模組化】AllBuff 功能
*/
private void initAllBuffModule() {
JButton btnAllBuff = new JButton("全能 Buff");
btnAllBuff.setBounds(145, 35, 100, 30);
btnAllBuff.addActionListener(e -> {
String selected = playerList.getSelectedValue();
if (selected == null) return;
L1PcInstance target = World.get().getPlayer(selected);
if (target != null) {
// 執行 AllBuff
L1AllBuff.getInstance().execute(target, "allbuff", selected);
System.out.println("執行 AllBuff -> " + selected);
}
});
getContentPane().add(btnAllBuff);
}
/**
* 【模組化】AddItem 功能
*/
private void initAddItemModule() {
// 1. 標題
JLabel lblItem = new JLabel("物品清單 搜尋:");
lblItem.setBounds(260, 10, 100, 15);
getContentPane().add(lblItem);
// 2. 物品選擇清單
JScrollPane scrollItem = new JScrollPane();
scrollItem.setBounds(260, 35, 250, 250);
getContentPane().add(scrollItem);
itemList = new JList<>(itemListModel);
scrollItem.setViewportView(itemList);
// 3. 執行按鈕
JButton btnAddItem = new JButton("給予物品");
btnAddItem.setBounds(145, 66, 100, 30);
btnAddItem.addActionListener(e -> {
String selectedPlayer = playerList.getSelectedValue();
String selectedItem = itemList.getSelectedValue();
if (selectedPlayer == null || selectedItem == null) {
JOptionPane.showMessageDialog(this, "請同時選取玩家與物品");
return;
}
L1PcInstance target = World.get().getPlayer(selectedPlayer);
if (target != null) {
int start = selectedItem.lastIndexOf("[") + 1;
int end = selectedItem.lastIndexOf("]");
String count = txtAmount.getText().trim();
String enchant = txtEnchantLevel.getText().trim();
String isId = "1"; // 1 為已鑑定
String itemId = selectedItem.substring(start, end);
if (count.isEmpty()) count = "1";
if (enchant.isEmpty()) enchant = "0";
String commandArg = String.format("%s %s %s %s", itemId, count, enchant, isId);
L1CreateItem.getInstance().execute(target, "item", commandArg);
System.out.println("給予物品 ID: " + itemId + " 數量: " + count + " -> " + selectedPlayer);
}
});
getContentPane().add(btnAddItem);
/*
* txtSearch 搜尋框 精煉等級 數量
*/
txtSearch = new JTextField();
txtSearch.setBounds(354, 7, 96, 21);
getContentPane().add(txtSearch);
txtSearch.setColumns(10);
JLabel lblNewLabel = new JLabel("精煉等級");
lblNewLabel.setBounds(145, 98, 53, 21);
getContentPane().add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("數量");
lblNewLabel_1.setBounds(145, 149, 69, 21);
getContentPane().add(lblNewLabel_1);
txtEnchantLevel = new JTextField();
txtEnchantLevel.setBounds(145, 118, 96, 21);
getContentPane().add(txtEnchantLevel);
txtEnchantLevel.setColumns(10);
txtAmount = new JTextField();
txtAmount.setBounds(145, 169, 96, 21);
getContentPane().add(txtAmount);
txtAmount.setColumns(10);
txtSearch.addKeyListener(new java.awt.event.KeyAdapter() {
@Override
public void keyReleased(java.awt.event.KeyEvent e) {
// 使用者放開按鍵時即時過濾
filterItems(txtSearch.getText());
}
});
}
// ==========================================
// 數據處理方法
// ==========================================
private void reloadPlayers() {
playerListModel.clear();
for (L1PcInstance pc : World.get().getAllPlayers()) {
playerListModel.addElement(pc.getName());
}
}
private void reloadItems() {
allItemsBackup.clear();
try {
ItemTable itemTable = ItemTable.get();
String[] fields = {"_etcitems", "_weapons", "_armors"};
for (String fieldName : fields) {
try {
java.lang.reflect.Field field = ItemTable.class.getDeclaredField(fieldName);
field.setAccessible(true);
java.util.Map<?, L1Item> map = (java.util.Map<?, L1Item>) field.get(itemTable);
if (map != null) {
allItemsBackup.addAll(map.values());
}
} catch (Exception e) {
System.out.println("跳過欄位: " + fieldName);
}
}
// 初始顯示全部
filterItems("");
System.out.println("成功載入 " + allItemsBackup.size() + " 件物品");
} catch (Exception e) {
e.printStackTrace();
}
}
private void filterItems(String key) {
itemListModel.clear();
String searchKey = key.toLowerCase().trim();
for (L1Item item : allItemsBackup) {
String itemName = item.getName();
// 如果關鍵字是空的,或者名字包含關鍵字
if (searchKey.isEmpty() || itemName.toLowerCase().contains(searchKey)) {
// 建議加上 ID 方便區分同名的東西
itemListModel.addElement(itemName + " [" + item.getItemId() + "]");
}
}
}
}
| |  | |  |
|
|