forked from Upstream/mmocore
New options for combat mode
This commit is contained in:
parent
07a61b900e
commit
cebbfcf5c8
@ -44,7 +44,7 @@ public class PvpModeCommand extends RegisteredCommand {
|
||||
// Toggling on when in PVP region
|
||||
if (playerData.getCombat().isInPvpMode() &&
|
||||
MythicLib.plugin.getFlags().isFlagAllowed(playerData.getPlayer(), CustomFlag.PVP_MODE)) {
|
||||
playerData.getCombat().applyInvulnerability();
|
||||
playerData.getCombat().preventPvp();
|
||||
MMOCore.plugin.configManager.getSimpleMessage("pvp-mode.toggle.on-invulnerable", "time",
|
||||
MythicLib.plugin.getMMOConfig().decimal.format(MMOCore.plugin.configManager.pvpModeInvulnerability)).send(playerData.getPlayer());
|
||||
|
||||
|
@ -13,6 +13,7 @@ import io.lumine.mythic.lib.comp.flags.CustomFlag;
|
||||
import io.lumine.mythic.lib.comp.flags.WorldGuardFlags;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import net.Indyuce.mmocore.command.PvpModeCommand;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@ -77,6 +78,9 @@ public class PvPModeHandler extends FlagValueChangeHandler<State> {
|
||||
|
||||
if (!newPvpMode && lastPvpMode) {
|
||||
|
||||
// Apply cooldown
|
||||
playerData.getMMOPlayerData().getCooldownMap().applyCooldown(PvpModeCommand.COOLDOWN_KEY, MMOCore.plugin.configManager.pvpModeRegionLeaveCooldown);
|
||||
|
||||
// Send message
|
||||
if (canSendMessage()) {
|
||||
final String msgPath = (playerData.getCombat().isInPvpMode() && !playerData.getCombat().canQuitPvpMode()) ? "allowed" : "denied";
|
||||
@ -87,10 +91,13 @@ public class PvPModeHandler extends FlagValueChangeHandler<State> {
|
||||
}
|
||||
} else if (newPvpMode && !lastPvpMode) {
|
||||
|
||||
// Apply cooldown
|
||||
playerData.getMMOPlayerData().getCooldownMap().applyCooldown(PvpModeCommand.COOLDOWN_KEY, MMOCore.plugin.configManager.pvpModeRegionEnterCooldown);
|
||||
|
||||
// Apply invulnerability
|
||||
final boolean applyInvulnerability = playerData.getCombat().isInPvpMode() && playerData.getCombat().canQuitPvpMode();
|
||||
if (applyInvulnerability)
|
||||
playerData.getCombat().applyInvulnerability();
|
||||
playerData.getCombat().preventPvp();
|
||||
|
||||
// Send message
|
||||
if (canSendMessage()) {
|
||||
|
@ -5,6 +5,7 @@ import com.sk89q.worldguard.bukkit.protection.events.DisallowedPVPEvent;
|
||||
import io.lumine.mythic.lib.MythicLib;
|
||||
import io.lumine.mythic.lib.comp.flags.CustomFlag;
|
||||
import io.lumine.mythic.lib.comp.interaction.InteractionType;
|
||||
import net.Indyuce.mmocore.MMOCore;
|
||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.event.EventHandler;
|
||||
@ -17,13 +18,25 @@ public class PvPModeListener implements Listener {
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void unblockPvp(DisallowedPVPEvent event) {
|
||||
PlayerData defender;
|
||||
if (!PlayerData.get(event.getAttacker()).getCombat().isInPvpMode() || !(defender = PlayerData.get(event.getDefender())).getCombat().isInPvpMode())
|
||||
PlayerData defender, attacker;
|
||||
if (!(attacker = PlayerData.get(event.getAttacker())).getCombat().isInPvpMode() || !(defender = PlayerData.get(event.getDefender())).getCombat().isInPvpMode())
|
||||
return;
|
||||
|
||||
if (!defender.getCombat().canQuitPvpMode() ||
|
||||
(!defender.getCombat().isInvulnerable() && MythicLib.plugin.getFlags().isFlagAllowed(event.getDefender().getLocation(), CustomFlag.PVP_MODE)))
|
||||
if (MythicLib.plugin.getEntities().checkPvpInteractionRules(event.getAttacker(), event.getDefender(), InteractionType.OFFENSE_ACTION, true))
|
||||
event.setCancelled(true);
|
||||
// If defender is out of combat
|
||||
if (!defender.getCombat().canPvp())
|
||||
return;
|
||||
|
||||
// If attacker cannot deal damage yet
|
||||
if (!MMOCore.plugin.configManager.pvpModeInvulnerabilityCanDamage && !attacker.getCombat().canPvp())
|
||||
return;
|
||||
|
||||
// Defender is still fighting and cannot leave PvP mode
|
||||
if (!defender.getCombat().canQuitPvpMode())
|
||||
event.setCancelled(true);
|
||||
|
||||
// Enable PvP if accepted
|
||||
else if (MythicLib.plugin.getFlags().isFlagAllowed(event.getDefender().getLocation(), CustomFlag.PVP_MODE) &&
|
||||
MythicLib.plugin.getEntities().checkPvpInteractionRules(event.getAttacker(), event.getDefender(), InteractionType.OFFENSE_ACTION, true))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
@ -27,11 +27,12 @@ import java.util.logging.Level;
|
||||
public class ConfigManager {
|
||||
public final CommandVerbose commandVerbose = new CommandVerbose();
|
||||
|
||||
public boolean overrideVanillaExp, canCreativeCast, passiveSkillNeedBound, cobbleGeneratorXP, saveDefaultClassInfo, attributesAsClassInfo, splitProfessionExp, disableQuestBossBar, pvpModeEnabled;
|
||||
public boolean overrideVanillaExp, canCreativeCast, passiveSkillNeedBound, cobbleGeneratorXP, saveDefaultClassInfo, attributesAsClassInfo, splitProfessionExp, disableQuestBossBar, pvpModeEnabled, pvpModeInvulnerabilityCanDamage;
|
||||
public String partyChatPrefix, noSkillBoundPlaceholder;
|
||||
public ChatColor staminaFull, staminaHalf, staminaEmpty;
|
||||
public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown;
|
||||
public double lootChestsChanceWeight, dropItemsChanceWeight, fishingDropsChanceWeight, partyMaxExpSplitRange, pvpModeToggleOnCooldown, pvpModeToggleOffCooldown, pvpModeCombatCooldown, pvpModeCombatTimeout, pvpModeInvulnerability;
|
||||
public double lootChestsChanceWeight, dropItemsChanceWeight, fishingDropsChanceWeight, partyMaxExpSplitRange, pvpModeToggleOnCooldown, pvpModeToggleOffCooldown, pvpModeCombatCooldown, pvpModeCombatTimeout, pvpModeInvulnerability,
|
||||
pvpModeRegionEnterCooldown, pvpModeRegionLeaveCooldown;
|
||||
public int maxPartyLevelDifference, maxBoundActiveSkills, maxBoundPassiveSkills;
|
||||
public final List<EntityDamageEvent.DamageCause> combatLogDamageCauses = new ArrayList<>();
|
||||
|
||||
@ -136,8 +137,11 @@ public class ConfigManager {
|
||||
pvpModeToggleOnCooldown = config.getDouble("pvp_mode.cooldown.toggle_on");
|
||||
pvpModeToggleOffCooldown = config.getDouble("pvp_mode.cooldown.toggle_off");
|
||||
pvpModeCombatCooldown = config.getDouble("pvp_mode.cooldown.combat");
|
||||
pvpModeRegionEnterCooldown = config.getDouble("pvp_mode.cooldown.region_enter");
|
||||
pvpModeRegionLeaveCooldown = config.getDouble("pvp_mode.cooldown.region_leave");
|
||||
pvpModeCombatTimeout = config.getDouble("pvp_mode.combat_timeout");
|
||||
pvpModeInvulnerability = config.getDouble("pvp_mode.invulnerability");
|
||||
pvpModeInvulnerability = config.getDouble("pvp_mode.invulnerability.time");
|
||||
pvpModeInvulnerabilityCanDamage = config.getBoolean("pvp_mode.invulnerability.can_damage");
|
||||
|
||||
// Resources
|
||||
staminaFull = getColorOrDefault("stamina-whole", ChatColor.GREEN);
|
||||
|
@ -14,8 +14,7 @@ public class CombatHandler implements Closable {
|
||||
private final PlayerData player;
|
||||
private final long firstHit = System.currentTimeMillis();
|
||||
|
||||
private long lastHit = System.currentTimeMillis();
|
||||
private long lastInvulnerabilityApplication;
|
||||
private long lastHit = System.currentTimeMillis(), lastToggle;
|
||||
|
||||
private boolean pvpMode;
|
||||
|
||||
@ -28,6 +27,7 @@ public class CombatHandler implements Closable {
|
||||
|
||||
public void update() {
|
||||
lastHit = System.currentTimeMillis();
|
||||
lastToggle = 0;
|
||||
player.getMMOPlayerData().getCooldownMap().applyCooldown(PvpModeCommand.COOLDOWN_KEY, MMOCore.plugin.configManager.pvpModeCombatCooldown);
|
||||
|
||||
// Simply refreshing
|
||||
@ -68,17 +68,18 @@ public class CombatHandler implements Closable {
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used for PvP mode invulnerability when a player
|
||||
* joins a region while he still has PvP mode toggled on.
|
||||
* This is used for PvP mode inactivity when a player
|
||||
* joins a region with PvP mode toggled on, OR toggles on
|
||||
* PvP mode using the command when standing in a PvP region.
|
||||
*
|
||||
* @return If the player is invulnerable
|
||||
* @return If the player is inert i.e if he CAN hit/take damage
|
||||
*/
|
||||
public boolean isInvulnerable() {
|
||||
return System.currentTimeMillis() < lastInvulnerabilityApplication + MMOCore.plugin.configManager.pvpModeInvulnerability * 1000;
|
||||
public boolean canPvp() {
|
||||
return System.currentTimeMillis() > lastToggle + MMOCore.plugin.configManager.pvpModeInvulnerability * 1000;
|
||||
}
|
||||
|
||||
public void applyInvulnerability() {
|
||||
lastInvulnerabilityApplication = System.currentTimeMillis();
|
||||
public void preventPvp() {
|
||||
lastToggle = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public boolean canQuitPvpMode() {
|
||||
|
@ -296,16 +296,35 @@ pvp_mode:
|
||||
enabled: true
|
||||
|
||||
# Delay after any attack during which the player will stay in PvP Mode (seconds)
|
||||
# Has to be lower than 'cooldown.combat'
|
||||
combat_timeout: 30
|
||||
|
||||
# Invulnerability when entering a pvp-mode region when your PvP mode is toggled on.
|
||||
invulnerability: 60
|
||||
# Invulnerability triggered when:
|
||||
# - entering a PvP region with PvP mode turned on.
|
||||
# - using the /pvpmode command inside of a PvP region.
|
||||
invulnerability:
|
||||
time: 60
|
||||
|
||||
# When enabled, players can hit other players to
|
||||
# end their invulnerability state.
|
||||
can_damage: false
|
||||
|
||||
cooldown:
|
||||
# Delay before being able to use /pvpmode after being in combat (seconds)
|
||||
# Has to be greater than the combat timeout for it to make sense
|
||||
|
||||
# Cooldown before being able to use the /pvpmode
|
||||
# command when entering a PvP mode region.
|
||||
region_enter: 20
|
||||
|
||||
# Cooldown before being able to use the /pvpmode
|
||||
# command when entering a PvP mode region.
|
||||
region_leave: 20
|
||||
|
||||
# Delay before being able to use /pvpmode after being in combat (seconds).
|
||||
# Has to be greater than the 'combat_timeout'
|
||||
combat: 45
|
||||
|
||||
# Cooldown when toggling on PvP mode, before being able to toggle it off (seconds)
|
||||
toggle_on: 5
|
||||
|
||||
# Cooldown when toggling off PvP mode (seconds)
|
||||
toggle_off: 3
|
Loading…
Reference in New Issue
Block a user