summaryrefslogtreecommitdiff
path: root/src/map/battle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/battle.c')
-rw-r--r--src/map/battle.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/map/battle.c b/src/map/battle.c
index 35e2fc710..561f9ef53 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -4801,6 +4801,38 @@ int battle_check_target( struct block_list *src, struct block_list *target,int f
if( (s_bl = battle_get_master(src)) == NULL )
s_bl = src;
+ // Disable PVM for specific groups.
+ if (src->type&BL_PC && target->type&BL_MOB && src->id && map_id2sd(src->id) != NULL)
+ { // Source => PC, Target => MOB
+ if (pc_has_permission(map_id2sd(src->id), PC_PERM_DISABLE_PVM))
+ return 0;
+ }
+ else if (src->type&BL_HOM && target->type&BL_MOB)
+ { // Source => HOM, Target => MOB; check the master BL id of homun
+ struct homun_data *hd = (TBL_HOM*)src;
+ if (hd != NULL && hd->master->bl.id)
+ {
+ if (pc_has_permission(map_id2sd(hd->master->bl.id), PC_PERM_DISABLE_PVM))
+ return 0;
+ }
+ }
+
+ // Disable PVP
+ if (src->type&BL_PC && target->type&(BL_PC|BL_HOM) && src->id && map_id2sd(src->id) != NULL)
+ { // Source => PC, Target => PC
+ if (pc_has_permission(map_id2sd(src->id), PC_PERM_DISABLE_PVP))
+ return 0;
+ }
+ else if (src->type&BL_HOM && target->type&(BL_HOM|BL_PC))
+ { // Source => HOM, Target => MOB|PC; check the master BL id of homun
+ struct homun_data *hd = (TBL_HOM*)src;
+ if (hd != NULL && hd->master->bl.id)
+ {
+ if (pc_has_permission(map_id2sd(hd->master->bl.id), PC_PERM_DISABLE_PVP))
+ return 0;
+ }
+ }
+
switch( target->type ) { // Checks on actual target
case BL_PC: {
struct status_change* sc = status_get_sc(src);