diff options
Diffstat (limited to 'src/emap/pc.c')
-rw-r--r-- | src/emap/pc.c | 114 |
1 files changed, 91 insertions, 23 deletions
diff --git a/src/emap/pc.c b/src/emap/pc.c index 011743e..5e8b3b0 100644 --- a/src/emap/pc.c +++ b/src/emap/pc.c @@ -15,12 +15,14 @@ #include "common/strlib.h" #include "common/timer.h" #include "map/achievement.h" +#include "map/clif.h" #include "map/chrif.h" #include "map/homunculus.h" #include "map/elemental.h" #include "map/itemdb.h" #include "map/npc.h" #include "map/pc.h" +#include "map/status.h" #include "map/quest.h" #include "plugins/HPMHooking.h" @@ -293,29 +295,6 @@ int epc_isequip_post(int retVal, if (!data) return retVal; - // test for missing basic stats calculation - if (sd->regen.sregen == NULL) - { - return retVal; - } - if (sd->battle_status.str < data->requiredStr || - sd->battle_status.agi < data->requiredAgi || - sd->battle_status.vit < data->requiredVit || - sd->battle_status.int_ < data->requiredInt || - sd->battle_status.dex < data->requiredDex || - sd->battle_status.luk < data->requiredLuk || - sd->battle_status.max_hp < data->requiredMaxHp || - sd->battle_status.max_sp < data->requiredMaxSp || - sd->battle_status.batk < data->requiredAtk || - sd->battle_status.matk_min < data->requiredMAtkMin || - sd->battle_status.matk_max < data->requiredMAtkMax || - sd->battle_status.def < data->requiredDef || - sd->battle_status.mdef < data->requiredMDef || - (data->requiredSkill && !pc->checkskill(sd, data->requiredSkill)) - ) - { - return 0; - } } return retVal; } @@ -1064,6 +1043,95 @@ void epc_calc_skilltree_clear_pre(struct map_session_data **sdPtr) hookStop(); } +// Required Stats +int epc_equipitem_pre(struct map_session_data **sdPtr, + int *nPtr, + int *req_pos __attribute__ ((unused))) +{ + struct map_session_data *sd = *sdPtr; + if (!sd) + return 1; + + const int n = *nPtr; + + if (n < 0 || n >= sd->status.inventorySize) + return 1; + + struct item_data *id; + id = sd->inventory_data[n]; + struct ItemdExt *data = itemd_get(id); + + if (!data) + return 1; + + if (sd->status.str < data->requiredStr || + sd->status.agi < data->requiredAgi || + sd->status.vit < data->requiredVit || + sd->status.int_ < data->requiredInt || + sd->status.dex < data->requiredDex || + sd->status.luk < data->requiredLuk || + sd->status.max_hp < data->requiredMaxHp || + sd->status.max_sp < data->requiredMaxSp || + (data->requiredSkill && !pc->checkskill(sd, data->requiredSkill)) + ) + { + clif->equipitemack(sd,n,0,EIA_FAIL); // fail + hookStop(); + return 0; + } + + // Okay, continue... + return 0; +} + +int epc_resetstate_post(int retVal, + struct map_session_data *sd) { + + // Do nothing if it failed + if (!retVal) + return retVal; + + int i; + struct item_data *id; + struct ItemdExt *data; + + // Check all your equipped items + for (i = 0; i < EQI_MAX; i++) { + int index = sd->equip_index[i]; + + id = sd->inventory_data[index]; + + // Skip possibly empty slots + if (id == NULL) + continue; + + data = itemd_get(id); + + // Skip broken pointers + if (data == NULL) + continue; + + // Check for requeriments + if (sd->status.str < data->requiredStr || + sd->status.agi < data->requiredAgi || + sd->status.vit < data->requiredVit || + sd->status.int_ < data->requiredInt || + sd->status.dex < data->requiredDex || + sd->status.luk < data->requiredLuk || + sd->status.max_hp < data->requiredMaxHp || + sd->status.max_sp < data->requiredMaxSp || + (data->requiredSkill && !pc->checkskill(sd, data->requiredSkill)) + ) + { + // Unequip the item + pc->unequipitem(sd, index, PCUNEQUIPITEM_FORCE); + } + } + // Now recalculate, and return whatever it had to return + status_calc_pc(sd,SCO_NONE); + return retVal; +} + // disable job based bonuses void epc_calc_skilltree_bonus_pre(struct map_session_data **sdPtr __attribute__ ((unused)), int *classidxPtr __attribute__ ((unused))) |