Added default.disable-health-regain.

This commit is contained in:
sk89q 2011-06-26 19:16:00 -07:00
parent 342cfc0801
commit 5bb7eb6f01
3 changed files with 62 additions and 41 deletions

View File

@ -20,6 +20,8 @@
package com.sk89q.worldguard.bukkit; package com.sk89q.worldguard.bukkit;
import java.util.List; import java.util.List;
import com.sk89q.worldedit.blocks.BlockType;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@ -139,4 +141,47 @@ public static boolean isBlockWater(World world, int ox, int oy, int oz) {
} }
} }
/**
* Find a position for the player to stand that is not inside a block.
* Blocks above the player will be iteratively tested until there is
* a series of two free blocks. The player will be teleported to
* that free position.
*
* @param player
*/
public static void findFreePosition(Player player) {
Location loc = player.getLocation();
int x = loc.getBlockX();
int y = Math.max(0, loc.getBlockY());
int origY = y;
int z = loc.getBlockZ();
World world = player.getWorld();
byte free = 0;
while (y <= 129) {
if (BlockType.canPassThrough(world.getBlockTypeIdAt(x, y, z))) {
free++;
} else {
free = 0;
}
if (free == 2) {
if (y - 1 != origY || y == 1) {
loc.setX(x + 0.5);
loc.setY(y);
loc.setZ(z + 0.5);
if (y <= 2 && world.getBlockAt(x,0,z).getType() == Material.AIR) {
world.getBlockAt(x,0,z).setTypeId(20);
loc.setY(2);
}
player.setFallDistance(0F);
player.teleport(loc);
}
return;
}
y++;
}
}
} }

View File

@ -134,6 +134,7 @@ public class WorldConfiguration {
public boolean alwaysThundering; public boolean alwaysThundering;
public boolean disablePigZap; public boolean disablePigZap;
public boolean disableCreeperPower; public boolean disableCreeperPower;
public boolean disableHealthRegain;
/* Configuration data end */ /* Configuration data end */
@ -228,6 +229,8 @@ private void loadConfiguration() {
pumpkinScuba = getBoolean("pumpkin-scuba", false); pumpkinScuba = getBoolean("pumpkin-scuba", false);
disableHealthRegain = getBoolean("default.disable-health-regain", false);
noPhysicsGravel = getBoolean("physics.no-physics-gravel", false); noPhysicsGravel = getBoolean("physics.no-physics-gravel", false);
noPhysicsSand = getBoolean("physics.no-physics-sand", false); noPhysicsSand = getBoolean("physics.no-physics-sand", false);
allowPortalAnywhere = getBoolean("physics.allow-portal-anywhere", false); allowPortalAnywhere = getBoolean("physics.allow-portal-anywhere", false);

View File

@ -35,7 +35,6 @@
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BlockType;
import com.sk89q.worldguard.blacklist.events.ItemUseBlacklistEvent; import com.sk89q.worldguard.blacklist.events.ItemUseBlacklistEvent;
import com.sk89q.worldguard.protection.ApplicableRegionSet; import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.flags.DefaultFlag; import com.sk89q.worldguard.protection.flags.DefaultFlag;
@ -81,6 +80,7 @@ public void registerEvents() {
registerEvent("PIG_ZAP", Priority.High); registerEvent("PIG_ZAP", Priority.High);
registerEvent("PAINTING_BREAK", Priority.High); registerEvent("PAINTING_BREAK", Priority.High);
registerEvent("PAINTING_PLACE", Priority.High); registerEvent("PAINTING_PLACE", Priority.High);
registerEvent("ENTITY_REGAIN_HEALTH", Priority.High);
} }
/** /**
@ -155,7 +155,7 @@ private void onEntityDamageByBlock(EntityDamageByBlockEvent event) {
} }
if (wcfg.teleportOnVoid && type == DamageCause.VOID) { if (wcfg.teleportOnVoid && type == DamageCause.VOID) {
findFreePosition(player); BukkitUtil.findFreePosition(player);
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -392,7 +392,7 @@ public void onEntityDamage(EntityDamageEvent event) {
} }
if (wcfg.teleportOnSuffocation && type == DamageCause.SUFFOCATION) { if (wcfg.teleportOnSuffocation && type == DamageCause.SUFFOCATION) {
findFreePosition(player); BukkitUtil.findFreePosition(player);
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -650,48 +650,21 @@ public void onPaintingPlace(PaintingPlaceEvent event) {
} }
} }
} }
/** /**
* Find a position for the player to stand that is not inside a block. * Called on entity health regain.
* Blocks above the player will be iteratively tested until there is
* a series of two free blocks. The player will be teleported to
* that free position.
*
* @param player
*/ */
public void findFreePosition(Player player) { public void onEntityRegainHealth(EntityRegainHealthEvent event) {
Location loc = player.getLocation(); Entity ent = event.getEntity();
int x = loc.getBlockX(); World world = ent.getWorld();
int y = Math.max(0, loc.getBlockY());
int origY = y;
int z = loc.getBlockZ();
World world = player.getWorld();
byte free = 0; ConfigurationManager cfg = plugin.getGlobalStateManager();
WorldConfiguration wcfg = cfg.get(world);
while (y <= 129) { if (wcfg.disableHealthRegain) {
if (BlockType.canPassThrough(world.getBlockTypeIdAt(x, y, z))) { event.setCancelled(true);
free++; return;
} else {
free = 0;
}
if (free == 2) {
if (y - 1 != origY || y == 1) {
loc.setX(x + 0.5);
loc.setY(y);
loc.setZ(z + 0.5);
if (y <= 2 && world.getBlockAt(x,0,z).getType() == Material.AIR) {
world.getBlockAt(x,0,z).setTypeId(20);
loc.setY(2);
}
player.setFallDistance(0F);
player.teleport(loc);
}
return;
}
y++;
} }
} }
} }