弒殺武神 發表於 2007-8-15 13:33:31

腳本基礎知識!!

1、坐標系

↑Y的增加
(0,200)--(200,200)
|         |
|         |
|         |
|         |
|         |
(0,0)--(200,0)→X的增加

坐標從左下開始,向右上遞增


--------------------------------------------------------------------------------

2、NPC的定義

NPC類型: 傳送點
作用: 把人物從一個坐標傳送到另一個坐標
格式: <gatname>,<x>,<y><tab>warp<tab><displayname><tab><dx>,<dy>,<destination_gatname>,<destination_x>,<destination_y>
說明: <gatname>   -- 原地圖名(不要忘記加上.gat)
<x>,<y>       -- 原地圖坐標
<displayname> -- NPC名字(DEBUG用)
<dx>,<dy>   -- 傳送點x,y軸的影響範圍
dx,dy舉例(●表示x,y的位置):
0,0         1,0             2,2
*      *****    *******
*●*    **●**    *******
*      *****    *******
                        ***●***
                        *******
                        *******
                        *******

<destination_gatname>         -- 目標地圖名(.gat可有可無)
<destination_x>,<destination_y> -- 目標地圖坐標

注意事項: 如果在同一位置放置了多個傳送點,則只有最後一個生效。
如果目標坐標是不可到達的坐標,則自動進行目標地圖內的隨機傳送。

 

NPC類型: 怪物
作用: 使地圖中出現怪物
格式: <gatname>,<x>,<y>,<xs>,<ys><tab>monster<tab><displayname><tab><npcid>,<number>,<spawn_delay1>,<spawn_delay2>[,<event>]
說明: <gatname>   -- 地圖名
<x>,<y>       -- 坐標
<xs>,<ys>   -- 怪物出現的x,y軸的範圍
xs,ys舉例(●表示x,y的位置):
0,0         2,1
●      *****
          **●**
          *****

<displayname>-- 顯示怪物的名字
<npcid>      -- 怪物ID(請參考mob_db.txt)
<number>       -- 怪物數量
<spawn_delay1> -- 刷新後多少毫秒再次刷新
<spawn_delay2> -- 死亡後多少毫秒再次刷新
<event>      -- 怪物死亡後執行的事件(省略時填0)

注意事項: 根據<spawn_delay1>和<spawn_delay2>的數值,優先選擇刷新較慢的那個。

 

NPC類型: 商店
作用: 出售物品
格式: <gatname>,<x>,<y>,<direction><tab>shop<tab><displayname><tab><npcid>,<item_id>:<price>
說明: <gatname>   -- 地圖名
<x>,<y>       -- 坐標
<direction>   -- 商店的方向
<direction> 的詳情:

107
2 6
345

<displayname>-- 商店名字
<npcid>      -- 商店的外觀
<item_id>      -- 商品的物品ID(請參考item_db.txt)
<price>      -- 商品價格

注意事項: <item_id>:<price>可用,分割指定多個物品。
當「<gatname>,<x>,<y>,<direction><tab>」部分為「-<tab>」的時候,可作為複製源。

 

NPC類型: 複製店
作用: 複製已存在的商店
格式: <gatname>,<x>,<y>,<direction><tab>substore(<source>)<tab><displayname><tab><npcid>
說明: <source>以外的參數和商店一樣。
<source>為要複製的商店的名字。
如果是複製沒有指定地圖的商店,則可用於任意地圖。否則只能複製同地圖名字的商店。


 

NPC類型: 腳本
作用: 製作NPC
格式: <gatname>,<x>,<y>,<direction><tab>script<tab><displayname><tab><npcid>,<xs>,<ys>,{ <script> ... }
說明: <gatname> -- 地圖名
<x>,<y> -- 坐標
<direction> -- NPC方向
<direction> 的詳情:

107
2 6
345

