微信扫一扫 分享朋友圈

已有 1716 人浏览分享

[服務器教學] 長篇基礎技術介紹——JS NPC腳本篇 作者:crazyforyou

[複製鏈接]

站長

Rank: 12Rank: 12Rank: 12

1757

威望

2933

金錢

106

A幣
主題
1315
帖子
2440
精華
3
綜合社群主題發文量
262
電玩社群主題發文量
1
娛樂社群主題發文量
4
技術社群主題發文量
26
閱讀權限
200
註冊時間
2013-1-28

我是傳奇贊助感謝勳章精華作者勳章

  • TA的每日心情

    2023-10-27 16:33
  • 簽到天數: 381 天

    連續簽到: 1 天

    [LV.9]以壇為家II

    TWAICL 發表於  2022-1-10 14:05:13 | 顯示全部樓層 | 閱讀模式

    001.png

    大家好,這次講的是NPC腳本..
    NPC腳本有兩個東西 一個是 NPCScriptManager 另一個 是 NPCConversationManager
    對於 NPCScriptManager 他是用來維護NPC腳本的,
    NPCConversationManager 是我們用cm.函數 可以調用的所有函數都在裡面。

    NPCScriptManager 有個 start 函數,有個人通過修改這個函數,達到對所有不存在腳本的NPC 實現提示
    他的內部邏輯是,查找 NPC 腳本 npc目錄下 id.js文件 執行,並調用 start函數,是沒有參數的
    iv.invokeFunction("start", new Object[0]);
    如果沒有這個函數的話就會調用 action 參數的是 1 0 0
    iv.invokeFunction("action", new Object[] { Byte.valueOf(1), Byte.valueOf(0), Integer.valueOf(0) });
    還有三個和任務相關的 函數 我在任務腳本時候講
    另外是一個action函數
    他的作用是調用 action 函數
    cm.getIv().invokeFunction("action", new Object[] { Byte.valueOf(mode), Byte.valueOf(type), Integer.valueOf(selection) });
    這裡的3個函數是這個函數傳入的


    我們再來看下 start 和 action 是怎麼被 服務端 調用的
    這兩個函數在NPCHandler中被調用
    當你點NPC後調用 NPCTalk 他調用  start 並傳入對用 的npcid
    當你繼續點NPC後調用 NPCMoreTalk 調用action
    NPCScriptManager.getInstance().action(c, action, lastMsg, selection);
    c不要管,
    final byte lastMsg = slea.readByte(); // 00 (last msg type I think) 最後一次的消息類型   
    final byte action = slea.readByte(); // 00 = end chat, 01 == follow 結束對話 繼續對話  是否 按鈕或者上一頁 下一頁
    selection = slea.readByte();  //選擇的,用屬性文本實現
    -1會被服務端處理掉,所以從0開始
    所以綜上所說,當你點擊NPC時,打開腳本,執行全局數據,再執行start,沒有就執行 action (1,0,0) ,如果你有選項,繼續交談,就有
    NPCMoreTalk 調用 action ,當然這裡是說沒任務情況下


    好,下面介紹NPCConversationManager裡邊的函數
    你可以在腳本里用cm.函數名調用

    public void sendNextPrev(String text)
    public void sendNextPrev(String text, int id)
       這兩個是 帶 上一頁 下一頁 按鈕的對話框 ,截圖下次介紹 屬性文本的時候一起發,可有npcid也可以沒有
      public void sendOk(String text)
      public void sendOk(String text, int id)
       這種是只有個確認的那種對話框

    public void sendYesNo(String text)
      public void sendYesNo(String text, int id)
      帶是否 按鈕的
    public void askAcceptDecline(String text) =sendAcceptDecline
      public void askAcceptDeclineNoESC(String text) =sendAcceptDeclineNoESC
    public void askAcceptDecline(String text, int id)
      public void askAcceptDeclineNoESC(String text, int id)

       有接受的對話框,下面那個不能按esc取消的

      public void sendSimple(String text)
      public void sendSimple(String text, int id)

    最簡單的那種,萬能npc用的那個

    sendNext(String text) 有繼續的那種
    sendPrev(String text) 返回的那種

    sendGetNumber(String text, int def, int min, int max)
      可以輸入數字的對話框,文字,默認值,最小,最大
    public void sendGetText(String text)
    public void sendGetText(String text, int id)
    可以輸入文字的對話框
    public void setHair(int hair)
    public void setFace(int face)
    public void setSkin(int color)
    public void setAndroidHair(int hair)
    public void setAndroidFace(int face)
    public void setAndroidSkin(int skin)
    分別是設置機子的頭髮 臉 皮膚 和機器人的

      public void openShop(int id)
      public void openShopNPC(int id)
      打開商店,商店NPC 後面是npcid
    changeJob(int job)
      改變職業
    public boolean isValidJob(int id)
      返回職業是否有效
    public String getJobNameById(int id)
      通過職業id返回職業的中文名字
    startQuest(int idd)
    completeQuest(int idd)
    forceStartQuest(int idd)
    forceCompleteQuest(int idd)

    開始和完成任務,下面兩個是強制的
    gainAp(int amount)
    獲得AP點
    unequipEverything()
    拿下裝備
    clearSkills()
    清空技能
    public boolean hasSkill(int skillid)
    返回是否有這個技能

    public void increaseGuildCapacity(boolean trueMax)
    增加家族容量
    displayGuildRanks()
    顯示家族排名

    disbandGuild()
    取消家族

    public void changeStat(byte slot, int type, int amount)
    changePotentialStat(byte slot, int type, int amount)

    改變身上裝備的屬性 和潛在屬性 參數太多 不建議用

    public void sendPVPWindow()

    public void sendPartyWindow()

    public void sendRepairWindow()
    public void sendProfessionWindow()

    public void sendEventWindow()

    打開各種窗口
    maxStats()
    人物屬性加滿 這個滿是他設置的比較大的值


    maxAllSkills()
    maxSkillsByJob()
    加滿技能 和本職業技能

    public boolean isEligibleName(String t)
    檢查是否是合法的名稱

    handleDivorce()
    離婚

    int getMoney()
    查銀行里的錢


    public int addMoney(int money, int type)
    銀行加錢,如果 type為1 銀行錢多於money就不加

    public String checkDrop(int mobId)

    檢查掉率,返回可以sendok之類的字符串
    public String getPotentialInfo(int id)
    判斷裝備潛能,返回可以send 的字符串

    public Equip getEquip(int itemid)
    獲取裝備  返回的是一個裝備對象
    public void setExpiration(Object statsSel, long expire)
    設置裝備的有效期 第一個是上面那個返回的 後面那個單位是天

    public void renewPotential(int type)
    這個是裝備對象的函數 改變潛能品質
    getEquip(100000).renewPotential(4)

    public boolean isCash(int itemId)
    判斷是否為現金裝備

      public short getSpace(byte type)
    獲取某一類物品的剩餘空間
    比如想知道玩家 裝備背包還有多少剩餘

    public MapleCharacter getCharByName(String name)

    通過角色名獲取角色對象
    下個帖子我會把各種id之類的梳理一遍,相關的對像也會說明下

    public MapleClient getClient()
    獲取服務器對象
    public String EquipList(MapleClient c)
    public String CashList(MapleClient c)
    查整個服務器的裝備列表和現金道具列表





    public int getHour()
    public int getMin()
    public int getSec()

    獲取服務器時間


    int countMonster()
    地圖怪的數量


    cm.dispose()
    結束,不能再調用任何cm的函數

    --------------------------------------------------------------------------------------------------------
    下面這個是所有cm qm都具有的 在AbstractPlayerInteraction裡的

    public void spawnMobOnMap(int id, int qty, int x, int y, int map)
    在特定地圖刷怪 怪id 數量,坐標,地圖


    killAllMob()
    清怪

    public String getName()
    用戶名
      public boolean haveItem(int itemid)
    判斷是否有物品
    public boolean canHold(int itemid)
    判斷是否可以拿某個物品
    public int getJob()
    職業id

      public int getLevel()
      等級
      public void gainItem(int id, short quantity)
      獲取道具 數量
    boolean removeItem(int id)
    刪除道具
    warp(int map)
    warp(int map,int portal)

    傳送,portal是傳送點,0為默認

    public void gainMeso(int gain)
    拿錢
    public void gainExp(int gain)
    拿經驗
    public void openNpc(int id)
    打開npc
    public int getMapId()
    地圖號
    public int getChannelNumber()
    頻道號
    public int getMonsterCount(int mapid)
    public int getPlayerCount(int mapid)
    地圖怪數量 玩家數量
    public void teachSkill(int id, int level, byte masterlevel)
    public void teachSkill(int id, int level)
    學習技能,技能id,最高技能等級,掌握的等級
    public void setVip(int vip)
      public void setVip(int vip, long period)
      設置vip
    public int getVip()
    vip等級
      public boolean isVip()
    是否vip
      public void setViptime(long period)
    設置vip時間
    public void openWeb(String web)
    打開網頁
    public boolean isCanPvp()
    頻道是否可以pvp
      public int getGMLevel()
      gm等級
      public void changeSex()
      變性

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

    集團新軍

    Rank: 1

    178

    威望

    244

    金錢

    0

    A幣
    主題
    0
    帖子
    40
    精華
    0
    綜合社群主題發文量
    37
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    0
    閱讀權限
    10
    註冊時間
    2021-8-12
  • TA的每日心情

    2024-1-14 05:03
  • 簽到天數: 206 天

    連續簽到: 1 天

    [LV.7]常住居民III

    我很會買可樂 發表於 2022-1-10 17:20:59 來自手機  | 顯示全部樓層
    簡單易懂,對剛要起步的新人很有幫助
    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    2440

    發文

    2933

    金錢

    106

    A幣

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

    我是傳奇 贊助感謝勳章 精華作者勳章

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

    小黑屋|AICL社群娛樂集團

    GMT+8, 2024-4-24 16:11 , 網路刷新 0.108980 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322