summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/map/data/mapd.c1
-rw-r--r--src/map/init.c1
-rw-r--r--src/map/npc.c7
-rw-r--r--src/map/pc.c20
-rw-r--r--src/map/pc.h2
-rw-r--r--src/map/struct/mapdext.h4
6 files changed, 35 insertions, 0 deletions
diff --git a/src/map/data/mapd.c b/src/map/data/mapd.c
index a1d8f11..a557dc9 100644
--- a/src/map/data/mapd.c
+++ b/src/map/data/mapd.c
@@ -35,5 +35,6 @@ struct MapdExt *mapd_create(void)
return NULL;
data->mask = 1;
data->invisible = false;
+ data->flag.nopve = 0;
return data;
}
diff --git a/src/map/init.c b/src/map/init.c
index a67ddba..c8f2ad3 100644
--- a/src/map/init.c
+++ b/src/map/init.c
@@ -102,6 +102,7 @@ HPExport void plugin_init (void)
addHookPre("pc->setregistry", epc_setregistry);
addHookPre("pc->equipitem_pos", epc_equipitem_pos);
addHookPre("pc->unequipitem_pos", epc_unequipitem_pos);
+ addHookPre("pc->can_attack", epc_can_attack);
addHookPre("npc->checknear", enpc_checknear);
addHookPre("npc->parse_unknown_mapflag", enpc_parse_unknown_mapflag);
addHookPre("clif->quest_send_list", eclif_quest_send_list);
diff --git a/src/map/npc.c b/src/map/npc.c
index 62dccfe..8ad68af 100644
--- a/src/map/npc.c
+++ b/src/map/npc.c
@@ -85,6 +85,13 @@ void enpc_parse_unknown_mapflag(const char *name, char *w3, char *w4, const char
if (data)
data->mask = atoi(w4);
}
+ else if (!strcmpi(w3, "nopve"))
+ {
+ int16 m = map->mapname2mapid(name);
+ struct MapdExt *data = mapd_get(m);
+ if (data)
+ data->flag.nopve = 1;
+ }
else
{
ShowError("npc_parse_mapflag: unrecognized mapflag '%s' in file '%s', line '%d'.\n", w3, filepath, strline(buffer,start-buffer));
diff --git a/src/map/pc.c b/src/map/pc.c
index 524c130..fddcdea 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -14,7 +14,9 @@
#include "../../../map/pc.h"
#include "map/pc.h"
+#include "map/data/mapd.h"
#include "map/data/session.h"
+#include "map/struct/mapdext.h"
#include "map/struct/sessionext.h"
int langScriptId;
@@ -122,3 +124,21 @@ void epc_unequipitem_pos(struct map_session_data *sd, int *nPtr, int *posPtr)
#undef unequipPos
#undef unequipPos2
+
+bool epc_can_attack (struct map_session_data *sd, int *target_id)
+{
+ if (!sd)
+ return false;
+
+ struct MapdExt *data = mapd_get(sd->bl.m);
+ if (!data)
+ return true;
+ if (data->flag.nopve)
+ {
+ if (map->id2md(*target_id))
+ {
+ hookStop();
+ return false;
+ }
+ }
+}
diff --git a/src/map/pc.h b/src/map/pc.h
index 104e8d5..ac6d723 100644
--- a/src/map/pc.h
+++ b/src/map/pc.h
@@ -17,4 +17,6 @@ void epc_equipitem_pos(struct map_session_data *sd, struct item_data *id, int *p
void epc_unequipitem_pos(struct map_session_data *sd, int *nPtr, int *posPtr);
+bool epc_can_attack (struct map_session_data *sd, int *target_id);
+
#endif // EVOL_MAP_PC
diff --git a/src/map/struct/mapdext.h b/src/map/struct/mapdext.h
index 0c3c03a..15fee7f 100644
--- a/src/map/struct/mapdext.h
+++ b/src/map/struct/mapdext.h
@@ -8,6 +8,10 @@ struct MapdExt
{
unsigned int mask;
bool invisible;
+ struct MapdExtFlag
+ {
+ unsigned nopve : 1;
+ } flag;
};
#endif // EVOL_MAP_MAPDEXT