<displayname> -- NPC名字。如果<npcid>為-1則為事件名。
<npcid> -- NPC的外觀。如果是-1則表示地圖內的事件。
<xs>,<ys> -- 觸發NPC的x,y軸的範圍。


--------------------------------------------------------------------------------

{}(大括號內)包含NPC的所有代碼。
不推薦集中在一行內編寫代碼,建議寫成這樣:

gatname等,
{
    //註釋
    script;
label:
    script;
}

單行註釋請用//,多行註釋請用/*,*/

「<gatname>,<x>,<y>,<direction><tab>」部分改為「-<tab>」的時候,可作為複製源。


 

NPC類型: 複製腳本
作用: 複製已存在的NPC
格式: <gatname>,<x>,<y>,<direction><tab>duplicate(<source>)<tab><displayname><tab><npcid>,<xs><ys>
說明: <source>以外的參數和腳本一樣。
<source>為要複製的NPC的名字。
如果是複製沒有指定地圖的NPC,則可用於任意地圖。否則只能複製同地圖名字的NPC。


 

NPC類型: 用戶自定義函數
作用: 製作由腳本調用的用戶自定義函數
格式: function<tab>script<tab><name><tab>{ <script> ... }
說明: <name> -- 函數名字
製作一個可用callfunc命令調用的函數。函數的參數可以用getarg函數獲得。從函數中返回請使用return命令。

弒殺武神 發表於 2007-8-15 13:34:08

NPC類型: mapflag
作用: 設置地圖標識
格式: <gatname><tab>mapflag<tab><const>
說明: <gatname> -- 地圖名字
<const>   -- 要設置的規則
<const>一覽表: nosave<tab><gatname>,<x>,<y> 重新登陸時,移動到<gatname>地圖的(x,y)坐標。
如果是"nosave SavePoint"的話,則移動到人物的儲存點。
nomemo<tab>dummy 禁止記憶(禁止使用/nomemo)
noteleport<tab>dummy 禁止使用指定了SavePoint或Random的warp段、傳送之陣和瞬移
noportal<tab>dummy 禁止傳送之陣(battle_athena.conf的noportal_flag為1時有效)
noreturn<tab>dummy 禁止warp命令SavePoint回城,並且禁止使用蝴蝶翅膀
nobranch<tab>dummy 禁止召怪
nopenalty<tab>dummy 禁止任何處罰
nozenypenalty<tab>dummy 死亡時不掉錢
notrade<tab>dummy 禁止玩家間交易
norevive<tab>dummy 死亡時強制傳送到儲存點
noskill<tab><skill_id> 禁止使用<skill_id>技能(同一地圖最多設定100個)
noskillall<tab>dummy 禁止使用所有技能
nodrop<tab>dummy 怪物死亡後不掉落物品
noabra<tab>dummy 禁止使用隨機技能
noicewall<tab>dummy 禁止使用冰牆
snow<tab>dummy 下雪
fog<tab>dummy 霧
sakura<tab>dummy 櫻花
leaves<tab>dummy 落葉
rain<tab>dummy 下雨
base_exp_rate<tab><rate> 設置Base經驗倍率(優先於battle_athena.conf)
job_exp_rate<tab><rate> 設置Job經驗倍率(優先於battle_athena.conf)
monster_noteleport<tab>dummy 禁止怪物使用瞬移
pvp<tab>dummy 變成PVP地圖
pvp_noparty<tab>dummy 變成PVP地圖(不可攻擊同隊玩家)
pvp_noguild<tab>dummy 變成PVP地圖(不可攻擊同工會玩家)
pvp_nightmaredrop<tab><drop_id>,<drop_type>,<drop_per> 變成PVP地圖(夢魘模式)
<drop_id>--掉落物品ID。如果為random則表示隨機掉落物品(random區分大小寫)
<drop_type>--掉落物品類型。inventory表示隨身物品、equip表示裝備、all表示以上類型均有可能(注意區分大小寫)
<drop_per>--掉率(萬分率)

