diff options
Diffstat (limited to 'src/map/pc.cpp')
-rw-r--r-- | src/map/pc.cpp | 57 |
1 files changed, 45 insertions, 12 deletions
diff --git a/src/map/pc.cpp b/src/map/pc.cpp index 12af48f..9ef70fe 100644 --- a/src/map/pc.cpp +++ b/src/map/pc.cpp @@ -870,6 +870,7 @@ int pc_authok(AccountId id, int login_id2, ClientVersion client_version, sd->quick_regeneration_hp.amount = 0; sd->quick_regeneration_sp.amount = 0; sd->heal_xp = 0; + sd->max_weight_override = 0; sd->canact_tick = tick; sd->canmove_tick = tick; sd->attackabletime = tick; @@ -1121,7 +1122,7 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first) b_attackrange, b_matk1, b_matk2, b_mdef, b_mdef2; int b_base_atk; int bl; - int aspd_rate, refinedef = 0; + int aspd_rate, speed_rate, refinedef = 0; int str, dstr, dex; int b_pvpchannel = 0; @@ -1473,6 +1474,7 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first) } aspd_rate = sd->aspd_rate; + speed_rate = sd->speed_rate; //攻撃速度増加 | Increased attack speed @@ -1483,6 +1485,9 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first) sd->hit += skill_power(sd, SkillID::AC_OWL) / 10; // 20 for 200 } + if (sd->max_weight_override) + sd->max_weight = sd->max_weight_override; + sd->max_weight += 1000; bl = sd->status.base_level; @@ -1548,12 +1553,15 @@ int pc_calcstatus(dumb_ptr<map_session_data> sd, int first) /* Slow down if protected */ - if (sd->sc_data[StatusChange::SC_PHYS_SHIELD].timer) - aspd_rate += sd->sc_data[StatusChange::SC_PHYS_SHIELD].val1; + if (sd->sc_data[StatusChange::SC_PHYS_SHIELD].timer || sd->sc_data[StatusChange::SC_PHYS_SHIELD_ITEM].timer) + aspd_rate += std::max(sd->sc_data[StatusChange::SC_PHYS_SHIELD].val1, sd->sc_data[StatusChange::SC_PHYS_SHIELD_ITEM].val1); // highest value is taken here but serverdata should make sure only one of those is active + + if (sd->sc_data[StatusChange::SC_SLOWMOVE].timer) + speed_rate += sd->sc_data[StatusChange::SC_SLOWMOVE].val1; } - if (sd->speed_rate != 100) - sd->speed = sd->speed * sd->speed_rate / 100; + if (speed_rate != 100) + sd->speed = sd->speed * speed_rate / 100; sd->speed = std::max(sd->speed, 1_ms); if (sd->speed_cap < interval_t::zero()) sd->speed_cap = interval_t::zero(); @@ -1894,6 +1902,14 @@ int pc_bonus(dumb_ptr<map_session_data> sd, SP type, int val) if (!sd->state.lr_flag_is_arrow_2) sd->base_weapon_delay_adjust += interval_t(val); break; + case SP::MAXWEIGHT: + if (!sd->state.lr_flag_is_arrow_2) + sd->max_weight = val; + break; + case SP::MAXWEIGHT_ADD: + if (!sd->state.lr_flag_is_arrow_2) + sd->max_weight += val; + break; default: if (battle_config.error_log) PRINTF("pc_bonus: unknown type %d %d !\n"_fmt, @@ -2404,8 +2420,12 @@ int pc_useitem(dumb_ptr<map_session_data> sd, IOff0 n) } P<const ScriptBuffer> script = borrow(*sdidn->use_script); - clif_useitemack(sd, n, amount - 1, 1); - pc_delitem(sd, n, 1, 1); + + if (!bool(sdidn->mode & ItemMode::KEEP_AFTER_USE)) + { + clif_useitemack(sd, n, amount - 1, 1); + pc_delitem(sd, n, 1, 1); + } // activity if (sd) @@ -3717,6 +3737,9 @@ int pc_readparam(dumb_ptr<block_list> bl, SP type) case SP::MAXWEIGHT: val = sd ? sd->max_weight : 0; break; + case SP::MAXWEIGHT_OVERRIDE: + val = sd ? sd->max_weight_override : 0; + break; case SP::BASEEXP: val = sd ? sd->status.base_exp : 0; break; @@ -3866,19 +3889,19 @@ int pc_readparam(dumb_ptr<block_list> bl, SP type) val = sd ? sd->mute.guild : 0; break; case SP::KILLS: - val = sd->activity.kills; + val = sd ? sd->activity.kills : 0; break; case SP::CASTS: - val = sd->activity.casts; + val = sd ? sd->activity.casts : 0; break; case SP::ITEMS_USED: - val = sd->activity.items_used; + val = sd ? sd->activity.items_used : 0; break; case SP::TILES_WALKED: - val = sd->activity.tiles_walked; + val = sd ? sd->activity.tiles_walked : 0; break; case SP::ATTACKS: - val = sd->activity.attacks; + val = sd ? sd->activity.attacks : 0; break; case SP::AUTOMOD: val = sd ? static_cast<int>(sd->automod) : 0; @@ -4044,6 +4067,11 @@ int pc_setparam(dumb_ptr<block_list> bl, SP type, int val) sd->max_weight = val; clif_updatestatus(sd, type); break; + case SP::MAXWEIGHT_OVERRIDE: + nullpo_retz(sd); + sd->max_weight_override = val; + pc_calcstatus(sd, (int)CalcStatusKind::NORMAL_RECALC); + break; case SP::HP: nullpo_retz(sd); // TODO: mob mutation @@ -4131,18 +4159,23 @@ int pc_setparam(dumb_ptr<block_list> bl, SP type, int val) 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: + nullpo_retz(sd); sd->activity.kills = val; break; case SP::CASTS: + nullpo_retz(sd); sd->activity.casts = val; break; case SP::ITEMS_USED: + nullpo_retz(sd); sd->activity.items_used = val; break; case SP::TILES_WALKED: + nullpo_retz(sd); sd->activity.tiles_walked = val; break; case SP::ATTACKS: + nullpo_retz(sd); sd->activity.attacks = val; break; case SP::AUTOMOD: |