腳本基礎知識!!
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命令。 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為優先) 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()
命令必須在最後加上;。 謝謝....
大大教導*. 33
我有比較會了
謝謝你 哈哈哈 謝謝你啦 推推推......寫的真好^^*. 54 *. 54 以迅速回貼為榮,以看貼不回為恥!以認真回復為榮,以惡意灌水為恥!
以虛心受教為榮,以屢教不改為恥!
以觀後稱謝為榮,以背本趨末為恥!
以無私奉獻為榮,以屢屢索取為恥!
做人必定要厚道,看帖必定要回帖!
回帖一定是尊重,回帖一定是美德!
美德絕對要發揚,我們絕對要頂帖!
頂帖保證是好事,千萬絕對莫灌水!
謝謝樓主的更新,感謝樓主辛苦了! *. 56 *. 56 *. 56 *. 56 多謝大大的教學
收益良多 雖然看不是很懂,還是感謝分享 多謝分享!! 謝謝分享 *. 49 *. 49 *. 49 謝謝分享~~*. 49 *. 49 大大解釋的還蠻清楚的,謝謝囉。