文章來源引自:
http://bbs.99nets.com/thread-747617-1-1.html聲明:
這個是供JAVA研究愛好者所提供的原碼,請勿使用在商業化上,否則本人一概不負責!!
測試版本:Rev2021
這個是將該篇文章在完整化,雖然說不上原創,但也把一些漏掉的說明補齊,如有更好的歡迎提出,將後補上
1.首先打開Navicat for MySQL後找到SHOP表裡新增一個欄位“yuanbao”,這個欄位是物品賣出的價錢,也就是元寶要賣的價錢。 
2.打開l1j\server\server\datatables\ShopTable.java
找到
- private final Map<Integer, L1Shop> _allShops = new HashMap<Integer, L1Shop>();
 复制代码 在底下加入
- private final Map<Integer, Integer> _allItemSells = new HashMap<Integer, Integer>();
 复制代码 找到
- private L1Shop loadShop(int npcId, ResultSet rs) throws SQLException {
 复制代码 改成和下面一樣
- private L1Shop loadShop(int npcId, ResultSet rs) throws SQLException { 
 
- List<L1ShopItem> sellingList = new ArrayList<L1ShopItem>(); 
 
- List<L1ShopItem> purchasingList = new ArrayList<L1ShopItem>(); 
 
- while (rs.next()) { 
 
- int itemId = rs.getInt("item_id"); 
 
- int sellingPrice = rs.getInt("selling_price"); 
 
- int purchasingPrice = rs.getInt("purchasing_price"); 
 
- int packCount = rs.getInt("pack_count"); 
 
- packCount = packCount == 0 ? 1 : packCount; 
 
- int yuanbao = rs.getInt("yuanbao");//add liumy 
 
 
- switch(npcId){ 
 
- case 70068:case 70020: 
 
- case 70024:case 70032: 
 
- case 80075: 
 
- continue; 
 
- default: 
 
- break; 
 
- } 
 
 
- if(0 <= sellingPrice){ 
 
- if(_allItemSells.get(itemId)==null){ 
 
- _allItemSells.put(itemId, sellingPrice/2); 
 
- }else if(_allItemSells.get(itemId)<sellingPrice/2){ 
 
- _allItemSells.put(itemId, sellingPrice/2); 
 
- } 
 
- }else{ //-1 
 
- if(0 <= purchasingPrice){ 
 
- if(_allItemSells.get(itemId)==null){ 
 
- _allItemSells.put(itemId, purchasingPrice); 
 
- }else if(_allItemSells.get(itemId)<purchasingPrice){ 
 
- _allItemSells.put(itemId, purchasingPrice); 
 
- } 
 
- } 
 
- } 
 
 
- if (0 <= sellingPrice && 0 >= yuanbao ) { 
 
- L1ShopItem item = new L1ShopItem(itemId, sellingPrice, 
 
- packCount); 
 
- sellingList.add(item); 
 
- } 
 
- if (0 <= purchasingPrice && 0 >= yuanbao ) { 
 
- L1ShopItem item = new L1ShopItem(itemId, purchasingPrice, 
 
- packCount); 
 
- purchasingList.add(item); 
 
- } 
 
- if (0 < yuanbao ) { //add liumy 
 
- L1ShopItem item = new L1ShopItem(itemId, yuanbao, 
 
- packCount); 
 
- sellingList.add(item); 
 
- }//add liumy end 
 
- } 
 
- return new L1Shop(npcId, sellingList, purchasingList); 
 
- } 
 复制代码 3,打開l1j\server\server\model\shop\L1Shop.java
找到
- private boolean ensureSell(L1PcInstance pc, L1ShopBuyOrderList orderList) {
 复制代码 改成和下面一樣
- private boolean ensureSell(L1PcInstance pc, L1ShopBuyOrderList orderList) { 
 
- int price = orderList.getTotalPriceTaxIncluded(); 
 
- // オーバーフローチェック 
 
- if (!IntRange.includes(price, 0, 2000000000)) { 
 
- // 總販賣価格は%dアデナを超過できません。 
 
- pc.sendPackets(new S_ServerMessage(904, \"2000000000\")); 
 
- return false; 
 
- } 
 
- // 購入できるかチェック 
 
- //add liumy 
 
- int bb; 
 
- if (_npcId >= 990000 && _npcId <= 995000) { //元寶商城專用NPC的ID 
 
- bb =61019; //元寶物品編號item_id 
 
- }else{ 
 
- bb =L1ItemId.ADENA; 
 
- }//add liumy 
 
- if (!pc.getInventory().checkItem(bb, price)) { 
 
- //l1j.eric.gui.J_Main.getInstance().addConsolPost(\"\"+price); 
 
- // \\f1アデナが不足しています。 
 
- if (L1ItemId.ADENA == bb){ //add liumy 
 
- pc.sendPackets(new S_ServerMessage(189)); 
 
- }else{ 
 
- //pc.sendPackets(new S_SystemMessage(\"元寶不足\"));//add liumy 
 
- pc.sendPackets(new S_ServerMessage(189)); 
 
- } 
 
- return false; 
 
- } 
 
- // 重量チェック 
 
- int currentWeight = pc.getInventory().getWeight() * 1000; 
 
- if (currentWeight + orderList.getTotalWeight() > pc.getMaxWeight() * 1000) { 
 复制代码 再找到
- private void sellItems(L1PcInventory inv, L1ShopBuyOrderList orderList) {
 复制代码 改成
- private void sellItems(L1PcInventory inv, L1ShopBuyOrderList orderList) { 
 
- //add liumy 
 
- int bb; 
 
- if (_npcId >= 990000 && _npcId <= 995000) { 
 
- bb =61019; //元寶物品編號item_id 
 
- }else{ 
 
- bb =L1ItemId.ADENA; 
 
- } 
 
- if (!inv.consumeItem(bb, orderList 
 
- .getTotalPriceTaxIncluded())) { 
 
- throw new IllegalStateException(\"購入に必要なアデナを消費できませんでした。\"); 
 
- } 
 
- for (L1ShopBuyOrder order : orderList.getList()) { 
 复制代码 大致上完成JAVA編修的工作,目前還不能使用,回到Navicat for MySQL上
4.再次打開npc表,新增加一筆資料,npcid填上990000(編號990000~995000都可以使用)
name、nameid就是NPC的名子 note是備註欄沒意義,給自己看而已、impl填L1Merchant、gfxid是NPC圖檔編號(如果不知道填啥,就填98(潘朵拉))
剩下就沒那麼重要,自己就摸索看看吧

5.打開npcaction表,新增加一筆資料,npcid填990000、normal_action填cold1其餘就不用理他

6.打開shop表,這裡開始是販賣道具清單的地方
npc_id填我們剛剛新增的990000、item_id填道具id(這裡就是賣的東西的item_id)、order_id(這裡是販賣清單順序,由0開始,順序填錯就沒辦法正常顯示)
yuanbao(這個就是元寶數)

7.打開spawnlist_npc表為伺服器正式在地圖上顯示,id是這張表的編號,不能夠重複,所以移到最後一頁最後一筆id在加1就是新的id
count是數量,填1就好;npc_templateid是剛剛新加的NPC,這裡填990000;locX和locY是座標(這個就請你用gm查座標),mapid是地圖編號(也是用GM帳號查地圖編號),heading是npc面向哪方,共八個方位數值由(0~7)自己試試看吧

8.打開etcitem表來新增一個叫元寶的道具,item_id填入61019(由前方源碼得知所使用的編號),後3格就是名稱,剩下的就可以抄我的值沒關系

增加好了以後就已經完成元寶商NPC的新增
