From 78ad8bcab7a0d29200e8cd47c1d759d0eeb15a72 Mon Sep 17 00:00:00 2001 From: HoraK-FDF Date: Mon, 27 Nov 2023 13:47:32 +0000 Subject: activity checks and status cleanup --- src/map/pc.cpp | 103 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 74 insertions(+), 29 deletions(-) (limited to 'src/map/pc.cpp') diff --git a/src/map/pc.cpp b/src/map/pc.cpp index ea15910..c7c6acf 100644 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -805,13 +805,13 @@ void pc_set_attack_info(dumb_ptr sd, interval_t speed, int ran if (speed == interval_t::zero()) { - pc_calcstatus(sd, 1); + pc_calcstatus(sd, (int)CalcStatusKind::INITIAL_CALC); clif_updatestatus(sd, SP::ASPD); clif_updatestatus(sd, SP::ATTACKRANGE); } else { - pc_calcstatus(sd, 9); + pc_calcstatus(sd, ((int)CalcStatusKind::INITIAL_CALC + (int)CalcStatusKind::MAGIC_OVERRIDE)); clif_updatestatus(sd, SP::ASPD); clif_updatestatus(sd, SP::ATTACKRANGE); } @@ -948,7 +948,7 @@ int pc_authok(AccountId id, int login_id2, ClientVersion client_version, sd->die_counter = pc_readglobalreg(sd, stringish("PC_DIE_COUNTER"_s)); // ステータス初期計算など | Status initial calculation, etc. - pc_calcstatus(sd, 1); + pc_calcstatus(sd, (int)CalcStatusKind::INITIAL_CALC); if (pc_isGM(sd)) { @@ -981,7 +981,7 @@ int pc_authok(AccountId id, int login_id2, ClientVersion client_version, sd->packet_flood_reset_due = tick_t(); sd->packet_flood_in = 0; - pc_calcstatus(sd, 1); + pc_calcstatus(sd, (int)CalcStatusKind::INITIAL_CALC); if(sd->bl_m->mask > 0) clif_send_mask(sd, sd->bl_m->mask); @@ -1157,7 +1157,7 @@ int pc_calcstatus(dumb_ptr sd, int first) sd->max_weight = max_weight_base_0 + sd->status.attrs[ATTR::STR] * 300; - if (first & 1) + if (first & (int)CalcStatusKind::INITIAL_CALC) { sd->weight = 0; for (IOff0 i : IOff0::iter()) @@ -1563,7 +1563,7 @@ int pc_calcstatus(dumb_ptr sd, int first) sd->aspd = sd->aspd * aspd_rate / 100; /* Magic speed */ - if (sd->attack_spell_override || first & 8) + if (sd->attack_spell_override || first & (int)CalcStatusKind::MAGIC_OVERRIDE) sd->aspd = sd->attack_spell_delay; /* Red Threshold Calculation (TODO) */ @@ -1581,14 +1581,14 @@ int pc_calcstatus(dumb_ptr sd, int first) if (sd->status.sp > sd->status.max_sp) sd->status.sp = sd->status.max_sp; - if (first & 4) + if (first & (int)CalcStatusKind::NORMAL_RECALC_NO_CLIENT_UPDATE) return 0; - if (first & 3) // never executed atm + if (first & ((int)CalcStatusKind::INITIAL_CALC + (int)CalcStatusKind::ITEM_BONUS_RECALC)) // never executed atm { clif_updatestatus(sd, SP::SPEED); clif_updatestatus(sd, SP::MAXHP); clif_updatestatus(sd, SP::MAXSP); - if (first & 1) // its always 1 here if first is 3 so this if is not needed normally + if (first & (int)CalcStatusKind::INITIAL_CALC) // its always 1 here if first is 3 so this if is not needed normally { clif_updatestatus(sd, SP::HP); clif_updatestatus(sd, SP::SP); @@ -1955,7 +1955,7 @@ int pc_skill(dumb_ptr sd, SkillID id, int level, int flag) if (!flag && (sd->status.skill[id].lv || level == 0)) { sd->status.skill[id].lv = level; - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); clif_skillinfoblock(sd); } else if (sd->status.skill[id].lv < level) @@ -2407,6 +2407,13 @@ int pc_useitem(dumb_ptr sd, IOff0 n) clif_useitemack(sd, n, amount - 1, 1); pc_delitem(sd, n, 1, 1); + // activity + if (sd) + if (sd->activity.items_used == 2147483647) + sd->activity.items_used = 1; + else + sd->activity.items_used++; + run_script(ScriptPointer(script, 0), sd->bl_id, BlockId()); } OMATCH_END (); @@ -2730,6 +2737,13 @@ int pc_walktoxy_sub(dumb_ptr sd) } clif_movechar(sd); + // activity + if (sd) + if (sd->activity.tiles_walked == 2147483647) + sd->activity.tiles_walked = 1; + else + sd->activity.tiles_walked++; + return 0; } @@ -2907,7 +2921,7 @@ void pc_attack_timer(TimerData *, tick_t tick, BlockId id) sd->attack_spell_override = BlockId(); pc_set_weapon_icon(sd, 0, StatusChange::ZERO, ItemNameId()); pc_set_attack_info(sd, interval_t::zero(), 0); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); } } else @@ -3043,7 +3057,7 @@ int pc_checkbaselevelup(dumb_ptr sd) clif_updatestatus(sd, SP::STATUSPOINT); clif_updatestatus(sd, SP::BASELEVEL); clif_updatestatus(sd, SP::NEXTBASEEXP); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); pc_heal(sd, sd->status.max_hp, sd->status.max_sp, true); clif_misceffect(sd, 0); @@ -3102,7 +3116,7 @@ int pc_checkjoblevelup(dumb_ptr sd) { // [Fate] Bah, this is is painful. // But the alternative is quite error-prone, and eAthena has far worse performance issues... sd->status.job_exp = next - 1; - pc_calcstatus(sd,0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); return 0; } @@ -3111,7 +3125,7 @@ int pc_checkjoblevelup(dumb_ptr sd) clif_updatestatus(sd, SP::NEXTJOBEXP); sd->status.skill_point++; clif_updatestatus(sd, SP::SKILLPOINT); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); MAP_LOG_PC(sd, "SKILLPOINTS-UP %d"_fmt, sd->status.skill_point); @@ -3348,7 +3362,7 @@ int pc_statusup(dumb_ptr sd, SP type) } clif_updatestatus(sd, SP::STATUSPOINT); clif_updatestatus(sd, type); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); clif_statusupack(sd, type, 1, val); MAP_LOG_STATS(sd, "STATUP"_fmt); @@ -3377,7 +3391,7 @@ int pc_statusup2(dumb_ptr sd, SP type, int val) sd->status.attrs[attr] = val; clif_updatestatus(sd, sp_to_usp(type)); clif_updatestatus(sd, type); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); clif_statusupack(sd, type, 1, val); MAP_LOG_STATS(sd, "STATUP2"_fmt); @@ -3400,7 +3414,7 @@ int pc_skillup(dumb_ptr sd, SkillID skill_num) sd->status.skill_point -= sd->status.skill[skill_num].lv; sd->status.skill[skill_num].lv++; - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); clif_skillup(sd, skill_num); clif_updatestatus(sd, SP::SKILLPOINT); clif_skillinfoblock(sd); @@ -3432,7 +3446,7 @@ int pc_resetstate(dumb_ptr sd) for (ATTR attr : ATTRs) clif_updatestatus(sd, attr_to_usp(attr)); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); return 0; } @@ -3458,7 +3472,7 @@ int pc_resetskill(dumb_ptr sd) clif_updatestatus(sd, SP::SKILLPOINT); clif_skillinfoblock(sd); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); return 0; } @@ -3551,7 +3565,7 @@ int pc_damage(dumb_ptr src, dumb_ptr sd, pc_set_weapon_icon(sd, 0, StatusChange::ZERO, ItemNameId()); pc_set_attack_info(sd, interval_t::zero(), 0); } - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); if (battle_config.death_penalty_type > 0 && sd->status.base_level >= 20) { @@ -3851,6 +3865,21 @@ int pc_readparam(dumb_ptr bl, SP type) case SP::MUTE_GUILD: val = sd ? sd->mute.guild : 0; break; + case SP::KILLS: + val = sd->activity.kills; + break; + case SP::CASTS: + val = sd->activity.casts; + break; + case SP::ITEMS_USED: + val = sd->activity.items_used; + break; + case SP::TILES_WALKED: + val = sd->activity.tiles_walked; + break; + case SP::ATTACKS: + val = sd->activity.attacks; + break; case SP::AUTOMOD: val = sd ? static_cast(sd->automod) : 0; break; @@ -3901,7 +3930,7 @@ int pc_setparam(dumb_ptr bl, SP type, int val) clif_updatestatus(sd, SP::NEXTBASEEXP); clif_updatestatus(sd, SP::STATUSPOINT); clif_updatestatus(sd, SP::BASEEXP); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); pc_heal(sd, sd->status.max_hp, sd->status.max_sp, true); break; case SP::JOBLEVEL: @@ -3919,7 +3948,7 @@ int pc_setparam(dumb_ptr bl, SP type, int val) clif_updatestatus(sd, SP::JOBLEVEL); clif_updatestatus(sd, SP::NEXTJOBEXP); clif_updatestatus(sd, SP::JOBEXP); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); break; case SP::CLASS: // TODO: mob class change @@ -3999,7 +4028,7 @@ int pc_setparam(dumb_ptr bl, SP type, int val) && !pc_isequip(sd, j)) pc_unequipitem(sd, j, CalcStatus::LATER); } - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); chrif_save(sd); clif_fixpcpos(sd); } @@ -4100,6 +4129,22 @@ int pc_setparam(dumb_ptr bl, SP type, int val) nullpo_retz(sd); sd->mute.guild = (val == 1); break; + // atm only setting of casts is needed since magic is handled in serverdata but I let the others here as well for whatever reason + case SP::KILLS: + sd->activity.kills = val; + break; + case SP::CASTS: + sd->activity.casts = val; + break; + case SP::ITEMS_USED: + sd->activity.items_used = val; + break; + case SP::TILES_WALKED: + sd->activity.tiles_walked = val; + break; + case SP::ATTACKS: + sd->activity.attacks = val; + break; case SP::AUTOMOD: nullpo_retz(sd); sd->automod = static_cast(val); @@ -4479,7 +4524,7 @@ int pc_setglobalreg(dumb_ptr sd, VarName reg, int val) if (reg == stringish("PC_DIE_COUNTER"_s) && sd->die_counter != val) { sd->die_counter = val; - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); } Option> quest_data_ = questdb_searchname(var); OMATCH_BEGIN_SOME(quest_data, quest_data_) @@ -4910,7 +4955,7 @@ int pc_equipitem(dumb_ptr sd, IOff0 n, EPOS) } pc_signal_advanced_equipment_change(sd, n); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); return 0; } @@ -4977,7 +5022,7 @@ int pc_unequipitem(dumb_ptr sd, IOff0 n, CalcStatus type) } if (type == CalcStatus::NOW) { - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); } return 0; @@ -5050,7 +5095,7 @@ int pc_checkitem(dumb_ptr sd) pc_setequipindex(sd); if (calc_flag) - pc_calcstatus(sd, 2); + pc_calcstatus(sd, (int)CalcStatusKind::ITEM_BONUS_RECALC); return 0; } @@ -5435,7 +5480,7 @@ void pc_natural_heal_sub(dumb_ptr sd) if (sd->spellpower_bonus_target < sd->spellpower_bonus_current) { sd->spellpower_bonus_current = sd->spellpower_bonus_target; - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); } else if (sd->spellpower_bonus_target > sd->spellpower_bonus_current) { @@ -5443,7 +5488,7 @@ void pc_natural_heal_sub(dumb_ptr sd) 1 + ((sd->spellpower_bonus_target - sd->spellpower_bonus_current) >> 5); - pc_calcstatus(sd, 0); + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); } if (sd->sc_data[StatusChange::SC_HALT_REGENERATE].timer) -- cgit v1.2.3-60-g2f50