forked from Muscipular/Pandas
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpandas_script_commands.txt
3428 lines (2487 loc) · 139 KB
/
pandas_script_commands.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//===== 熊猫模拟器 (PandasWS/Pandas) 文档 ====================
//= 脚本指令 (Script Command) 说明文档
//===== 维护人员 =============================================
//= 熊猫模拟器开发团队
//===== 最后更新 =============================================
//= 20220514 (不一定准)
//===== 文档描述 =============================================
//= 此文档对熊猫模拟器添加的脚本指令进行说明.
//============================================================
-%TAB%pointshop%TAB%<NPC名称>%TAB%<外观编号>,<货币变量|货币昵称>{:<折扣>},<出售的道具编号>:<售价>{,<出售的道具编号>:<售价>...}
<地图名称>,<X坐标>,<Y坐标>,<面部朝向>%TAB%pointshop%TAB%<NPC名称>%TAB%<外观编号>,<货币变量|货币昵称>{:<折扣>},<出售的道具编号>:<售价>{,<出售的道具编号>:<售价>...}
在 rAthena 设计的 pointshop 类型的商店允许我们使用数值变量的值作为货币.
这让我们将类似: 战场积分、泡点积分 这样的自定义积分值开放给玩家通过 pointshop 进行道具兑换来说体验很棒.
在这个设计中唯一美中不足的地方就是每次玩家访问 pointshop 类型的商店,
程序都会提示玩家当前这个商店使用的变量名称, 比如你写:
prontera,150,150,3 pointshop testshop 123,BattleScoreVar,501:10
他会在每次玩家访问的时候都告诉玩家这个商店使用: BattleScoreVar 进行结算...
母语不是英文的亚洲玩家看到 BattleScoreVar 会感觉很奇怪, 因为这并不是他熟悉的表述方式,
正因为如此, 支持为货币变量起一个别名就变得非常必要.
做法很简单, 就是在变量名称末尾使用 | 后面写上这个货币变量的昵称, 例如:
prontera,150,150,3 pointshop testshop 123,BattleScoreVar|战场积分,501:10
这样玩家访问这个商店的时候, 程序就会提示玩家这个商店使用: 战场积分 进行结算.
如此一来体验就会改善很多...
这个功能熊猫模拟器很早很早就在代码中支持了, 最初可以追溯到 rAthenaCN 项目...
只是一直忘记补充相关的文档, 导致很多朋友在使用上不太方便.
--------------------------------------------------------------
*setheaddir <朝向编号>{,<角色编号>};
调整角色纸娃娃脑袋的朝向
朝向编号:
0 = 相对于身体朝向的正前方, 头部看向正前方
1 = 相对于身体朝向的正前方, 头部看向右看
2 = 相对于身体朝向的正前方, 头部看向左看
角色编号:
可选参数, 若不携带此参数则控制当前脚本关联的角色
若填写了指定角色编号, 那么就控制指定角色
返回值:
该指令无论执行成功与否, 都不会有返回值
--------------------------------------------------------------
*setbodydir <朝向编号>{,<角色编号>};
调整角色纸娃娃身体的朝向
朝向编号:
1 = 西北 0 = 正北 7 = 东北
↖ | ↗
2 = 正西 <- + -> 6 = 正东
↙ | ↘
3 = 西南 4 = 正南 5 = 东南
角色编号:
可选参数, 若不携带此参数则控制当前脚本关联的角色
若填写了指定角色编号, 那么就控制指定角色
返回值:
该指令无论执行成功与否, 都不会有返回值
--------------------------------------------------------------
*openbank {<角色编号>};
让指定的角色立刻打开银行界面 (只对拥有随身银行的客户端版本有效).
角色编号:
可选参数, 若不携带此参数则控制当前脚本关联的角色
若填写了指定角色编号, 那么就控制指定角色
返回值:
若打开银行失败则返回 0, 成功则返回 1
--------------------------------------------------------------
*instance_users <副本实例编号>;
获取指定的副本实例中已经进入副本地图的人数
副本实例编号:
必填项, 这里填写的副本编号就是 instance_create 脚本指令返回的那个数值
举例说明:
可以用 instance_id 脚本指令来获得当前队伍关联的副本实例编号
.@party_instance_id = instance_id(IM_PARTY);
if (.@party_instance_id == 0) {
dispbottom "你的队伍当前并没有创建副本.";
}
dispbottom "副本地图中当前人数: " + instance_users(.@party_instance_id) + " 人";
返回值:
成功直接返回副本中的人数, 副本不存在或副本中无人存在则返回 0
--------------------------------------------------------------
*cap <要判断的数值>,<最小值>,<最大值>;
确保数值不低于给定的最小值, 不超过给定的最大值
要判断的数值:
必填项, 数值类型的值
最小值:
必填项, 数值类型的值
最大值:
必填项, 数值类型的值
不推荐使用:
rAthena 已经推出了功能完全一致的指令 cap_value;
建议优先使用 rAthena 官方指令, 以便确保最大的脚本兼容性.
此处的 cap 实际上是 cap_value 的别名, 以便兼容以前的部分脚本.
返回值:
要判断的数值低于最小值则直接返回最小值, 超过最大值则直接返回最大值,
如果要判断的数值在两者之间, 那么原样返回该数值
--------------------------------------------------------------
*mobremove <魔物的GID>;
根据 GID 移除一个魔物(只是移除, 不会让魔物死亡)
魔物的GID:
必填项, 比如使用 monster 脚本指令后 $@mobid[] 数组的内容
返回值:
该指令无论执行成功与否, 都不会有返回值
--------------------------------------------------------------
*mesclear;
清空玩家与当前 NPC 的对话框内容, 清空后可以用 mes 重新给对话框填充内容
不推荐使用:
rAthena 已经推出了功能完全一致的指令 clear;
建议优先使用 rAthena 官方指令, 以便确保最大的脚本兼容性.
此处的 mesclear 实际上是 clear 的别名, 以便兼容以前的部分脚本.
返回值:
该指令无论执行成功与否, 都不会有返回值
--------------------------------------------------------------
*battleignore <开关标记>{,<角色编号>};
将指定的角色设置为魔物免战状态, 避免被魔物攻击
魔物会无视此玩家的存在, 因此不会攻击该玩家 (也可以叫无敌状态)
不推荐使用:
rAthena 已经推出了类似的脚本指令解决方案.
启用无敌状态等价于 rAthena 的官方指令用法: setpcblock PCBLOCK_IMMUNE, 1;
建议优先使用 rAthena 官方指令, 以便确保最大的脚本兼容性.
开关标记:
0 - 关闭免战 (角色会被魔物看见)
1 - 打开免战 (角色不会被魔物看见, 也不会被攻击)
返回值:
该指令无论执行成功与否, 都不会有返回值
--------------------------------------------------------------
*getinventorylist {<角色编号>{,<想查询的数据类型>}};
用于查询玩家背包中的物品列表以及物品的全部详情信息, 该指令在 rAthena 的基础上得到了改进.
想查询的数据类型:
有的用户会把玩家的背包扩充到一个比较大的值, 这时候如果还有一个脚本频繁调用 getinventorylist 的话,
会导致程序默认填充几乎所有物品信息回来, 而往往很多信息我们用不到, 这就会出现多余的性能开销.
你可以通过该掩码参数来控制指令内部给你填充指定的一个或多个数组, 降低程序填充数据的工作量来降低卡顿.
INV_ID = 填充 @inventorylist_id[] - 道具编号
INV_IDX = 填充 @inventorylist_idx[] - 道具的背包序号
INV_AMOUNT = 填充 @inventorylist_amount[] - 道具的数量
INV_EQUIP = 填充 @inventorylist_equip[] - 道具当前的装备位置
INV_REFINE = 填充 @inventorylist_refine[] - 道具的精炼值
INV_IDENTIFY = 填充 @inventorylist_identify[] - 道具是否已鉴定 (0: 未鉴定; 1: 已鉴定)
INV_ATTRIBUTE = 填充 @inventorylist_attribute[] - 道具的属性
INV_CARD = 填充物品的插卡信息数组:
@inventorylist_card1[] - 道具一号卡槽的卡片编号
@inventorylist_card2[] - 道具二号卡槽的卡片编号
@inventorylist_card3[] - 道具三号卡槽的卡片编号
@inventorylist_card4[] - 道具四号卡槽的卡片编号
INV_EXPIRE = 填充 @inventorylist_expire[] - 道具的过期时间戳 (0: 永不过期; 其他非零正整数表示 Unix 时间戳)
INV_BOUND = 填充 @inventorylist_bound[] - 道具的绑定状态
INV_ENCHANTGRADE = 填充 @inventorylist_enchantgrade[] - 道具的附魔评级
INV_OPTION = 填充物品随机属性(Random Option)的信息数组:
@inventorylist_option_id1[]
@inventorylist_option_value1[]
@inventorylist_option_parameter1[]
@inventorylist_option_id2[]
@inventorylist_option_value2[]
@inventorylist_option_parameter2[]
@inventorylist_option_id3[]
@inventorylist_option_value3[]
@inventorylist_option_parameter3[]
@inventorylist_option_id4[]
@inventorylist_option_value4[]
@inventorylist_option_parameter4[]
@inventorylist_option_id5[]
@inventorylist_option_value5[]
@inventorylist_option_parameter5[]
INV_TRADABLE = 填充 @inventorylist_tradable[] - 道具是否可交易
INV_FAVORITE = 填充 @inventorylist_favorite[] - 道具是否被标记为最喜欢的道具 (0: 未标记; 1: 已标记)
INV_UID = 填充 @inventorylist_uid$[] - 道具的唯一编号 (字符串类型的数组, 末尾记得要带 $ 符号)
INV_EQUIPSWITCH = 填充 @inventorylist_equipswitch[] - 道具作为第二套快速切换装备时的穿戴位置
INV_ALL = 填充以上全部数组(默认值)
举例说明:
想查询背包中所有道具的信息, 但只希望获取背包序号和数量:
getinventorylist(getcharid(0), INV_IDX | INV_AMOUNT);
注意事项:
若你指定了需要查询的数据类型, 那么未被查询的数据数组将不会被填充.
背包序号:
背包序号每一次登录、每一次玩家在自己的背包中增删物品 (包括但不限:
存仓、存手推车、丢弃、购买和使用道具等操作) 都可能会导致背包序号有变化.
所以请注意在一段连续、玩家不可能会停下来做其他动作的脚本中去使用“背包序号”.
否则, 只要在 getinventorylist 之后, 还给玩家或脚本去进行道具的增删,
那么 @inventorylist_idx[] 中的数据将立刻变得不再可靠.
--------------------------------------------------------------
*getcartlist {<角色编号>{,<想查询的数据>}};
与 getinventorylist 类似, 但是查询的是玩家的手推车中的物品信息.
它的返回数组与 getinventorylist 完全一致, 只是部分数组的意义会发生变化:
- @inventorylist_favorite[] - 该数组无意义并且值固定为 0,
因为手推车中的道具不能被标记为最喜欢的道具.
- @inventorylist_equipswitch[] - 该数组无意义并且值固定为 0,
因为手推车中的道具不能被作为第二套快速切换装备.
- @inventorylist_idx[] - 道具的手推车序号
特别注意:
这里 @inventorylist_idx[] 读取到的序号不再是道具的背包序号,
应该使用 getcartinfo 而不是 getinventoryinfo 来获取物品的详细信息.
玩家必须拥有手推车才能调用该指令, 否则会抛出错误.
若想规避终端提示无手推车错误,
可以在调用该指令之前使用 checkcart() 来确保玩家有手推车.
--------------------------------------------------------------
*getguildstoragelist {<角色编号>{,<想查询的数据>}};
与 getinventorylist 类似, 但是查询的是公会仓库中的物品信息.
它的返回数组与 getinventorylist 完全一致, 只是部分数组的意义会发生变化:
- @inventorylist_favorite[] - 该数组无意义并且值固定为 0,
因为公会仓库中的道具不能被标记为最喜欢的道具.
- @inventorylist_equipswitch[] - 该数组无意义并且值固定为 0,
因为公会仓库中的道具不能被作为第二套快速切换装备.
- @inventorylist_idx[] - 道具的公会仓库序号
特别注意:
这里 @inventorylist_idx[] 读取到的序号不再是道具的背包序号,
应该使用 getguildstorageinfo 而不是 getinventoryinfo 来获取物品的详细信息.
玩家必须加入拥有公会仓库的公会才能调用该指令, 否则会抛出错误.
若想规避终端提示未加入公会以及没有公会仓库的错误,
可以在调用该指令之前使用 getgdskilllv(getcharid(2), "GD_GUILD_STORAGE") > 0
来确保玩家已加入有公会仓库的公会.
--------------------------------------------------------------
*getstoragelist {<角色编号>{,<想查询的数据>{,<仓库编号>}}};
与 getinventorylist 类似, 但是查询的是个人仓库/扩充仓库中的物品信息.
它的返回数组与 getinventorylist 完全一致, 只是部分数组的意义会发生变化:
- @inventorylist_favorite[] - 该数组无意义并且值固定为 0,
因为个人仓库/扩充仓库中的道具不能被标记为最喜欢的道具.
- @inventorylist_equipswitch[] - 该数组无意义并且值固定为 0,
因为个人仓库/扩充仓库中的道具不能被作为第二套快速切换装备.
- @inventorylist_idx[] - 道具的个人仓库/扩充仓库序号
特别注意:
这里 @inventorylist_idx[] 读取到的序号不再是道具的背包序号,
应该使用 getstorageinfo 而不是 getinventoryinfo 来获取物品的详细信息.
仓库编号:
该指令支持获取扩充仓库的内容, 因此你需要在查询时指定仓库编号.
0 - 个人仓库 (每个玩家都会有的默认仓库)
X - 扩充仓库 (其他非 0 的定义在 conf/inter_athena.yml 中的有效仓库编号)
注意事项:
该指令的参数顺序和 getinventorylist、getcartlist、
getguildstoragelist 有所差异, 使用的时候一定要注意, 不要被坑了.
--------------------------------------------------------------
*readparam(<参数代码>{,"<角色名称>"})
*readparam(<参数代码>{,<角色编号>})
在 rAthena 原来的参数代码基础上, 熊猫模拟器新增了以下几个参数:
bAllStr - 返回角色的总 STR (用总 STR 减去 bStr 可得到面板中 STR 在加号右侧的值)
bAllAgi - 返回角色的总 AGI (用总 AGI 减去 bAgi 可得到面板中 AGI 在加号右侧的值)
bAllVit - 返回角色的总 VIT (用总 VIT 减去 bVit 可得到面板中 VIT 在加号右侧的值)
bAllInt - 返回角色的总 INT (用总 INT 减去 bInt 可得到面板中 INT 在加号右侧的值)
bAllDex - 返回角色的总 DEX (用总 DEX 减去 bDex 可得到面板中 DEX 在加号右侧的值)
bAllLuk - 返回角色的总 LUK (用总 LUK 减去 bLuk 可得到面板中 LUK 在加号右侧的值)
CartWeight - 手推车中的物品总重量 (脱下手推车时数值为 0)
MaxCartWeight - 手推车的最大负重量 (脱下手推车时数值为 0)
使用方法:
dispbottom "总STR为 : " + readparam(bAllStr) + " (" + readparam(bStr) + " + " + (readparam(bAllStr) - readparam(bStr)) + ")";
dispbottom "手推车当前负重情况: " + CartWeight + "/" + MaxCartWeight;
提示信息:
被 readparam 调用的有效 <参数代码> 可以直接当做常量使用
--------------------------------------------------------------
*gethotkey <快捷键位置编号>{,<要获取的数据类型>};
获取指定快捷键位置的信息, 快捷键位置编号必须大于 0 小于 MAX_HOTKEYS.
MAX_HOTKEYS 是个常量, 在脚本中可以直接使用以下方法来确认它的值:
dispbottom "MAX_HOTKEYS = " + MAX_HOTKEYS;
要获取的数据类型:
可选参数, 若携带这个参数则函数的返回值会具备不同含义:
0 - 获取快捷键的类型
> 若返回 0 表示该位置的快捷键上放的是一个物品
> 若返回 1 表示该位置的快捷键上放的是一个技能
1 - 获取技能编号或物品编号
2 - 获取登记在快捷键上的技能等级
若不携带 <要获取的数据类型> 参数, 那么指定的快捷键的信息会被存放到以下角色变量:
@hotkey_type - 快捷键的类型 (为 0 表示物品, 为 1 表示技能)
@hotkey_id - 技能编号或物品编号
@hotkey_lv - 登记在快捷键上的技能等级
返回值:
若携带 <要获取的数据类型> 参数时, 发生错误将返回 -1, 成功则返回查询的值;
不携带 <要获取的数据类型> 参数时, 发生错误将返回 -1, 成功则将信息保存到变量并返回 1
--------------------------------------------------------------
*sethotkey <快捷键位置编号>,<快捷键的类型>,<物品编号/技能编号>,<技能等级>;
设置玩家快捷键工具栏上的内容, 快捷键位置编号必须大于 0 小于 MAX_HOTKEYS.
MAX_HOTKEYS 是个常量, 在脚本中可以直接使用以下方法来确认它的值:
dispbottom "MAX_HOTKEYS = " + MAX_HOTKEYS;
快捷键的类型:
0 - 这个快捷键想放置一个物品 (若使用该值, 则"技能等级"参数无意义, 请直接给"技能等级"参数传 0 即可)
1 - 这个快捷键想放置一个技能
物品编号/技能编号:
根据您 <快捷键的类型> 的取值不同而拥有不同含义, 程序会校验给定的物品编号或技能编号是否有效.
技能等级:
只有当 <快捷键的类型> 的值为 1 时才有意义. 若是个物品的话, 这里随便传什么都会被默认为 0.
返回值:
设置成功则返回 1, 设置失败则返回 0
--------------------------------------------------------------
*showvend "<NPC名称>",<是否显示>{,"<招牌名称>"};
使指定的 NPC 头上可以显示露天商店的招牌, 点击招牌可触发与 NPC 的对话.
NPC名称:
你可以指定 NPC 的名称, 或者用 strnpcinfo(0) 获取当前 NPC 的名称.
是否显示:
0 - 隐藏招牌 (当选择隐藏招牌时, <招牌名称> 参数可不传递)
1 - 显示招牌
返回值:
操作成功则返回 1, 操作失败则返回 0
--------------------------------------------------------------
*viewequip <目标的角色编号|目标的账号编号>{,<是否强制查看>};
查看指定在线角色的装备面板信息.
是否强制查看:
0 - 若目标角色禁止其他玩家查看装备, 那么就不查看 (对 GM 无影响)
1 - 无视目标角色设置, 强制进行查看
返回值:
操作成功则返回 1, 操作失败则返回 0
--------------------------------------------------------------
*countitemidx <背包序号>{,<角色编号>};
*countinventory <背包序号>{,<角色编号>};
获取指定背包序号的道具在背包中的数量.
背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
返回值:
操作成功则返回道具的数量, 操作失败则返回 0
--------------------------------------------------------------
*delitemidx <背包序号>{,<移除的数量>{,<角色编号>}};
*delinventory <背包序号>{,<移除的数量>{,<角色编号>}};
移除指定背包序号的道具, 支持指定移除数量以及目标角色编号.
若被指定的道具已穿戴在目标角色身上, 那么该装备会被立刻脱下并移除.
背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
移除的数量:
可选参数, 若不指定, 则表示你想删除指定道具的全部.
返回值:
操作成功则返回 1, 操作失败则返回 0
--------------------------------------------------------------
*identifyidx <背包序号>{,<角色编号>};
*identifybyidx <背包序号>{,<角色编号>};
鉴定指定背包序号的道具.
只要背包序号合法, 哪怕道具已经被鉴定过, 该函数也会返回 1.
背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
返回值:
操作成功则返回 1, 操作失败则返回 0
--------------------------------------------------------------
*unequipidx <背包序号>{,<角色编号>};
*unequipinventory <背包序号>{,<角色编号>};
脱下指定背包序号的道具.
只要背包序号合法, 哪怕道具已被脱下, 该函数也会返回 1.
若指定的道具不是装备, 那么该函数将返回 0 (但不会报错, 也不会警告).
背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
返回值:
操作成功则返回 1, 操作失败则返回 0
--------------------------------------------------------------
*equipidx <背包序号>{,<角色编号>};
*equipinventory <背包序号>{,<角色编号>};
穿戴指定背包序号的道具.
只要背包序号合法, 哪怕道具已被穿戴, 该函数也会返回 1.
若指定的道具不是装备, 那么该函数将返回 0 (但不会报错, 也不会警告).
背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
返回值:
操作成功则返回 1, 操作失败则返回 0
--------------------------------------------------------------
*itemexists <物品编号/"物品名称">;
*existitem <物品编号/"物品名称">;
确认物品数据库中是否存在指定物品, 通常用于提高脚本的健壮性.
物品编号/"物品名称":
多类型参数. 可以填写数值类型的道具编号, 或者字符串类型的道具名称.
推荐使用道具编号, 相较而言结果会更加准确.
注意事项:
查询时请避免填写 [字符串类型] 的道具编号,
因为这里的参数只要是字符串类型的, 都会走物品名称判断逻辑.
返回值:
若物品指定的道具编号不存在于数据库中则返回 0,
若物品存在且 [可堆叠] 则返回 [正数] 物品编号, [不可堆叠] 则返回 [负数] 物品编号
--------------------------------------------------------------
*renttime <EQI装备位置>,<增减的时间秒数>{,<角色编号>};
*setrenttime <EQI装备位置>,<增减的时间秒数>{,<角色编号>};
*resume <EQI装备位置>,<增减的时间秒数>{,<角色编号>};
增加/减少指定位置装备的租赁时间.
如果要减少租赁时间的话, 第二个参数请使用负数.
EQI装备位置:
是指 EQI_* 开头的位置常量, 可参考 doc/script_commands.txt
增减的时间秒数:
若需要减少时间的话, 请使用负数.
注意事项:
input 指令会将所有小于 0 的用户输入数值变成 0.
若您希望由玩家通过 input 指令来指定要减少的秒数, 那么需要加个负数符号.
或者修改 conf/script_athena.conf 中 input_min_value 选项的值.
返回值:
操作失败返回 0, 非 0 的正数表示成功增减后新的剩余时间秒数
若指定位置没有穿戴装备, 或指定位置的装备并非租赁道具, 函数都会返回 0
--------------------------------------------------------------
*getequipidx <EQI装备位置>{,<角色编号>};
获取指定位置装备的背包序号. 注意该函数返回 0 不代表失败.
EQI装备位置:
EQI_COMPOUND_ON (-1) - Item slot that calls this script (In context of item script)
EQI_ACC_L (0) - Accessory 1
EQI_ACC_R (1) - Accessory 2
EQI_SHOES (2) - Footgear (shoes, boots)
EQI_GARMENT (3) - Garment (mufflers, hoods, manteaux)
EQI_HEAD_LOW (4) - Lower Headgear (beards, some masks)
EQI_HEAD_MID (5) - Middle Headgear (masks, glasses)
EQI_HEAD_TOP (6) - Upper Headgear
EQI_ARMOR (7) - Armor (jackets, robes)
EQI_HAND_L (8) - Left hand (weapons, shields)
EQI_HAND_R (9) - Right hand (weapons)
EQI_COSTUME_HEAD_TOP (10) - Upper Costume Headgear
EQI_COSTUME_HEAD_MID (11) - Middle Costume Headgear
EQI_COSTUME_HEAD_LOW (12) - Lower Costume Headgear
EQI_COSTUME_GARMENT (13) - Costume Garment
EQI_AMMO (14) - Arrow/Ammunition
EQI_SHADOW_ARMOR (15) - Shadow Armor
EQI_SHADOW_WEAPON (16) - Shadow Weapon
EQI_SHADOW_SHIELD (17) - Shadow Shield
EQI_SHADOW_SHOES (18) - Shadow Shoes
EQI_SHADOW_ACC_R (19) - Shadow Accessory 2
EQI_SHADOW_ACC_L (20) - Shadow Accessory 1
返回值:
-1 - 在指定的EQI装备位置找不到装备
-2 - 填写的EQI装备位置无效
-3 - 指定的角色编号无效, 或者目标玩家不在线
其他大于等于 0 的数值则表示成功, 返回值就是所查位置装备的背包序号
--------------------------------------------------------------
*statuscalc;
*status_calc;
根据角色目前的装备、技能、状态以及其他各种加成, 重新执行计算玩家的能力.
不推荐使用:
rAthena 已经推出了功能完全一致的指令 recalculatestat;
建议优先使用 rAthena 官方指令, 以便确保最大的脚本兼容性.
此处的 statuscalc 和 status_calc 实际上是 recalculatestat 的别名, 以便兼容以前的部分脚本.
返回值:
该指令无论执行成功与否, 都不会有返回值
--------------------------------------------------------------
*getequipexpiretick <EQI装备位置>{,<角色编号>};
*isrental <EQI装备位置>{,<角色编号>};
获取指定位置装备的租赁到期剩余秒数.
EQI装备位置:
是指 EQI_* 开头的位置常量, 可参考 doc/script_commands.txt
返回值:
-1 - 在指定的EQI装备位置找不到装备
-2 - 填写的EQI装备位置无效
-3 - 指定的角色编号无效, 或者目标玩家不在线
-4 - 剩余秒数不合法 (比如: 道具早应该过期消失了, 但居然还在背包里)
0 - 此装备不是租赁装备, 永久有效
其他大于 0 的数值则代表租赁到期的剩余秒数
--------------------------------------------------------------
*updateinventory {<角色编号>};
该指令用于重新下发关联玩家的背包数据给客户端.
涵盖角色背包每一个道具的每一个信息, 请避免高频调用或者循环调用.
--------------------------------------------------------------
*getinventoryinfo <道具的背包序号>,<要查看的信息类型>{,<角色编号>};
查询指定背包序号的道具详细信息.
道具的背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
要查看的信息类型:
0 - 物品编号
1 - 堆叠数量
2 - 装备的穿戴位置
3 - 精炼值
4 - 是否已鉴定 (若已鉴定则返回 1, 未鉴定则返回 0)
5 - 是否已损坏 (若已损坏则返回 1, 未损坏则返回 0)
6 - 第一个卡槽的卡片编号
7 - 第二个卡槽的卡片编号
8 - 第三个卡槽的卡片编号
9 - 第四个卡槽的卡片编号
10 - 过期时间 (Unix时间戳, 0 表示永不过期)
11 - 唯一编号 (unique_id)
12 - 第一个随机属性的编号 (ROA_ID)
13 - 第二个随机属性的编号 (ROA_ID)
14 - 第三个随机属性的编号 (ROA_ID)
15 - 第四个随机属性的编号 (ROA_ID)
16 - 第五个随机属性的编号 (ROA_ID)
17 - 第一个随机属性的值 (ROA_VALUE)
18 - 第二个随机属性的值 (ROA_VALUE)
19 - 第三个随机属性的值 (ROA_VALUE)
20 - 第四个随机属性的值 (ROA_VALUE)
21 - 第五个随机属性的值 (ROA_VALUE)
22 - 第一个随机属性的参数 (ROA_PARAM)
23 - 第二个随机属性的参数 (ROA_PARAM)
24 - 第三个随机属性的参数 (ROA_PARAM)
25 - 第四个随机属性的参数 (ROA_PARAM)
26 - 第五个随机属性的参数 (ROA_PARAM)
27 - 道具的绑定类型
28 - 道具的附魔评级 (Grade Level)
29 - 道具作为第二套快速切换装备时的穿戴位置
30 - 道具是否被标记为最喜欢的道具 (0: 未标记; 1: 已标记)
装备的穿戴位置:
如果为 0 则表示还没穿戴在身上, 位置请参考 EQP_* 开头的常量
查询的信息类型 2 和 29 都是 EQP_* 开头的常量.
道具的绑定类型:
Bound_None - 没有绑定 (与 0 等价, 但更推荐用常量)
Bound_Account - 绑定账号的道具, 可放个人仓库, 全账号共享
Bound_Guild - 绑定公会的道具, 可放公会仓库与他人共享, 拥有物品的人离开公会后物品消失
Bound_Party - 绑定队伍的道具, 离开队伍后消失
Bound_Char - 绑定角色的道具, 不能放个人仓库
注意事项:
从 v1.0.6 版本开始,
若查询的信息类型是 11 (装备的唯一编号),
那么返回值既可以存放在数值型变量, 也可以存放在字符串型变量.
返回值:
获取失败则返回 -1, 获取成功则返回你所查询的信息
--------------------------------------------------------------
*getcartinfo <道具的手推车序号>,<要查看的信息类型>{,<角色编号>};
查询指定手推车序号的道具详细信息.
道具的手推车序号:
可以通过 getcartlist 脚本指令的 @inventorylist_idx[] 数组来获得.
要查看的信息类型:
请参考 getinventoryinfo 的参数定义, 它们完全一致.
以下信息类型, 对于手推车道具没有意义:
29 - 道具作为第二套快速切换装备时的穿戴位置
因为手推车中的道具不能作为第二套快速切换装备
30 - 道具是否被标记为最喜欢的道具
因为手推车中的道具不能被标记为最喜欢的道具
返回值:
获取失败则返回 -1, 获取成功则返回你所查询的信息
--------------------------------------------------------------
*getguildstorageinfo <道具的公会仓库序号>,<要查看的信息类型>{,<角色编号>};
查询指定公会仓库序号的道具详细信息.
道具的公会仓库序号:
可以通过 getguildstoragelist 脚本指令的 @inventorylist_idx[] 数组来获得.
要查看的信息类型:
请参考 getinventoryinfo 的参数定义, 它们完全一致.
以下信息类型, 对于公会仓库道具没有意义:
29 - 道具作为第二套快速切换装备时的穿戴位置
因为公会仓库中的道具不能作为第二套快速切换装备
30 - 道具是否被标记为最喜欢的道具
因为公会仓库中的道具不能被标记为最喜欢的道具
返回值:
获取失败则返回 -1, 获取成功则返回你所查询的信息
--------------------------------------------------------------
*getstorageinfo <道具的个人仓库/扩充仓库序号>,<要查看的信息类型>{{,<仓库编号>},<角色编号>};
查询指定个人仓库/扩充仓库序号的道具详细信息.
道具的个人仓库/扩充仓库序号:
可以通过 getstoragelist 脚本指令的 @inventorylist_idx[] 数组来获得.
要查看的信息类型:
请参考 getinventoryinfo 的参数定义, 它们完全一致.
以下信息类型, 对于个人仓库/扩充仓库道具没有意义:
29 - 道具作为第二套快速切换装备时的穿戴位置
因为个人仓库/扩充仓库中的道具不能作为第二套快速切换装备
30 - 道具是否被标记为最喜欢的道具
因为个人仓库/扩充仓库中的道具不能被标记为最喜欢的道具
仓库编号:
该指令支持获取扩充仓库的内容, 因此你需要在查询时指定仓库编号.
0 - 个人仓库 (每个玩家都会有的默认仓库)
X - 扩充仓库 (其他非 0 的定义在 conf/inter_athena.yml 中的有效仓库编号)
返回值:
获取失败则返回 -1, 获取成功则返回你所查询的信息
--------------------------------------------------------------
*setinventoryinfo <道具的背包序号>,<要设置的信息类型>,<值>{{,<标记位>},<角色编号>};
设置指定背包序号道具的详细信息.
值得注意的是, 这里修改的主要是每个玩家各有不同的那些道具的属性信息,
例如: 道具插入的卡片, 道具的精炼值等等
道具的背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
要设置的信息类型:
3 - 精炼值
4 - 是否已鉴定 (若已鉴定则返回 1, 未鉴定则返回 0)
5 - 是否已损坏 (若已损坏则返回 1, 未损坏则返回 0)
6 - 第一个卡槽的卡片编号
7 - 第二个卡槽的卡片编号
8 - 第三个卡槽的卡片编号
9 - 第四个卡槽的卡片编号
10 - 过期时间 (Unix时间戳, 0 表示永不过期)
11 - 唯一编号 (unique_id)
12 - 第一个随机属性编号 (ROA_ID)
13 - 第二个随机属性编号 (ROA_ID)
14 - 第三个随机属性编号 (ROA_ID)
15 - 第四个随机属性编号 (ROA_ID)
16 - 第五个随机属性编号 (ROA_ID)
17 - 第一个随机属性的值 (ROA_VALUE)
18 - 第二个随机属性的值 (ROA_VALUE)
19 - 第三个随机属性的值 (ROA_VALUE)
20 - 第四个随机属性的值 (ROA_VALUE)
21 - 第五个随机属性的值 (ROA_VALUE)
22 - 第一个随机属性的参数 (ROA_PARAM)
23 - 第二个随机属性的参数 (ROA_PARAM)
24 - 第三个随机属性的参数 (ROA_PARAM)
25 - 第四个随机属性的参数 (ROA_PARAM)
26 - 第五个随机属性的参数 (ROA_PARAM)
27 - 道具的绑定类型
28 - 道具的附魔评级 (Grade Level)
29 - 道具作为第二套快速切换装备时的穿戴位置
30 - 道具是否被标记为最喜欢的道具 (0: 未标记; 1: 已标记)
卡片编号:
若将卡片编号设置为 0 则视为删除卡片.
需要注意的是, 卡片将会被凭空移除, 不会留下任何日志记录.
随机属性编号:
此处的编号是 item_randomopt_db.yml 数据库中的 VAR_* 开头的常量,
但需要注意的是从 yml 文件中获得的常量需要添加 RDMOPT_ 前缀才是最后生效的最终常量名,
例如: VAR_MAXHPAMOUNT 最终常量名是 RDMOPT_VAR_MAXHPAMOUNT.
若将此处的编号设置为 0, 那么将会同时清空对应的 ROA_VALUE 和 ROA_PARAM 选项的值.
道具的绑定类型:
Bound_None - 没有绑定 (与 0 等价, 但更推荐用常量)
Bound_Account - 绑定账号的道具, 可放个人仓库, 全账号共享
Bound_Guild - 绑定公会的道具, 可放公会仓库与他人共享, 拥有物品的人离开公会后物品消失
Bound_Party - 绑定队伍的道具, 离开队伍后消失
Bound_Char - 绑定角色的道具, 不能放个人仓库
过期时间:
当您要设置的类型是 10 (过期时间)时, 一定要注意这是个Unix时间戳.
若将值设为 60 秒, 那么道具会因为已过期被立刻删掉:
setinventoryinfo(<背包序号>, 10, 60); // 错误
延长道具 60 秒有效期的正确写法是:
setinventoryinfo(<背包序号>, 10, gettimetick(2) + 60); // 正确
标记位:
每次调用该指令时会调用按需重算角色属性, 且必定重新发送完整背包数据给客户端
但如果因为你需要循环处理背包中的全部道具, 那么你有 100 个道具,
服务器就需要把 100 个道具信息下发 100 次给客户端, 这是非常低效且不合理的.
原则上尽量避免大量循环调用 setinventoryinfo 指令,
但如果无法避免, 那么可以考虑通过传递特殊标记位, 来在循环过程中抑制能力重算
或者背包数据的刷新行为, 在循环结束后再触发一次相关行为.
&1 : 跳过角色能力重算
&2 : 跳过全量刷新角色的背包数据
&4 : 忽略卡片插入合理性的校验 (插入的道具类型必须是卡片, 卡片位置和装备位置符合)
&8 : 插入卡片无需写入 picklog 记录 (凭空生成)
若标记位设置为 0 则表示维持默认行为.
--------
提示信息:
- 使用 &1 标记位的循环结束后, 可以使用 recalculatestat(); 触发角色能力重算
- 使用 &2 标记位的循环结束后, 可以使用 updateinventory(); 重现发送最新背包数据给客户端
返回值:
-1 - 设置失败, 插入的卡片不合法
0 - 设置失败
1 - 设置成功
--------------------------------------------------------------
*statuscheck <状态编号>{,<游戏单位编号>};
*sc_check <状态编号>{,<游戏单位编号>};
该指令用于判断状态是否存在, 并取得相关的状态参数.
不推荐使用:
rAthena 已经推出了功能近似的指令 getstatus;
建议优先使用 rAthena 官方指令, 以便确保最大的脚本兼容性.
状态编号:
每一个增益或者减益状态都有一个编号, 脚本中一般用常量表示.
比如负重超过 50% 的状态编号是: SC_WEIGHT50
这部分的常量定义可以在: src/map/status.hpp 中的 sc_type 定义中找到.
游戏单位编号:
这个编号有不同的叫法: GameID, GID, MapID 等
每一个游戏中的对象只要会显示在地图上的, 就会有一个自己的 <游戏单位编号>
游戏玩家进入游戏后, 它的 <账号编号> 就是他角色的 <游戏单位编号>
信息通过变量返回:
当返回值为 1 的时候, 可以通过以下变量来读取状态的参数:
@sc_val1 状态的第 1 个参数值 (如果是技能对应的状态的话, 往往这个参数都是技能等级)
@sc_val2 状态的第 2 个参数值
@sc_val3 状态的第 3 个参数值
@sc_val4 状态的第 4 个参数值
@sc_tickleft 状态的剩余时间 (单位为毫秒, 若为 -1 表示永久有效)
注意事项:
从 v1.0.7 版本开始 @sc_tickleft 的上限已经[不会再被限制]到 2147483647 毫秒.
返回值:
获取成功则返回 1, 角色没有该状态则返回 0, 其他错误返回 -1
--------------------------------------------------------------
*renttimeidx <背包序号>,<增减的时间秒数>{,<角色编号>};
增加/减少指定背包序号道具的租赁时间.
如果要减少租赁时间的话, 第二个参数请使用负数.
该指令与 renttime 近似, 只是 renttime 操作的是某个已穿戴的装备,
而 renttimeidx 指令可以通过背包序号来指定要调整的物品.
背包序号:
可以通过 getinventorylist 脚本指令的 @inventorylist_idx[] 数组来获得.
增减的时间秒数:
若需要减少时间的话, 请使用负数.
注意事项:
input 指令会将所有小于 0 的用户输入数值变成 0.
若您希望由玩家通过 input 指令来指定要减少的秒数, 那么需要加个负数符号.
或者修改 conf/script_athena.conf 中 input_min_value 选项的值.
返回值:
操作失败返回 0, 非 0 的正数表示成功增减后新的剩余时间秒数
若指定位置没有穿戴装备, 或指定位置的装备并非租赁道具, 函数都会返回 0
--------------------------------------------------------------
*party_leave {<角色编号>};
使当前角色或指定角色退出队伍.
不推荐使用:
rAthena 已经推出了功能近似的指令 party_delmember;
建议优先使用 rAthena 官方指令, 以便确保最大的脚本兼容性.
角色编号:
若不指定角色编号, 那么将会使执行该指令的玩家退出队伍.
返回值:
若指定的角色不在线或不在队伍中则返回 0,
若角色成功退出队伍则返回 1
--------------------------------------------------------------
*script4each <"{脚本}">,<脚本执行范围>{,<动态参数>...};
*script4eachmob <"{脚本}">,<脚本执行范围>{,<动态参数>...};
*script4eachnpc <"{脚本}">,<脚本执行范围>{,<动态参数>...};
对指定范围的单位执行相同的一段脚本.
若使用 script4each 指令, 则执行 <脚本> 的玩家将会成为其默认关联玩家.
脚本的执行范围:
0 - 全服单位 例: script4each "{<脚本>}",0;
1 - 指定地图上的全部单位 例: script4each "{<脚本>}",1,<"地图名称">;
2 - 以地图某个点为中心半径距离内的单位 例: script4each "{<脚本>}",2,<"地图名称">,<中心坐标x>,<中心坐标y>,<范围>;
3 - 指定玩家所在的队伍中的全部队伍成员 例: script4each "{<脚本>}",3,<角色编号>;
4 - 指定玩家所在的公会中的全部公会成员 例: script4each "{<脚本>}",4,<角色编号>;
5 - 指定区域内的全部单位 例: script4each "{<脚本>}",5,<"地图名称">,<坐标x0>,<坐标y0>,<坐标x1>,<坐标y1>;
6 - 指定队伍中的全部队伍成员 例: script4each "{<脚本>}",6,<队伍编号>;
7 - 指定公会中的全部公会成员 例: script4each "{<脚本>}",7,<公会编号>;
其中 3,4,6,7 仅支持被 script4each 使用, 无法对 script4eachmob 和 script4eachnpc 生效.
可无视外层大括号:
从 Pandas v1.0.1 版本开始, {<脚本>} 参数中最外层的大括号可以被忽略.
例如, 以前必须加外层大括号, 否则会报错:
script4each "{ getitem 501, 10; }", 0;
现在, 可以直接忽略最外层大括号, 简写变成:
script4each "getitem 501, 10;", 0;
通过变量返回 GID:
当 script4each 系列指令即将在某个单位身上执行脚本之前, 会将该单位的 GID 保存到 $@gid
通过 $@gid 变量保存的内容, 就能利用 unit* 系列指令来操作目标单位.
例如, 以下代码会让全服魔物立刻说出自己的名字:
script4eachmob "{ unittalk $@gid, getunitname($@gid); }", 0;
双引号转义:
如果 <脚本> 参数中有使用到双引号的话, 需要在双引号的左侧使用 \ 来进行转义.
假设我们希望让全服玩家执行这样一段脚本:
announce "角色名称: " + strcharinfo(0) + " | 角色编号: " + getcharid(0), 0;
那么上述脚本在使用 script4each 系列指令来执行的时候, <脚本> 参数内的双引号都需要加 \ 来转义,
转义操作很简单, 直接将 " 替换成 \" 即可, 最后调用 script4each 时用法如下:
script4each "{ announce \"角色名称: \" + strcharinfo(0) + \" | 角色编号: \" + getcharid(0), 0; }", 0;
字符串变量拼接特别注意:
角色名默认也允许玩家使用双引号, 在这种情况下当您使用 strcharinfo(0) 作为脚本的一部分,
或者引用其他字符串变量作为脚本的一部分但其内容中可能包含双引号的时候, 也需要对这些字符串变量的内容进行双引号转义.
比较推荐的方法是自己包装一个转义函数, 来将 " 替换成 \", 参考代码如下:
function script esc_double_quotation {
.@text$ = getarg(0, "");
.@text$ = replacestr(.@text$, "\"", "\\\"");
return .@text$;
}
然后在拼接 script4each 用于执行的脚本时, 参与拼接的字符串变量都套上它:
script4each "{ announce \"角色名称: \" + esc_double_quotation(strcharinfo(0)) + \" | 角色编号: \" + getcharid(0), 0; }", 0;
这样就是比较完备和严谨的做法了, 哪怕角色名带双引号也不会导致脚本解析失败.
之所以不推荐使用 escape_sql 指令来进行转义, 是因为它除了转义双引号还会处理单引号等其他符号, 而我们只关心双引号.
支持调用事件标签:
从 Pandas v1.0.2 版本开始, {<脚本>} 参数支持直接调用指定的 NPCNAME::EVENT 事件标签.