/
pc.hpp
1430 lines (1229 loc) · 52.3 KB
/
pc.hpp
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
// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder
#ifndef PC_HPP
#define PC_HPP
#include <memory>
#include <vector>
#include "../common/mmo.hpp" // JOB_*, MAX_FAME_LIST, struct fame_list, struct mmo_charstatus
#include "../common/strlib.hpp"// StringBuf
#include "../common/timer.hpp"
#include "battleground.hpp"
#include "buyingstore.hpp" // struct s_buyingstore
#include "clif.hpp" //e_wip_block
#include "itemdb.hpp" // MAX_ITEMGROUP
#include "map.hpp" // RC_ALL
#include "mob.hpp" //e_size
#include "script.hpp" // struct script_reg, struct script_regstr
#include "searchstore.hpp" // struct s_search_store_info
#include "status.hpp" // unit_data
#include "unit.hpp" // unit_data
#include "vending.hpp" // struct s_vending
enum AtCommandType : uint8;
enum e_instance_mode : uint8;
//enum e_log_chat_type : uint8;
enum e_log_pick_type : uint32;
enum sc_type : int16;
#define MAX_PC_BONUS 50 /// Max bonus, usually used by item bonus
#define MAX_PC_SKILL_REQUIRE 5 /// Max skill tree requirement
#define MAX_PC_FEELHATE 3 /// Max feel hate info
#define DAMAGELOG_SIZE_PC 100 /// Damage log
#define MAX_SPIRITBALL 15 /// Max spirit balls
#define MAX_DEVOTION 5 /// Max Devotion slots
#define MAX_SPIRITCHARM 10 /// Max spirit charms
#define MAX_SOUL_BALL 20 /// Max soul ball
#define MAX_STELLAR_MARKS 5 /// Max stellar marks
#define MAX_UNITED_SOULS 12 /// Max united souls
#define LANGTYPE_VAR "#langtype"
#define CASHPOINT_VAR "#CASHPOINTS"
#define KAFRAPOINT_VAR "#KAFRAPOINTS"
#define BANK_VAULT_VAR "#BANKVAULT"
#define ROULETTE_BRONZE_VAR "RouletteBronze"
#define ROULETTE_SILVER_VAR "RouletteSilver"
#define ROULETTE_GOLD_VAR "RouletteGold"
#define COOKMASTERY_VAR "COOK_MASTERY"
#define PCDIECOUNTER_VAR "PC_DIE_COUNTER"
#define JOBCHANGE2ND_VAR "jobchange_level"
#define JOBCHANGE3RD_VAR "jobchange_level_3rd"
#define TKMISSIONID_VAR "TK_MISSION_ID"
#define TKMISSIONCOUNT_VAR "TK_MISSION_COUNT"
#define ATTENDANCE_DATE_VAR "#AttendanceDate"
#define ATTENDANCE_COUNT_VAR "#AttendanceCounter"
#define ACHIEVEMENTLEVEL "AchievementLevel"
//Update this max as necessary. 55 is the value needed for Super Baby currently
//Raised to 105 since Expanded Super Baby needs it.
#define MAX_SKILL_TREE 105
//Total number of classes (for data storage)
#define CLASS_COUNT (JOB_MAX - JOB_NOVICE_HIGH + JOB_MAX_BASIC)
//Equip indexes constants. (eg: sd->equip_index[EQI_AMMO] returns the index
//where the arrows are equipped)
enum equip_index {
EQI_COMPOUND_ON = -1,
EQI_ACC_L = 0,
EQI_ACC_R,
EQI_SHOES,
EQI_GARMENT,
EQI_HEAD_LOW,
EQI_HEAD_MID,
EQI_HEAD_TOP,
EQI_ARMOR,
EQI_HAND_L,
EQI_HAND_R,
EQI_COSTUME_HEAD_TOP,
EQI_COSTUME_HEAD_MID,
EQI_COSTUME_HEAD_LOW,
EQI_COSTUME_GARMENT,
EQI_AMMO,
EQI_SHADOW_ARMOR,
EQI_SHADOW_WEAPON,
EQI_SHADOW_SHIELD,
EQI_SHADOW_SHOES,
EQI_SHADOW_ACC_R,
EQI_SHADOW_ACC_L,
EQI_MAX
};
enum prevent_logout_trigger {
PLT_NONE = 0,
PLT_LOGIN = 1,
PLT_ATTACK = 2,
PLT_SKILL = 4,
PLT_DAMAGE = 8
};
enum e_chkitem_result : uint8 {
CHKADDITEM_EXIST,
CHKADDITEM_NEW,
CHKADDITEM_OVERAMOUNT
};
enum e_additem_result : uint8 {
ADDITEM_SUCCESS,
ADDITEM_INVALID,
ADDITEM_OVERWEIGHT,
ADDITEM_ITEM,
ADDITEM_OVERITEM,
ADDITEM_OVERAMOUNT,
ADDITEM_REFUSED_TIME,
ADDITEM_STACKLIMIT
};
struct skill_cooldown_entry {
unsigned short skill_id;
int timer;
};
#ifdef VIP_ENABLE
struct vip_info {
unsigned int enabled : 1;
time_t time;
bool disableshowrate; //State to disable clif_display_pinfo(). [Cydh]
};
#endif
enum npc_timeout_type {
NPCT_INPUT = 0,
NPCT_MENU = 1,
NPCT_WAIT = 2,
};
extern unsigned int equip_bitmask[EQI_MAX];
#define equip_index_check(i) ( (i) >= EQI_ACC_L && (i) < EQI_MAX )
/// Miscellaneous item bonus struct
struct s_item_bonus {
uint16 id;
int val;
};
/// AddEle bonus struct
struct s_addele2 {
short flag, rate;
unsigned char ele;
};
/// AddRace bonus struct
struct s_addrace2 {
short flag, rate;
unsigned char race;
};
struct weapon_data {
int atkmods[SZ_ALL];
// all the variables except atkmods get zero'ed in each call of status_calc_pc
// NOTE: if you want to add a non-zeroed variable, you need to update the memset call
// in status_calc_pc as well! All the following are automatically zero'ed. [Skotlex]
int overrefine;
int star;
int ignore_def_ele;
int ignore_def_race;
int ignore_def_class;
int def_ratio_atk_ele;
int def_ratio_atk_race;
int def_ratio_atk_class;
int addele[ELE_MAX];
int addrace[RC_MAX];
int addclass[CLASS_MAX];
int addrace2[RC2_MAX];
int addsize[SZ_MAX];
short hp_drain_race[RC_MAX];
short sp_drain_race[RC_MAX];
short hp_drain_class[CLASS_MAX];
short sp_drain_class[CLASS_MAX];
struct drain_data {
short rate; ///< Success rate 10000 = 100%
short per; ///< Drain value/rate per attack
} hp_drain_rate, sp_drain_rate;
std::vector<s_item_bonus> add_dmg;
std::vector<s_addele2> addele2;
std::vector<s_addrace2> addrace3;
};
/// AutoSpell bonus struct
struct s_autospell {
short id, lv, rate, flag;
unsigned short card_id;
bool lock; // bAutoSpellOnSkill: blocks autospell from triggering again, while being executed
};
/// AddEff and AddEff2 bonus struct
struct s_addeffect {
enum sc_type sc; /// SC type/effect
short rate, /// Rate
arrow_rate; /// Arrow rate
unsigned char flag; /// Flag
unsigned int duration; /// Duration the effect applied
};
/// AddEffOnSkill bonus struct
struct s_addeffectonskill {
enum sc_type sc; /// SC type/effect
short rate, /// Rate
skill_id; /// Skill ID
unsigned char target; /// Target
unsigned int duration; /// Duration the effect applied
};
///Struct of add drop item/group rate
struct s_add_drop {
t_itemid nameid; ///Item ID
unsigned short group; ///Group ID
int rate; ///Rate, 1 ~ 10000, -1 ~ -100000
short race; ///Target Race, bitwise value of 1<<x. if < 0 means Monster ID
unsigned short class_; ///Target Class, bitwise value of 1<<x
};
struct s_vanish_bonus {
int16 rate; // 1000 = 100%
int16 per; // 100 = 100%
int flag;
};
/// AutoBonus bonus struct
struct s_autobonus {
short rate;
uint16 atk_type;
unsigned int duration;
char *bonus_script, *other_script;
int active;
unsigned int pos;
};
/// Timed bonus 'bonus_script' struct [Cydh]
struct s_bonus_script_entry {
struct script_code *script;
StringBuf *script_buf; //Used for comparing and storing on table
t_tick tick;
uint16 flag;
enum efst_types icon;
uint8 type; //0 - Ignore; 1 - Buff; 2 - Debuff
int tid;
};
/// HP/SP bonus struct
struct s_regen {
short value;
int rate;
int tick;
};
/// Item combo struct
struct s_combos {
script_code *bonus;
uint32 id;
uint32 pos;
};
struct map_session_data {
struct block_list bl;
struct unit_data ud;
struct view_data vd;
struct status_data base_status, battle_status;
struct status_change sc;
struct regen_data regen;
struct regen_data_sub sregen, ssregen;
//NOTE: When deciding to add a flag to state or special_state, take into consideration that state is preserved in
//status_calc_pc, while special_state is recalculated in each call. [Skotlex]
struct s_state {
unsigned int active : 1; //Marks active player (not active is logging in/out, or changing map servers)
unsigned int menu_or_input : 1;// if a script is waiting for feedback from the player
unsigned int dead_sit : 2;
unsigned int lr_flag : 3;//1: left h. weapon; 2: arrow; 3: shield
unsigned int connect_new : 1;
unsigned int arrow_atk : 1;
unsigned int gangsterparadise : 1;
unsigned int rest : 1;
unsigned int storage_flag : 3; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex], 3: Premium Storage
unsigned int snovice_dead_flag : 1; //Explosion spirits on death: 0 off, 1 used.
unsigned int abra_flag : 2; // Abracadabra bugfix by Aru
unsigned int autocast : 1; // Autospell flag [Inkfish]
unsigned int autotrade : 3; //By Fantik. &2 Requested by vending autotrade; &4 Requested by buyingstore autotrade
unsigned int showdelay :1;
unsigned int showexp :1;
unsigned int showzeny :1;
unsigned int noask :1; // [LuzZza]
unsigned int trading :1; //[Skotlex] is 1 only after a trade has started.
unsigned int deal_locked :2; //1: Clicked on OK. 2: Clicked on TRADE
unsigned int size :2; // for tiny/large types
unsigned int night :1; //Holds whether or not the player currently has the SI_NIGHT effect on. [Skotlex]
unsigned int using_fake_npc :1;
unsigned int rewarp :1; //Signals that a player should warp as soon as he is done loading a map. [Skotlex]
unsigned int killer : 1;
unsigned int killable : 1;
unsigned int doridori : 1;
unsigned int ignoreAll : 1;
unsigned int debug_remove_map : 1; // temporary state to track double remove_map's [FlavioJS]
unsigned int buyingstore : 1;
unsigned int lesseffect : 1;
unsigned int vending : 1;
unsigned int noks : 3; // [Zeph Kill Steal Protection]
unsigned int changemap : 1;
unsigned int callshop : 1; // flag to indicate that a script used callshop; on a shop
short pmap; // Previous map on Map Change
unsigned short autoloot;
t_itemid autolootid[AUTOLOOTITEM_SIZE]; // [Zephyrus]
unsigned short autoloottype;
unsigned int autolooting : 1; //performance-saver, autolooting state for @alootid
unsigned int autobonus; //flag to indicate if an autobonus is activated. [Inkfish]
unsigned int gmaster_flag : 1;
unsigned int prevend : 1;//used to flag wheather you've spent 40sp to open the vending or not.
unsigned int warping : 1;//states whether you're in the middle of a warp processing
unsigned int permanent_speed : 1; // When 1, speed cannot be changed through status_calc_pc().
bool hold_recalc;
unsigned int banking : 1; //1 when we using the banking system 0 when closed
unsigned int hpmeter_visible : 1;
unsigned disable_atcommand_on_npc : 1; //Prevent to use atcommand while talking with NPC [Kichi]
uint8 isBoundTrading; // Player is currently add bound item to trade list [Cydh]
bool ignoretimeout; // Prevent the SECURE_NPCTIMEOUT function from closing current script.
unsigned int workinprogress : 2; // See clif.hpp::e_workinprogress
bool pc_loaded; // Ensure inventory data and status data is loaded before we calculate player stats
bool keepshop; // Whether shop data should be removed when the player disconnects
bool mail_writing; // Whether the player is currently writing a mail in RODEX or not
bool cashshop_open;
bool sale_open;
unsigned int block_action : 10;
} state;
struct {
unsigned char no_weapon_damage, no_magic_damage, no_misc_damage;
unsigned int restart_full_recover : 1;
unsigned int no_castcancel : 1;
unsigned int no_castcancel2 : 1;
unsigned int no_sizefix : 1;
unsigned int no_gemstone : 2;
unsigned int intravision : 1; // Maya Purple Card effect [DracoRPG]
unsigned int perfect_hiding : 1; // [Valaris]
unsigned int no_knockback : 1;
unsigned int bonus_coma : 1;
unsigned int no_mado_fuel : 1; // Disable Magic_Gear_Fuel consumption [Secret]
unsigned int no_walk_delay : 1;
} special_state;
uint32 login_id1, login_id2;
unsigned short class_; //This is the internal job ID used by the map server to simplify comparisons/queries/etc. [Skotlex]
int group_id, group_pos, group_level;
unsigned int permissions;/* group permissions */
int count_rewarp; //count how many time we being rewarped
int langtype;
struct mmo_charstatus status;
// Item Storages
struct s_storage storage, premiumStorage;
struct s_storage inventory;
struct s_storage cart;
struct item_data* inventory_data[MAX_INVENTORY]; // direct pointers to itemdb entries (faster than doing item_id lookups)
short equip_index[EQI_MAX];
short equip_switch_index[EQI_MAX];
unsigned int weight,max_weight,add_max_weight;
int cart_weight,cart_num,cart_weight_max;
int fd;
unsigned short mapindex;
unsigned char head_dir; //0: Look forward. 1: Look right, 2: Look left.
t_tick client_tick;
int npc_id,npc_shopid; //for script follow scriptoid; ,npcid
std::vector<int> areanpc, npc_ontouch_; ///< Array of OnTouch and OnTouch_ NPC ID
int npc_item_flag; //Marks the npc_id with which you can use items during interactions with said npc (see script command enable_itemuse)
int npc_menu; // internal variable, used in npc menu handling
int npc_amount;
struct script_state *st;
char npc_str[CHATBOX_SIZE]; // for passing npc input box text to script engine
int npc_timer_id; //For player attached npc timers. [Skotlex]
unsigned int chatID;
time_t idletime;
time_t idletime_hom;
struct s_progressbar {
int npc_id;
t_tick timeout;
} progressbar; //Progress Bar [Inkfish]
struct s_ignore {
char name[NAME_LENGTH];
} ignore[MAX_IGNORE_LIST];
int followtimer; // [MouseJstr]
int followtarget;
time_t emotionlasttime; // to limit flood with emotion packets
short skillitem,skillitemlv;
bool skillitem_keep_requirement;
uint16 skill_id_old,skill_lv_old;
uint16 skill_id_dance,skill_lv_dance;
short cook_mastery; // range: [0,1999] [Inkfish]
struct skill_cooldown_entry * scd[MAX_SKILLCOOLDOWN]; // Skill Cooldown
uint16 cloneskill_idx, ///Stores index of copied skill by Intimidate/Plagiarism
reproduceskill_idx; ///Stores index of copied skill by Reproduce
int menuskill_id, menuskill_val, menuskill_val2;
int invincible_timer;
t_tick canlog_tick;
t_tick canuseitem_tick; // [Skotlex]
t_tick canusecashfood_tick;
t_tick canequip_tick; // [Inkfish]
t_tick cantalk_tick;
t_tick canskill_tick; // used to prevent abuse from no-delay ACT files
t_tick cansendmail_tick; // [Mail System Flood Protection]
t_tick ks_floodprotect_tick; // [Kill Steal Protection]
t_tick equipswitch_tick; // Equip switch
struct s_item_delay {
t_itemid nameid;
t_tick tick;
} item_delay[MAX_ITEMDELAYS]; // [Paradox924X]
short weapontype1,weapontype2;
short disguise; // [Valaris]
struct weapon_data right_weapon, left_weapon;
// here start arrays to be globally zeroed at the beginning of status_calc_pc()
struct s_indexed_bonus {
int param_bonus[6], param_equip[6]; //Stores card/equipment bonuses.
int subele[ELE_MAX];
int subele_script[ELE_MAX];
int subdefele[ELE_MAX];
int subrace[RC_MAX];
int subclass[CLASS_MAX];
int subrace2[RC2_MAX];
int subsize[SZ_MAX];
short coma_class[CLASS_MAX];
short coma_race[RC_MAX];
short weapon_coma_ele[ELE_MAX];
short weapon_coma_race[RC_MAX];
short weapon_coma_class[CLASS_MAX];
int weapon_atk[16];
int weapon_damage_rate[16];
int arrow_addele[ELE_MAX];
int arrow_addrace[RC_MAX];
int arrow_addclass[CLASS_MAX];
int arrow_addsize[SZ_MAX];
int magic_addele[ELE_MAX];
int magic_addele_script[ELE_MAX];
int magic_addrace[RC_MAX];
int magic_addclass[CLASS_MAX];
int magic_addsize[SZ_MAX];
int magic_atk_ele[ELE_MAX];
int magic_subsize[SZ_MAX];
int critaddrace[RC_MAX];
int expaddrace[RC_MAX];
int expaddclass[CLASS_MAX];
int ignore_mdef_by_race[RC_MAX];
int ignore_mdef_by_class[CLASS_MAX];
int ignore_def_by_race[RC_MAX];
int ignore_def_by_class[CLASS_MAX];
short sp_gain_race[RC_MAX];
int magic_addrace2[RC2_MAX];
int ignore_mdef_by_race2[RC2_MAX];
int dropaddrace[RC_MAX];
int dropaddclass[CLASS_MAX];
int magic_subdefele[ELE_MAX];
} indexed_bonus;
// zeroed arrays end here.
std::vector<s_autospell> autospell, autospell2, autospell3;
std::vector<s_addeffect> addeff, addeff_atked;
std::vector<s_addeffectonskill> addeff_onskill;
std::vector<s_item_bonus> skillatk, skillusesprate, skillusesp, skillheal, skillheal2, skillblown, skillcastrate, skillfixcastrate, subskill, skillcooldown, skillfixcast,
skillvarcast, skilldelay, itemhealrate, add_def, add_mdef, add_mdmg, reseff, itemgrouphealrate;
std::vector<s_add_drop> add_drop;
std::vector<s_addele2> subele2;
std::vector<s_vanish_bonus> sp_vanish, hp_vanish;
std::vector<s_addrace2> subrace3;
std::vector<s_autobonus> autobonus, autobonus2, autobonus3; //Auto script on attack, when attacked, on skill usage
// zeroed structures start here
struct s_regen {
short value;
int rate;
t_tick tick;
} hp_loss, sp_loss, hp_regen, sp_regen, percent_hp_regen, percent_sp_regen;
struct {
short value;
int rate, tick;
} def_set_race[RC_MAX], mdef_set_race[RC_MAX], norecover_state_race[RC_MAX];
struct s_bonus_vanish_gain {
short rate, ///< Success rate 0 - 1000 (100%)
per; ///< % HP/SP vanished/gained
} hp_vanish_race[RC_MAX], sp_vanish_race[RC_MAX];
// zeroed structures end here
// zeroed vars start here.
struct s_bonus {
int hp, sp;
int atk_rate;
int arrow_atk,arrow_ele,arrow_cri,arrow_hit;
int nsshealhp,nsshealsp;
int critical_def,double_rate;
int short_attack_atk_rate; // Short range atk rate, not weapon based.
int long_attack_atk_rate; //Long range atk rate, not weapon based. [Skotlex]
int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate;
int ignore_mdef_ele;
int ignore_mdef_race;
int ignore_mdef_class;
int perfect_hit;
int perfect_hit_add;
int get_zeny_rate;
int get_zeny_num; //Added Get Zeny Rate [Skotlex]
int double_add_rate;
int short_weapon_damage_return,long_weapon_damage_return;
int magic_damage_return; // AppleGirl Was Here
int break_weapon_rate,break_armor_rate;
int crit_atk_rate;
int crit_def_rate;
int classchange; // [Valaris]
int speed_rate, speed_add_rate, aspd_add;
int itemhealrate2; // [Epoque] Increase heal rate of all healing items.
int shieldmdef;//royal guard's
unsigned int setitem_hash, setitem_hash2; //Split in 2 because shift operations only work on int ranges. [Skotlex]
short splash_range, splash_add_range;
short add_steal_rate;
int add_heal_rate, add_heal2_rate;
int sp_gain_value, hp_gain_value, magic_sp_gain_value, magic_hp_gain_value, long_sp_gain_value, long_hp_gain_value;
unsigned short unbreakable; // chance to prevent ANY equipment breaking [celest]
unsigned short unbreakable_equip; //100% break resistance on certain equipment
unsigned short unstripable_equip;
int fixcastrate, varcastrate; // n/100
int add_fixcast, add_varcast; // in milliseconds
int ematk; // matk bonus from equipment
int eatk; // atk bonus from equipment
uint8 absorb_dmg_maxhp; // [Cydh]
short critical_rangeatk;
short weapon_atk_rate, weapon_matk_rate;
} bonus;
// zeroed vars end here.
int castrate,delayrate,hprate,sprate,dsprate;
int hprecov_rate,sprecov_rate;
int matk_rate;
int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;
t_itemid itemid;
short itemindex; //Used item's index in sd->inventory [Skotlex]
uint16 catch_target_class; // pet catching, stores a pet class to catch [zzo]
int8 spiritball, spiritball_old;
int spirit_timer[MAX_SPIRITBALL];
short spiritcharm; //No. of spirit
int spiritcharm_type; //Spirit type
int spiritcharm_timer[MAX_SPIRITCHARM];
int8 soulball, soulball_old;
unsigned char potion_success_counter; //Potion successes in row counter
unsigned char mission_count; //Stores the bounty kill count for TK_MISSION
short mission_mobid; //Stores the target mob_id for TK_MISSION
int die_counter; //Total number of times you've died
int devotion[MAX_DEVOTION]; //Stores the account IDs of chars devoted to.
int stellar_mark[MAX_STELLAR_MARKS]; // Stores the account ID's of character's with a stellar mark.
int united_soul[MAX_UNITED_SOULS]; // Stores the account ID's of character's who's soul is united.
int trade_partner;
struct s_deal {
struct s_item {
short index, amount;
} item[10];
int zeny, weight;
} deal;
bool party_creating; // whether the char is requesting party creation
bool party_joining; // whether the char is accepting party invitation
int party_invite, party_invite_account; // for handling party invitation (holds party id and account id)
int adopt_invite; // Adoption
struct guild *guild; // [Ind] speed everything up
int guild_invite,guild_invite_account;
int guild_emblem_id,guild_alliance,guild_alliance_account;
short guild_x,guild_y; // For guildmate position display. [Skotlex] should be short [zzo]
int guildspy; // [Syrus22]
int partyspy; // [Syrus22]
int clanspy;
struct clan *clan;
int vended_id;
int vender_id;
int vend_num;
uint16 vend_skill_lv;
char message[MESSAGE_SIZE];
struct s_vending vending[MAX_VENDING];
unsigned int buyer_id; // uid of open buying store
struct s_buyingstore buyingstore;
struct s_search_store_info searchstore;
struct pet_data *pd;
struct homun_data *hd; // [blackhole89]
struct mercenary_data *md;
struct elemental_data *ed;
struct s_hate_mob {
int m; //-1 - none, other: map index corresponding to map name.
unsigned short index; //map index
} feel_map[3];// 0 - Sun; 1 - Moon; 2 - Stars
short hate_mob[3];
int pvp_timer;
short pvp_point;
unsigned short pvp_rank, pvp_lastusers;
unsigned short pvp_won, pvp_lost;
char eventqueue[MAX_EVENTQUEUE][EVENT_NAME_LENGTH];
int eventtimer[MAX_EVENTTIMER];
unsigned short eventcount; // [celest]
unsigned char change_level_2nd; // job level when changing from 1st to 2nd class [jobchange_level in global_reg_value]
unsigned char change_level_3rd; // job level when changing from 2nd to 3rd class [jobchange_level_3rd in global_reg_value]
char fakename[NAME_LENGTH]; // fake names [Valaris]
size_t duel_group; // duel vars [LuzZza]
size_t duel_invite;
int killerrid, killedrid, killedgid;
int cashPoints, kafraPoints;
int rental_timer;
// Auction System [Zephyrus]
struct s_auction{
int index, amount;
} auction;
// Mail System [Zephyrus]
struct s_mail {
struct {
t_itemid nameid;
int index, amount;
} item[MAIL_MAX_ITEM];
int zeny;
struct mail_data inbox;
bool changed; // if true, should sync with charserver on next mailbox request
} mail;
//Quest log system
int num_quests; ///< Number of entries in quest_log
int avail_quests; ///< Number of Q_ACTIVE and Q_INACTIVE entries in quest log (index of the first Q_COMPLETE entry)
struct quest *quest_log; ///< Quest log entries (note: Q_COMPLETE quests follow the first <avail_quests>th enties
bool save_quest; ///< Whether the quest_log entries were modified and are waitin to be saved
// Achievement log system
struct s_achievement_data {
int total_score; ///< Total achievement points
int level; ///< Achievement level
bool save; ///< Flag to know if achievements need to be saved
uint16 count; ///< Total achievements in log
uint16 incompleteCount; ///< Total incomplete achievements in log
struct achievement *achievements; ///< Achievement log entries
} achievement_data;
// Title system
std::vector<int> titles;
std::vector<int> cloaked_npc;
/* ShowEvent Data Cache flags from map */
bool *qi_display;
int qi_count;
// temporary debug [flaviojs]
const char* debug_file;
int debug_line;
const char* debug_func;
// Battlegrounds queue system [MasterOfMuppets]
int bg_id, bg_queue_id;
int tid_queue_active; ///< Timer ID associated with players joining an active BG
#ifdef SECURE_NPCTIMEOUT
/**
* ID of the timer
* @info
* - value is -1 (INVALID_TIMER constant) when not being used
* - timer is cancelled upon closure of the current npc's instance
**/
int npc_idle_timer;
/**
* Tick on the last recorded NPC iteration (next/menu/whatever)
* @info
* - It is updated on every NPC iteration as mentioned above
**/
t_tick npc_idle_tick;
/* */
enum npc_timeout_type npc_idle_type;
#endif
std::vector<std::shared_ptr<s_combos>> combos;
/**
* Guarantees your friend request is legit (for bugreport:4629)
**/
int friend_req;
int shadowform_id;
/* Channel System [Ind] */
struct Channel **channels;
unsigned char channel_count;
struct Channel *gcbind;
bool stealth;
unsigned char fontcolor;
t_tick *channel_tick;
/* [Ind] */
struct sc_display_entry **sc_display;
unsigned char sc_display_count;
unsigned char delayed_damage; //[Ind]
/**
* Account/Char variables & array control of those variables
**/
struct reg_db regs;
unsigned char vars_received; // char loading is only complete when you get it all.
bool vars_ok;
bool vars_dirty;
uint16 dmglog[DAMAGELOG_SIZE_PC]; ///target ids
int c_marker[MAX_SKILL_CRIMSON_MARKER]; /// Store target that marked by Crimson Marker [Cydh]
bool flicker; /// Check RL_FLICKER usage status [Cydh]
#ifdef VIP_ENABLE
struct vip_info vip;
#endif
/// Bonus Script [Cydh]
struct s_bonus_script_list {
struct linkdb_node *head; ///< Bonus script head node. data: struct s_bonus_script_entry *entry, key: (intptr_t)entry
uint16 count;
} bonus_script;
/* Expiration Timer ID */
int expiration_tid;
time_t expiration_time;
short last_addeditem_index; /// Index of latest item added
int autotrade_tid;
int respawn_tid;
int bank_vault; ///< Bank Vault
#ifdef PACKET_OBFUSCATION
unsigned int cryptKey; ///< Packet obfuscation key to be used for the next received packet
#endif
struct {
int bronze, silver, gold; ///< Roulette Coin
} roulette_point;
struct {
short stage;
int8 prizeIdx;
short prizeStage;
bool claimPrize;
t_tick tick;
} roulette;
int instance_id;
e_instance_mode instance_mode; ///< Mode of instance player last leaves from (used for instance destruction button)
short setlook_head_top, setlook_head_mid, setlook_head_bottom, setlook_robe; ///< Stores 'setlook' script command values.
#if PACKETVER_MAIN_NUM >= 20150507 || PACKETVER_RE_NUM >= 20150429 || defined(PACKETVER_ZERO)
std::vector<int16> hatEffects;
#endif
struct{
int tid;
uint16 skill_id;
uint16 level;
int target;
} skill_keep_using;
};
extern struct eri *pc_sc_display_ers; /// Player's SC display table
/**
* ERS for the bulk of pc vars
**/
extern struct eri *num_reg_ers;
extern struct eri *str_reg_ers;
/* Global Expiration Timer ID */
extern int pc_expiration_tid;
enum weapon_type : uint8 {
W_FIST, //Bare hands
W_DAGGER, //1
W_1HSWORD, //2
W_2HSWORD, //3
W_1HSPEAR, //4
W_2HSPEAR, //5
W_1HAXE, //6
W_2HAXE, //7
W_MACE, //8
W_2HMACE, //9 (unused)
W_STAFF, //10
W_BOW, //11
W_KNUCKLE, //12
W_MUSICAL, //13
W_WHIP, //14
W_BOOK, //15
W_KATAR, //16
W_REVOLVER, //17
W_RIFLE, //18
W_GATLING, //19
W_SHOTGUN, //20
W_GRENADE, //21
W_HUUMA, //22
W_2HSTAFF, //23
MAX_WEAPON_TYPE,
// dual-wield constants
W_DOUBLE_DD, // 2 daggers
W_DOUBLE_SS, // 2 swords
W_DOUBLE_AA, // 2 axes
W_DOUBLE_DS, // dagger + sword
W_DOUBLE_DA, // dagger + axe
W_DOUBLE_SA, // sword + axe
MAX_WEAPON_TYPE_ALL,
};
#define WEAPON_TYPE_ALL ((1<<MAX_WEAPON_TYPE)-1)
enum e_ammo_type : uint8 {
AMMO_NONE = 0,
AMMO_ARROW,
AMMO_DAGGER,
AMMO_BULLET,
AMMO_SHELL,
AMMO_GRENADE,
AMMO_SHURIKEN,
AMMO_KUNAI,
AMMO_CANNONBALL,
AMMO_THROWWEAPON,
MAX_AMMO_TYPE
};
enum idletime_option {
IDLE_WALK = 0x0001,
IDLE_USESKILLTOID = 0x0002,
IDLE_USESKILLTOPOS = 0x0004,
IDLE_USEITEM = 0x0008,
IDLE_ATTACK = 0x0010,
IDLE_CHAT = 0x0020,
IDLE_SIT = 0x0040,
IDLE_EMOTION = 0x0080,
IDLE_DROPITEM = 0x0100,
IDLE_ATCOMMAND = 0x0200,
IDLE_NPC_CLOSE = 0x0400,
IDLE_NPC_INPUT = 0x0800,
IDLE_NPC_MENU = 0x1000,
IDLE_NPC_NEXT = 0x2000,
IDLE_NPC_PROGRESS = 0x4000,
};
enum adopt_responses {
ADOPT_ALLOWED = 0,
ADOPT_ALREADY_ADOPTED,
ADOPT_MARRIED_AND_PARTY,
ADOPT_EQUIP_RINGS,
ADOPT_NOT_NOVICE,
ADOPT_CHARACTER_NOT_FOUND,
ADOPT_MORE_CHILDREN,
ADOPT_LEVEL_70,
ADOPT_MARRIED,
};
enum item_check {
ITMCHK_NONE = 0x0,
ITMCHK_INVENTORY = 0x1,
ITMCHK_CART = 0x2,
ITMCHK_STORAGE = 0x4,
ITMCHK_ALL = ITMCHK_INVENTORY|ITMCHK_CART|ITMCHK_STORAGE,
};
struct s_job_info {
unsigned int base_hp[MAX_LEVEL], base_sp[MAX_LEVEL]; //Storage for the first calculation with hp/sp factor and multiplicator
int hp_factor, hp_multiplicator, sp_factor;
int max_weight_base;
char job_bonus[MAX_LEVEL];
#ifdef RENEWAL_ASPD
int aspd_base[MAX_WEAPON_TYPE+1];
#else
int aspd_base[MAX_WEAPON_TYPE]; //[blackhole89]
#endif
t_exp exp_table[2][MAX_LEVEL];
uint32 max_level[2];
struct s_params {
uint16 str, agi, vit, int_, dex, luk;
} max_param;
struct s_job_noenter_map {
uint32 zone;
uint8 group_lv;
} noenter_map;
};
extern struct s_job_info job_info[CLASS_COUNT];
#define EQP_WEAPON EQP_HAND_R
#define EQP_SHIELD EQP_HAND_L
#define EQP_ARMS (EQP_HAND_R|EQP_HAND_L)
#define EQP_HELM (EQP_HEAD_LOW|EQP_HEAD_MID|EQP_HEAD_TOP)
#define EQP_ACC (EQP_ACC_L|EQP_ACC_R)
#define EQP_COSTUME (EQP_COSTUME_HEAD_TOP|EQP_COSTUME_HEAD_MID|EQP_COSTUME_HEAD_LOW|EQP_COSTUME_GARMENT)
#define EQP_COSTUME_HELM (EQP_COSTUME_HEAD_TOP|EQP_COSTUME_HEAD_MID|EQP_COSTUME_HEAD_LOW)
#define EQP_SHADOW_GEAR (EQP_SHADOW_ARMOR|EQP_SHADOW_WEAPON|EQP_SHADOW_SHIELD|EQP_SHADOW_SHOES|EQP_SHADOW_ACC_R|EQP_SHADOW_ACC_L)
#define EQP_SHADOW_ACC (EQP_SHADOW_ACC_R|EQP_SHADOW_ACC_L)
#define EQP_SHADOW_ARMS (EQP_SHADOW_WEAPON|EQP_SHADOW_SHIELD)
/// Equip positions that use a visible sprite
#if PACKETVER < 20110111
#define EQP_VISIBLE EQP_HELM
#else
#define EQP_VISIBLE (EQP_HELM|EQP_GARMENT|EQP_COSTUME)
#endif
#define pc_setdead(sd) ( (sd)->state.dead_sit = (sd)->vd.dead_sit = 1 )
#define pc_setsit(sd) { pc_stop_walking((sd), 1|4); pc_stop_attack((sd)); (sd)->state.dead_sit = (sd)->vd.dead_sit = 2; }
#define pc_isdead(sd) ( (sd)->state.dead_sit == 1 )
#define pc_issit(sd) ( (sd)->vd.dead_sit == 2 )
#define pc_isidle_party(sd) ( (sd)->chatID || (sd)->state.vending || (sd)->state.buyingstore || DIFF_TICK(last_tick, (sd)->idletime) >= battle_config.idle_no_share )
#define pc_isidle_hom(sd) ( (sd)->hd && ( (sd)->chatID || (sd)->state.vending || (sd)->state.buyingstore || DIFF_TICK(last_tick, (sd)->idletime_hom) >= battle_config.hom_idle_no_share ) )
#define pc_istrading(sd) ( (sd)->npc_id || (sd)->state.vending || (sd)->state.buyingstore || (sd)->state.trading )
#define pc_cant_act(sd) ( (sd)->npc_id || (sd)->state.vending || (sd)->state.buyingstore || (sd)->chatID || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend )
/* equals pc_cant_act except it doesn't check for chat rooms or npcs */
#define pc_cant_act2(sd) ( (sd)->state.vending || (sd)->state.buyingstore || ((sd)->sc.opt1 && (sd)->sc.opt1 != OPT1_BURNING) || (sd)->state.trading || (sd)->state.storage_flag || (sd)->state.prevend )
#define pc_setdir(sd,b,h) ( (sd)->ud.dir = (b) ,(sd)->head_dir = (h) )
#define pc_setchatid(sd,n) ( (sd)->chatID = n )
#define pc_ishiding(sd) ( (sd)->sc.option&(OPTION_HIDE|OPTION_CLOAK|OPTION_CHASEWALK) )
#define pc_iscloaking(sd) ( !((sd)->sc.option&OPTION_CHASEWALK) && ((sd)->sc.option&OPTION_CLOAK) )
#define pc_ischasewalk(sd) ( (sd)->sc.option&OPTION_CHASEWALK )
#ifdef VIP_ENABLE
#define pc_isvip(sd) ( sd->vip.enabled ? true : false )
#else
#define pc_isvip(sd) ( false )
#endif
#ifdef NEW_CARTS
#define pc_iscarton(sd) ( (sd)->sc.data[SC_PUSH_CART] )
#else
#define pc_iscarton(sd) ( (sd)->sc.option&OPTION_CART )
#endif
#define pc_isfalcon(sd) ( (sd)->sc.option&OPTION_FALCON )
#define pc_isriding(sd) ( (sd)->sc.option&OPTION_RIDING )
#define pc_isinvisible(sd) ( (sd)->sc.option&OPTION_INVISIBLE )
#define pc_is50overweight(sd) ( (sd)->weight * 100 >= (sd)->max_weight * battle_config.natural_heal_weight_rate )
#define pc_is70overweight(sd) ( (sd)->weight * 100 >= (sd)->max_weight * battle_config.natural_heal_weight_rate_renewal )
#define pc_is90overweight(sd) ( (sd)->weight * 10 >= (sd)->max_weight * 9 )
static inline bool pc_hasprogress(struct map_session_data *sd, enum e_wip_block progress) {
return sd == NULL || (sd->state.workinprogress&progress) == progress;
}
/// Enum of Player's Parameter
enum e_params {
PARAM_STR = 0,
PARAM_AGI,
PARAM_VIT,
PARAM_INT,
PARAM_DEX,
PARAM_LUK,
PARAM_MAX
};
short pc_maxparameter(struct map_session_data *sd, enum e_params param);
short pc_maxaspd(struct map_session_data *sd);
/**
* Ranger
**/
#define pc_iswug(sd) ( (sd)->sc.option&OPTION_WUG )
#define pc_isridingwug(sd) ( (sd)->sc.option&OPTION_WUGRIDER )
// Mechanic Magic Gear
#define pc_ismadogear(sd) ( (sd)->sc.option&OPTION_MADOGEAR )
// Rune Knight Dragon
#define pc_isridingdragon(sd) ( (sd)->sc.option&OPTION_DRAGON )
#define pc_stop_walking(sd, type) unit_stop_walking(&(sd)->bl, type)