diff options
Diffstat (limited to 'src/map/pc.c')
-rw-r--r-- | src/map/pc.c | 590 |
1 files changed, 301 insertions, 289 deletions
diff --git a/src/map/pc.c b/src/map/pc.c index 362ee0873..ebfd5f09f 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -51,45 +51,6 @@ #include <time.h> -#define PVP_CALCRANK_INTERVAL 1000 // PVP calculation interval -static unsigned int exp_table[CLASS_COUNT][2][MAX_LEVEL]; -static unsigned int max_level[CLASS_COUNT][2]; -static unsigned int statp[MAX_LEVEL+1]; -#if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) -static unsigned int level_penalty[3][RC_MAX][MAX_LEVEL*2+1]; -#endif - -// h-files are for declarations, not for implementations... [Shinomori] -struct skill_tree_entry skill_tree[CLASS_COUNT][MAX_SKILL_TREE]; -// timer for night.day implementation -int day_timer_tid; -int night_timer_tid; - -struct fame_list smith_fame_list[MAX_FAME_LIST]; -struct fame_list chemist_fame_list[MAX_FAME_LIST]; -struct fame_list taekwon_fame_list[MAX_FAME_LIST]; - -static unsigned short equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARMENT,EQP_HEAD_LOW,EQP_HEAD_MID,EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_GARMENT,EQP_AMMO}; - -//Links related info to the sd->hate_mob[]/sd->feel_map[] entries -const struct sg_data sg_info[MAX_PC_FEELHATE] = { - { SG_SUN_ANGER, SG_SUN_BLESS, SG_SUN_COMFORT, "PC_FEEL_SUN", "PC_HATE_MOB_SUN", is_day_of_sun }, - { SG_MOON_ANGER, SG_MOON_BLESS, SG_MOON_COMFORT, "PC_FEEL_MOON", "PC_HATE_MOB_MOON", is_day_of_moon }, - { SG_STAR_ANGER, SG_STAR_BLESS, SG_STAR_COMFORT, "PC_FEEL_STAR", "PC_HATE_MOB_STAR", is_day_of_star } - }; - -/** - * Item Cool Down Delay Saving - * Struct item_cd is not a member of struct map_session_data - * to keep cooldowns in memory between player log-ins. - * All cooldowns are reset when server is restarted. - **/ -DBMap* itemcd_db = NULL; // char_id -> struct skill_cd -struct item_cd { - unsigned int tick[MAX_ITEMDELAYS];//tick - short nameid[MAX_ITEMDELAYS];//skill id -}; - struct pc_interface pc_s; //Converts a class to its array index for CLASS_COUNT defined arrays. @@ -156,7 +117,7 @@ bool pc_should_log_commands(struct map_session_data *sd) return pc_group_should_log_commands(sd->group); } -static int pc_invincible_timer(int tid, unsigned int tick, int id, intptr_t data) { +int pc_invincible_timer(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd; if( (sd=(struct map_session_data *)map->id2sd(id)) == NULL || sd->bl.type!=BL_PC ) @@ -178,8 +139,8 @@ void pc_setinvincibletimer(struct map_session_data* sd, int val) { val += maplist[sd->bl.m].invincible_time_inc; if( sd->invincible_timer != INVALID_TIMER ) - timer->delete(sd->invincible_timer,pc_invincible_timer); - sd->invincible_timer = timer->add(timer->gettick()+val,pc_invincible_timer,sd->bl.id,0); + timer->delete(sd->invincible_timer,pc->invincible_timer); + sd->invincible_timer = timer->add(timer->gettick()+val,pc->invincible_timer,sd->bl.id,0); } void pc_delinvincibletimer(struct map_session_data* sd) @@ -188,13 +149,13 @@ void pc_delinvincibletimer(struct map_session_data* sd) if( sd->invincible_timer != INVALID_TIMER ) { - timer->delete(sd->invincible_timer,pc_invincible_timer); + timer->delete(sd->invincible_timer,pc->invincible_timer); sd->invincible_timer = INVALID_TIMER; skill->unit_move(&sd->bl,timer->gettick(),1); } } -static int pc_spiritball_timer(int tid, unsigned int tick, int id, intptr_t data) { +int pc_spiritball_timer(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd; int i; @@ -238,14 +199,14 @@ int pc_addspiritball(struct map_session_data *sd,int interval,int max) if( sd->spiritball && sd->spiritball >= max ) { if(sd->spirit_timer[0] != INVALID_TIMER) - timer->delete(sd->spirit_timer[0],pc_spiritball_timer); + timer->delete(sd->spirit_timer[0],pc->spiritball_timer); sd->spiritball--; if( sd->spiritball != 0 ) memmove(sd->spirit_timer+0, sd->spirit_timer+1, (sd->spiritball)*sizeof(int)); sd->spirit_timer[sd->spiritball] = INVALID_TIMER; } - tid = timer->add(timer->gettick()+interval, pc_spiritball_timer, sd->bl.id, 0); + tid = timer->add(timer->gettick()+interval, pc->spiritball_timer, sd->bl.id, 0); ARR_FIND(0, sd->spiritball, i, sd->spirit_timer[i] == INVALID_TIMER || DIFF_TICK(timer->get(tid)->tick, timer->get(sd->spirit_timer[i])->tick) < 0); if( i != sd->spiritball ) memmove(sd->spirit_timer+i+1, sd->spirit_timer+i, (sd->spiritball-i)*sizeof(int)); @@ -280,7 +241,7 @@ int pc_delspiritball(struct map_session_data *sd,int count,int type) for(i=0;i<count;i++) { if(sd->spirit_timer[i] != INVALID_TIMER) { - timer->delete(sd->spirit_timer[i],pc_spiritball_timer); + timer->delete(sd->spirit_timer[i],pc->spiritball_timer); sd->spirit_timer[i] = INVALID_TIMER; } } @@ -297,7 +258,7 @@ int pc_delspiritball(struct map_session_data *sd,int count,int type) } return 0; } -static int pc_check_banding( struct block_list *bl, va_list ap ) { +int pc_check_banding( struct block_list *bl, va_list ap ) { int *c, *b_sd; struct block_list *src; struct map_session_data *tsd; @@ -337,7 +298,7 @@ int pc_banding(struct map_session_data *sd, uint16 skill_lv) { c = 0; memset(b_sd, 0, sizeof(b_sd)); - i = party->foreachsamemap(pc_check_banding,sd,range,&sd->bl,&c,&b_sd); + i = party->foreachsamemap(pc->check_banding,sd,range,&sd->bl,&c,&b_sd); if( c < 1 ) { //just recalc status no need to recalc hp @@ -415,19 +376,19 @@ unsigned char pc_famerank(int char_id, int job) switch(job){ case MAPID_BLACKSMITH: // Blacksmith for(i = 0; i < MAX_FAME_LIST; i++){ - if(smith_fame_list[i].id == char_id) + if(pc->smith_fame_list[i].id == char_id) return i + 1; } break; case MAPID_ALCHEMIST: // Alchemist for(i = 0; i < MAX_FAME_LIST; i++){ - if(chemist_fame_list[i].id == char_id) + if(pc->chemist_fame_list[i].id == char_id) return i + 1; } break; case MAPID_TAEKWON: // Taekwon for(i = 0; i < MAX_FAME_LIST; i++){ - if(taekwon_fame_list[i].id == char_id) + if(pc->taekwon_fame_list[i].id == char_id) return i + 1; } break; @@ -458,7 +419,7 @@ int pc_setrestartvalue(struct map_session_data *sd,int type) { /*========================================== Rental System *------------------------------------------*/ -static int pc_inventory_rental_end(int tid, unsigned int tick, int id, intptr_t data) { +int pc_inventory_rental_end(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd = map->id2sd(id); if( sd == NULL ) return 0; @@ -476,7 +437,7 @@ int pc_inventory_rental_clear(struct map_session_data *sd) { if( sd->rental_timer != INVALID_TIMER ) { - timer->delete(sd->rental_timer, pc_inventory_rental_end); + timer->delete(sd->rental_timer, pc->inventory_rental_end); sd->rental_timer = INVALID_TIMER; } @@ -511,7 +472,7 @@ void pc_inventory_rentals(struct map_session_data *sd) } if( c > 0 ) // min(next_tick,3600000) 1 hour each timer to keep announcing to the owner, and to avoid a but with rental time > 15 days - sd->rental_timer = timer->add(timer->gettick() + min(next_tick,3600000), pc_inventory_rental_end, sd->bl.id, 0); + sd->rental_timer = timer->add(timer->gettick() + min(next_tick,3600000), pc->inventory_rental_end, sd->bl.id, 0); else sd->rental_timer = INVALID_TIMER; } @@ -530,11 +491,11 @@ void pc_inventory_rental_add(struct map_session_data *sd, int seconds) if( DIFF_TICK(td->tick, timer->gettick()) > tick ) { // Update Timer as this one ends first than the current one pc->inventory_rental_clear(sd); - sd->rental_timer = timer->add(timer->gettick() + tick, pc_inventory_rental_end, sd->bl.id, 0); + sd->rental_timer = timer->add(timer->gettick() + tick, pc->inventory_rental_end, sd->bl.id, 0); } } else - sd->rental_timer = timer->add(timer->gettick() + min(tick,3600000), pc_inventory_rental_end, sd->bl.id, 0); + sd->rental_timer = timer->add(timer->gettick() + min(tick,3600000), pc->inventory_rental_end, sd->bl.id, 0); } /** @@ -683,26 +644,26 @@ int pc_calcweapontype(struct map_session_data *sd) // dual-wield sd->status.weapon = 0; switch (sd->weapontype1){ - case W_DAGGER: - switch (sd->weapontype2) { - case W_DAGGER: sd->status.weapon = W_DOUBLE_DD; break; - case W_1HSWORD: sd->status.weapon = W_DOUBLE_DS; break; - case W_1HAXE: sd->status.weapon = W_DOUBLE_DA; break; - } - break; - case W_1HSWORD: - switch (sd->weapontype2) { - case W_DAGGER: sd->status.weapon = W_DOUBLE_DS; break; - case W_1HSWORD: sd->status.weapon = W_DOUBLE_SS; break; - case W_1HAXE: sd->status.weapon = W_DOUBLE_SA; break; - } - break; - case W_1HAXE: - switch (sd->weapontype2) { - case W_DAGGER: sd->status.weapon = W_DOUBLE_DA; break; - case W_1HSWORD: sd->status.weapon = W_DOUBLE_SA; break; - case W_1HAXE: sd->status.weapon = W_DOUBLE_AA; break; - } + case W_DAGGER: + switch (sd->weapontype2) { + case W_DAGGER: sd->status.weapon = W_DOUBLE_DD; break; + case W_1HSWORD: sd->status.weapon = W_DOUBLE_DS; break; + case W_1HAXE: sd->status.weapon = W_DOUBLE_DA; break; + } + break; + case W_1HSWORD: + switch (sd->weapontype2) { + case W_DAGGER: sd->status.weapon = W_DOUBLE_DS; break; + case W_1HSWORD: sd->status.weapon = W_DOUBLE_SS; break; + case W_1HAXE: sd->status.weapon = W_DOUBLE_SA; break; + } + break; + case W_1HAXE: + switch (sd->weapontype2) { + case W_DAGGER: sd->status.weapon = W_DOUBLE_DA; break; + case W_1HSWORD: sd->status.weapon = W_DOUBLE_SA; break; + case W_1HAXE: sd->status.weapon = W_DOUBLE_AA; break; + } } // unknown, default to right hand type if (!sd->status.weapon) @@ -725,7 +686,7 @@ int pc_setequipindex(struct map_session_data *sd) continue; if(sd->status.inventory[i].equip) { for(j=0;j<EQI_MAX;j++) - if(sd->status.inventory[i].equip & equip_pos[j]) + if(sd->status.inventory[i].equip & pc->equip_pos[j]) sd->equip_index[j] = i; if(sd->status.inventory[i].equip & EQP_HAND_R) @@ -745,7 +706,7 @@ int pc_setequipindex(struct map_session_data *sd) } } } - pc_calcweapontype(sd); + pc->calcweapontype(sd); return 0; } @@ -1205,7 +1166,7 @@ int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl) return 0; //Wrong size } sd->hate_mob[pos] = class_; - pc_setglobalreg(sd,sg_info[pos].hate_var,class_+1); + pc_setglobalreg(sd,pc->sg_info[pos].hate_var,class_+1); clif->hate_info(sd, pos, class_, 1); return 1; } @@ -1236,14 +1197,14 @@ int pc_reg_received(struct map_session_data *sd) //SG map and mob read [Komurka] for(i=0;i<MAX_PC_FEELHATE;i++) { //for now - someone need to make reading from txt/sql - if ((j = pc_readglobalreg(sd,sg_info[i].feel_var))!=0) { + if ((j = pc_readglobalreg(sd,pc->sg_info[i].feel_var))!=0) { sd->feel_map[i].index = j; sd->feel_map[i].m = map->mapindex2mapid(j); } else { sd->feel_map[i].index = 0; sd->feel_map[i].m = -1; } - sd->hate_mob[i] = pc_readglobalreg(sd,sg_info[i].hate_var)-1; + sd->hate_mob[i] = pc_readglobalreg(sd,pc->sg_info[i].hate_var)-1; } if ((i = pc->checkskill(sd,RG_PLAGIARISM)) > 0) { @@ -1447,8 +1408,8 @@ int pc_calc_skilltree(struct map_session_data *sd) do { flag = 0; - for( i = 0; i < MAX_SKILL_TREE && (id = skill_tree[c][i].id) > 0; i++ ) { - int f, idx = skill_tree[c][i].idx; + for( i = 0; i < MAX_SKILL_TREE && (id = pc->skill_tree[c][i].id) > 0; i++ ) { + int f, idx = pc->skill_tree[c][i].idx; if( sd->status.skill[idx].id ) continue; //Skill already known. @@ -1457,21 +1418,21 @@ int pc_calc_skilltree(struct map_session_data *sd) int j; for(j = 0; j < MAX_PC_SKILL_REQUIRE; j++) { int k; - if((k=skill_tree[c][i].need[j].id)) { - int idx2 = skill_tree[c][i].need[j].idx; + if((k=pc->skill_tree[c][i].need[j].id)) { + int idx2 = pc->skill_tree[c][i].need[j].idx; if (sd->status.skill[idx2].id == 0 || sd->status.skill[idx2].flag == SKILL_FLAG_TEMPORARY || sd->status.skill[idx2].flag == SKILL_FLAG_PLAGIARIZED) k = 0; //Not learned. else if (sd->status.skill[idx2].flag >= SKILL_FLAG_REPLACED_LV_0) //Real lerned level k = sd->status.skill[idx2].flag - SKILL_FLAG_REPLACED_LV_0; else k = pc->checkskill2(sd,idx2); - if (k < skill_tree[c][i].need[j].lv) { + if (k < pc->skill_tree[c][i].need[j].lv) { f = 0; break; } } } - if( sd->status.job_level < skill_tree[c][i].joblv ) + if( sd->status.job_level < pc->skill_tree[c][i].joblv ) f = 0; // job level requirement wasn't satisfied } if( f ) { @@ -1505,8 +1466,8 @@ int pc_calc_skilltree(struct map_session_data *sd) - (c > 0) to avoid grant Novice Skill Tree in case of Skill Reset (need more logic) - (sd->status.skill_point == 0) to wait until all skill points are asigned to avoid problems with Job Change quest. */ - for( i = 0; i < MAX_SKILL_TREE && (id = skill_tree[c][i].id) > 0; i++ ) { - int idx = skill_tree[c][i].idx; + for( i = 0; i < MAX_SKILL_TREE && (id = pc->skill_tree[c][i].id) > 0; i++ ) { + int idx = pc->skill_tree[c][i].idx; if( (skill->db[idx].inf2&(INF2_QUEST_SKILL|INF2_WEDDING_SKILL)) ) continue; //Do not include Quest/Wedding skills. @@ -1525,7 +1486,7 @@ int pc_calc_skilltree(struct map_session_data *sd) } //Checks if you can learn a new skill after having leveled up a skill. -static void pc_check_skilltree(struct map_session_data *sd, int skill_id) +void pc_check_skilltree(struct map_session_data *sd, int skill_id) { int i,id=0,flag; int c=0; @@ -1542,22 +1503,22 @@ static void pc_check_skilltree(struct map_session_data *sd, int skill_id) c = pc->class2idx(c); do { flag = 0; - for( i = 0; i < MAX_SKILL_TREE && (id=skill_tree[c][i].id)>0; i++ ) { - int j, f = 1, k, idx = skill_tree[c][i].idx; + for( i = 0; i < MAX_SKILL_TREE && (id=pc->skill_tree[c][i].id)>0; i++ ) { + int j, f = 1, k, idx = pc->skill_tree[c][i].idx; if( sd->status.skill[idx].id ) //Already learned continue; for( j = 0; j < MAX_PC_SKILL_REQUIRE; j++ ) { - if( (k = skill_tree[c][i].need[j].id) ) { - int idx2 = skill_tree[c][i].need[j].idx; + if( (k = pc->skill_tree[c][i].need[j].id) ) { + int idx2 = pc->skill_tree[c][i].need[j].idx; if( sd->status.skill[idx2].id == 0 || sd->status.skill[idx2].flag == SKILL_FLAG_TEMPORARY || sd->status.skill[idx2].flag == SKILL_FLAG_PLAGIARIZED ) k = 0; //Not learned. else if( sd->status.skill[idx2].flag >= SKILL_FLAG_REPLACED_LV_0) //Real lerned level k = sd->status.skill[idx2].flag - SKILL_FLAG_REPLACED_LV_0; else k = pc->checkskill2(sd,idx2); - if( k < skill_tree[c][i].need[j].lv ) { + if( k < pc->skill_tree[c][i].need[j].lv ) { f = 0; break; } @@ -1565,7 +1526,7 @@ static void pc_check_skilltree(struct map_session_data *sd, int skill_id) } if( !f ) continue; - if( sd->status.job_level < skill_tree[c][i].joblv ) + if( sd->status.job_level < pc->skill_tree[c][i].joblv ) continue; j = skill->db[idx].inf2; @@ -1612,7 +1573,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd) skill_point = pc->calc_skillpoint(sd); - novice_skills = max_level[pc->class2idx(JOB_NOVICE)][1] - 1; + novice_skills = pc->max_level[pc->class2idx(JOB_NOVICE)][1] - 1; sd->sktree.second = sd->sktree.third = 0; @@ -1630,7 +1591,7 @@ int pc_calc_skilltree_normalize_job(struct map_session_data *sd) { // if neither 2nd nor 3rd jobchange levels are known, we have to assume a default for 2nd if (!sd->change_level_3rd) - sd->change_level_2nd = max_level[pc->class2idx(pc->mapid2jobid(sd->class_&MAPID_UPPERMASK, sd->status.sex))][1]; + sd->change_level_2nd = pc->max_level[pc->class2idx(pc->mapid2jobid(sd->class_&MAPID_UPPERMASK, sd->status.sex))][1]; else sd->change_level_2nd = 1 + skill_point + sd->status.skill_point - (sd->status.job_level - 1) @@ -1759,7 +1720,7 @@ int pc_disguise(struct map_session_data *sd, int class_) { return 1; } -static int pc_bonus_autospell(struct s_autospell *spell, int max, short id, short lv, short rate, short flag, short card_id) +int pc_bonus_autospell(struct s_autospell *spell, int max, short id, short lv, short rate, short flag, short card_id) { int i; @@ -1795,7 +1756,7 @@ static int pc_bonus_autospell(struct s_autospell *spell, int max, short id, shor return 1; } -static int pc_bonus_autospell_onskill(struct s_autospell *spell, int max, short src_skill, short id, short lv, short rate, short card_id) +int pc_bonus_autospell_onskill(struct s_autospell *spell, int max, short src_skill, short id, short lv, short rate, short card_id) { int i; @@ -1821,7 +1782,7 @@ static int pc_bonus_autospell_onskill(struct s_autospell *spell, int max, short return 1; } -static int pc_bonus_addeff(struct s_addeffect* effect, int max, enum sc_type id, short rate, short arrow_rate, unsigned char flag) +int pc_bonus_addeff(struct s_addeffect* effect, int max, enum sc_type id, short rate, short arrow_rate, unsigned char flag) { int i; if (!(flag&(ATF_SHORT|ATF_LONG))) @@ -1850,7 +1811,7 @@ static int pc_bonus_addeff(struct s_addeffect* effect, int max, enum sc_type id, return 1; } -static int pc_bonus_addeff_onskill(struct s_addeffectonskill* effect, int max, enum sc_type id, short rate, short skill_id, unsigned char target) { +int pc_bonus_addeff_onskill(struct s_addeffectonskill* effect, int max, enum sc_type id, short rate, short skill_id, unsigned char target) { int i; for( i = 0; i < max && effect[i].skill; i++ ) { if( effect[i].id == id && effect[i].skill == skill_id && effect[i].target == target ) { @@ -1869,7 +1830,7 @@ static int pc_bonus_addeff_onskill(struct s_addeffectonskill* effect, int max, e return 1; } -static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id, short group, int race, int rate) { +int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id, short group, int race, int rate) { int i; //Apply config rate adjustment settings. @@ -2695,7 +2656,7 @@ int pc_bonus(struct map_session_data *sd,int type,int val) { #endif case SP_ADD_MONSTER_DROP_CHAINITEM: if (sd->state.lr_flag != 2) - pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, val, (1<<RC_BOSS)|(1<<RC_NONBOSS), 10000); + pc->bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, val, (1<<RC_BOSS)|(1<<RC_NONBOSS), 10000); break; default: ShowWarning("pc_bonus: unknown type %d %d !\n",type,val); @@ -2759,7 +2720,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) ShowWarning("pc_bonus2 (Add Effect): %d is not supported.\n", type2); break; } - pc_bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), (sc_type)type2, + pc->bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), (sc_type)type2, sd->state.lr_flag!=2?val:0, sd->state.lr_flag==2?val:0, 0); break; case SP_ADDEFF2: @@ -2767,7 +2728,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) ShowWarning("pc_bonus2 (Add Effect2): %d is not supported.\n", type2); break; } - pc_bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), (sc_type)type2, + pc->bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), (sc_type)type2, sd->state.lr_flag!=2?val:0, sd->state.lr_flag==2?val:0, ATF_SELF); break; case SP_RESEFF: @@ -2978,7 +2939,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) break; } if(sd->state.lr_flag != 2) - pc_bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), (sc_type)type2, val, 0, 0); + pc->bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), (sc_type)type2, val, 0, 0); break; case SP_SKILL_ATK: if(sd->state.lr_flag == 2) @@ -3148,7 +3109,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) break; case SP_ADD_MONSTER_DROP_ITEM: if (sd->state.lr_flag != 2) - pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, (1<<RC_BOSS)|(1<<RC_NONBOSS), val); + pc->bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, (1<<RC_BOSS)|(1<<RC_NONBOSS), val); break; case SP_SP_LOSS_RATE: if(sd->state.lr_flag != 2) { @@ -3292,7 +3253,7 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) break; case SP_ADD_MONSTER_DROP_CHAINITEM: if (sd->state.lr_flag != 2) - pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, val, 1<<type2, 10000); + pc->bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), 0, val, 1<<type2, 10000); break; default: ShowWarning("pc_bonus2: unknown type %d %d %d!\n",type,type2,val); @@ -3308,18 +3269,18 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) switch(type){ case SP_ADD_MONSTER_DROP_ITEM: if(sd->state.lr_flag != 2) - pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, 1<<type3, val); + pc->bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, 1<<type3, val); break; case SP_ADD_CLASS_DROP_ITEM: if(sd->state.lr_flag != 2) - pc_bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, -type3, val); + pc->bonus_item_drop(sd->add_drop, ARRAYLENGTH(sd->add_drop), type2, 0, -type3, val); break; case SP_AUTOSPELL: if(sd->state.lr_flag != 2) { int target = skill->get_inf(type2); //Support or Self (non-auto-target) skills should pick self. target = target&INF_SUPPORT_SKILL || (target&INF_SELF_SKILL && !(skill->get_inf2(type2)&INF2_NO_TARGET_SELF)); - pc_bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), + pc->bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), target?-type2:type2, type3, val, 0, status->current_equip_card_id); } break; @@ -3328,7 +3289,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) { int target = skill->get_inf(type2); //Support or Self (non-auto-target) skills should pick self. target = target&INF_SUPPORT_SKILL || (target&INF_SELF_SKILL && !(skill->get_inf2(type2)&INF2_NO_TARGET_SELF)); - pc_bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), + pc->bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), target?-type2:type2, type3, val, BF_NORMAL|BF_SKILL, status->current_equip_card_id); } break; @@ -3376,7 +3337,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) ShowWarning("pc_bonus3 (Add Effect): %d is not supported.\n", type2); break; } - pc_bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), (sc_type)type2, + pc->bonus_addeff(sd->addeff, ARRAYLENGTH(sd->addeff), (sc_type)type2, sd->state.lr_flag!=2?type3:0, sd->state.lr_flag==2?type3:0, val); break; @@ -3386,7 +3347,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) break; } if(sd->state.lr_flag != 2) - pc_bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), (sc_type)type2, type3, 0, val); + pc->bonus_addeff(sd->addeff2, ARRAYLENGTH(sd->addeff2), (sc_type)type2, type3, 0, val); break; case SP_ADDEFF_ONSKILL: @@ -3395,7 +3356,7 @@ int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) break; } if( sd->state.lr_flag != 2 ) - pc_bonus_addeff_onskill(sd->addeff3, ARRAYLENGTH(sd->addeff3), (sc_type)type3, val, type2, ATF_TARGET); + pc->bonus_addeff_onskill(sd->addeff3, ARRAYLENGTH(sd->addeff3), (sc_type)type3, val, type2, ATF_TARGET); break; case SP_ADDELE: @@ -3430,12 +3391,12 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4 switch(type) { case SP_AUTOSPELL: if(sd->state.lr_flag != 2) - pc_bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), (val&1?type2:-type2), (val&2?-type3:type3), type4, 0, status->current_equip_card_id); + pc->bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), (val&1?type2:-type2), (val&2?-type3:type3), type4, 0, status->current_equip_card_id); break; case SP_AUTOSPELL_WHENHIT: if(sd->state.lr_flag != 2) - pc_bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), (val&1?type2:-type2), (val&2?-type3:type3), type4, BF_NORMAL|BF_SKILL, status->current_equip_card_id); + pc->bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), (val&1?type2:-type2), (val&2?-type3:type3), type4, BF_NORMAL|BF_SKILL, status->current_equip_card_id); break; case SP_AUTOSPELL_ONSKILL: @@ -3443,7 +3404,7 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4 int target = skill->get_inf(type2); //Support or Self (non-auto-target) skills should pick self. target = target&INF_SUPPORT_SKILL || (target&INF_SELF_SKILL && !(skill->get_inf2(type2)&INF2_NO_TARGET_SELF)); - pc_bonus_autospell_onskill(sd->autospell3, ARRAYLENGTH(sd->autospell3), type2, target?-type3:type3, type4, val, status->current_equip_card_id); + pc->bonus_autospell_onskill(sd->autospell3, ARRAYLENGTH(sd->autospell3), type2, target?-type3:type3, type4, val, status->current_equip_card_id); } break; @@ -3453,7 +3414,7 @@ int pc_bonus4(struct map_session_data *sd,int type,int type2,int type3,int type4 break; } if( sd->state.lr_flag != 2 ) - pc_bonus_addeff_onskill(sd->addeff3, ARRAYLENGTH(sd->addeff3), (sc_type)type3, type4, type2, val); + pc->bonus_addeff_onskill(sd->addeff3, ARRAYLENGTH(sd->addeff3), (sc_type)type3, type4, type2, val); break; default: @@ -3470,17 +3431,17 @@ int pc_bonus5(struct map_session_data *sd,int type,int type2,int type3,int type4 switch(type){ case SP_AUTOSPELL: if(sd->state.lr_flag != 2) - pc_bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, status->current_equip_card_id); + pc->bonus_autospell(sd->autospell, ARRAYLENGTH(sd->autospell), (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, status->current_equip_card_id); break; case SP_AUTOSPELL_WHENHIT: if(sd->state.lr_flag != 2) - pc_bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, status->current_equip_card_id); + pc->bonus_autospell(sd->autospell2, ARRAYLENGTH(sd->autospell2), (val&1?type2:-type2), (val&2?-type3:type3), type4, type5, status->current_equip_card_id); break; case SP_AUTOSPELL_ONSKILL: if(sd->state.lr_flag != 2) - pc_bonus_autospell_onskill(sd->autospell3, ARRAYLENGTH(sd->autospell3), type2, (val&1?-type3:type3), (val&2?-type4:type4), type5, status->current_equip_card_id); + pc->bonus_autospell_onskill(sd->autospell3, ARRAYLENGTH(sd->autospell3), type2, (val&1?-type3:type3), (val&2?-type4:type4), type5, status->current_equip_card_id); break; default: @@ -4332,7 +4293,7 @@ int pc_useitem(struct map_session_data *sd,int n) { if( sd->status.inventory[n].nameid <= 0 || sd->status.inventory[n].amount <= 0 ) return 0; - if( !pc_isUseitem(sd,n) ) + if( !pc->isUseitem(sd,n) ) return 0; // Store information for later use before it is lost (via pc->delitem) [Paradox924X] @@ -4714,7 +4675,7 @@ int pc_steal_item(struct map_session_data *sd,struct block_list *bl, uint16 skil } if(battle_config.show_steal_in_same_party) - party->foreachsamemap(pc_show_steal,sd,AREA_SIZE,sd,tmp_item.nameid); + party->foreachsamemap(pc->show_steal,sd,AREA_SIZE,sd,tmp_item.nameid); //Logs items, Stolen from mobs [Lupus] logs->pick_mob(md, LOG_TYPE_STEAL, -1, &tmp_item, data); @@ -5166,7 +5127,7 @@ int pc_checkequip(struct map_session_data *sd,int pos) nullpo_retr(-1, sd); for(i=0;i<EQI_MAX;i++){ - if(pos & equip_pos[i]) + if(pos & pc->equip_pos[i]) return sd->equip_index[i]; } @@ -5707,7 +5668,7 @@ int pc_follow_timer(int tid, unsigned int tick, int id, intptr_t data) { } sd->followtimer = timer->add( tick + 1000, // increase time a bit to loosen up map's load - pc_follow_timer, sd->bl.id, 0); + pc->follow_timer, sd->bl.id, 0); return 0; } @@ -5716,7 +5677,7 @@ int pc_stop_following (struct map_session_data *sd) nullpo_ret(sd); if (sd->followtimer != INVALID_TIMER) { - timer->delete(sd->followtimer,pc_follow_timer); + timer->delete(sd->followtimer,pc->follow_timer); sd->followtimer = INVALID_TIMER; } sd->followtarget = -1; @@ -5735,7 +5696,7 @@ int pc_follow(struct map_session_data *sd,int target_id) { pc->stop_following(sd); sd->followtarget = target_id; - pc_follow_timer(INVALID_TIMER, timer->gettick(), sd->bl.id, 0); + pc->follow_timer(INVALID_TIMER, timer->gettick(), sd->bl.id, 0); return 0; } @@ -5837,7 +5798,7 @@ int pc_checkjoblevelup(struct map_session_data *sd) /*========================================== * Alters experienced based on self bonuses that do not get even shared to the party. *------------------------------------------*/ -static void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src) { +void pc_calcexp(struct map_session_data *sd, unsigned int *base_exp, unsigned int *job_exp, struct block_list *src) { int bonus = 0; struct status_data *st = status->get_status_data(src); @@ -5878,7 +5839,7 @@ int pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int if(sd->status.guild_id>0) base_exp-=guild->payexp(sd,base_exp); - if(src) pc_calcexp(sd, &base_exp, &job_exp, src); + if(src) pc->calcexp(sd, &base_exp, &job_exp, src); nextb = pc->nextbaseexp(sd); nextj = pc->nextjobexp(sd); @@ -5948,12 +5909,12 @@ int pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned int *------------------------------------------*/ unsigned int pc_maxbaselv(struct map_session_data *sd) { - return max_level[pc->class2idx(sd->status.class_)][0]; + return pc->max_level[pc->class2idx(sd->status.class_)][0]; } unsigned int pc_maxjoblv(struct map_session_data *sd) { - return max_level[pc->class2idx(sd->status.class_)][1]; + return pc->max_level[pc->class2idx(sd->status.class_)][1]; } /*========================================== @@ -5968,7 +5929,7 @@ unsigned int pc_nextbaseexp(struct map_session_data *sd) if(sd->status.base_level>=pc->maxbaselv(sd) || sd->status.base_level<=0) return 0; - return exp_table[pc->class2idx(sd->status.class_)][0][sd->status.base_level-1]; + return pc->exp_table[pc->class2idx(sd->status.class_)][0][sd->status.base_level-1]; } //Base exp needed for this level. @@ -5977,7 +5938,7 @@ unsigned int pc_thisbaseexp(struct map_session_data *sd) if(sd->status.base_level>pc->maxbaselv(sd) || sd->status.base_level<=1) return 0; - return exp_table[pc->class2idx(sd->status.class_)][0][sd->status.base_level-2]; + return pc->exp_table[pc->class2idx(sd->status.class_)][0][sd->status.base_level-2]; } @@ -5995,7 +5956,7 @@ unsigned int pc_nextjobexp(struct map_session_data *sd) if(sd->status.job_level>=pc->maxjoblv(sd) || sd->status.job_level<=0) return 0; - return exp_table[pc->class2idx(sd->status.class_)][1][sd->status.job_level-1]; + return pc->exp_table[pc->class2idx(sd->status.class_)][1][sd->status.job_level-1]; } //Job exp needed for this level. @@ -6003,41 +5964,41 @@ unsigned int pc_thisjobexp(struct map_session_data *sd) { if(sd->status.job_level>pc->maxjoblv(sd) || sd->status.job_level<=1) return 0; - return exp_table[pc->class2idx(sd->status.class_)][1][sd->status.job_level-2]; + return pc->exp_table[pc->class2idx(sd->status.class_)][1][sd->status.job_level-2]; } /// Returns the value of the specified stat. -static int pc_getstat(struct map_session_data* sd, int type) +int pc_getstat(struct map_session_data* sd, int type) { nullpo_retr(-1, sd); switch( type ) { - case SP_STR: return sd->status.str; - case SP_AGI: return sd->status.agi; - case SP_VIT: return sd->status.vit; - case SP_INT: return sd->status.int_; - case SP_DEX: return sd->status.dex; - case SP_LUK: return sd->status.luk; - default: - return -1; + case SP_STR: return sd->status.str; + case SP_AGI: return sd->status.agi; + case SP_VIT: return sd->status.vit; + case SP_INT: return sd->status.int_; + case SP_DEX: return sd->status.dex; + case SP_LUK: return sd->status.luk; + default: + return -1; } } /// Sets the specified stat to the specified value. /// Returns the new value. -static int pc_setstat(struct map_session_data* sd, int type, int val) +int pc_setstat(struct map_session_data* sd, int type, int val) { nullpo_retr(-1, sd); switch( type ) { - case SP_STR: sd->status.str = val; break; - case SP_AGI: sd->status.agi = val; break; - case SP_VIT: sd->status.vit = val; break; - case SP_INT: sd->status.int_ = val; break; - case SP_DEX: sd->status.dex = val; break; - case SP_LUK: sd->status.luk = val; break; - default: - return -1; + case SP_STR: sd->status.str = val; break; + case SP_AGI: sd->status.agi = val; break; + case SP_VIT: sd->status.vit = val; break; + case SP_INT: sd->status.int_ = val; break; + case SP_DEX: sd->status.dex = val; break; + case SP_LUK: sd->status.luk = val; break; + default: + return -1; } return val; @@ -6047,7 +6008,7 @@ static int pc_setstat(struct map_session_data* sd, int type, int val) int pc_gets_status_point(int level) { if (battle_config.use_statpoint_table) //Use values from "db/statpoint.txt" - return (statp[level+1] - statp[level]); + return (pc->statp[level+1] - pc->statp[level]); else //Default increase return ((level+15) / 5); } @@ -6062,7 +6023,7 @@ int pc_need_status_point(struct map_session_data* sd, int type, int val) if ( val == 0 ) return 0; - low = pc_getstat(sd,type); + low = pc->getstat(sd,type); if ( low >= pc_maxparameter(sd) && val > 0 ) return 0; // Official servers show '0' when max is reached @@ -6103,14 +6064,14 @@ int pc_statusup(struct map_session_data* sd, int type) // check limits max = pc_maxparameter(sd); - if( pc_getstat(sd,type) >= max ) + if( pc->getstat(sd,type) >= max ) { clif->statusupack(sd,type,0,0); return 1; } // set new values - val = pc_setstat(sd, type, pc_getstat(sd,type) + 1); + val = pc->setstat(sd, type, pc->getstat(sd,type) + 1); sd->status.status_point -= need; status_calc_pc(sd,0); @@ -6151,7 +6112,7 @@ int pc_statusup2(struct map_session_data* sd, int type, int val) // set new value max = pc_maxparameter(sd); - val = pc_setstat(sd, type, cap_value(pc_getstat(sd,type) + val, 1, max)); + val = pc->setstat(sd, type, cap_value(pc->getstat(sd,type) + val, 1, max)); status_calc_pc(sd,0); @@ -6200,7 +6161,7 @@ int pc_skillup(struct map_session_data *sd,uint16 skill_id) { else if( sd->status.skill_point == 0 && (sd->class_&MAPID_UPPERMASK) == MAPID_TAEKWON && sd->status.base_level >= 90 && pc->famerank(sd->status.char_id, MAPID_TAEKWON) ) pc->calc_skilltree(sd); // Required to grant all TK Ranger skills. else - pc_check_skilltree(sd, skill_id); // Check if a new skill can Lvlup + pc->check_skilltree(sd, skill_id); // Check if a new skill can Lvlup clif->skillup(sd,skill_id); clif->updatestatus(sd,SP_SKILLPOINT); @@ -6255,8 +6216,8 @@ int pc_allskillup(struct map_session_data *sd) } } else { int inf2; - for(i=0;i < MAX_SKILL_TREE && (id=skill_tree[pc->class2idx(sd->status.class_)][i].id)>0;i++){ - int idx = skill_tree[pc->class2idx(sd->status.class_)][i].idx; + for(i=0;i < MAX_SKILL_TREE && (id=pc->skill_tree[pc->class2idx(sd->status.class_)][i].id)>0;i++){ + int idx = pc->skill_tree[pc->class2idx(sd->status.class_)][i].idx; inf2 = skill->db[idx].inf2; if ( (inf2&INF2_QUEST_SKILL && !battle_config.quest_skill_learn) || @@ -6374,33 +6335,33 @@ int pc_resetstate(struct map_session_data* sd) if (battle_config.use_statpoint_table) { // New statpoint table used here - Dexity if (sd->status.base_level > MAX_LEVEL) - { //statp[] goes out of bounds, can't reset! + { //pc->statp[] goes out of bounds, can't reset! ShowError("pc_resetstate: Can't reset stats of %d:%d, the base level (%d) is greater than the max level supported (%d)\n", sd->status.account_id, sd->status.char_id, sd->status.base_level, MAX_LEVEL); return 0; } - sd->status.status_point = statp[sd->status.base_level] + ( sd->class_&JOBL_UPPER ? 52 : 0 ); // extra 52+48=100 stat points + sd->status.status_point = pc->statp[sd->status.base_level] + ( sd->class_&JOBL_UPPER ? 52 : 0 ); // extra 52+48=100 stat points } else { int add=0; - add += pc->need_status_point(sd, SP_STR, 1-pc_getstat(sd, SP_STR)); - add += pc->need_status_point(sd, SP_AGI, 1-pc_getstat(sd, SP_AGI)); - add += pc->need_status_point(sd, SP_VIT, 1-pc_getstat(sd, SP_VIT)); - add += pc->need_status_point(sd, SP_INT, 1-pc_getstat(sd, SP_INT)); - add += pc->need_status_point(sd, SP_DEX, 1-pc_getstat(sd, SP_DEX)); - add += pc->need_status_point(sd, SP_LUK, 1-pc_getstat(sd, SP_LUK)); + add += pc->need_status_point(sd, SP_STR, 1-pc->getstat(sd, SP_STR)); + add += pc->need_status_point(sd, SP_AGI, 1-pc->getstat(sd, SP_AGI)); + add += pc->need_status_point(sd, SP_VIT, 1-pc->getstat(sd, SP_VIT)); + add += pc->need_status_point(sd, SP_INT, 1-pc->getstat(sd, SP_INT)); + add += pc->need_status_point(sd, SP_DEX, 1-pc->getstat(sd, SP_DEX)); + add += pc->need_status_point(sd, SP_LUK, 1-pc->getstat(sd, SP_LUK)); sd->status.status_point+=add; } - pc_setstat(sd, SP_STR, 1); - pc_setstat(sd, SP_AGI, 1); - pc_setstat(sd, SP_VIT, 1); - pc_setstat(sd, SP_INT, 1); - pc_setstat(sd, SP_DEX, 1); - pc_setstat(sd, SP_LUK, 1); + pc->setstat(sd, SP_STR, 1); + pc->setstat(sd, SP_AGI, 1); + pc->setstat(sd, SP_VIT, 1); + pc->setstat(sd, SP_INT, 1); + pc->setstat(sd, SP_DEX, 1); + pc->setstat(sd, SP_LUK, 1); clif->updatestatus(sd,SP_STR); clif->updatestatus(sd,SP_AGI); @@ -6553,7 +6514,7 @@ int pc_resetfeel(struct map_session_data* sd) { sd->feel_map[i].m = -1; sd->feel_map[i].index = 0; - pc_setglobalreg(sd,sg_info[i].feel_var,0); + pc_setglobalreg(sd,pc->sg_info[i].feel_var,0); } return 0; @@ -6567,7 +6528,7 @@ int pc_resethate(struct map_session_data* sd) for (i=0; i<3; i++) { sd->hate_mob[i] = -1; - pc_setglobalreg(sd,sg_info[i].hate_var,0); + pc_setglobalreg(sd,pc->sg_info[i].hate_var,0); } return 0; } @@ -6631,7 +6592,7 @@ void pc_respawn(struct map_session_data* sd, clr_type clrtype) clif->resurrection(&sd->bl, 1); //If warping fails, send a normal stand up packet. } -static int pc_respawn_timer(int tid, unsigned int tick, int id, intptr_t data) { +int pc_respawn_timer(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd = map->id2sd(id); if( sd != NULL ) { @@ -6874,7 +6835,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { pc->setinvincibletimer(sd, battle_config.pc_invincible_time); sc_start(&sd->bl,status->skill2sc(MO_STEELBODY),100,1,skill->get_time(MO_STEELBODY,1)); if(map_flag_gvg2(sd->bl.m)) - pc_respawn_timer(INVALID_TIMER, timer->gettick(), sd->bl.id, 0); + pc->respawn_timer(INVALID_TIMER, timer->gettick(), sd->bl.id, 0); return 0; } } @@ -6990,18 +6951,18 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) { } if( sd->pvp_point < 0 ) { - timer->add(tick+1, pc_respawn_timer,sd->bl.id,0); + timer->add(tick+1, pc->respawn_timer,sd->bl.id,0); return 1|8; } } //GvG if( map_flag_gvg2(sd->bl.m) ) { - timer->add(tick+1, pc_respawn_timer, sd->bl.id, 0); + timer->add(tick+1, pc->respawn_timer, sd->bl.id, 0); return 1|8; } else if( sd->bg_id ) { struct battleground_data *bgd = bg->team_search(sd->bg_id); if( bgd && bgd->mapindex > 0 ) { // Respawn by BG - timer->add(tick+1000, pc_respawn_timer, sd->bl.id, 0); + timer->add(tick+1000, pc->respawn_timer, sd->bl.id, 0); return 1|8; } } @@ -7454,7 +7415,7 @@ int pc_percentheal(struct map_session_data *sd,int hp,int sp) return 0; } -static int jobchange_killclone(struct block_list *bl, va_list ap) +int jobchange_killclone(struct block_list *bl, va_list ap) { struct mob_data *md; int flag; @@ -7542,7 +7503,7 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper) if ( (b_class&MAPID_UPPERMASK) != (sd->class_&MAPID_UPPERMASK) ) { //Things to remove when changing class tree. const int class_ = pc->class2idx(sd->status.class_); short id; - for(i = 0; i < MAX_SKILL_TREE && (id = skill_tree[class_][i].id) > 0; i++) { + for(i = 0; i < MAX_SKILL_TREE && (id = pc->skill_tree[class_][i].id) > 0; i++) { //Remove status specific to your current tree skills. enum sc_type sc = status->skill2sc(id); if (sc > SC_COMMON_MAX && sd->sc.data[sc]) @@ -7600,7 +7561,7 @@ int pc_jobchange(struct map_session_data *sd,int job, int upper) if (sd->state.vending) vending->close(sd); - map->foreachinmap(jobchange_killclone, sd->bl.m, BL_MOB, sd->bl.id); + map->foreachinmap(pc->jobchange_killclone, sd->bl.m, BL_MOB, sd->bl.id); //Remove peco/cart/falcon i = sd->sc.option; @@ -8281,7 +8242,7 @@ int pc_setregistry_str(struct map_session_data *sd,const char *reg,const char *v /*========================================== * Exec eventtimer for player sd (retrieved from map_session (id)) *------------------------------------------*/ -static int pc_eventtimer(int tid, unsigned int tick, int id, intptr_t data) { +int pc_eventtimer(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd=map->id2sd(id); char *p = (char *)data; int i; @@ -8314,7 +8275,7 @@ int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name) if( i == MAX_EVENTTIMER ) return 0; - sd->eventtimer[i] = timer->add(timer->gettick()+tick, pc_eventtimer, sd->bl.id, (intptr_t)aStrdup(name)); + sd->eventtimer[i] = timer->add(timer->gettick()+tick, pc->eventtimer, sd->bl.id, (intptr_t)aStrdup(name)); sd->eventcount++; return 1; @@ -8342,7 +8303,7 @@ int pc_deleventtimer(struct map_session_data *sd,const char *name) if( i == MAX_EVENTTIMER ) return 0; // not found - timer->delete(sd->eventtimer[i],pc_eventtimer); + timer->delete(sd->eventtimer[i],pc->eventtimer); sd->eventtimer[i] = INVALID_TIMER; sd->eventcount--; aFree(p); @@ -8384,7 +8345,7 @@ int pc_cleareventtimer(struct map_session_data *sd) for(i=0;i<MAX_EVENTTIMER;i++) if( sd->eventtimer[i] != INVALID_TIMER ){ char *p = (char *)(timer->get(sd->eventtimer[i])->data); - timer->delete(sd->eventtimer[i],pc_eventtimer); + timer->delete(sd->eventtimer[i],pc->eventtimer); sd->eventtimer[i] = INVALID_TIMER; sd->eventcount--; if (p) aFree(p); @@ -8506,7 +8467,7 @@ int pc_removecombo(struct map_session_data *sd, struct item_data *data ) { } /* check if combo requirements still fit */ - if( pc_checkcombo( sd, data ) ) + if( pc->checkcombo( sd, data ) ) continue; /* it's empty, we can clear all the memory */ @@ -8530,7 +8491,7 @@ int pc_load_combo(struct map_session_data *sd) { if( sd->equip_index[i] < 0 || !(id = sd->inventory_data[idx] ) ) continue; if( id->combos_count ) - ret += pc_checkcombo(sd,id); + ret += pc->checkcombo(sd,id); if(!itemdb_isspecial(sd->status.inventory[idx].card[0])) { struct item_data *data; int j; @@ -8539,7 +8500,7 @@ int pc_load_combo(struct map_session_data *sd) { continue; if ( ( data = itemdb->exists(sd->status.inventory[idx].card[j]) ) != NULL ) { if( data->combos_count ) - ret += pc_checkcombo(sd,data); + ret += pc->checkcombo(sd,data); } } } @@ -8607,7 +8568,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) } for(i=0;i<EQI_MAX;i++) { - if(pos & equip_pos[i]) { + if(pos & pc->equip_pos[i]) { if(sd->equip_index[i] >= 0) //Slot taken, remove item from there. pc->unequipitem(sd,sd->equip_index[i],2); @@ -8629,7 +8590,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) sd->weapontype1 = id->look; else sd->weapontype1 = 0; - pc_calcweapontype(sd); + pc->calcweapontype(sd); clif->changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon); } if(pos & EQP_HAND_L) { @@ -8646,7 +8607,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) } else sd->status.shield = sd->weapontype2 = 0; - pc_calcweapontype(sd); + pc->calcweapontype(sd); clif->changelook(&sd->bl,LOOK_SHIELD,sd->status.shield); } //Added check to prevent sending the same look on multiple slots -> @@ -8713,7 +8674,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) /* check for combos (MUST be before status_calc_pc) */ if ( id ) { if( id->combos_count ) - pc_checkcombo(sd,id); + pc->checkcombo(sd,id); if(itemdb_isspecial(sd->status.inventory[n].card[0])) ; //No cards else { @@ -8723,7 +8684,7 @@ int pc_equipitem(struct map_session_data *sd,int n,int req_pos) continue; if ( ( data = itemdb->exists(sd->status.inventory[n].card[i]) ) != NULL ) { if( data->combos_count ) - pc_checkcombo(sd,data); + pc->checkcombo(sd,data); } } } @@ -8794,21 +8755,21 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) { return 0; } for(i=0;i<EQI_MAX;i++) { - if(sd->status.inventory[n].equip & equip_pos[i]) + if(sd->status.inventory[n].equip & pc->equip_pos[i]) sd->equip_index[i] = -1; } if(sd->status.inventory[n].equip & EQP_HAND_R) { sd->weapontype1 = 0; sd->status.weapon = sd->weapontype2; - pc_calcweapontype(sd); + pc->calcweapontype(sd); clif->changelook(&sd->bl,LOOK_WEAPON,sd->status.weapon); if( !battle_config.dancing_weaponswitch_fix ) status_change_end(&sd->bl, SC_DANCING, INVALID_TIMER); // Unequipping => stop dancing. } if(sd->status.inventory[n].equip & EQP_HAND_L) { sd->status.shield = sd->weapontype2 = 0; - pc_calcweapontype(sd); + pc->calcweapontype(sd); clif->changelook(&sd->bl,LOOK_SHIELD,sd->status.shield); } if(sd->status.inventory[n].equip & EQP_HEAD_LOW && pc->checkequip(sd,EQP_COSTUME_HEAD_LOW) == -1 ) { @@ -8873,7 +8834,7 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) { /* check for combos (MUST be before status_calc_pc) */ if ( sd->inventory_data[n] ) { if( sd->inventory_data[n]->combos_count ) { - if( pc_removecombo(sd,sd->inventory_data[n]) ) + if( pc->removecombo(sd,sd->inventory_data[n]) ) status_cacl = true; } if(itemdb_isspecial(sd->status.inventory[n].card[0])) ; //No cards @@ -8884,7 +8845,7 @@ int pc_unequipitem(struct map_session_data *sd,int n,int flag) { continue; if ( ( data = itemdb->exists(sd->status.inventory[n].card[i]) ) != NULL ) { if( data->combos_count ) { - if( pc_removecombo(sd,data) ) + if( pc->removecombo(sd,data) ) status_cacl = true; } } @@ -9292,12 +9253,12 @@ int pc_autosave(int tid, unsigned int tick, int id, intptr_t data) interval = map->autosave_interval/(map->usercount()+1); if(interval < map->minsave_interval) interval = map->minsave_interval; - timer->add(timer->gettick()+interval,pc_autosave,0,0); + timer->add(timer->gettick()+interval,pc->autosave,0,0); return 0; } -static int pc_daynight_timer_sub(struct map_session_data *sd,va_list ap) { +int pc_daynight_timer_sub(struct map_session_data *sd,va_list ap) { if (sd->state.night != map->night_flag && maplist[sd->bl.m].flag.nightenabled) { //Night/day state does not match. clif->status_change(&sd->bl, SI_SKE, map->night_flag, 0, 0, 0, 0); //New night effect by dynamix [Skotlex] sd->state.night = map->night_flag; @@ -9319,7 +9280,7 @@ int map_day_timer(int tid, unsigned int tick, int id, intptr_t data) { return 0; //Already day. map->night_flag = 0; // 0=day, 1=night [Yor] - map->map_foreachpc(pc_daynight_timer_sub); + map->map_foreachpc(pc->daynight_timer_sub); strcpy(tmp_soutput, (data == 0) ? msg_txt(502) : msg_txt(60)); // The day has arrived! intif->broadcast(tmp_soutput, strlen(tmp_soutput) + 1, BC_DEFAULT); return 0; @@ -9339,7 +9300,7 @@ int map_night_timer(int tid, unsigned int tick, int id, intptr_t data) { return 0; //Already nigth. map->night_flag = 1; // 0=day, 1=night [Yor] - map->map_foreachpc(pc_daynight_timer_sub); + map->map_foreachpc(pc->daynight_timer_sub); strcpy(tmp_soutput, (data == 0) ? msg_txt(503) : msg_txt(59)); // The night has fallen... intif->broadcast(tmp_soutput, strlen(tmp_soutput) + 1, BC_DEFAULT); return 0; @@ -9401,7 +9362,7 @@ bool pc_can_use_command(struct map_session_data *sd, const char *command) { return atcommand->can_use(sd,command); } -static int pc_charm_timer(int tid, unsigned int tick, int id, intptr_t data) { +int pc_charm_timer(int tid, unsigned int tick, int id, intptr_t data) { struct map_session_data *sd; int i, type; @@ -9448,14 +9409,14 @@ int pc_add_charm(struct map_session_data *sd,int interval,int max,int type) if( sd->charm[type] && sd->charm[type] >= max ) { if(sd->charm_timer[type][0] != INVALID_TIMER) - timer->delete(sd->charm_timer[type][0],pc_charm_timer); + timer->delete(sd->charm_timer[type][0],pc->charm_timer); sd->charm[type]--; if( sd->charm[type] != 0 ) memmove(sd->charm_timer[type]+0, sd->charm_timer[type]+1, (sd->charm[type])*sizeof(int)); sd->charm_timer[type][sd->charm[type]] = INVALID_TIMER; } - tid = timer->add(timer->gettick()+interval, pc_charm_timer, sd->bl.id, 0); + tid = timer->add(timer->gettick()+interval, pc->charm_timer, sd->bl.id, 0); ARR_FIND(0, sd->charm[type], i, sd->charm_timer[type][i] == INVALID_TIMER || DIFF_TICK(timer->get(tid)->tick, timer->get(sd->charm_timer[type][i])->tick) < 0); if( i != sd->charm[type] ) memmove(sd->charm_timer[type]+i+1, sd->charm_timer[type]+i, (sd->charm[type]-i)*sizeof(int)); @@ -9487,7 +9448,7 @@ int pc_del_charm(struct map_session_data *sd,int count,int type) for(i = 0; i < count; i++) { if(sd->charm_timer[type][i] != INVALID_TIMER) { - timer->delete(sd->charm_timer[type][i],pc_charm_timer); + timer->delete(sd->charm_timer[type][i],pc->charm_timer); sd->charm_timer[type][i] = INVALID_TIMER; } } @@ -9521,7 +9482,7 @@ int pc_level_penalty_mod(int diff, unsigned char race, unsigned short mode, int continue; } - if( (tmp=level_penalty[type][i][diff]) > 0 ){ + if( (tmp=pc->level_penalty[type][i][diff]) > 0 ){ rate = tmp; break; } @@ -9749,36 +9710,36 @@ void pc_read_skill_tree(void) { if( ( skill_id = skill->name2id(sk_name) ) ) { int skidx, offset = 0, h = 0, rlen = 0, rskid = 0; - ARR_FIND( 0, MAX_SKILL_TREE, skidx, skill_tree[idx][skidx].id == 0 || skill_tree[idx][skidx].id == skill_id ); + ARR_FIND( 0, MAX_SKILL_TREE, skidx, pc->skill_tree[idx][skidx].id == 0 || pc->skill_tree[idx][skidx].id == skill_id ); if( skidx == MAX_SKILL_TREE ) { ShowWarning("pc_read_skill_tree: Unable to load skill %hu (%s) into '%s's tree. Maximum number of skills per class has been reached.\n", skill_id, sk_name, name); continue; - } else if(skill_tree[idx][skidx].id) { + } else if(pc->skill_tree[idx][skidx].id) { ShowNotice("pc_read_skill_tree: Overwriting %hu for '%s' (%d)\n", skill_id, name, jnames[k].id); } - skill_tree[idx][skidx].id = skill_id; - skill_tree[idx][skidx].idx = skill->get_index(skill_id); + pc->skill_tree[idx][skidx].id = skill_id; + pc->skill_tree[idx][skidx].idx = skill->get_index(skill_id); if( config_setting_is_group(sk) ) { int max = 0, jlevel = 0; config_setting_lookup_int(sk, "MaxLevel", &max); config_setting_lookup_int(sk, "MinJobLevel", &jlevel); - skill_tree[idx][skidx].max = (unsigned char)max; - skill_tree[idx][skidx].joblv = (unsigned char)jlevel; + pc->skill_tree[idx][skidx].max = (unsigned char)max; + pc->skill_tree[idx][skidx].joblv = (unsigned char)jlevel; rlen = config_setting_length(sk); offset += jlevel ? 2 : 1; } else { - skill_tree[idx][skidx].max = (unsigned char)config_setting_get_int(sk); - skill_tree[idx][skidx].joblv = 0; + pc->skill_tree[idx][skidx].max = (unsigned char)config_setting_get_int(sk); + pc->skill_tree[idx][skidx].joblv = 0; } for( h = offset; h < rlen && h < MAX_PC_SKILL_REQUIRE; h++ ) { config_setting_t *rsk = config_setting_get_elem(sk,h); if( rsk && ( rskid = skill->name2id(config_setting_name(rsk)) ) ) { - skill_tree[idx][skidx].need[h].id = rskid; - skill_tree[idx][skidx].need[h].idx = skill->get_index(rskid); - skill_tree[idx][skidx].need[h].lv = (unsigned char)config_setting_get_int(rsk); + pc->skill_tree[idx][skidx].need[h].id = rskid; + pc->skill_tree[idx][skidx].need[h].idx = skill->get_index(rskid); + pc->skill_tree[idx][skidx].need[h].lv = (unsigned char)config_setting_get_int(rsk); } else if( rsk ) { ShowWarning("pc_read_skill_tree: unknown requirement '%s' for '%s' in '%s'\n",config_setting_name(rsk),sk_name,name); } else { @@ -9821,19 +9782,19 @@ void pc_read_skill_tree(void) { fidx = pc->class2idx(jnames[b].id); - ARR_FIND( 0, MAX_SKILL_TREE, d, skill_tree[fidx][d].id == 0 ); + ARR_FIND( 0, MAX_SKILL_TREE, d, pc->skill_tree[fidx][d].id == 0 ); for( f = 0; f < d; f++ ) { - ARR_FIND( 0, MAX_SKILL_TREE, a, skill_tree[idx][a].id == 0 || skill_tree[idx][a].id == skill_tree[fidx][f].id ); + ARR_FIND( 0, MAX_SKILL_TREE, a, pc->skill_tree[idx][a].id == 0 || pc->skill_tree[idx][a].id == pc->skill_tree[fidx][f].id ); if( a == MAX_SKILL_TREE ) { ShowWarning("pc_read_skill_tree: '%s' can't inherit '%s', skill tree is full!\n", name,iname); break; - } else if ( skill_tree[idx][a].id || ( skill_tree[idx][a].id == NV_TRICKDEAD && ((pc->jobid2mapid(jnames[k].id)&MAPID_BASEMASK)!=MAPID_NOVICE) ) ) /* we skip trickdead for non-novices */ + } else if ( pc->skill_tree[idx][a].id || ( pc->skill_tree[idx][a].id == NV_TRICKDEAD && ((pc->jobid2mapid(jnames[k].id)&MAPID_BASEMASK)!=MAPID_NOVICE) ) ) /* we skip trickdead for non-novices */ continue;/* skip */ - memcpy(&skill_tree[idx][a],&skill_tree[fidx][f],sizeof(skill_tree[fidx][f])); + memcpy(&pc->skill_tree[idx][a],&pc->skill_tree[fidx][f],sizeof(pc->skill_tree[fidx][f])); } } @@ -9850,8 +9811,7 @@ void pc_read_skill_tree(void) { mapit->free(iter); } #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) -static bool pc_readdb_levelpenalty(char* fields[], int columns, int current) -{ +bool pc_readdb_levelpenalty(char* fields[], int columns, int current) { int type, race, diff; type = atoi(fields[0]); @@ -9873,7 +9833,7 @@ static bool pc_readdb_levelpenalty(char* fields[], int columns, int current) if( diff < 0 ) diff = min(MAX_LEVEL + ( ~(diff) + 1 ), MAX_LEVEL*2); - level_penalty[type][race][diff] = atoi(fields[3]); + pc->level_penalty[type][race][diff] = atoi(fields[3]); return true; } @@ -9892,8 +9852,8 @@ int pc_readdb(void) { char line[24000],*p; //reset - memset(exp_table,0,sizeof(exp_table)); - memset(max_level,0,sizeof(max_level)); + memset(pc->exp_table,0,sizeof(pc->exp_table)); + memset(pc->max_level,0,sizeof(pc->max_level)); sprintf(line, "%s/"DBPATH"exp.txt", map->db_path); @@ -9933,23 +9893,23 @@ int pc_readdb(void) { count++; job = jobs[0] = pc->class2idx(job_id); //We send one less and then one more because the last entry in the exp array should hold 0. - max_level[job][type] = pc_split_atoui(split[3], exp_table[job][type],',',maxlv-1)+1; + pc->max_level[job][type] = pc_split_atoui(split[3], pc->exp_table[job][type],',',maxlv-1)+1; //Reverse check in case the array has a bunch of trailing zeros... [Skotlex] //The reasoning behind the -2 is this... if the max level is 5, then the array //should look like this: //0: x, 1: x, 2: x: 3: x 4: 0 <- last valid value is at 3. - while ((ui = max_level[job][type]) >= 2 && exp_table[job][type][ui-2] <= 0) - max_level[job][type]--; - if (max_level[job][type] < maxlv) { - ShowWarning("pc_readdb: Specified max %u for job %d, but that job's exp table only goes up to level %u.\n", maxlv, job_id, max_level[job][type]); + while ((ui = pc->max_level[job][type]) >= 2 && pc->exp_table[job][type][ui-2] <= 0) + pc->max_level[job][type]--; + if (pc->max_level[job][type] < maxlv) { + ShowWarning("pc_readdb: Specified max %u for job %d, but that job's exp table only goes up to level %u.\n", maxlv, job_id, pc->max_level[job][type]); ShowInfo("Filling the missing values with the last exp entry.\n"); //Fill the requested values with the last entry. - ui = (max_level[job][type] <= 2? 0: max_level[job][type]-2); + ui = (pc->max_level[job][type] <= 2? 0: pc->max_level[job][type]-2); for (; ui+2 < maxlv; ui++) - exp_table[job][type][ui] = exp_table[job][type][ui-1]; - max_level[job][type] = maxlv; + pc->exp_table[job][type][ui] = pc->exp_table[job][type][ui-1]; + pc->max_level[job][type] = maxlv; } -// ShowDebug("%s - Class %d: %d\n", type?"Job":"Base", job_id, max_level[job][type]); +// ShowDebug("%s - Class %d: %d\n", type?"Job":"Base", job_id, pc->max_level[job][type]); for (i = 1; i < job_count; i++) { job_id = jobs[i]; if (!pcdb_checkid(job_id)) { @@ -9957,9 +9917,9 @@ int pc_readdb(void) { continue; } job = pc->class2idx(job_id); - memcpy(exp_table[job][type], exp_table[jobs[0]][type], sizeof(exp_table[0][0])); - max_level[job][type] = maxlv; -// ShowDebug("%s - Class %d: %u\n", type?"Job":"Base", job_id, max_level[job][type]); + memcpy(pc->exp_table[job][type], pc->exp_table[jobs[0]][type], sizeof(pc->exp_table[0][0])); + pc->max_level[job][type] = maxlv; +// ShowDebug("%s - Class %d: %u\n", type?"Job":"Base", job_id, pc->max_level[job][type]); } } fclose(fp); @@ -9968,28 +9928,28 @@ int pc_readdb(void) { if (i == JOB_WEDDING || i == JOB_XMAS || i == JOB_SUMMER) continue; //Classes that do not need exp tables. j = pc->class2idx(i); - if (!max_level[j][0]) + if (!pc->max_level[j][0]) ShowWarning("Class %s (%d) does not has a base exp table.\n", pc->job_name(i), i); - if (!max_level[j][1]) + if (!pc->max_level[j][1]) ShowWarning("Class %s (%d) does not has a job exp table.\n", pc->job_name(i), i); } ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s/"DBPATH"%s"CL_RESET"'.\n",count,map->db_path,"exp.txt"); count = 0; // Reset and read skilltree - memset(skill_tree,0,sizeof(skill_tree)); - pc_read_skill_tree(); + memset(pc->skill_tree,0,sizeof(pc->skill_tree)); + pc->read_skill_tree(); #if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) - sv->readdb(map->db_path, "re/level_penalty.txt", ',', 4, 4, -1, &pc_readdb_levelpenalty); + sv->readdb(map->db_path, "re/level_penalty.txt", ',', 4, 4, -1, pc->readdb_levelpenalty); for( k=1; k < 3; k++ ){ // fill in the blanks for( j = 0; j < RC_MAX; j++ ){ int tmp = 0; for( i = 0; i < MAX_LEVEL*2; i++ ){ if( i == MAX_LEVEL+1 ) - tmp = level_penalty[k][j][0];// reset - if( level_penalty[k][j][i] > 0 ) - tmp = level_penalty[k][j][i]; + tmp = pc->level_penalty[k][j][0];// reset + if( pc->level_penalty[k][j][i] > 0 ) + tmp = pc->level_penalty[k][j][i]; else - level_penalty[k][j][i] = tmp; + pc->level_penalty[k][j][i] = tmp; } } } @@ -10048,7 +10008,7 @@ int pc_readdb(void) { ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s/"DBPATH"%s"CL_RESET"'.\n",count,map->db_path,"attr_fix.txt"); count = 0; // reset then read statspoint - memset(statp,0,sizeof(statp)); + memset(pc->statp,0,sizeof(pc->statp)); i=1; sprintf(line, "%s/"DBPATH"statpoint.txt", map->db_path); @@ -10067,7 +10027,7 @@ int pc_readdb(void) { if (i > MAX_LEVEL) break; count++; - statp[i]=stat; + pc->statp[i]=stat; i++; } fclose(fp); @@ -10077,9 +10037,9 @@ int pc_readdb(void) { // generate the remaining parts of the db if necessary k = battle_config.use_statpoint_table; //save setting battle_config.use_statpoint_table = 0; //temporarily disable to force pc->gets_status_point use default values - statp[0] = 45; // seed value + pc->statp[0] = 45; // seed value for (; i <= MAX_LEVEL; i++) - statp[i] = statp[i-1] + pc->gets_status_point(i-1); + pc->statp[i] = pc->statp[i-1] + pc->gets_status_point(i-1); battle_config.use_statpoint_table = k; //restore setting return 0; @@ -10090,7 +10050,7 @@ void pc_itemcd_do(struct map_session_data *sd, bool load) { struct item_cd* cd = NULL; if( load ) { - if( !(cd = idb_get(itemcd_db, sd->status.char_id)) ) { + if( !(cd = idb_get(pc->itemcd_db, sd->status.char_id)) ) { // no skill cooldown is associated with this character return; } @@ -10101,12 +10061,12 @@ void pc_itemcd_do(struct map_session_data *sd, bool load) { cursor++; } } - idb_remove(itemcd_db,sd->status.char_id); + idb_remove(pc->itemcd_db,sd->status.char_id); } else { - if( !(cd = idb_get(itemcd_db,sd->status.char_id)) ) { + if( !(cd = idb_get(pc->itemcd_db,sd->status.char_id)) ) { // create a new skill cooldown object for map storage CREATE( cd, struct item_cd, 1 ); - idb_put( itemcd_db, sd->status.char_id, cd ); + idb_put( pc->itemcd_db, sd->status.char_id, cd ); } for(i = 0; i < MAX_ITEMDELAYS; i++) { if( sd->item_delay[i].nameid && DIFF_TICK(timer->gettick(),sd->item_delay[i].tick) < 0 ) { @@ -10124,31 +10084,31 @@ void pc_itemcd_do(struct map_session_data *sd, bool load) { *------------------------------------------*/ void do_final_pc(void) { - db_destroy(itemcd_db); + db_destroy(pc->itemcd_db); do_final_pc_groups(); - ers_destroy(pc_sc_display_ers); + ers_destroy(pc->sc_display_ers); return; } -int do_init_pc(void) { +void do_init_pc(void) { - itemcd_db = idb_alloc(DB_OPT_RELEASE_DATA); + pc->itemcd_db = idb_alloc(DB_OPT_RELEASE_DATA); pc->readdb(); - timer->add_func_list(pc_invincible_timer, "pc_invincible_timer"); - timer->add_func_list(pc_eventtimer, "pc_eventtimer"); - timer->add_func_list(pc_inventory_rental_end, "pc_inventory_rental_end"); - timer->add_func_list(pc->calc_pvprank_timer, "pc->calc_pvprank_timer"); - timer->add_func_list(pc_autosave, "pc_autosave"); - timer->add_func_list(pc_spiritball_timer, "pc_spiritball_timer"); - timer->add_func_list(pc_follow_timer, "pc_follow_timer"); - timer->add_func_list(pc->endautobonus, "pc->endautobonus"); - timer->add_func_list(pc_charm_timer, "pc_charm_timer"); + timer->add_func_list(pc->invincible_timer, "pc_invincible_timer"); + timer->add_func_list(pc->eventtimer, "pc_eventtimer"); + timer->add_func_list(pc->inventory_rental_end, "pc_inventory_rental_end"); + timer->add_func_list(pc->calc_pvprank_timer, "pc_calc_pvprank_timer"); + timer->add_func_list(pc->autosave, "pc_autosave"); + timer->add_func_list(pc->spiritball_timer, "pc_spiritball_timer"); + timer->add_func_list(pc->follow_timer, "pc_follow_timer"); + timer->add_func_list(pc->endautobonus, "pc_endautobonus"); + timer->add_func_list(pc->charm_timer, "pc_charm_timer"); - timer->add(timer->gettick() + map->autosave_interval, pc_autosave, 0, 0); + timer->add(timer->gettick() + map->autosave_interval, pc->autosave, 0, 0); // 0=day, 1=night [Yor] map->night_flag = battle_config.night_at_start ? 1 : 0; @@ -10157,8 +10117,8 @@ int do_init_pc(void) { int day_duration = battle_config.day_duration; int night_duration = battle_config.night_duration; // add night/day timer [Yor] - timer->add_func_list(pc->map_day_timer, "pc->map_day_timer"); - timer->add_func_list(pc->map_night_timer, "pc->map_night_timer"); + timer->add_func_list(pc->map_day_timer, "pc_map_day_timer"); + timer->add_func_list(pc->map_night_timer, "pc_map_night_timer"); pc->day_timer_tid = timer->add_interval(timer->gettick() + (map->night_flag ? 0 : day_duration) + night_duration, pc->map_day_timer, 0, 0, day_duration + night_duration); pc->night_timer_tid = timer->add_interval(timer->gettick() + day_duration + (map->night_flag ? night_duration : 0), pc->map_night_timer, 0, 0, day_duration + night_duration); @@ -10166,9 +10126,7 @@ int do_init_pc(void) { do_init_pc_groups(); - pc_sc_display_ers = ers_new(sizeof(struct sc_display_entry), "pc.c:pc_sc_display_ers", ERS_OPT_NONE); - - return 0; + pc->sc_display_ers = ers_new(sizeof(struct sc_display_entry), "pc.c:sc_display_ers", ERS_OPT_NONE); } /*===================================== @@ -10177,15 +10135,41 @@ int do_init_pc(void) { * created by Susu *-------------------------------------*/ void pc_defaults(void) { + const struct sg_data sg_info[MAX_PC_FEELHATE] = { + { SG_SUN_ANGER, SG_SUN_BLESS, SG_SUN_COMFORT, "PC_FEEL_SUN", "PC_HATE_MOB_SUN", is_day_of_sun }, + { SG_MOON_ANGER, SG_MOON_BLESS, SG_MOON_COMFORT, "PC_FEEL_MOON", "PC_HATE_MOB_MOON", is_day_of_moon }, + { SG_STAR_ANGER, SG_STAR_BLESS, SG_STAR_COMFORT, "PC_FEEL_STAR", "PC_HATE_MOB_STAR", is_day_of_star } + }; + unsigned short equip_pos[EQI_MAX]={EQP_ACC_L,EQP_ACC_R,EQP_SHOES,EQP_GARMENT,EQP_HEAD_LOW,EQP_HEAD_MID,EQP_HEAD_TOP,EQP_ARMOR,EQP_HAND_L,EQP_HAND_R,EQP_COSTUME_HEAD_TOP,EQP_COSTUME_HEAD_MID,EQP_COSTUME_HEAD_LOW,EQP_COSTUME_GARMENT,EQP_AMMO}; + + pc = &pc_s; /* vars */ - // timer for night.day - pc->day_timer_tid = day_timer_tid; - pc->night_timer_tid = night_timer_tid; - + pc->itemcd_db = NULL; + /* */ + pc->day_timer_tid = INVALID_TIMER; + pc->night_timer_tid = INVALID_TIMER; + /* respecting order */ + memset(pc->exp_table, 0, sizeof(pc->exp_table) + + sizeof(pc->max_level) + + sizeof(pc->statp) + + sizeof(pc->level_penalty) + + sizeof(pc->skill_tree) + + sizeof(pc->smith_fame_list) + + sizeof(pc->chemist_fame_list) + + sizeof(pc->taekwon_fame_list) + ); + /* */ + memcpy(pc->equip_pos, &equip_pos, sizeof(pc->equip_pos)); + /* */ + memcpy(pc->sg_info, sg_info, sizeof(pc->sg_info)); + /* */ + pc->sc_display_ers = NULL; /* funcs */ - + pc->init = do_init_pc; + pc->final = do_final_pc; + pc->get_dummy_sd = pc_get_dummy_sd; pc->class2idx = pc_class2idx; pc->get_group_level = pc_get_group_level; @@ -10363,8 +10347,6 @@ void pc_defaults(void) { pc->set_hate_mob = pc_set_hate_mob; pc->readdb = pc_readdb; - pc->do_init_pc = do_init_pc; - pc->do_final_pc = do_final_pc; pc->map_day_timer = map_day_timer; // by [yor] pc->map_night_timer = map_night_timer; // by [yor] // Rental System @@ -10392,4 +10374,34 @@ void pc_defaults(void) { #endif pc->calc_skillpoint = pc_calc_skillpoint; + + pc->invincible_timer = pc_invincible_timer; + pc->spiritball_timer = pc_spiritball_timer; + pc->check_banding = pc_check_banding; + pc->inventory_rental_end = pc_inventory_rental_end; + pc->check_skilltree = pc_check_skilltree; + pc->bonus_autospell = pc_bonus_autospell; + pc->bonus_autospell_onskill = pc_bonus_autospell_onskill; + pc->bonus_addeff = pc_bonus_addeff; + pc->bonus_addeff_onskill = pc_bonus_addeff_onskill; + pc->bonus_item_drop = pc_bonus_item_drop; + pc->calcexp = pc_calcexp; + pc->respawn_timer = pc_respawn_timer; + pc->jobchange_killclone = jobchange_killclone; + pc->getstat = pc_getstat; + pc->setstat = pc_setstat; + pc->eventtimer = pc_eventtimer; + pc->daynight_timer_sub = pc_daynight_timer_sub; + pc->charm_timer = pc_charm_timer; +#if defined(RENEWAL_DROP) || defined(RENEWAL_EXP) + pc->readdb_levelpenalty = pc_readdb_levelpenalty; +#endif + pc->autosave = pc_autosave; + pc->follow_timer = pc_follow_timer; + pc->read_skill_tree = pc_read_skill_tree; + pc->isUseitem = pc_isUseitem; + pc->show_steal = pc_show_steal; + pc->checkcombo = pc_checkcombo; + pc->calcweapontype = pc_calcweapontype; + pc->removecombo = pc_removecombo; } |