pvp_nocalcrank<tab>dummy 變成PVP地圖(不計算PVP點數和排行榜)
gvg<tab>dummy 變成GVG地圖
gvg_noparty<tab>dummy 變成GVG地圖(不可攻擊同隊玩家)
pk<rab>dummy 變成PK地圖
pk_noparty<tab>dummy 變成PK地圖(不可攻擊同隊玩家)
pk_noguild<tab>dummy 變成PK地圖(不可攻擊同工會玩家)
pk_nightmaredrop<tab><drop_id>,<drop_type>,<drop_per> 變成PK地圖(夢魘模式)
<drop_id>--掉落物品ID。如果為random則表示隨機掉落物品(random區分大小寫)
<drop_type>--掉落物品類型。inventory表示隨身物品、equip表示裝備、all表示以上類型均有可能(注意區分大小寫)
<drop_per>--掉率(萬分率)

pk_nocalcrank<tab>dummy 變成PK地圖(不計算PK點數和排行榜)
turbo<tab>dummy 變為競速模式
noitem<tab><item_id> 禁止使用某個物品(同一地圖最多設定100個)
noitemall<tab>dummy 禁止使用所有物品
no_char_pvp<tab>dummy 禁止玩家使用#pvpon/#pvpoff(VIP版專用)
no_disguise<tab>dummy 禁止玩家使用#disguise/#undisguise
nodropitem<tab>dummy 禁止玩家丟棄物品
no_create_party<tab>dummy 禁止創建隊伍
no_invite_party<tab>dummy 禁止邀請玩家加入隊伍
no_leave_party<tab>dummy 禁止玩家離開隊伍
potion_drop_rate<tab><rate> 設置恢復品掉率
expend_drop_rate<tab><rate> 設置消耗品掉率
refine_drop_rate<tab><rate> 設置精煉材料掉率
etc_drop_rate<tab><rate> 設置收集品掉率
weapon_drop_rate<tab><rate> 設置武器掉率
equip_drop_rate<tab><rate> 設置防具掉率
card_drop_rate<tab><rate> 設置卡片掉率
petequip_drop_rate<tab><rate> 設置寵物裝備掉率
arrow_drop_rate<tab><rate> 設置箭矢掉率
other_drop_rate<tab><rate> 設置其他物品掉率
noequip<tab><equip_id> 設定地圖上不能裝備的物品,如果有裝備上,則自動卸下(同一地圖最多設定100個)
nocard<tab><card_id> 設定地圖上不能裝備插有指定卡片的物品,如果有裝備上,則自動卸下(同一地圖最多設定100個)
gvg_cannot_see_hide<tab>dummy 設定地圖不能利用GM模式看到隱身(但狂暴蟻後卡等等仍然效果正常)
gvg_cannot_see_damage<tab>dummy 設定地圖不能看到傷害值(包括GM模式)
show_mob_hp<tab>dummy 設定地圖顯示怪物HP(show_mob_hp、no_show_mob_hp的mapflag優先於battle_athena.conf的show_mob_hp開關。當show_mob_hp、no_show_mob_hp同時存在時,則以show_mob_hp為優先)
no_show_mob_hp<tab>dummy 設定地圖不顯示怪物HP(show_mob_hp、no_show_mob_hp的mapflag優先於battle_athena.conf的show_mob_hp開關。當show_mob_hp、no_show_mob_hp同時存在時,則以show_mob_hp為優先)

弒殺武神 發表於 2007-8-15 13:34:23

3、關於NPC的一些注意事項

3.1

Jathena以NPC的標識名來區別NPC,而不是顯示名。
如果省略了子名字的話,則使用顯示名來代表識別名。
在顯示名後加上#表示子名字的話,則子名字不會顯示出來。

舉例:
<displayname> <顯示名> <標識名>
A A A
A::B A B
A#dummy A A#dummy

 

3.2

