summaryrefslogtreecommitdiff
path: root/src/map/pc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/pc.cpp')
-rw-r--r--src/map/pc.cpp103
1 files changed, 74 insertions, 29 deletions
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<map_session_data> 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<VarName>("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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<block_list> src, dumb_ptr<map_session_data> 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<block_list> 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<int>(sd->automod) : 0;
break;
@@ -3901,7 +3930,7 @@ int pc_setparam(dumb_ptr<block_list> 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<block_list> 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<block_list> 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<block_list> 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<AutoMod>(val);
@@ -4479,7 +4524,7 @@ int pc_setglobalreg(dumb_ptr<map_session_data> sd, VarName reg, int val)
if (reg == stringish<VarName>("PC_DIE_COUNTER"_s) && sd->die_counter != val)
{
sd->die_counter = val;
- pc_calcstatus(sd, 0);
+ pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC);
}
Option<P<struct quest_data>> quest_data_ = questdb_searchname(var);
OMATCH_BEGIN_SOME(quest_data, quest_data_)
@@ -4910,7 +4955,7 @@ int pc_equipitem(dumb_ptr<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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<map_session_data> 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)