summaryrefslogtreecommitdiff
path: root/src/emap/pc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emap/pc.c')
-rw-r--r--src/emap/pc.c114
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)))