單行註釋請使用//,(多行)文本註釋註釋請使用/* */。
服務端在解釋腳本時,會忽略多餘的空格、TAB、換行符。

下面舉一些例子:

1.超出NPC範圍的文字是錯誤的
prontera.gat,132,150,4 script Test1 120,{
    end;
}
set @hoge,1; ← ×

2.註釋OK
// 註釋
prontera.gat,132,151,4 script Test2 121,{
    end;
} /* 註釋區域 */

3.可以使用以下多行註釋
/* prontera.gat,132,152,4 script Test3 122,{
    end;
} */


--------------------------------------------------------------------------------

4、腳本說明和基本規則

    *數字
      可使用有符號數和16進制數。
      有符號數可請使用半角的數字,如123456等。
      16進制數要以0x開頭,例如0x12。

    *字符串
      字符的表示要用""包含在其中。
      如果要顯示"字符,請使用\"代替。
      如果要顯示\字符,請使用\\代替。
      字符串中也可以用^000000等顯示顏色。
      也可以使用:變量 + "字符串"這樣的形式組合。

    *單目運算符
      以下運算符僅需要一個操作數即可。
            -    符號取反
            ~    按位取反
            !    邏輯非

    *雙目運算符
      以下運算符需要兩個操作數。
            +    加法/字符串連接
            既可以當作加法運算,也可以當作連接字符串符號。

            -    減法
            *    乘法
            /    除法
            %    取模(餘數)
            &    按位與
            |    按位或
            ^    異或
            &&   邏輯與
            ||   邏輯或
            >>   向右移位
            <<   向左移位

      以下雙目運算符在關係成立時返回1,否則返回0。
            ==   等於
            !=   不等於
            >    大於
            >=   大於等於
            <    小於
            <=   小於等於

    *三目運算符
            ?:   唯一一個三目運算符

            舉例:<cond> ? <ture> : <false>
            如果<cond>為真,則返回<ture>部分,否則返回<false>部分。

    *變量
      必須使用半角字符表示變量的前綴、後綴。
      變量的生存期看前綴而定。

前綴 作用範圍 生存期
(無前綴) 人物 永久
@ 人物 人物在線時
$ Map服務器 永久
$@ Map服務器 同一次Map服務器運行時
# 帳號(個人) 永久
## 帳號(全服) 永久
' 單個NPC 同一次Map服務器運行時
'@ 單個NPC 超出NPC範圍時

      簡單來說,臨時變量帶有@、服務器變量帶有$、帳號變量帶有#。

      '表示NPC變量。
      同名的NPC變量,在NPC之間不會發生衝突;而且是和單個玩家關聯,不用擔心會和其他玩家發生衝突。

      '變量依賴於NPC,即使NPC結束後,其值也會被保存(Map服務器重啟時才消失)。
      雖然使用callfunc函數時,其參數不會影響到其他NPC變量;但是如果配合getarg()函數的話,仍然可以操作傳遞的參數(參數是以引用傳遞的)。舉例:

      function script func1 {
            set 'var1, 'var1 + 1;            // func1::'var1 加1
            set getarg(0), getarg(0) + 1;    // func2::'var1 加1
      }
      function script func2 {
            callfunc "func1", 'var1;
      }

      '@變量是函數固有的變量,使用callfunc、callsub時,會重新分配內存空間給變量,return時則使分配的變量超出範圍。
      簡單來說,就像是C語言的臨時變量一樣,還可以使用遞歸處理。當然,這種變量也可以使用getarg()函數操作。舉例:

      function script func3 {
            set '@n, rand(5);
            if( '@n == 0 ) {
                return;
            } else {
                // '@n 變量和其他變量不同,調用callfunc時變量的範圍不同,
                // 所以不會出現mes的結果全部為0的現象。
                callfunc "func3";
            }
            mes '@n;
            return;
      }

      此外,函數類型由後綴決定。
      但是,字符串類型只適用於人物臨時變量、NPC變量、臨時/永久的服務器變量。(前綴為@、$、$@的)

