From 3c60f75bbdbfe40c17dfd08fa7b6802ec86cdb01 Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Tue, 23 Apr 2013 12:14:36 +0200 Subject: [PATCH] Rethinking power calculation some. --- plugin.yml | 4 - src/com/massivecraft/factions/ConfServer.java | 1 + src/com/massivecraft/factions/Factions.java | 6 +- src/com/massivecraft/factions/Perm.java | 2 - .../factions/cmd/CmdFactions.java | 2 - .../factions/cmd/CmdFactionsPower.java | 33 -- .../factions/cmd/CmdFactionsPowerBoost.java | 52 +--- .../massivecraft/factions/entity/Faction.java | 33 +- .../massivecraft/factions/entity/MConf.java | 138 +++++++-- .../massivecraft/factions/entity/UConf.java | 20 +- .../massivecraft/factions/entity/UPlayer.java | 281 ++++-------------- .../listeners/FactionsListenerMain.java | 18 +- .../listeners/TodoFactionsPlayerListener.java | 33 +- ...andRewardTask.java => EconRewardTask.java} | 6 +- .../factions/task/PowerUpdateTask.java | 68 +++++ 15 files changed, 283 insertions(+), 414 deletions(-) delete mode 100644 src/com/massivecraft/factions/cmd/CmdFactionsPower.java rename src/com/massivecraft/factions/task/{EconLandRewardTask.java => EconRewardTask.java} (84%) create mode 100644 src/com/massivecraft/factions/task/PowerUpdateTask.java diff --git a/plugin.yml b/plugin.yml index a2980622..8aa9488c 100644 --- a/plugin.yml +++ b/plugin.yml @@ -51,8 +51,6 @@ permissions: factions.officer.any: {description: give or revoke officer rights for any player in any faction} factions.open: {description: switch if invitation is required to join} factions.perm: {description: change faction permissions} - factions.power: {description: show player power info} - factions.power.any: {description: view an other players power level} factions.powerboost: {description: apply permanent power bonus/penalty to specified player or faction} factions.promote: {description: promote lesser members in your faction} factions.relation: {description: set relation wish to another faction} @@ -145,8 +143,6 @@ permissions: factions.money.*: true factions.open: true factions.perm: true - factions.power: true - factions.power.any: true factions.promote: true factions.relation: true factions.seechunk: true diff --git a/src/com/massivecraft/factions/ConfServer.java b/src/com/massivecraft/factions/ConfServer.java index 35e677ef..59c5fe4d 100644 --- a/src/com/massivecraft/factions/ConfServer.java +++ b/src/com/massivecraft/factions/ConfServer.java @@ -80,6 +80,7 @@ public class ConfServer extends SimpleConfig // ASSORTED // -------------------------------------------- // + // TODO: Should this be based on a permission node lookup map? public static double territoryShieldFactor = 0.3; // for claimed areas where further faction-member ownership can be defined diff --git a/src/com/massivecraft/factions/Factions.java b/src/com/massivecraft/factions/Factions.java index db3edb6f..258bfc74 100644 --- a/src/com/massivecraft/factions/Factions.java +++ b/src/com/massivecraft/factions/Factions.java @@ -33,7 +33,8 @@ import com.massivecraft.factions.listeners.FactionsListenerExploit; import com.massivecraft.factions.listeners.FactionsListenerMain; import com.massivecraft.factions.listeners.TodoFactionsPlayerListener; import com.massivecraft.factions.task.AutoLeaveTask; -import com.massivecraft.factions.task.EconLandRewardTask; +import com.massivecraft.factions.task.EconRewardTask; +import com.massivecraft.factions.task.PowerUpdateTask; import com.massivecraft.mcore.MPlugin; import com.massivecraft.mcore.usys.Aspect; @@ -128,8 +129,9 @@ public class Factions extends MPlugin getServer().getPluginManager().registerEvents(this.playerListener, this); // Schedule recurring non-tps-dependent tasks + PowerUpdateTask.get().schedule(this); AutoLeaveTask.get().schedule(this); - EconLandRewardTask.get().schedule(this); + EconRewardTask.get().schedule(this); // Register built in chat modifiers ChatModifierLc.get().register(); diff --git a/src/com/massivecraft/factions/Perm.java b/src/com/massivecraft/factions/Perm.java index f41c096a..08584cf4 100644 --- a/src/com/massivecraft/factions/Perm.java +++ b/src/com/massivecraft/factions/Perm.java @@ -52,8 +52,6 @@ public enum Perm OFFICER_ANY("officer.any"), OPEN("open"), PERM("perm"), - POWER("power"), - POWER_ANY("power.any"), POWERBOOST("powerboost"), PROMOTE("promote"), RELATION("relation"), diff --git a/src/com/massivecraft/factions/cmd/CmdFactions.java b/src/com/massivecraft/factions/cmd/CmdFactions.java index 02d5bb12..e9834ae0 100644 --- a/src/com/massivecraft/factions/cmd/CmdFactions.java +++ b/src/com/massivecraft/factions/cmd/CmdFactions.java @@ -31,7 +31,6 @@ public class CmdFactions extends FCommand public CmdFactionsMoney cmdFactionsMoney = new CmdFactionsMoney(); public CmdFactionsOpen cmdFactionsOpen = new CmdFactionsOpen(); public CmdFactionsPerm cmdFactionsPerm = new CmdFactionsPerm(); - public CmdFactionsPower cmdFactionsPower = new CmdFactionsPower(); public CmdFactionsPowerBoost cmdFactionsPowerBoost = new CmdFactionsPowerBoost(); public CmdFactionsPromote cmdFactionsPromote = new CmdFactionsPromote(); public CmdFactionsRelationAlly cmdFactionsRelationAlly = new CmdFactionsRelationAlly(); @@ -62,7 +61,6 @@ public class CmdFactions extends FCommand this.addSubCommand(HelpCommand.get()); this.addSubCommand(this.cmdFactionsList); this.addSubCommand(this.cmdFactionsShow); - this.addSubCommand(this.cmdFactionsPower); this.addSubCommand(this.cmdFactionsJoin); this.addSubCommand(this.cmdFactionsLeave); this.addSubCommand(this.cmdFactionsHome); diff --git a/src/com/massivecraft/factions/cmd/CmdFactionsPower.java b/src/com/massivecraft/factions/cmd/CmdFactionsPower.java deleted file mode 100644 index 563f6d65..00000000 --- a/src/com/massivecraft/factions/cmd/CmdFactionsPower.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.massivecraft.factions.cmd; - -import com.massivecraft.factions.Perm; -import com.massivecraft.factions.cmd.arg.ARUPlayer; -import com.massivecraft.factions.entity.UPlayer; -import com.massivecraft.mcore.cmd.req.ReqHasPerm; - -public class CmdFactionsPower extends FCommand -{ - - public CmdFactionsPower() - { - this.addAliases("power", "pow"); - - this.addOptionalArg("player", "you"); - - this.addRequirements(ReqHasPerm.get(Perm.POWER.node)); - } - - @Override - public void perform() - { - UPlayer target = this.arg(0, ARUPlayer.getStartAny(fme), fme); - if (target == null) return; - - if (target != fme && ! Perm.POWER_ANY.has(sender, true)) return; - - double powerBoost = target.getPowerBoost(); - String boost = (powerBoost == 0.0) ? "" : (powerBoost > 0.0 ? " (bonus: " : " (penalty: ") + powerBoost + ")"; - msg("%s - Power / Maxpower: %d / %d %s", target.describeTo(fme, true), target.getPowerRounded(), target.getPowerMaxRounded(), boost); - } - -} diff --git a/src/com/massivecraft/factions/cmd/CmdFactionsPowerBoost.java b/src/com/massivecraft/factions/cmd/CmdFactionsPowerBoost.java index 11879497..2e997309 100644 --- a/src/com/massivecraft/factions/cmd/CmdFactionsPowerBoost.java +++ b/src/com/massivecraft/factions/cmd/CmdFactionsPowerBoost.java @@ -2,9 +2,7 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.Factions; import com.massivecraft.factions.Perm; -import com.massivecraft.factions.cmd.arg.ARUPlayer; import com.massivecraft.factions.cmd.arg.ARFaction; -import com.massivecraft.factions.entity.UPlayer; import com.massivecraft.factions.entity.Faction; import com.massivecraft.mcore.cmd.arg.ARDouble; import com.massivecraft.mcore.cmd.req.ReqHasPerm; @@ -15,9 +13,8 @@ public class CmdFactionsPowerBoost extends FCommand { this.addAliases("powerboost"); - this.addRequiredArg("p|f|player|faction"); - this.addRequiredArg("name"); - this.addRequiredArg("#"); + this.addRequiredArg("faction"); + this.addRequiredArg("amount"); this.addRequirements(ReqHasPerm.get(Perm.POWERBOOST.node)); } @@ -25,42 +22,17 @@ public class CmdFactionsPowerBoost extends FCommand @Override public void perform() { - String type = this.arg(0).toLowerCase(); - boolean doPlayer = true; - if (type.equals("f") || type.equals("faction")) - { - doPlayer = false; - } - else if (!type.equals("p") && !type.equals("player")) - { - msg("You must specify \"p\" or \"player\" to target a player or \"f\" or \"faction\" to target a faction."); - msg("ex. /f powerboost p SomePlayer 0.5 -or- /f powerboost f SomeFaction -5"); - return; - } + Faction faction = this.arg(0, ARFaction.get(fme)); + if (faction == null) return; - Double targetPower = this.arg(2, ARDouble.get()); - if (targetPower == null) return; + Double amount = this.arg(1, ARDouble.get()); + if (amount == null) return; - String target; - - if (doPlayer) - { - UPlayer targetPlayer = this.arg(1, ARUPlayer.getStartAny(sender)); - if (targetPlayer == null) return; - - targetPlayer.setPowerBoost(targetPower); - target = "Player \""+targetPlayer.getName()+"\""; - } - else - { - Faction targetFaction = this.arg(1, ARFaction.get(sender)); - if (targetFaction == null) return; - - targetFaction.setPowerBoost(targetPower); - target = "Faction \""+targetFaction.getTag()+"\""; - } - - msg(""+target+" now has a power bonus/penalty of "+targetPower+" to min and max power levels."); - Factions.get().log(fme.getName()+" has set the power bonus/penalty for "+target+" to "+targetPower+"."); + faction.setPowerBoost(amount); + + msg(""+faction.getTag()+" now has a power bonus/penalty of "+amount+" to min and max power levels."); + + // TODO: Inconsistent. Why is there no boolean to toggle this logging of? + Factions.get().log(fme.getName()+" has set the power bonus/penalty for "+faction.getTag()+" to "+amount+"."); } } diff --git a/src/com/massivecraft/factions/entity/Faction.java b/src/com/massivecraft/factions/entity/Faction.java index 09e4bdb8..92ad1e21 100644 --- a/src/com/massivecraft/factions/entity/Faction.java +++ b/src/com/massivecraft/factions/entity/Faction.java @@ -646,44 +646,25 @@ public class Faction extends Entity implements EconomyParticipator public double getPower() { - if (this.getFlag(FFlag.INFPOWER)) - { - return 999999; - } + if (this.getFlag(FFlag.INFPOWER)) return 999999; double ret = 0; for (UPlayer uplayer : this.getUPlayers()) { ret += uplayer.getPower(); } + ret += this.getPowerBoost(); - if (UConf.get(this).powerFactionMax > 0 && ret > UConf.get(this).powerFactionMax) - { - ret = UConf.get(this).powerFactionMax; - } + ret = Math.min(ret, this.getPowerMax()); + ret = Math.max(ret, 0); - return ret + this.getPowerBoost(); + return ret; } public double getPowerMax() { - if (this.getFlag(FFlag.INFPOWER)) - { - return 999999; - } - - double ret = 0; - for (UPlayer uplayer : this.getUPlayers()) - { - ret += uplayer.getPowerMax(); - } - - if (UConf.get(this).powerFactionMax > 0 && ret > UConf.get(this).powerFactionMax) - { - ret = UConf.get(this).powerFactionMax; - } - - return ret + this.getPowerBoost(); + if (this.getFlag(FFlag.INFPOWER)) return 999999; + return UConf.get(this).powerFactionMax + this.getPowerBoost(); } public int getPowerRounded() diff --git a/src/com/massivecraft/factions/entity/MConf.java b/src/com/massivecraft/factions/entity/MConf.java index 906cab15..05d15260 100644 --- a/src/com/massivecraft/factions/entity/MConf.java +++ b/src/com/massivecraft/factions/entity/MConf.java @@ -1,13 +1,20 @@ package com.massivecraft.factions.entity; +import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; import java.util.Set; import org.bukkit.ChatColor; import org.bukkit.event.EventPriority; +import org.bukkit.permissions.PermissionDefault; import com.massivecraft.mcore.store.Entity; +import com.massivecraft.mcore.util.MUtil; +import com.massivecraft.mcore.util.PermUtil; +import com.massivecraft.mcore.util.TimeUnit; public class MConf extends Entity { @@ -19,27 +26,73 @@ public class MConf extends Entity public static MConf get() { return i; } // -------------------------------------------- // - // COLORS + // OVERRIDE: ENTITY // -------------------------------------------- // - public ChatColor colorMember = ChatColor.GREEN; - public ChatColor colorAlly = ChatColor.DARK_PURPLE; - public ChatColor colorTruce = ChatColor.LIGHT_PURPLE; - public ChatColor colorNeutral = ChatColor.WHITE; - public ChatColor colorEnemy = ChatColor.RED; - - public ChatColor colorNoPVP = ChatColor.GOLD; - public ChatColor colorFriendlyFire = ChatColor.DARK_RED; - //public ChatColor colorWilderness = ChatColor.DARK_GREEN; + @Override + public MConf load(MConf that) + { + super.load(that); + + this.upsertPowerPerms(); + + return this; + } // -------------------------------------------- // - // PREFIXES + // POWER // -------------------------------------------- // - public String prefixLeader = "**"; - public String prefixOfficer = "*"; - public String prefixMember = "+"; - public String prefixRecruit = "-"; + public long powerTaskMillis = TimeUnit.MILLIS_PER_MINUTE; + + public Map permToPowerMax = MUtil.map( + "factions.power.max.50", 50.0, + "factions.power.max.40", 40.0, + "factions.power.max.30", 30.0, + "factions.power.max.20", 20.0, + "factions.power.max.10", 10.0, + "factions.power.max.default", 10.0 + ); + + public Map permToPowerMin = MUtil.map( + "factions.power.min.50", 50.0, + "factions.power.min.40", 40.0, + "factions.power.min.30", 30.0, + "factions.power.min.20", 20.0, + "factions.power.min.10", 10.0, + "factions.power.min.default", 10.0 + ); + + public Map permToPowerHour = MUtil.map( + "factions.power.hour.50", 50.0, + "factions.power.hour.40", 40.0, + "factions.power.hour.30", 30.0, + "factions.power.hour.20", 20.0, + "factions.power.hour.10", 10.0, + "factions.power.hour.4", 4.0, + "factions.power.hour.2", 2.0, + "factions.power.hour.default", 2.0 + ); + + public Map permToPowerDeath = MUtil.map( + "factions.power.death.0", 0.0, + "factions.power.death.-2", -2.0, + "factions.power.death.default", -2.0 + ); + + public void upsertPowerPerms() + { + List names = new ArrayList(); + names.addAll(this.permToPowerMax.keySet()); + names.addAll(this.permToPowerMin.keySet()); + names.addAll(this.permToPowerHour.keySet()); + names.addAll(this.permToPowerDeath.keySet()); + + for (String name : names) + { + PermUtil.get(true, true, name, name, PermissionDefault.FALSE); + } + } // -------------------------------------------- // // CHAT @@ -77,27 +130,27 @@ public class MConf extends Entity public Set herochatAlliesWorlds = new HashSet(); // -------------------------------------------- // - // LOGGING + // COLORS // -------------------------------------------- // - public boolean logFactionCreate = true; - public boolean logFactionDisband = true; - public boolean logFactionJoin = true; - public boolean logFactionKick = true; - public boolean logFactionLeave = true; - public boolean logLandClaims = true; - public boolean logLandUnclaims = true; - public boolean logMoneyTransactions = true; - public boolean logPlayerCommands = true; - + public ChatColor colorMember = ChatColor.GREEN; + public ChatColor colorAlly = ChatColor.DARK_PURPLE; + public ChatColor colorTruce = ChatColor.LIGHT_PURPLE; + public ChatColor colorNeutral = ChatColor.WHITE; + public ChatColor colorEnemy = ChatColor.RED; + + public ChatColor colorNoPVP = ChatColor.GOLD; + public ChatColor colorFriendlyFire = ChatColor.DARK_RED; + //public ChatColor colorWilderness = ChatColor.DARK_GREEN; + // -------------------------------------------- // - // EXPLOITS + // PREFIXES // -------------------------------------------- // - public boolean handleExploitObsidianGenerators = true; - public boolean handleExploitEnderPearlClipping = true; - public boolean handleExploitInteractionSpam = true; - public boolean handleExploitTNTWaterlog = false; + public String prefixLeader = "**"; + public String prefixOfficer = "*"; + public String prefixMember = "+"; + public String prefixRecruit = "-"; // -------------------------------------------- // // DERPY OVERRIDES @@ -113,5 +166,28 @@ public class MConf extends Entity public Set worldsNoClaiming = new LinkedHashSet(); public Set worldsNoPowerLoss = new LinkedHashSet(); public Set worldsIgnorePvP = new LinkedHashSet(); + + // -------------------------------------------- // + // EXPLOITS + // -------------------------------------------- // + + public boolean handleExploitObsidianGenerators = true; + public boolean handleExploitEnderPearlClipping = true; + public boolean handleExploitInteractionSpam = true; + public boolean handleExploitTNTWaterlog = false; + + // -------------------------------------------- // + // LOGGING + // -------------------------------------------- // + + public boolean logFactionCreate = true; + public boolean logFactionDisband = true; + public boolean logFactionJoin = true; + public boolean logFactionKick = true; + public boolean logFactionLeave = true; + public boolean logLandClaims = true; + public boolean logLandUnclaims = true; + public boolean logMoneyTransactions = true; + public boolean logPlayerCommands = true; } \ No newline at end of file diff --git a/src/com/massivecraft/factions/entity/UConf.java b/src/com/massivecraft/factions/entity/UConf.java index c7bd32ad..01f27ed6 100644 --- a/src/com/massivecraft/factions/entity/UConf.java +++ b/src/com/massivecraft/factions/entity/UConf.java @@ -47,25 +47,11 @@ public class UConf extends Entity // POWER // -------------------------------------------- // - public double powerMax = 10.0; - public double powerMin = -10.0; - public double powerStarting = 10.0; // New players start out with this power level + // TODO: Group default values together? - public double powerPerDeath = -4.0; // A death makes you lose 4 power + public double powerPlayerDefault = 0.0; - public double powerPerHourOnline = 10.0; - public double powerPerHourOffline = 0.0; - - // players will no longer lose power from being offline once their power drops to this amount or less - public double powerLimitGainOnline = 10.0; - public double powerLimitGainOffline = 0.0; - public double powerLimitLossOnline = -10.0; - public double powerLimitLossOffline = 0.0; - - public boolean scaleNegativePower = false; // Power regeneration rate increase as power decreases - public double scaleNegativeDivisor = 40.0; // Divisor for inverse power regeneration curve - - public double powerFactionMax = 0.0; // if greater than 0, the cap on how much power a faction can have (additional power from players beyond that will act as a "buffer" of sorts) + public double powerFactionMax = 1000.0; // -------------------------------------------- // // DENY COMMANDS diff --git a/src/com/massivecraft/factions/entity/UPlayer.java b/src/com/massivecraft/factions/entity/UPlayer.java index d6843ba9..3a8735c4 100644 --- a/src/com/massivecraft/factions/entity/UPlayer.java +++ b/src/com/massivecraft/factions/entity/UPlayer.java @@ -18,8 +18,6 @@ import com.massivecraft.factions.RelationParticipator; import com.massivecraft.factions.event.FactionsEventLandClaim; import com.massivecraft.factions.event.FactionsEventMembershipChange; import com.massivecraft.factions.event.FactionsEventMembershipChange.MembershipChangeReason; -import com.massivecraft.factions.event.FactionsEventPowerChange; -import com.massivecraft.factions.event.FactionsEventPowerChange.PowerChangeReason; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.LWCFeatures; import com.massivecraft.factions.integration.Worldguard; @@ -28,8 +26,6 @@ import com.massivecraft.mcore.mixin.Mixin; import com.massivecraft.mcore.money.Money; import com.massivecraft.mcore.ps.PS; import com.massivecraft.mcore.store.SenderEntity; -import com.massivecraft.mcore.util.MUtil; -import com.massivecraft.mcore.util.TimeUnit; import com.massivecraft.mcore.util.Txt; @@ -54,10 +50,7 @@ public class UPlayer extends SenderEntity implements EconomyParticipato this.setFactionId(that.factionId); this.setRole(that.role); this.setTitle(that.title); - this.setPowerBoost(that.powerBoost); - - this.power = that.power; - this.lastPowerUpdateTime = that.lastPowerUpdateTime; + this.setPower(that.power); return this; } @@ -65,14 +58,13 @@ public class UPlayer extends SenderEntity implements EconomyParticipato @Override public boolean isDefault() { + // TODO: What if I incorporated the "default" word into the system? + // Rename?: hasFaction --> isFactionDefault + if (this.hasFaction()) return false; - - // Note: we do not check role or title here since they mean nothing without a faction. - - // TODO: This line looks obnoxious, investigate it. - if (this.getPowerRounded() != this.getPowerMaxRounded() && this.getPowerRounded() != (int) Math.round(UConf.get(this).powerStarting)) return false; - - if (this.hasPowerBoost()) return false; + // Role means nothing without a faction. + // Title means nothing without a faction. + if (this.getPowerRounded() != (int) Math.round(UConf.get(this).powerPlayerDefault)) return false; return true; } @@ -84,38 +76,30 @@ public class UPlayer extends SenderEntity implements EconomyParticipato // Each field has it's own section further down since just the getter and setter logic takes up quite some place. // This is a foreign key. - // A players always belongs to a faction. - // If null the player belongs to the no-faction faction called Wilderness. + // Each player belong to a faction. + // Null means default which is the no-faction faction called Wilderness. private String factionId = null; // What role does the player have in the faction? - // The default value here is MEMBER since that one would be one of the most common ones and our goal is to save database space. - // A note to self is that we can not change it from member to anything else just because we feel like it, that would corrupt database content. + // Null means default which is the default value for the universe. private Rel role = null; // What title does the player have in the faction? - // The title is just for fun. It's completely meaningless. + // The title is just for fun. It's not connected to any game mechanic. // The default case is no title since it's what you start with and also the most common case. // The player title is similar to the faction description. // // Question: Can the title contain chat colors? // Answer: Yes but in such case the policy is that they already must be parsed using Txt.parse. - // If they contain markup it should not be parsed in case we coded the system correctly. + // If the title contains raw markup, such as "" instead of "§f" it will not be parsed and "" will be displayed. private String title = null; - // Player usually do not have a powerboost. It defaults to 0. - // The powerBoost is a custom increase/decrease to default and maximum power. - // Note that player powerBoost and faction powerBoost are very similar. - private Double powerBoost = null; - - // This field contains the last calculated value of the players power. - // The power calculation is lazy which means that the power is calculated first when you try to view the value. + // Each player has an individual power level. + // The power level for online players is occasionally updated by a recurring task and the power should stay the same for offline players. + // For that reason the value is to be considered correct when you pick it. Do not call the power update method. + // Null means default which is the default value for the universe. private Double power = null; - // This is the timestamp for the last calculation of the power. - // The value is used for the lazy calculation described above. - private long lastPowerUpdateTime = System.currentTimeMillis(); - // -------------------------------------------- // // FIELDS: RAW TRANSIENT // -------------------------------------------- // @@ -142,16 +126,9 @@ public class UPlayer extends SenderEntity implements EconomyParticipato public String getAccountId() { return this.getId(); } // -------------------------------------------- // - // CONSTRUCT + // CORE UTILITIES // -------------------------------------------- // - // GSON need this noarg constructor. - public UPlayer() - { - this.resetFactionData(); - //this.power = ConfServer.powerStarting; - } - public void resetFactionData() { // The default neutral faction @@ -162,6 +139,37 @@ public class UPlayer extends SenderEntity implements EconomyParticipato this.autoClaimFor = null; } + /* + public boolean isPresent(boolean requireFetchable) + { + if (!this.isOnline()) return false; + + if (requireFetchable) + { + + } + else + { + + } + + PS ps = Mixin.getSenderPs(this.getId()); + if (ps == null) return false; + + String psUniverse = Factions.get().getMultiverse().getUniverseForWorldName(ps.getWorld()); + if (!psUniverse.equals(this.getUniverse())) return false; + + if (!requireFetchable) return true; + + Player player = this.getPlayer(); + if (player == null) return false; + + if (player.isDead()) return false; + + return true; + } + */ + // -------------------------------------------- // // FIELD: factionId // -------------------------------------------- // @@ -281,49 +289,6 @@ public class UPlayer extends SenderEntity implements EconomyParticipato this.changed(); } - // -------------------------------------------- // - // FIELD: powerBoost - // -------------------------------------------- // - - public double getPowerBoost() - { - Double ret = this.powerBoost; - if (ret == null) ret = 0D; - return ret; - } - - public void setPowerBoost(Double powerBoost) - { - if (powerBoost == null || powerBoost == 0) - { - powerBoost = null; - } - this.powerBoost = powerBoost; - this.changed(); - } - - public boolean hasPowerBoost() - { - return this.getPowerBoost() != 0D; - } - - // -------------------------------------------- // - // FIELD: lastPowerUpdateTime - // -------------------------------------------- // - - // RAW - - public long getLastPowerUpdateTime() - { - return this.lastPowerUpdateTime; - } - - public void setLastPowerUpdateTime(long lastPowerUpdateTime) - { - this.lastPowerUpdateTime = lastPowerUpdateTime; - this.changed(); - } - // -------------------------------------------- // // FIELD: power // -------------------------------------------- // @@ -332,144 +297,24 @@ public class UPlayer extends SenderEntity implements EconomyParticipato public double getPower() { - this.recalculatePower(); Double ret = this.power; - if (ret == null) ret = UConf.get(this).powerStarting; + if (ret == null) ret = UConf.get(this).powerPlayerDefault; return ret; } - public void setPower(double power) + public void setPower(Double power) { - this.setPower(power, System.currentTimeMillis()); - } - - public void setPower(double power, long now) - { - power = Math.min(power, this.getPowerMax()); - power = Math.max(power, this.getPowerMin()); - - // Nochange - if (MUtil.equals(this.power, Double.valueOf(power))) return; - - this.power = power; - this.setLastPowerUpdateTime(now); + if (power == null || power == UConf.get(this).powerPlayerDefault) + { + this.power = null; + } + else + { + this.power = power; + } this.changed(); } - public double getPowerMax() - { - return UConf.get(this).powerMax + this.getPowerBoost(); - } - - public double getPowerMin() - { - return UConf.get(this).powerMin + this.getPowerBoost(); - } - - public void recalculatePower() - { - this.recalculatePower(this.isOnline()); - } - - private static final transient long POWER_RECALCULATION_MINIMUM_WAIT_MILLIS = 10 * TimeUnit.MILLIS_PER_SECOND; - public void recalculatePower(boolean online) - { - // Is the player really on this server? - // We use the sender ps mixin to fetch the current player location. - // If the PS is null it's OK. We assume the player is here if we do not know. - PS ps = Mixin.getSenderPs(this.getId()); - if (ps != null && !ps.isWorldLoadedOnThisServer()) return; - - // Get the now - long now = System.currentTimeMillis(); - - // We will only update if a certain amount of time has passed. - if (this.getLastPowerUpdateTime() + POWER_RECALCULATION_MINIMUM_WAIT_MILLIS >= now) return; - - // Calculate millis passed - long millisPassed = now - this.getLastPowerUpdateTime(); - - // Note that we updated - this.setLastPowerUpdateTime(now); - - // We consider dead players and players in other universes offline. - if (online) - { - Player thisPlayer = this.getPlayer(); - online = (thisPlayer != null && !thisPlayer.isDead() && UPlayer.get(thisPlayer) == this); - } - - // Cache and prepare - UConf uconf = UConf.get(this); - double powerCurrent; - if (this.power != null) - { - powerCurrent = this.power; - } - else - { - powerCurrent = uconf.powerStarting; - } - - // Depending on online state pick the config values - double powerPerHour = online ? uconf.powerPerHourOnline : uconf.powerPerHourOffline; - double powerLimitGain = online ? uconf.powerLimitGainOnline : uconf.powerLimitGainOffline; - double powerLimitLoss = online ? uconf.powerLimitLossOnline : uconf.powerLimitLossOffline; - - // Apply the negative divisor thingy - if (uconf.scaleNegativePower && powerCurrent < 0) - { - powerPerHour += (Math.sqrt(Math.abs(powerCurrent)) * Math.abs(powerCurrent)) / uconf.scaleNegativeDivisor; - } - - // Calculate delta and target - double powerDelta = powerPerHour * millisPassed / TimeUnit.MILLIS_PER_HOUR; - double powerTarget = powerCurrent + powerDelta; - - // Check Gain and Loss limits - if (powerDelta >= 0) - { - // Gain - if (powerTarget > powerLimitGain) - { - if (powerCurrent > powerLimitGain) - { - // Did already cross --> Just freeze - powerTarget = powerCurrent; - } - else - { - // Crossing right now --> Snap to limit - powerTarget = powerLimitGain; - } - } - } - else - { - // Loss - if (powerTarget < powerLimitLoss) - { - if (powerCurrent < powerLimitLoss) - { - // Did already cross --> Just freeze - powerTarget = powerCurrent; - } - else - { - // Crossing right now --> Snap to limit - powerTarget = powerLimitLoss; - } - } - } - - FactionsEventPowerChange event = new FactionsEventPowerChange(null, this, PowerChangeReason.TIME, powerTarget); - event.run(); - if (event.isCancelled()) return; - powerTarget = event.getNewPower(); - - this.setPower(powerTarget, now); - } - // FINER public int getPowerRounded() @@ -477,16 +322,6 @@ public class UPlayer extends SenderEntity implements EconomyParticipato return (int) Math.round(this.getPower()); } - public int getPowerMaxRounded() - { - return (int) Math.round(this.getPowerMax()); - } - - public int getPowerMinRounded() - { - return (int) Math.round(this.getPowerMin()); - } - // -------------------------------------------- // // TITLE, NAME, FACTION TAG AND CHAT // -------------------------------------------- // diff --git a/src/com/massivecraft/factions/listeners/FactionsListenerMain.java b/src/com/massivecraft/factions/listeners/FactionsListenerMain.java index 8c618c8d..f913d5ab 100644 --- a/src/com/massivecraft/factions/listeners/FactionsListenerMain.java +++ b/src/com/massivecraft/factions/listeners/FactionsListenerMain.java @@ -59,6 +59,7 @@ import com.massivecraft.factions.event.FactionsEventPowerChange.PowerChangeReaso import com.massivecraft.factions.util.VisualizeUtil; import com.massivecraft.mcore.ps.PS; import com.massivecraft.mcore.util.MUtil; +import com.massivecraft.mcore.util.PermUtil; import com.massivecraft.mcore.util.Txt; public class FactionsListenerMain implements Listener @@ -106,18 +107,26 @@ public class FactionsListenerMain implements Listener return; } - // ... Event ... - double newPower = uplayer.getPower() + UConf.get(uplayer).powerPerDeath; + // ... alter the power ... + double maxPower = PermUtil.pickFirstVal(player, MConf.get().permToPowerMax); + double minPower = PermUtil.pickFirstVal(player, MConf.get().permToPowerMin); + double deathPower = PermUtil.pickFirstVal(player, MConf.get().permToPowerDeath); + double oldPower = uplayer.getPower(); + + double newPower = oldPower + deathPower; + newPower = Math.max(newPower, minPower); + newPower = Math.min(newPower, maxPower); + FactionsEventPowerChange powerChangeEvent = new FactionsEventPowerChange(null, uplayer, PowerChangeReason.DEATH, newPower); powerChangeEvent.run(); if (powerChangeEvent.isCancelled()) return; newPower = powerChangeEvent.getNewPower(); - // ... alter the power ... uplayer.setPower(newPower); // ... and inform the player. - uplayer.msg("Your power is now %d / %d", uplayer.getPowerRounded(), uplayer.getPowerMaxRounded()); + // TODO: A progress bar here would be epic :) + uplayer.msg("Your power is now %.2f / %.2f", newPower, maxPower); } // -------------------------------------------- // @@ -578,7 +587,6 @@ public class FactionsListenerMain implements Listener event.setCancelled(true); } - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void blockBuild(BlockPistonExtendEvent event) diff --git a/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java b/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java index d874b006..91739826 100644 --- a/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java +++ b/src/com/massivecraft/factions/listeners/TodoFactionsPlayerListener.java @@ -10,7 +10,6 @@ import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import com.massivecraft.factions.Const; @@ -21,7 +20,6 @@ import com.massivecraft.factions.entity.Faction; import com.massivecraft.factions.entity.UPlayer; import com.massivecraft.factions.entity.MConf; import com.massivecraft.factions.entity.UPlayerColls; -import com.massivecraft.mcore.event.MCorePlayerLeaveEvent; import com.massivecraft.mcore.ps.PS; import com.massivecraft.mcore.util.MUtil; import com.massivecraft.mcore.util.Txt; @@ -29,30 +27,9 @@ import com.massivecraft.mcore.util.Txt; public class TodoFactionsPlayerListener implements Listener { - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerJoin(PlayerJoinEvent event) - { - // If a player is joining the server ... - Player player = event.getPlayer(); - UPlayer uplayer = UPlayer.get(player); - - // ... recalculate their power as if they were offline since last recalculation. - uplayer.recalculatePower(false); - // TODO: What about the other universes? - // TODO: Track world --> world travel as logging on and off. - } - - @EventHandler(priority = EventPriority.NORMAL) - public void onPlayerLeave(MCorePlayerLeaveEvent event) - { - Player player = event.getPlayer(); - UPlayer uplayer = UPlayer.get(player); - - // Recalculate the power before the player leaves. - // This is required since we recalculate as if the player were offline when they log back in. - // TODO: When I setup universes I must do this for all universe instance of the player that logs off! - uplayer.recalculatePower(true); - } + // -------------------------------------------- // + // TERRITORY INFO MESSAGES + // -------------------------------------------- // @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) @@ -105,6 +82,10 @@ public class TodoFactionsPlayerListener implements Listener } } + // -------------------------------------------- // + // ASSORTED BUILD AND INTERACT + // -------------------------------------------- // + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerInteract(PlayerInteractEvent event) { diff --git a/src/com/massivecraft/factions/task/EconLandRewardTask.java b/src/com/massivecraft/factions/task/EconRewardTask.java similarity index 84% rename from src/com/massivecraft/factions/task/EconLandRewardTask.java rename to src/com/massivecraft/factions/task/EconRewardTask.java index f2367078..6950b864 100644 --- a/src/com/massivecraft/factions/task/EconLandRewardTask.java +++ b/src/com/massivecraft/factions/task/EconRewardTask.java @@ -6,14 +6,14 @@ import com.massivecraft.factions.entity.FactionColls; import com.massivecraft.mcore.ModuloRepeatTask; import com.massivecraft.mcore.util.TimeUnit; -public class EconLandRewardTask extends ModuloRepeatTask +public class EconRewardTask extends ModuloRepeatTask { // -------------------------------------------- // // INSTANCE & CONSTRUCT // -------------------------------------------- // - private static EconLandRewardTask i = new EconLandRewardTask(); - public static EconLandRewardTask get() { return i; } + private static EconRewardTask i = new EconRewardTask(); + public static EconRewardTask get() { return i; } // -------------------------------------------- // // OVERRIDE: MODULO REPEAT TASK diff --git a/src/com/massivecraft/factions/task/PowerUpdateTask.java b/src/com/massivecraft/factions/task/PowerUpdateTask.java new file mode 100644 index 00000000..d8ac5357 --- /dev/null +++ b/src/com/massivecraft/factions/task/PowerUpdateTask.java @@ -0,0 +1,68 @@ +package com.massivecraft.factions.task; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import com.massivecraft.factions.entity.MConf; +import com.massivecraft.factions.entity.UPlayer; +import com.massivecraft.factions.event.FactionsEventPowerChange; +import com.massivecraft.factions.event.FactionsEventPowerChange.PowerChangeReason; +import com.massivecraft.mcore.ModuloRepeatTask; +import com.massivecraft.mcore.util.PermUtil; +import com.massivecraft.mcore.util.TimeUnit; + +public class PowerUpdateTask extends ModuloRepeatTask +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static PowerUpdateTask i = new PowerUpdateTask(); + public static PowerUpdateTask get() { return i; } + + // -------------------------------------------- // + // OVERRIDE: MODULO REPEAT TASK + // -------------------------------------------- // + + @Override + public long getDelayMillis() + { + return MConf.get().powerTaskMillis; + } + + @Override + public void setDelayMillis(long delayMillis) + { + MConf.get().powerTaskMillis = delayMillis; + } + + @Override + public void invoke() + { + long millis = this.getDelayMillis(); + + for (Player player : Bukkit.getOnlinePlayers()) + { + if (player.isDead()) continue; + + double maxPower = PermUtil.pickFirstVal(player, MConf.get().permToPowerMax); + double minPower = PermUtil.pickFirstVal(player, MConf.get().permToPowerMin); + double hourPower = PermUtil.pickFirstVal(player, MConf.get().permToPowerHour); + + UPlayer uplayer = UPlayer.get(player); + double oldPower = uplayer.getPower(); + + double newPower = oldPower + hourPower * millis / TimeUnit.MILLIS_PER_HOUR; + newPower = Math.max(newPower, minPower); + newPower = Math.min(newPower, maxPower); + + FactionsEventPowerChange event = new FactionsEventPowerChange(null, uplayer, PowerChangeReason.TIME, newPower); + event.run(); + if (event.isCancelled()) continue; + newPower = event.getNewPower(); + + uplayer.setPower(newPower); + } + } + +}