New options for combat mode

This commit is contained in:
Jules 2023-02-22 17:33:22 +01:00
parent 07a61b900e
commit cebbfcf5c8
6 changed files with 68 additions and 24 deletions

View File

@ -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());

View File

@ -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()) {

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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() {

View File

@ -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