微信扫一扫 分享朋友圈

已有 746 人浏览分享

[服務器教學] 全版本通用 類似優惠券功能

[複製鏈接]

初窺門道

Rank: 2

337

威望

433

金錢

216

A幣
主題
13
帖子
66
精華
5
綜合社群主題發文量
0
電玩社群主題發文量
0
娛樂社群主題發文量
0
技術社群主題發文量
13
閱讀權限
20
註冊時間
2019-8-9

精華作者勳章

  • TA的每日心情

    2021-6-8 20:12
  • 簽到天數: 14 天

    連續簽到: 0 天

    [LV.3]偶爾看看II

    精華 a894985459 發表於  2023-8-2 03:44:54 | 顯示全部樓層 | 閱讀模式
    本帖最後由 a894985459 於 2023-8-2 03:53 編輯

    久久沒發文 發個簡單的教學文

    不清楚各版本商城優惠券功能是否可用
    就先當不可用來處理好了
    另外寫一個簡易的小功能出來解決

    先在資料庫建立資料表
    就叫他CDK吧,主要結構如下圖
    photo_2023-08-02_03-46-18.jpg


    接著來編譯主要的語法
    找到
    AbstractPlayerInteraction.java
    在喜歡的地方建立以下幾段語法

    1.取得CDK狀態
    1.     public int getcdk(String cdk) {//取得CDK使用狀況 0 = 不存在 1 = 已建立(資料表) 2 = 已使用
    2.         Connection con = DatabaseConnection.getConnection();
    3.         try {
    4.             int use = 0;
    5.             PreparedStatement ps = con.prepareStatement("SELECT * FROM cdk WHERE cdk = ?");
    6.             ps.setString(1, cdk);
    7.             ResultSet rs = ps.executeQuery();
    8.             if (rs.next()) {
    9.                 use = rs.getInt("use");
    10.             }
    11.             rs.close();
    12.             ps.close();
    13.             return use;
    14.         } catch (Exception Ex) {
    15.             Ex.printStackTrace();
    16.             return -1;
    17.         }
    18.     }
    複製代碼
    2.取得CDK給的道具(基本上跟上面長一樣)
    1.     public int getcdkitem(String cdk) {//取得CDK要給的道具
    2.         Connection con = DatabaseConnection.getConnection();
    3.         try {
    4.             int item = 0;
    5.             PreparedStatement ps = con.prepareStatement("SELECT * FROM cdk WHERE cdk = ?");
    6.             ps.setString(1, cdk);
    7.             ResultSet rs = ps.executeQuery();
    8.             if (rs.next()) {
    9.                 item = rs.getInt("itemid");
    10.             }
    11.             rs.close();
    12.             ps.close();
    13.             return item;
    14.         } catch (Exception Ex) {
    15.             Ex.printStackTrace();
    16.             return -1;
    17.         }
    18.     }
    複製代碼
    3.取得CDK給道具的數量(沒錯 還是跟上面幾乎長一樣)
    1. public int getcdkitemcount(String cdk) {
    2.         Connection con = DatabaseConnection.getConnection();
    3.         try {
    4.             int count = 0;
    5.             PreparedStatement ps = con.prepareStatement("SELECT * FROM cdk WHERE cdk = ?");
    6.             ps.setString(1, cdk);
    7.             ResultSet rs = ps.executeQuery();
    8.                         if (rs.next()) {
    9.                                 count = rs.getInt("count");
    10.                         }
    11.             rs.close();
    12.             ps.close();
    13.             return count;
    14.         } catch (Exception Ex) {
    15.             Ex.printStackTrace();
    16.             return -1;
    17.         }
    18.     }
    複製代碼


    當然這是最陽春的寫法撈三次資料對伺服器很不友善
    可以自己想辦法改進,其實也很簡單
    撈一次資料 丟去陣列儲存
    在利用腳本去對陣列資料就行,不過是教學性質我就不多做改良了
    留給各位思考

    4.修改CDK使用狀態
    1.     public void setcdk(String cdk, int use) {//改變CDK狀態
    2.         PreparedStatement ps = null;
    3.         Connection con = DatabaseConnection.getConnection();
    4.         try {
    5.             ps = con.prepareStatement("UPDATE cdk SET `use` = ? WHERE cdk = ?");
    6.             ps.setInt(1, use);
    7.             ps.setString(2, cdk);
    8.             ps.executeUpdate();
    9.             ps.close();
    10.         } catch (Exception Ex) {
    11.             Ex.printStackTrace();
    12.         }
    13.     }
    複製代碼
    語法使用方式:
    1. cm.getcdk("你的CDK");
    2. cm.getcdkitem("你的CDK");
    3. cm.getcdkitemcount("你的CDK");
    4. cm.setcdk("你的CDK",2);
    複製代碼


    到此 主系統算完成了
    再來我們轉向NPC腳本來處理吧

    我就大概 隨便寫一下 我跟碼之間有一個能跑就行.jpg
    1. var cdk = "";
    2. function start() {
    3.     status = -1;
    4.     action(1, 0, 0);
    5. }

    6. function action(mode, type, selection) {

    7.         if (mode == -1) {
    8.         cm.dispose();
    9.     } else {
    10.         if (status >= 3 && mode == 0) {
    11.             cm.sendOk("#e有任何需求歡迎再來。");
    12.             cm.dispose();
    13.         }
    14.         if (mode == 1) {
    15.                 status++;
    16.         } else if (mode != 1 && status >= 1){
    17.                         status--;
    18.                 } else {
    19.                         cm.sendOk("#e有任何需求歡迎再來。");
    20.                         cm.dispose();
    21.     }
    22.         if (status == 0) {
    23.             cm.sendGetText("#e請輸入取得的CDK");
    24.     } else if (status == 1) {
    25.                 cdk = cm.getText();//取得玩家輸入文字(CDK)
    26.                     if (cm.getcdk(cdk) == 0) {
    27.                                 cm.sendOk("#e#r此CDK不存在,請檢查是否輸入錯誤。");
    28.                                 cm.dispose();
    29.                         } else if (cm.getcdk(cdk) == 2) {
    30.                                 cm.sendOk("#e#r此CDK已被使用過。");
    31.                                 cm.dispose();
    32.             } else {
    33.                                 cm.sendYesNo("#e你確定要領取此CDK的獎勵嗎?\r\n此CDK的獎勵為#i" + cm.getcdkitem(cdk) + "##t" + cm.getcdkitem(cdk) + "#" + cm.getcdkitemcount(cdk) + "個");
    34.                         }
    35.     } else if (status == 2) {
    36.            cm.sendOk("#e#r你已領取CDK獎勵");
    37.                    cm.gainItem(cm.getcdkitem(cdk),cm.getcdkitemcount(cdk));
    38.                    cm.setcdk(cdk,2);
    39.                    cm.dispose();
    40.                    }
    41.         }
    42.     }
    複製代碼

    實際測試圖
    1.輸入CDK
    photo_2023-08-02_03-50-18.jpg

    2.CDK存在,且沒被使用過
    photo_2023-08-02_03-50-45.jpg

    3.成功使用
    photo_2023-08-02_03-51-24.jpg

    4.輸入不存在的CDK
    photo_2023-08-02_03-52-09.jpg

    5.因有先比對,所以回傳不存在 結束對話
    photo_2023-08-02_03-52-29.jpg

    6.輸入已使用過CDK,結束對話
    photo_2023-08-02_03-52-59.jpg

    就這樣 一個簡單的系統就完成了

    題外話
    可以不光只要領取物品嗎?
    可以方法也很簡單
    } else if (status == 2) {
    之下增加判斷就好
    cm.getcdkitem(cdk) == 0 的話 要給什麼
    cm.getcdkitem(cdk) == 1 的話 要給什麼
    你可以給錢 給經驗 給等級 你想的到的都能給



    題外話2
    那CDK怎樣生產最快?難道還要我一個一個用手打嗎?
    An,你要那樣做我也是不反對啦
    我有幾個小方案可以選
    1.寫個ˊ小語法去產生CDK直接丟進資料庫
    2.一樣是寫語法,不過是寫在Js
    可以利用https://jsfiddle.net/這個網站來幫你
    核心與法大概是這樣啦,可以自己更改 要多組就自己加個迴圈去讓他生產
    下面這段語法我已經排除I跟O了,想要的可自己加回去
    1. var SendStr = Array("1","2","3","4","5","6","7","8","9","0","A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z");
    2. var pws = "";
    3.     for (var r = 0; r < 31; r++) {//決定CDK要多長 尾數+1=總長碼數
    4.       pws += SendStr[Math.floor(Math.random() * SendStr.length)];
    5.     }
    6.   
    7. console.log(pws);
    複製代碼
    最後怎麼丟資料表比較快?
    開個EXCEL把複製的資料先貼上去
    然後把物品ID、數量都設定好
    EXCEL有資料的地方複製起來
    回到SQL資料表新增一行空白資料後,直接貼上
    就新增完畢了EZ

    個位看官怎麼喜歡怎麼來
    簡易的功能往往能造就不同的玩法

    還有任何問題可以下方提出
    或是+我DC聊聊
    DC:緋夜冷冽#9071

    共收到 20 A幣
    打賞榜
    共打賞 20 A幣
    暫無
    暫無
    暫無
    ----
    暫無
    ----
    暫無
    ----
    暫無
    ----

    集團新軍

    Rank: 1

    115

    威望

    141

    金錢

    112

    A幣
    主題
    10
    帖子
    63
    精華
    0
    綜合社群主題發文量
    0
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    10
    閱讀權限
    10
    註冊時間
    2022-4-8
  • TA的每日心情
    鬱悶
    2024-2-5 13:49
  • 簽到天數: 1 天

    連續簽到: 1 天

    [LV.1]初來乍到

    zl121108 發表於 2023-8-8 09:44:38 | 顯示全部樓層
    我自己寫的是NPC脚本裏判斷管理員可見按鍵 1.輸入物品代碼,生產單個CDK 2. 輸入物品代碼,生產批量CDK 3.生產完畢數據入庫并且導出EXCEL文件到服務器指定目錄即可

    點評

    這也可以啊,用類似Log輸出的方式也是一個很棒的方法 只要額外定義一個迴圈GetNumber決定迴圈要跑幾次就很方便了  發表於 2023-8-8 10:34
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    66

    發文

    433

    金錢

    216

    A幣

    ----------榮譽勳章----------

    精華作者勳章

    熱門推薦
    圖文推薦
    • 聯繫我們

    小黑屋|AICL社群娛樂集團

    GMT+8, 2024-4-29 05:13 , 網路刷新 0.102114 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322