後綴 類型
(無後綴) 數值類型
$ 字符串類型

    <例> @hoge$ 字符串類型人物臨時變量
         hoge   數值類型人物永久變量
         $hoge數值類型服務器永久變量

      不要過多的使用永久變量。
      不需要時馬上設置為0進行刪除。
      認真思考是否需用用到永久變量。
      特別時人物/帳號變量是有數量限制的。

    *數組變量
      變量名後緊跟[]則表示數組變量。
      注意變量名與「[」之間不能留空。
      也可以使用多維數組,維數沒有限制。

      <例> hoge    fuga[ @temp ]    foo[@i]

      數組元素的索引從0-127。索引為0時表示和同名變量。
      比如說,hoge和hoge是相同的變量。
      同樣的,fuga和fuga是相同的變量。
      (但是要注意,foo和foo是不同的變量。)

      數組變量可儲存人物變量、服務器變量、NPC變量。數值類型或字符串類型均可。

    *標籤
      標籤名是以(半角的)字母或_開頭、並且可包含數字的單詞組成。
      例如L_hoge:。
      用if或menu指令時可跳轉到該標籤。

    *Const屬性
      Athena的db/const.txt給出了這些Const屬性。
      只有在腳本內才可以使用。

    *表達式
      在指令的參數為數值類型時使用。
      不需要空格,為了便於閱讀時也可以加上空格。
      表達式為真時返回1,否則返回0。

    *事件
      沒有固定格式的腳本。
      可用於製作與時間相關的腳本。
      在調用時指定為「事件名::標籤」的話,則從事件中指定的標籤開始執行腳本。

    *命令語法
      參數請用半角的空格來分割。
      函數必須帶()。如果是沒有參數的函數,括號內不能帶任何東西(包括0)。例如:checkcart()
      命令必須在最後加上;。

☆惡≠魔 發表於 2007-8-16 09:50:04

謝謝....
大大教導*. 33

asd9955s 發表於 2007-8-16 09:52:12

我有比較會了

謝謝你 哈哈哈

ian650227 發表於 2007-8-19 18:51:47

謝謝你啦 推推推......寫的真好^^*. 54 *. 54

howard10448 發表於 2007-8-19 20:03:58

以迅速回貼為榮,以看貼不回為恥!
以認真回復為榮,以惡意灌水為恥!
以虛心受教為榮,以屢教不改為恥!
以觀後稱謝為榮,以背本趨末為恥!
以無私奉獻為榮,以屢屢索取為恥!
做人必定要厚道,看帖必定要回帖!
回帖一定是尊重,回帖一定是美德!
美德絕對要發揚,我們絕對要頂帖!
頂帖保證是好事,千萬絕對莫灌水!
謝謝樓主的更新,感謝樓主辛苦了!

goko500 發表於 2007-8-31 13:05:11

*. 56 *. 56 *. 56 *. 56 多謝大大的教學
收益良多

jupiter0042 發表於 2007-9-1 00:53:48

雖然看不是很懂,還是感謝分享

drfvtgb 發表於 2007-9-6 00:52:45

多謝分享!!

天藍 發表於 2007-9-11 11:38:09

謝謝分享 *. 49 *. 49 *. 49

楓精靈 發表於 2007-9-12 22:27:37

謝謝分享~~*. 49 *. 49

jack1212 發表於 2007-9-17 18:50:55

大大解釋的還蠻清楚的,謝謝囉。

stu55007 發表於 2007-9-17 19:00:35

謝 謝 ~

感謝 分享 我懂了~

window3350 發表於 2007-9-17 20:14:24

看不懂可是還是謝謝大大的分享

看不懂可是還是謝謝大大的分享
頁: [1] 2 3 4 5
查看完整版本: 腳本基礎知識!!