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
|
// Toggling on when in PVP region
|
||||||
if (playerData.getCombat().isInPvpMode() &&
|
if (playerData.getCombat().isInPvpMode() &&
|
||||||
MythicLib.plugin.getFlags().isFlagAllowed(playerData.getPlayer(), CustomFlag.PVP_MODE)) {
|
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",
|
MMOCore.plugin.configManager.getSimpleMessage("pvp-mode.toggle.on-invulnerable", "time",
|
||||||
MythicLib.plugin.getMMOConfig().decimal.format(MMOCore.plugin.configManager.pvpModeInvulnerability)).send(playerData.getPlayer());
|
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 io.lumine.mythic.lib.comp.flags.WorldGuardFlags;
|
||||||
import net.Indyuce.mmocore.MMOCore;
|
import net.Indyuce.mmocore.MMOCore;
|
||||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||||
|
import net.Indyuce.mmocore.command.PvpModeCommand;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
@ -77,6 +78,9 @@ public class PvPModeHandler extends FlagValueChangeHandler<State> {
|
|||||||
|
|
||||||
if (!newPvpMode && lastPvpMode) {
|
if (!newPvpMode && lastPvpMode) {
|
||||||
|
|
||||||
|
// Apply cooldown
|
||||||
|
playerData.getMMOPlayerData().getCooldownMap().applyCooldown(PvpModeCommand.COOLDOWN_KEY, MMOCore.plugin.configManager.pvpModeRegionLeaveCooldown);
|
||||||
|
|
||||||
// Send message
|
// Send message
|
||||||
if (canSendMessage()) {
|
if (canSendMessage()) {
|
||||||
final String msgPath = (playerData.getCombat().isInPvpMode() && !playerData.getCombat().canQuitPvpMode()) ? "allowed" : "denied";
|
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) {
|
} else if (newPvpMode && !lastPvpMode) {
|
||||||
|
|
||||||
|
// Apply cooldown
|
||||||
|
playerData.getMMOPlayerData().getCooldownMap().applyCooldown(PvpModeCommand.COOLDOWN_KEY, MMOCore.plugin.configManager.pvpModeRegionEnterCooldown);
|
||||||
|
|
||||||
// Apply invulnerability
|
// Apply invulnerability
|
||||||
final boolean applyInvulnerability = playerData.getCombat().isInPvpMode() && playerData.getCombat().canQuitPvpMode();
|
final boolean applyInvulnerability = playerData.getCombat().isInPvpMode() && playerData.getCombat().canQuitPvpMode();
|
||||||
if (applyInvulnerability)
|
if (applyInvulnerability)
|
||||||
playerData.getCombat().applyInvulnerability();
|
playerData.getCombat().preventPvp();
|
||||||
|
|
||||||
// Send message
|
// Send message
|
||||||
if (canSendMessage()) {
|
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.MythicLib;
|
||||||
import io.lumine.mythic.lib.comp.flags.CustomFlag;
|
import io.lumine.mythic.lib.comp.flags.CustomFlag;
|
||||||
import io.lumine.mythic.lib.comp.interaction.InteractionType;
|
import io.lumine.mythic.lib.comp.interaction.InteractionType;
|
||||||
|
import net.Indyuce.mmocore.MMOCore;
|
||||||
import net.Indyuce.mmocore.api.player.PlayerData;
|
import net.Indyuce.mmocore.api.player.PlayerData;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@ -17,13 +18,25 @@ public class PvPModeListener implements Listener {
|
|||||||
|
|
||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
public void unblockPvp(DisallowedPVPEvent event) {
|
public void unblockPvp(DisallowedPVPEvent event) {
|
||||||
PlayerData defender;
|
PlayerData defender, attacker;
|
||||||
if (!PlayerData.get(event.getAttacker()).getCombat().isInPvpMode() || !(defender = PlayerData.get(event.getDefender())).getCombat().isInPvpMode())
|
if (!(attacker = PlayerData.get(event.getAttacker())).getCombat().isInPvpMode() || !(defender = PlayerData.get(event.getDefender())).getCombat().isInPvpMode())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!defender.getCombat().canQuitPvpMode() ||
|
// If defender is out of combat
|
||||||
(!defender.getCombat().isInvulnerable() && MythicLib.plugin.getFlags().isFlagAllowed(event.getDefender().getLocation(), CustomFlag.PVP_MODE)))
|
if (!defender.getCombat().canPvp())
|
||||||
if (MythicLib.plugin.getEntities().checkPvpInteractionRules(event.getAttacker(), event.getDefender(), InteractionType.OFFENSE_ACTION, true))
|
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);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,11 +27,12 @@ import java.util.logging.Level;
|
|||||||
public class ConfigManager {
|
public class ConfigManager {
|
||||||
public final CommandVerbose commandVerbose = new CommandVerbose();
|
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 String partyChatPrefix, noSkillBoundPlaceholder;
|
||||||
public ChatColor staminaFull, staminaHalf, staminaEmpty;
|
public ChatColor staminaFull, staminaHalf, staminaEmpty;
|
||||||
public long combatLogTimer, lootChestExpireTime, lootChestPlayerCooldown, globalSkillCooldown;
|
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 int maxPartyLevelDifference, maxBoundActiveSkills, maxBoundPassiveSkills;
|
||||||
public final List<EntityDamageEvent.DamageCause> combatLogDamageCauses = new ArrayList<>();
|
public final List<EntityDamageEvent.DamageCause> combatLogDamageCauses = new ArrayList<>();
|
||||||
|
|
||||||
@ -136,8 +137,11 @@ public class ConfigManager {
|
|||||||
pvpModeToggleOnCooldown = config.getDouble("pvp_mode.cooldown.toggle_on");
|
pvpModeToggleOnCooldown = config.getDouble("pvp_mode.cooldown.toggle_on");
|
||||||
pvpModeToggleOffCooldown = config.getDouble("pvp_mode.cooldown.toggle_off");
|
pvpModeToggleOffCooldown = config.getDouble("pvp_mode.cooldown.toggle_off");
|
||||||
pvpModeCombatCooldown = config.getDouble("pvp_mode.cooldown.combat");
|
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");
|
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
|
// Resources
|
||||||
staminaFull = getColorOrDefault("stamina-whole", ChatColor.GREEN);
|
staminaFull = getColorOrDefault("stamina-whole", ChatColor.GREEN);
|
||||||
|
@ -14,8 +14,7 @@ public class CombatHandler implements Closable {
|
|||||||
private final PlayerData player;
|
private final PlayerData player;
|
||||||
private final long firstHit = System.currentTimeMillis();
|
private final long firstHit = System.currentTimeMillis();
|
||||||
|
|
||||||
private long lastHit = System.currentTimeMillis();
|
private long lastHit = System.currentTimeMillis(), lastToggle;
|
||||||
private long lastInvulnerabilityApplication;
|
|
||||||
|
|
||||||
private boolean pvpMode;
|
private boolean pvpMode;
|
||||||
|
|
||||||
@ -28,6 +27,7 @@ public class CombatHandler implements Closable {
|
|||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
lastHit = System.currentTimeMillis();
|
lastHit = System.currentTimeMillis();
|
||||||
|
lastToggle = 0;
|
||||||
player.getMMOPlayerData().getCooldownMap().applyCooldown(PvpModeCommand.COOLDOWN_KEY, MMOCore.plugin.configManager.pvpModeCombatCooldown);
|
player.getMMOPlayerData().getCooldownMap().applyCooldown(PvpModeCommand.COOLDOWN_KEY, MMOCore.plugin.configManager.pvpModeCombatCooldown);
|
||||||
|
|
||||||
// Simply refreshing
|
// Simply refreshing
|
||||||
@ -68,17 +68,18 @@ public class CombatHandler implements Closable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is used for PvP mode invulnerability when a player
|
* This is used for PvP mode inactivity when a player
|
||||||
* joins a region while he still has PvP mode toggled on.
|
* 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() {
|
public boolean canPvp() {
|
||||||
return System.currentTimeMillis() < lastInvulnerabilityApplication + MMOCore.plugin.configManager.pvpModeInvulnerability * 1000;
|
return System.currentTimeMillis() > lastToggle + MMOCore.plugin.configManager.pvpModeInvulnerability * 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyInvulnerability() {
|
public void preventPvp() {
|
||||||
lastInvulnerabilityApplication = System.currentTimeMillis();
|
lastToggle = System.currentTimeMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canQuitPvpMode() {
|
public boolean canQuitPvpMode() {
|
||||||
|
@ -296,16 +296,35 @@ pvp_mode:
|
|||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# Delay after any attack during which the player will stay in PvP Mode (seconds)
|
# Delay after any attack during which the player will stay in PvP Mode (seconds)
|
||||||
|
# Has to be lower than 'cooldown.combat'
|
||||||
combat_timeout: 30
|
combat_timeout: 30
|
||||||
|
|
||||||
# Invulnerability when entering a pvp-mode region when your PvP mode is toggled on.
|
# Invulnerability triggered when:
|
||||||
invulnerability: 60
|
# - 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:
|
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
|
combat: 45
|
||||||
|
|
||||||
# Cooldown when toggling on PvP mode, before being able to toggle it off (seconds)
|
# Cooldown when toggling on PvP mode, before being able to toggle it off (seconds)
|
||||||
toggle_on: 5
|
toggle_on: 5
|
||||||
|
|
||||||
# Cooldown when toggling off PvP mode (seconds)
|
# Cooldown when toggling off PvP mode (seconds)
|
||||||
toggle_off: 3
|
toggle_off: 3
|
Loading…
Reference in New Issue
Block a user