mirror of
https://github.com/EngineHub/WorldGuard.git
synced 2024-11-16 23:55:23 +01:00
Removed FlagStateManager for now. To be added later.
This commit is contained in:
parent
2d8911c9ce
commit
cc5958bc2f
@ -1,237 +0,0 @@
|
|||||||
// $Id$
|
|
||||||
/*
|
|
||||||
* WorldGuard
|
|
||||||
* Copyright (C) 2010 sk89q <http://www.sk89q.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.sk89q.worldguard.bukkit;
|
|
||||||
|
|
||||||
import static com.sk89q.worldguard.bukkit.BukkitUtil.toVector;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import com.sk89q.worldedit.Vector;
|
|
||||||
import com.sk89q.worldguard.region.ApplicableRegionSet;
|
|
||||||
import com.sk89q.worldguard.region.flags.DefaultFlag;
|
|
||||||
import com.sk89q.worldguard.region.indices.RegionIndex;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This processes per-player state information and is also meant to be used
|
|
||||||
* as a scheduled task.
|
|
||||||
*
|
|
||||||
* @author sk89q
|
|
||||||
*/
|
|
||||||
public class FlagStateManager implements Runnable {
|
|
||||||
|
|
||||||
public static final int RUN_DELAY = 20;
|
|
||||||
|
|
||||||
private WorldGuardPlugin plugin;
|
|
||||||
private Map<String, PlayerFlagState> states;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Construct the object.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin instance
|
|
||||||
*/
|
|
||||||
public FlagStateManager(WorldGuardPlugin plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
|
|
||||||
states = new HashMap<String, PlayerFlagState>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run the task.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Player[] players = plugin.getServer().getOnlinePlayers();
|
|
||||||
ConfigurationManager config = plugin.getGlobalStateManager();
|
|
||||||
|
|
||||||
for (Player player : players) {
|
|
||||||
WorldConfiguration worldConfig = config.get(player.getWorld());
|
|
||||||
|
|
||||||
if (!worldConfig.useRegions) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlayerFlagState state;
|
|
||||||
|
|
||||||
synchronized (this) {
|
|
||||||
state = states.get(player.getName());
|
|
||||||
|
|
||||||
if (state == null) {
|
|
||||||
state = new PlayerFlagState();
|
|
||||||
states.put(player.getName(), state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector playerLocation = toVector(player.getLocation());
|
|
||||||
RegionIndex regionManager = plugin.getGlobalRegionManager()
|
|
||||||
.get(player.getWorld());
|
|
||||||
ApplicableRegionSet applicable = regionManager
|
|
||||||
.getApplicableRegions(playerLocation);
|
|
||||||
|
|
||||||
if (!RegionQueryUtil.isInvincible(plugin, player, applicable)
|
|
||||||
&& !plugin.getGlobalStateManager().hasGodMode(player)
|
|
||||||
&& !(player.getGameMode() == GameMode.CREATIVE)) {
|
|
||||||
processHeal(applicable, player, state);
|
|
||||||
processFeed(applicable, player, state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process healing for a player.
|
|
||||||
*
|
|
||||||
* @param applicable The set of applicable regions
|
|
||||||
* @param player The player to process healing flags on
|
|
||||||
* @param state The player's state
|
|
||||||
*/
|
|
||||||
private void processHeal(ApplicableRegionSet applicable, Player player,
|
|
||||||
PlayerFlagState state) {
|
|
||||||
|
|
||||||
if (player.getHealth() <= 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
|
|
||||||
Integer healAmount = applicable.getFlag(DefaultFlag.HEAL_AMOUNT);
|
|
||||||
Integer healDelay = applicable.getFlag(DefaultFlag.HEAL_DELAY);
|
|
||||||
Integer minHealth = applicable.getFlag(DefaultFlag.MIN_HEAL);
|
|
||||||
Integer maxHealth = applicable.getFlag(DefaultFlag.MAX_HEAL);
|
|
||||||
|
|
||||||
if (healAmount == null || healDelay == null || healAmount == 0 || healDelay < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (minHealth == null) minHealth = 0;
|
|
||||||
if (maxHealth == null) maxHealth = 20;
|
|
||||||
|
|
||||||
if (player.getHealth() >= maxHealth && healAmount > 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (healDelay <= 0) {
|
|
||||||
player.setHealth(healAmount > 0 ? maxHealth : minHealth); // this will insta-kill if the flag is unset
|
|
||||||
state.lastHeal = now;
|
|
||||||
} else if (now - state.lastHeal > healDelay * 1000) {
|
|
||||||
// clamp health between minimum and maximum
|
|
||||||
player.setHealth(Math.min(maxHealth, Math.max(minHealth, player.getHealth() + healAmount)));
|
|
||||||
state.lastHeal = now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Process restoring hunger for a player.
|
|
||||||
*
|
|
||||||
* @param applicable The set of applicable regions
|
|
||||||
* @param player The player to process hunger flags on
|
|
||||||
* @param state The player's state
|
|
||||||
*/
|
|
||||||
private void processFeed(ApplicableRegionSet applicable, Player player,
|
|
||||||
PlayerFlagState state) {
|
|
||||||
|
|
||||||
long now = System.currentTimeMillis();
|
|
||||||
|
|
||||||
Integer feedAmount = applicable.getFlag(DefaultFlag.FEED_AMOUNT);
|
|
||||||
Integer feedDelay = applicable.getFlag(DefaultFlag.FEED_DELAY);
|
|
||||||
Integer minHunger = applicable.getFlag(DefaultFlag.MIN_FOOD);
|
|
||||||
Integer maxHunger = applicable.getFlag(DefaultFlag.MAX_FOOD);
|
|
||||||
|
|
||||||
if (feedAmount == null || feedDelay == null || feedAmount == 0 || feedDelay < 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (minHunger == null) minHunger = 0;
|
|
||||||
if (maxHunger == null) maxHunger = 20;
|
|
||||||
|
|
||||||
if (player.getFoodLevel() >= maxHunger && feedAmount > 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (feedDelay <= 0) {
|
|
||||||
player.setFoodLevel(feedAmount > 0 ? maxHunger : minHunger);
|
|
||||||
state.lastFeed = now;
|
|
||||||
} else if (now - state.lastFeed > feedDelay * 1000) {
|
|
||||||
// clamp health between minimum and maximum
|
|
||||||
player.setFoodLevel(Math.min(maxHunger, Math.max(minHunger, player.getFoodLevel() + feedAmount)));
|
|
||||||
state.lastFeed = now;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forget a player.
|
|
||||||
*
|
|
||||||
* @param player The player to forget
|
|
||||||
*/
|
|
||||||
public synchronized void forget(Player player) {
|
|
||||||
states.remove(player.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forget all managed players. Use with caution.
|
|
||||||
*/
|
|
||||||
public synchronized void forgetAll() {
|
|
||||||
states.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a player's flag state. A new state will be created if there is no existing
|
|
||||||
* state for the player.
|
|
||||||
*
|
|
||||||
* @param player The player to get a state for
|
|
||||||
* @return The {@code player}'s state
|
|
||||||
*/
|
|
||||||
public synchronized PlayerFlagState getState(Player player) {
|
|
||||||
PlayerFlagState state = states.get(player.getName());
|
|
||||||
|
|
||||||
if (state == null) {
|
|
||||||
state = new PlayerFlagState();
|
|
||||||
states.put(player.getName(), state);
|
|
||||||
}
|
|
||||||
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Keeps state per player.
|
|
||||||
*/
|
|
||||||
public static class PlayerFlagState {
|
|
||||||
public long lastHeal;
|
|
||||||
public long lastFeed;
|
|
||||||
public String lastGreeting;
|
|
||||||
public String lastFarewell;
|
|
||||||
public Boolean lastExitAllowed = null;
|
|
||||||
public Boolean notifiedForLeave = false;
|
|
||||||
public Boolean notifiedForEnter = false;
|
|
||||||
public GameMode lastGameMode;
|
|
||||||
public World lastWorld;
|
|
||||||
public int lastBlockX;
|
|
||||||
public int lastBlockY;
|
|
||||||
public int lastBlockZ;
|
|
||||||
|
|
||||||
/* Used to cache invincibility status */
|
|
||||||
public World lastInvincibleWorld;
|
|
||||||
public int lastInvincibleX;
|
|
||||||
public int lastInvincibleY;
|
|
||||||
public int lastInvincibleZ;
|
|
||||||
public boolean wasInvincible;
|
|
||||||
}
|
|
||||||
}
|
|
@ -30,8 +30,6 @@
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
@ -100,7 +98,6 @@
|
|||||||
import com.sk89q.worldguard.bukkit.resolvers.TargetEntityResolver;
|
import com.sk89q.worldguard.bukkit.resolvers.TargetEntityResolver;
|
||||||
import com.sk89q.worldguard.region.RegionManager;
|
import com.sk89q.worldguard.region.RegionManager;
|
||||||
import com.sk89q.worldguard.region.indices.RegionIndex;
|
import com.sk89q.worldguard.region.indices.RegionIndex;
|
||||||
import com.sk89q.worldguard.util.FatalConfigurationLoadingException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main class for WorldGuard as a Bukkit plugin.
|
* The main class for WorldGuard as a Bukkit plugin.
|
||||||
@ -110,7 +107,6 @@ public class WorldGuardPlugin extends JavaPlugin {
|
|||||||
private final CommandsManager<CommandSender> commands;
|
private final CommandsManager<CommandSender> commands;
|
||||||
private final RegionManager globalRegionManager;
|
private final RegionManager globalRegionManager;
|
||||||
private final ConfigurationManager configuration;
|
private final ConfigurationManager configuration;
|
||||||
private FlagStateManager flagStateManager;
|
|
||||||
private RuleListsManager ruleListsManager;
|
private RuleListsManager ruleListsManager;
|
||||||
private RegionQueryCache regionCache;
|
private RegionQueryCache regionCache;
|
||||||
private final LagStopMode lagStopper;
|
private final LagStopMode lagStopper;
|
||||||
@ -173,25 +169,14 @@ public void run() {
|
|||||||
// This must be done before configuration is loaded
|
// This must be done before configuration is loaded
|
||||||
LegacyWorldGuardMigration.migrateBlacklist(this);
|
LegacyWorldGuardMigration.migrateBlacklist(this);
|
||||||
|
|
||||||
try {
|
|
||||||
// Load the configuration
|
// Load the configuration
|
||||||
configuration.load();
|
configuration.load();
|
||||||
globalRegionManager.preload();
|
globalRegionManager.preload();
|
||||||
} catch (FatalConfigurationLoadingException e) {
|
|
||||||
getLogger().log(Level.SEVERE, "Fatal error encountered", e);
|
|
||||||
getServer().shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Migrate regions after the regions were loaded because
|
// Migrate regions after the regions were loaded because
|
||||||
// the migration code reuses the loaded region managers
|
// the migration code reuses the loaded region managers
|
||||||
LegacyWorldGuardMigration.migrateRegions(this);
|
LegacyWorldGuardMigration.migrateRegions(this);
|
||||||
|
|
||||||
flagStateManager = new FlagStateManager(this);
|
|
||||||
|
|
||||||
if (configuration.useRegionsScheduler) {
|
|
||||||
getServer().getScheduler().scheduleAsyncRepeatingTask(this, flagStateManager, FlagStateManager.RUN_DELAY, FlagStateManager.RUN_DELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register events
|
// Register events
|
||||||
(new WorldGuardPlayerListener(this)).registerEvents();
|
(new WorldGuardPlayerListener(this)).registerEvents();
|
||||||
(new WorldGuardBlockListener(this)).registerEvents();
|
(new WorldGuardBlockListener(this)).registerEvents();
|
||||||
@ -280,15 +265,6 @@ public ConfigurationManager getGlobalConfiguration() {
|
|||||||
return getGlobalStateManager();
|
return getGlobalStateManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the flag state manager.
|
|
||||||
*
|
|
||||||
* @return The flag state manager
|
|
||||||
*/
|
|
||||||
public FlagStateManager getFlagStateManager() {
|
|
||||||
return flagStateManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the global ConfigurationManager.
|
* Get the global ConfigurationManager.
|
||||||
* USe this to access global configuration values and per-world configuration values.
|
* USe this to access global configuration values and per-world configuration values.
|
||||||
@ -882,7 +858,6 @@ public void broadcastNotification(String msg) {
|
|||||||
* @param player The player to remove state information for
|
* @param player The player to remove state information for
|
||||||
*/
|
*/
|
||||||
public void forgetPlayer(Player player) {
|
public void forgetPlayer(Player player) {
|
||||||
flagStateManager.forget(player);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user