diff --git a/src/main/java/com/bekvon/bukkit/residence/FlagManager.java b/src/main/java/com/bekvon/bukkit/residence/FlagManager.java new file mode 100644 index 0000000..544d83b --- /dev/null +++ b/src/main/java/com/bekvon/bukkit/residence/FlagManager.java @@ -0,0 +1,38 @@ +package com.bekvon.bukkit.residence; + +import java.util.HashMap; +import java.util.Map.Entry; + +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; + +import com.bekvon.bukkit.residence.listeners.flag.ResidenceFlyListener; + +import cn.citycraft.PluginHelper.config.FileConfig; + +public class FlagManager { + Plugin plugin; + FileConfig config; + + HashMap flagmap; + + public FlagManager(Plugin plugin) { + this.plugin = plugin; + this.config = new FileConfig(plugin, "flagconfig.yml"); + } + + public void init() { + PluginManager pm = plugin.getServer().getPluginManager(); + + flagmap = new HashMap(); + + flagmap.put(config.getBoolean("Flag.Fly"), new ResidenceFlyListener()); + + for (Entry fm : flagmap.entrySet()) + if (fm.getKey()) + pm.registerEvents(fm.getValue(), plugin); + + Residence.getLog().info("扩展Flag初始化完毕!"); + } +} diff --git a/src/main/java/com/bekvon/bukkit/residence/listeners/flag/ResidenceFlyListener.java b/src/main/java/com/bekvon/bukkit/residence/listeners/flag/ResidenceFlyListener.java new file mode 100644 index 0000000..7e297ca --- /dev/null +++ b/src/main/java/com/bekvon/bukkit/residence/listeners/flag/ResidenceFlyListener.java @@ -0,0 +1,98 @@ +package com.bekvon.bukkit.residence.listeners.flag; + +import java.util.HashMap; + +import org.bukkit.ChatColor; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; + +import com.bekvon.bukkit.residence.Residence; +import com.bekvon.bukkit.residence.event.ResidenceChangedEvent; +import com.bekvon.bukkit.residence.event.ResidenceDeleteEvent; +import com.bekvon.bukkit.residence.event.ResidenceFlagChangeEvent; +import com.bekvon.bukkit.residence.protection.ClaimedResidence; +import com.bekvon.bukkit.residence.protection.FlagPermissions; +import com.bekvon.bukkit.residence.protection.ResidencePermissions; + +public class ResidenceFlyListener implements Listener { + + HashMap fall = new HashMap(); + + public ResidenceFlyListener() { + FlagPermissions.addFlag("fly"); + FlagPermissions.addResidenceOnlyFlag("fly"); + } + + @EventHandler(ignoreCancelled = true) + public void FlagChange(ResidenceFlagChangeEvent e) { + ClaimedResidence res = e.getResidence(); + for (Player p : res.getPlayersInResidence()) + if (!permCheck(p)) + if (!resPermCheck(res, p)) + ChangePlayerFly(p, false); + else + ChangePlayerFly(p, true); + } + + // ResidenceDeleteEvent.class + // ResidenceFlagChangeEvent.class + + public void onFallDamage(EntityDamageEvent e) { + if (e.getEntity() instanceof Player) { + Player p = (Player) e.getEntity(); + if (e.getCause() == DamageCause.FALL) + if (p == fall.get(p)) { + fall.remove(p); + e.setCancelled(true); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void resChange(ResidenceChangedEvent event) { + Player player = event.getPlayer(); + ClaimedResidence resto = event.getTo(); + if (!permCheck(player)) + if (!resPermCheck(resto, player)) + ChangePlayerFly(player, false); + else + ChangePlayerFly(player, true); + } + + @EventHandler(ignoreCancelled = true) + public void ResDelete(ResidenceDeleteEvent e) { + ClaimedResidence res = e.getResidence(); + for (Player p : res.getPlayersInResidence()) + if (!permCheck(p)) + ChangePlayerFly(p, false); + } + + void ChangePlayerFly(Player p, boolean fly) { + if (p.getAllowFlight() && !fly) { + if (p.isFlying()) + fall.put(p, p); + p.setAllowFlight(false); + p.sendMessage(ChatColor.RED + Residence.getLanguage().getPhrase("FlagDeny", "fly")); + } + if (!p.getAllowFlight() && fly) { + if (p == fall.get(p)) + fall.remove(p); + p.setAllowFlight(true); + } + } + + boolean permCheck(Player p) { + return p.hasPermission("resfly.ignore") || p.isOp() || p.getGameMode() == GameMode.CREATIVE; + } + + boolean resPermCheck(ClaimedResidence res, Player p) { + if (res == null) + return false; + ResidencePermissions perms = res.getPermissions(); + return perms.playerHas(p.getName(), "fly", false); + } +} \ No newline at end of file diff --git a/src/main/resources/flagconfig.yml b/src/main/resources/flagconfig.yml new file mode 100644 index 0000000..a4507c4 --- /dev/null +++ b/src/main/resources/flagconfig.yml @@ -0,0 +1,3 @@ +#领地插件配置文件2.7.0.0 重制 By: 喵♂呜(部分汉化来自宝石汉化组 大刘,Zesty). +Flag: + Fly: true \ No newline at end of file