mirror of
https://github.com/EngineHub/WorldGuard.git
synced 2024-10-02 00:27:28 +02:00
Don't apply the region override permission to PvP.
This commit is contained in:
parent
38c9479385
commit
fd460337f4
@ -108,9 +108,10 @@ private void tellErrorMessage(DelegateEvent event, Cause cause, Location locatio
|
|||||||
*
|
*
|
||||||
* @param cause the cause
|
* @param cause the cause
|
||||||
* @param world the world
|
* @param world the world
|
||||||
|
* @param pvp whether the event in question is PvP combat
|
||||||
* @return true if whitelisted
|
* @return true if whitelisted
|
||||||
*/
|
*/
|
||||||
private boolean isWhitelisted(Cause cause, World world) {
|
private boolean isWhitelisted(Cause cause, World world, boolean pvp) {
|
||||||
Object rootCause = cause.getRootCause();
|
Object rootCause = cause.getRootCause();
|
||||||
|
|
||||||
if (rootCause instanceof Block) {
|
if (rootCause instanceof Block) {
|
||||||
@ -124,7 +125,7 @@ private boolean isWhitelisted(Cause cause, World world) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new RegionPermissionModel(getPlugin(), player).mayIgnoreRegionProtection(world);
|
return !pvp && new RegionPermissionModel(getPlugin(), player).mayIgnoreRegionProtection(world);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -153,7 +154,7 @@ private RegionAssociable createRegionAssociable(Cause cause) {
|
|||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onPlaceBlock(final PlaceBlockEvent event) {
|
public void onPlaceBlock(final PlaceBlockEvent event) {
|
||||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||||
if (isWhitelisted(event.getCause(), event.getWorld())) return; // Whitelisted cause
|
if (isWhitelisted(event.getCause(), event.getWorld(), false)) return; // Whitelisted cause
|
||||||
|
|
||||||
final Material type = event.getEffectiveMaterial();
|
final Material type = event.getEffectiveMaterial();
|
||||||
final RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
final RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
||||||
@ -196,7 +197,7 @@ public boolean apply(Location target) {
|
|||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onBreakBlock(final BreakBlockEvent event) {
|
public void onBreakBlock(final BreakBlockEvent event) {
|
||||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||||
if (isWhitelisted(event.getCause(), event.getWorld())) return; // Whitelisted cause
|
if (isWhitelisted(event.getCause(), event.getWorld(), false)) return; // Whitelisted cause
|
||||||
|
|
||||||
final RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
final RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
||||||
|
|
||||||
@ -234,7 +235,7 @@ public boolean apply(Location target) {
|
|||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onUseBlock(final UseBlockEvent event) {
|
public void onUseBlock(final UseBlockEvent event) {
|
||||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||||
if (isWhitelisted(event.getCause(), event.getWorld())) return; // Whitelisted cause
|
if (isWhitelisted(event.getCause(), event.getWorld(), false)) return; // Whitelisted cause
|
||||||
|
|
||||||
final Material type = event.getEffectiveMaterial();
|
final Material type = event.getEffectiveMaterial();
|
||||||
final RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
final RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
||||||
@ -290,7 +291,7 @@ public boolean apply(Location target) {
|
|||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onSpawnEntity(SpawnEntityEvent event) {
|
public void onSpawnEntity(SpawnEntityEvent event) {
|
||||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||||
if (isWhitelisted(event.getCause(), event.getWorld())) return; // Whitelisted cause
|
if (isWhitelisted(event.getCause(), event.getWorld(), false)) return; // Whitelisted cause
|
||||||
|
|
||||||
Location target = event.getTarget();
|
Location target = event.getTarget();
|
||||||
EntityType type = event.getEffectiveType();
|
EntityType type = event.getEffectiveType();
|
||||||
@ -336,7 +337,7 @@ public void onSpawnEntity(SpawnEntityEvent event) {
|
|||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onDestroyEntity(DestroyEntityEvent event) {
|
public void onDestroyEntity(DestroyEntityEvent event) {
|
||||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||||
if (isWhitelisted(event.getCause(), event.getWorld())) return; // Whitelisted cause
|
if (isWhitelisted(event.getCause(), event.getWorld(), false)) return; // Whitelisted cause
|
||||||
|
|
||||||
Location target = event.getTarget();
|
Location target = event.getTarget();
|
||||||
EntityType type = event.getEntity().getType();
|
EntityType type = event.getEntity().getType();
|
||||||
@ -371,7 +372,7 @@ public void onDestroyEntity(DestroyEntityEvent event) {
|
|||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onUseEntity(UseEntityEvent event) {
|
public void onUseEntity(UseEntityEvent event) {
|
||||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||||
if (isWhitelisted(event.getCause(), event.getWorld())) return; // Whitelisted cause
|
if (isWhitelisted(event.getCause(), event.getWorld(), false)) return; // Whitelisted cause
|
||||||
|
|
||||||
Location target = event.getTarget();
|
Location target = event.getTarget();
|
||||||
RegionAssociable associable = createRegionAssociable(event.getCause());
|
RegionAssociable associable = createRegionAssociable(event.getCause());
|
||||||
@ -410,17 +411,24 @@ public void onUseEntity(UseEntityEvent event) {
|
|||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void onDamageEntity(DamageEntityEvent event) {
|
public void onDamageEntity(DamageEntityEvent event) {
|
||||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||||
if (isWhitelisted(event.getCause(), event.getWorld())) return; // Whitelisted cause
|
// Whitelist check is below
|
||||||
|
|
||||||
Location target = event.getTarget();
|
Location target = event.getTarget();
|
||||||
RegionAssociable associable = createRegionAssociable(event.getCause());
|
RegionAssociable associable = createRegionAssociable(event.getCause());
|
||||||
|
|
||||||
RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
||||||
Object rootCause = event.getCause().getRootCause();
|
Player playerAttacker = event.getCause().getFirstPlayer();
|
||||||
Player attacker;
|
|
||||||
boolean canDamage;
|
boolean canDamage;
|
||||||
String what;
|
String what;
|
||||||
|
|
||||||
|
// Block PvP like normal even if the player has an override permission
|
||||||
|
// because (1) this is a frequent source of confusion and
|
||||||
|
// (2) some users want to block PvP even with the bypass permission
|
||||||
|
boolean pvp = event.getEntity() instanceof Player && playerAttacker != null && !playerAttacker.equals(event.getEntity());
|
||||||
|
if (isWhitelisted(event.getCause(), event.getWorld(), pvp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Hostile / ambient mob override */
|
/* Hostile / ambient mob override */
|
||||||
if (Entities.isHostile(event.getEntity()) || Entities.isAmbient(event.getEntity())) {
|
if (Entities.isHostile(event.getEntity()) || Entities.isAmbient(event.getEntity())) {
|
||||||
canDamage = event.getRelevantFlags().isEmpty() || query.testState(target, associable, combine(event));
|
canDamage = event.getRelevantFlags().isEmpty() || query.testState(target, associable, combine(event));
|
||||||
@ -432,14 +440,14 @@ public void onDamageEntity(DamageEntityEvent event) {
|
|||||||
what = "change that";
|
what = "change that";
|
||||||
|
|
||||||
/* PVP */
|
/* PVP */
|
||||||
} else if (event.getEntity() instanceof Player && (attacker = event.getCause().getFirstPlayer()) != null && !attacker.equals(event.getEntity())) {
|
} else if (pvp) {
|
||||||
Player defender = (Player) event.getEntity();
|
Player defender = (Player) event.getEntity();
|
||||||
|
|
||||||
canDamage = query.testBuild(target, associable, combine(event, DefaultFlag.PVP))
|
canDamage = query.testBuild(target, associable, combine(event, DefaultFlag.PVP))
|
||||||
&& query.queryState(attacker.getLocation(), attacker, combine(event, DefaultFlag.PVP)) != State.DENY;
|
&& query.queryState(playerAttacker.getLocation(), playerAttacker, combine(event, DefaultFlag.PVP)) != State.DENY;
|
||||||
|
|
||||||
// Fire the disallow PVP event
|
// Fire the disallow PVP event
|
||||||
if (!canDamage && Events.fireAndTestCancel(new DisallowedPVPEvent(attacker, defender, event.getOriginalEvent()))) {
|
if (!canDamage && Events.fireAndTestCancel(new DisallowedPVPEvent(playerAttacker, defender, event.getOriginalEvent()))) {
|
||||||
canDamage = true;
|
canDamage = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -469,7 +477,7 @@ public void onVehicleExit(VehicleExitEvent event) {
|
|||||||
|
|
||||||
if (vehicle instanceof Tameable && exited instanceof Player) {
|
if (vehicle instanceof Tameable && exited instanceof Player) {
|
||||||
Player player = (Player) exited;
|
Player player = (Player) exited;
|
||||||
if (!isWhitelisted(Cause.create(player), vehicle.getWorld())) {
|
if (!isWhitelisted(Cause.create(player), vehicle.getWorld(), false)) {
|
||||||
RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
RegionQuery query = getPlugin().getRegionContainer().createQuery();
|
||||||
Location location = vehicle.getLocation();
|
Location location = vehicle.getLocation();
|
||||||
if (!query.testBuild(location, player, DefaultFlag.RIDE, DefaultFlag.INTERACT)) {
|
if (!query.testBuild(location, player, DefaultFlag.RIDE, DefaultFlag.INTERACT)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user