kernitus / BukkitOldCombatMechanics

Spigot plugin to configure combat mechanics for 1.9 onwards
https://www.spigotmc.org/resources/19510/
Mozilla Public License 2.0
176 stars 73 forks source link

Auto-click Exploit Causing Instant Player Death #665

Closed pedrodalben closed 1 year ago

pedrodalben commented 1 year ago

Information

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.

# ############# OldCombatMechanics Plugin by kernitus and Rayzr522 ##########
#                                                                           #
# Bukkit Page: http://dev.bukkit.org/bukkit-plugins/oldcombatmechanics/     #
# Spigot Page: https://www.spigotmc.org/resources/oldcombatmechanics.19510/ #
# GitHub Page: https://github.com/kernitus/BukkitOldCombatMechanics/        #
#                                                                           #
# ###########################################################################

# When this is set to 'true', the 'worlds' section under each module config will represent worlds that the feature is disabled in
# When this is set to 'false', the 'worlds' section under each module config will represent worlds that the feature is enabled in
worlds-is-blacklist: false

# To use the per-world feature you must specify a list of worlds in square brackets []
# If empty, will be enabled in all worlds.
# Otherwise, it acts as whitelist / blacklist (as per the global 'worlds-is-blacklist' setting, see above).
#
# --- Example #1: this will enable 'disable-sword-seep' exclusively in 'world', 'survival', and 'creative'
#
# worlds-is-blacklist: false
# disable-sword-sweep:
#   enabled: true
#   worlds: [world,survival,creative]
#
# --- Example #2: this will enable 'disable-sword-seep' in all worlds EXCEPT 'world_nether' & 'world_the_end'
#
# worlds-is-blacklist: true
# disable-sword-sweep:
#   enabled: true
#   worlds: [world_nether,world_the_end]

disable-attack-cooldown:
  # This is to disable the attack cooldown
  enabled: true
  worlds: []
  # What to set the attack speed to. Default for 1.9 is 4, at least 40 is needed for no cooldown.
  generic-attack-speed: 40
  message-enabled: "&aAttack cooldown enabled for %player%"
  message-disabled: "&cAttack cooldown disabled for %player%"
  message-usage: "Usage: &7/ocm toggle [player] [on/off]"

disable-player-collisions:
  # This is to disable player collisions
  # This is now compatible with scoreboard and tablist-editing plugins
  enabled: false
  worlds: []

disable-sword-sweep:
  # This is to disable the sword sweep attack
  # Particle effect is also now removed
  enabled: true
  worlds: []

disable-attack-sounds:
  enabled: false
  worlds: []
  # The sounds that will be blocked by this module
  blocked-sounds:
    - "minecraft:entity.player.attack.strong"
    - "minecraft:entity.player.attack.sweep"
    - "minecraft:entity.player.attack.nodamage"
    - "minecraft:entity.player.attack.knockback"
    - "minecraft:entity.player.attack.crit"
    - "minecraft:entity.player.attack.weak"

disable-crafting:
  # Disable the crafting of specified items
  enabled: true
  worlds: []
  # List of denied items
  denied:
    - shield
  # Show the user a message if they try to craft a blacklisted item
  showMessage: true
  message: "&cYou cannot craft that item!"

disable-offhand:
  # Disable the usage of the offhand
  # Won't affect sword-blocking module
  enabled: true
  worlds: []
  # Whether the following list allows items or blocks them
  whitelist: true
  # List of items that should be allowed/blocked
  # Example: [diamond_sword,BOW]
  items: []

old-brewing-stand:
  # Automatically refuels brewing stands
  enabled: true
  worlds: []

no-lapis-enchantments:
  # Automatically adds lapis to enchantment tables upon opening
  enabled: false
  worlds: []
  # Whether to only allow this for players with oldcombatmechanics.nolapis permission
  usePermission: false

disable-elytra:
  # Do not allow players to wear elytra
  enabled: false
  worlds: []

disable-enderpearl-cooldown:
  # Disables enderpearl cooldown
  enabled: false
  worlds: [Survival]
  # The cooldown, in seconds
  cooldown: 5
  # Show the user a message if they try to use an enderpearl and the cooldown has not expired yet
  showMessage: FALSE
  message: "&cYou must wait &7%ds&c before using an enderpearl again!"

old-tool-damage:
  # This is to set the tool damage as in pre-1.9
  # IMPORTANT: Also enable disable-sword-sweep module or sweeps will have the damage value of the weapon in hand
  # NOTE: this will modify the damage, however on the item tooltip it will still show the 1.9+ damage
  enabled: true
  worlds: []
  # Use old sharpness calculations, i.e. each level adds 1.25 damage
  # In 1.9+, sharpness adds 1 + 0.5 * level damage
  old-sharpness: true
  # Damage values shown in 1.9 representation (actual damage)
  # In 1.8 the damage tooltip value would be added to 1 'base damage', yielding the values below
  damages:
    # Axe damages
    GOLD_AXE: 4
    WOOD_AXE: 4
    STONE_AXE: 5
    IRON_AXE: 6
    DIAMOND_AXE: 7
    NETHERITE_AXE: 8
    # Shovel damages
    GOLD_SPADE: 2
    WOOD_SPADE: 2
    STONE_SPADE: 3
    IRON_SPADE: 4
    DIAMOND_SPADE: 5
    NETHERITE_SPADE: 6
    # Sword damages
    GOLD_SWORD: 5
    WOOD_SWORD: 5
    STONE_SWORD: 6
    IRON_SWORD: 7
    DIAMOND_SWORD: 8
    NETHERITE_SWORD: 9
    # Pickaxe damages
    GOLD_PICKAXE: 3
    WOOD_PICKAXE: 3
    STONE_PICKAXE: 4
    IRON_PICKAXE: 5
    DIAMOND_PICKAXE: 6
    NETHERITE_PICKAXE: 7
    # Hoe damages
    GOLD_HOE: 1
    WOOD_HOE: 1
    STONE_HOE: 1
    IRON_HOE: 1
    DIAMOND_HOE: 1
    NETHERITE_HOE: 1

sword-blocking:
  # This is to allow players to block with swords again, by getting a shield while they hold right click with a sword
  enabled: true
  worlds: []
  # How often, in ticks, OCM should check if the player is still blocking with a shield, and remove it if not
  # If this is too fast the player will have their shield disappear before they're able to block again causing a slight delay
  # If this is too slow players will have a shield in their hand well after they've stopped blocking
  # 20 ticks = 1 second
  restoreDelay: 40
  # List of items that holding in the offhand while right-clicking with a sword doesn't trigger blocking e.g. bow
  noBlockingItems: []
  # Whether the above list should act as a blacklist (i.e. only items listed stop the blocking mechanic)
  blacklist: true
  # Whether to require players to have oldcombatmechanics.swordblock permission to block with a sword
  use-permission: false

shield-damage-reduction:
  # This module allows changing the damage reduction behaviour of shields
  enabled: true
  worlds: []
  # How much damage blocking should reduce
  # Firstly, amount is subtracted, them value is reduced to percentage
  # 1.8 default: (damage - 1) * 50%    1.9 default: 33%   1.11 default: 0%
  # Damage reduction = (damage - damageReductionAmount) * damageReductionPercentage / 100
  generalDamageReductionAmount: 1
  generalDamageReductionPercentage: 50
  # This value works the same but is exclusively for projectile damage
  # Set amount to 0 and percentage to 100 for 1.8 behaviour, i.e. arrows go through shields
  projectileDamageReductionAmount: 1
  projectileDamageReductionPercentage: 50

old-golden-apples:
  # This is to change the behaviour / crafting of golden apples to how it was in pre-1.9
  # WARNING: If on 1.12 or above and you disable this module you must reload the server for the recipe to disappear
  enabled: true
  worlds: []
  # Cooldown between eating the apples, in seconds
  cooldown:
    # The cooldown for normal golden apples
    normal: 0
    # Message when user tries to eat golden apple during cooldown. Leave empty to disable.
    message-normal: "&ePlease wait %seconds%s before eating another golden apple."
    # The cooldown for enchanted golden apples
    enchanted: 0
    # Message when user tries to eat enchanted golden apple during cooldown. Leave empty to disable.
    message-enchanted: "&ePlease wait %seconds%s before eating another enchanted golden apple."
    # Whether the two apple types share a cooldown.
    # If this is true:
    #   1. Eating any apple resets both cooldowns
    #   2. Each apple type can only be eaten when its cooldown time is over
    #      This means that when you eat *any* apple you start two parallel cooldowns: One for enchanted and one
    #      for normal apples. Each type can only be eaten when its cooldown is over.
    #      Once any apple is eaten, both cooldowns are restarted, so you can not eat either type again
    #      before its full cooldown is over.
    #   3. To have the plugin treat normal and enchanted golden apples as having the same cooldown,
    #      then set the same cooldown time and enable shared mode. (This was the old mode)
    # If this is false:
    #   Eating an enchanted apple will prevent any *enchanted* apple type from being eaten before the cooldown is over
    #   Eating a normal apple will prevent any *normal* apple type from being eaten before the normal cooldown is over
    is-shared: false
  # If you want to allow enchanted golden apple crafting
  enchanted-golden-apple-crafting: true
  # Enabling this makes the potion effects gained by eating golden apples
  # and enchanted golden apples the same as it was in pre-1.9
  old-potion-effects: true
  # Potion effects golden apples should apply
  # Duration is in ticks (20 ticks = 1 second)
  # Amplifier is the potion level - 1, so Regeneration IV would be amplifier 3
  gapple-effects:
    regeneration:
      duration: 100
      amplifier: 1
    absorption:
      duration: 2400
      amplifier: 0
  # Potion effects enchanted golden apples should apply
  napple-effects:
    regeneration:
      duration: 600
      amplifier: 4
    damage_resistance:
      duration: 6000
      amplifier: 0
    fire_resistance:
      duration: 6000
      amplifier: 0
    absorption:
      duration: 2400
      amplifier: 0
  # Enable this if you have another plugin which adds a crafting recipe for
  # enchanted golden apples (requires server restart)
  no-conflict-mode: false

old-fishing-knockback:
  # This is to make the knockback of players when they get hit by a fishing bobber the same as it was in pre-1.9
  enabled: true
  worlds: []
  # This makes OCM check if other plugins are stopping the rod damage and follow their choice
  # Set to false to always have rod damage
  checkCancelled: false
  # This is the damage done by the fishing rod attack
  damage: 0.0001
  # Whether the EntityDamageEvent should be used instead of the EntityDamageByEntityEvent
  # Set to true when using plugins like NCP that check range
  useEntityDamageEvent: false
  # This is to cancel dragging in the entity attached to the fishing rod when reeling in, like in 1.8
  # Options: all, players, mobs, none. players allows compatibility with WorldGuard pvp-deny regions
  cancelDraggingIn: players
  # Whether to also give knockback on non-player living entities (e.g. mobs)
  knockbackNonPlayerEntities: false
  # This is the delay in milliseconds in-between rod damage, so the player hit has time to fall back down
  hitCooldown: 1000

fishing-rod-velocity:
  # In 1.9+ fishing rods go 8 blocks instead of 12 blocks
  # This is due to both gravity and initial launch speed
  # Set to true to revert back to the old calculations and gravity
  enabled: true
  worlds: []

projectile-knockback:
  # This adds knockback and/or damage to players when they get hit by snowballs, eggs & enderpearls
  # This has been a Bukkit bug for so long people thought it was vanilla when it was recently patched
  enabled: true
  worlds: []
  # This is the damage done by each projectile
  damage:
    snowball: 0.0001
    egg: 0.0001
    ender_pearl: 0.0001

old-player-knockback:
  # This is to change knockback players receive from attacks.  Default values are as in 1.8.
  #
  # Practice servers tend to use lower knockback, for example:
  # knockback-horizontal: 0.35
  # knockback-vertical: 0.35
  # knockback-vertical-limit: 0.4
  # knockback-extra-horizontal: 0.425
  # knockback-extra-vertical: 0.085
  #
  # Minigame servers use higher vertical knockback and lower horizontal knockback, exact values are unknown.
  enabled: true
  worlds: []
  # Horizontal knockback is reduced by 40% for every successful attack by the player, with no limit
  # Increase to make clicking more important, decrease to make it less important
  knockback-horizontal: 0.4
  # Vertical knockback is not reduced by clicking faster
  # Increase to make clicking less important, decrease to make clicking more important
  knockback-vertical: 0.4
  # Vertical knockback limit is applied after base vertical knockback
  # This limit can be exceeded by sprint hitting or knockback enchantments, from the extra vertical knockback
  knockback-vertical-limit: 0.4
  # Extra horizontal knockback is applied for each level of knockback enchant, and for sprinting
  # Increase to make sprint resetting (w-tapping) more important, decrease to make it less important
  # Increase to make clicking more important, decrease to make clicking less important
  knockback-extra-horizontal: 0.5
  # Extra vertical knockback is applied for each level of knockback enchant, and for sprinting
  # Increase to make sprint resetting (w-tapping) more important, decrease to make it less important
  # Increase to make clicking less important, decrease to make clicking more important
  knockback-extra-vertical: 0.1
  # Should knockback resistance be enabled? (e.g. netherite armour knockback resistance)
  enable-knockback-resistance: false

old-player-regen:
  # This is to make players' regeneration act mostly like it did in pre-1.9
  # Based on https://minecraft.gamepedia.com/Hunger?oldid=948685
  enabled: true
  worlds: []
  # How often a player should regenerate health, in milliseconds (In 1.8: 4 seconds)
  # The foodTickerTimer might not be perfectly accurate so we give it ~10ms of leeway
  interval: 3990
  # How many half-hearts the player should heal by, every seconds specified above
  amount: 1
  # How much exhaustion the player should get from healing. In 1.8: 3    In 1.9: 4    In 1.11: 6
  # If, after adding this, Minecraft finds the value is above 4, it subtracts 4
  # and either reduces saturation or, if saturation is 0, reduces food level by 1 (1/2 a stick)
  exhaustion: 3

old-armour-strength:
  # This is to make armour calculations like in 1.8
  # Based on this: https://minecraft.gamepedia.com/index.php?title=Armor&oldid=909187
  enabled: true
  worlds: []

old-armour-durability:
  # This makes armour take a constant amount of durability damage (except for explosions)
  enabled: true
  worlds: []
  # By how much to reduce durability every attack. 1.8 default is 1
  reduction: 1

disable-projectile-randomness:
  # This is to remove projectile randomness while firing arrows with a bow
  # This is actually a very old feature and has been in the game for quite some time
  enabled: false
  worlds: []
  # This is the threshold between projectiles' (X,Z) values before they're considered the same and straightened
  # This value is only useful for multishot. The default of 0.1 works at all but extremely shallow angles,
  # where arrows end up bunched together. Set to 1 if you want multishots to all follow the same path.
  epsilon: 0.1

disable-bow-boost:
  # This is to stop players from boosting themselves forward by hitting themselves
  # while running with a punch II arrow from their bow
  # This module simply stops them from hitting themselves with arrows entirely
  enabled: false
  worlds: []

old-potion-effects:
  # This is to restore the 1.8 potion effects and duration
  enabled: true
  worlds: []

  # DURATION: (in seconds)
  potion-durations:
    regen: # Regeneration
      drinkable:
        base: 45
        II: 22
        extended: 120
      splash:
        base: 33
        II: 16
        extended: 90

    speed: # Swiftness
      drinkable:
        base: 180
        II: 90
        extended: 480
      splash:
        base: 135
        II: 67
        extended: 360

    fire_resistance:
      drinkable:
        base: 180
        extended: 480
      splash:
        base: 135
        extended: 360

    poison:
      drinkable:
        base: 45
        II: 22
        extended: 120
      splash:
        base: 33
        II: 16
        extended: 90

    night_vision:
      drinkable:
        base: 180
        extended: 480
      splash:
        base: 180
        extended: 480

    weakness:
      drinkable:
        base: 90
        extended: 240
      splash:
        base: 90
        extended: 240

    strength:
      drinkable:
        base: 180
        II: 90
        extended: 480
      splash:
        base: 135
        II: 67
        extended: 360

    slowness:
      drinkable:
        base: 90
        extended: 240
      splash:
        base: 67
        extended: 180

    jump: # Leaping
      drinkable:
        base: 180
        II: 90
        extended: 480
      splash:
        base: 135
        II: 67
        extended: 360

    water_breathing:
      drinkable:
        base: 180
        extended: 480
      splash:
        base: 135
        extended: 360

    invisibility:
      drinkable:
        base: 180
        extended: 480
      splash:
        base: 135
        extended: 360

    # 1.9+ potions
    # Turtle Master potion currently incompatible, will just work like default
    luck:
      drinkable:
        base: 300
      splash:
        base: 300

    slow_falling:
      drinkable:
        base: 90
        extended: 240
      splash:
        base: 90
        extended: 240

  # EFFECTS
  # If 'multiplier' is true value is multiplied by base tool damage. If 'addend' it is added.
  # If both true, it is first increased by 1 then multiplied (same as +xx%)
  # Strength potion
  # 1.9: I = +3; II = +6;    1.8: I = +130%; II = +260%
  strength:
    modifier: 1.3
    multiplier: true
    addend: true
  # Weakness potion
  # 1.9 value: -4   1.8 value: -0.5
  weakness:
    modifier: -0.5
    multiplier: false

chorus-fruit:
  # This makes the chorus fruit behaviour configurable
  enabled: false
  worlds: []
  # The maximum distance the fruit can teleport the player. This a PER AXIS value, so this outlines a cube with
  # 2 * max-teleportation-distance as the side length
  # Vanilla default is 8.
  # Setting this to 0 disables chorus fruit teleport.
  # Setting this to a value greater than 8 MIGHT CAUSE CONFLICTS with bukkit's internal anti cheat
  # and *potentially* any other anti-cheat you use. Please make sure this is not an issue before increasing
  # this value.
  max-teleportation-distance: 8
  # Whether to prevent eating the fruit completely. This also prevents the teleportation.
  prevent-eating: false
  # The saturation value of the chorus fruit.
  # Vanilla default is 2.4
  saturation-value: 2.4
  # The hunger value of the chorus fruit.
  # Vanilla default is 4 (2 bars)
  hunger-value: 4

old-burn-delay:
  # This makes it so entities will immediately start to burn when entering fire
  enabled: false
  worlds: []
  # How long, in ticks, entities should be on fire for after not being in direct contact anymore
  fire-ticks: 120

attack-frequency:
  # Allows changing the player invulnerability between hits
  enabled: true
  worlds: []
  # The hit delay to apply. Default for 1.9+ is 20 ticks (1 second)
  playerDelay: 30
  mobDelay: 16

old-critical-hits:
  # Makes critical hits work like in 1.8
  # With a critical hit, the damage will be multiplied by 1.5
  # In 1.9, the user must also not be sprinting for it to be a crit
  enabled: false
  world: []
  # What the damage, after applying potions effects, is multiplied by
  multiplier: 1.5
  # Whether to allow crits while sprinting. 1.8: true, 1.9: false
  allow-sprinting: true

# List of interactive blocks that right-clicking on will be ignored
# This is for modules such as sword blocking and disable-elytra
interactive: [crafting_table,enchantment_table,anvil,brewing_stand,trapped_chest,chest,bed,boat,fence_gate,dispenser,dropper,furnace,jukebox,ender_chest,stone_button,wood_button,beacon,tripwire_hook,hopper,daylight_detector,daylight_detector_inverted,item_frame,diode,diode_block_off,diode_block_on,redstone_comparator,redstone_comparator_off,redstone_comparator_on,acacia_door,birch_door,dark_oak_door,jungle_door,spruce_door,wood_door,workbench,bed_block,lever,trap_door,burning_furnace,spruce_fence_gate,birch_fence_gate,jungle_fence_gate,dark_oak_fence_gate,acacia_fence_gate,white_shulker_box,orange_shulker_box,magenta_shulker_box,light_blue_shulker_box,yellow_shulker_box,lime_shulker_box,pink_shulker_box,gray_shulker_box,silver_shulker_box,cyan_shulker_box,purple_shulker_box,blue_shulker_box,brown_shulker_box,green_shulker_box,red_shulker_box,black_shulker_box,barrel]

# ########################
# SUPPORT SETTINGS BELOW #
# ########################
support:
  spartan-cancel-ticks: 1

# ########################
# SPECIAL SETTINGS BELOW #
# ########################

# This is to toggle the update checker
update-checker:
  enabled: true

# This enables command argument completion when pressing tab
command-completer:
  enabled: true

# This enables debug messages, only enable when troubleshooting
debug:
  enabled: false

# DO NOT CHANGE THIS NUMBER AS IT WILL RESET YOUR CONFIG
config-version: 56

Problem Description

To Reproduce

Steps to reproduce the behavior: - auto click, delay 0 - hit https://www.youtube.com/watch?v=T5uTR-eNxx4 ### Expected Behaviour

The expected behavior is that the plugin somehow handles these thousands of clicks that end up instantly killing any player, providing some kind of protection.

Actual Behaviour

https://www.youtube.com/watch?v=T5uTR-eNxx4

NotAlexNoyle commented 1 year ago

Lots of players on my server are still complaining about this. I am under the impression that the statement the last time this was brought up "The attack-frequency does not set hard limits, because you can still be overdamaged by an attack of a higher value than the previous one while immune" does not describe the desired behavior. This was not an issue in 1.8, there was a click limit, and auto clicking many times a second would not insta kill your opponent. This is still reproducible in 1.8 to this day.

cnie109 commented 1 year ago

I'd like to add to the above comment with a few more technical details about pre1.9 immunity frames(i-frames). The i-frames in pre1.9 caused the player to not take damage for 0.5 seconds, unless the new damage was higher than the damage inflicted at the start of the i-frames. For instance, if someone deals 2 damage to a player, and then another 2 within 0.5 seconds, no extra damage is taken. However, if 3 damage is dealt within 0.5 seconds, 1 damage is added to the player, so that the total damage for the i-frame is 3, but no knockback is sustained. Using OCM, we have found that any damage dealt within this 0.5 seconds does in fact get registered, and fully dealt to the player, without any knockback being sustained.

pedro-dalben commented 1 year ago

Gostaria de adicionar ao comentário acima mais alguns detalhes técnicos sobre os quadros de imunidade pré-1.9 (i-quadros). Os i-frames em pré-1.9 faziam com que o jogador não sofresse dano por 0,5 segundos, a menos que o novo dano fosse maior que o dano infligido no início dos i-frames. Por exemplo, se alguém causar 2 danos a um jogador e depois outros 2 em 0,5 segundos, nenhum dano extra será recebido. No entanto, se 3 danos forem causados ​​em 0,5 segundos, 1 dano é adicionado ao jogador, de modo que o dano total para o i-frame é 3, mas nenhum knockback é sustentado. Usando o OCM, descobrimos que qualquer dano causado dentro desses 0,5 segundos é de fato registrado e totalmente causado ao jogador, sem qualquer repulsão.

yes, this is completely game breaking

kernitus commented 1 year ago

What @Barny1094875 describes is the correct 1.8 behaviour and what OCM attempts to replicate. In fact, the minecraft code for this pre and post-1.9 is the same, all that changed are the immunity times themselves, from 18 ticks to 20 ticks. When an entity is first hit, their immunity time is set to 20 ticks, i.e. 1 second. Before this number goes past halfway, if they receive damage greater than the last damage they are dealt the difference. The "damage" here includes the weapon damage + weapon enchantments, the strength status/weakness status effects, and critical hits. When the immunity ticks goes down past halfway they are no longer immune, meaning the "immunity" lasts half a second when set to 20.

Now, this behaviour is exactly what OCM is coded to do and what I have observed in all my tests, both manual and automated. Thus, to have any chance of identifying where the problem might lie I will need your collaboration. I will need from all of you:

  1. A complete list of all plugins running on the server where the bug manifests itself. This is because in order for OCM to register all potential "overdamage" (damage difference during immunity period) it temporarily sets the last damage to 0 before setting it back to the actual value. It is possible some other plugins do not like this and are interfering with it.
  2. A "minimal viable example" of the bug happening. This could be a video of the bug happening, like @pedrodalben posted, but with debug mode enabled in the config, and the absolute minimal set of plugins and weapons/tools required for the bug to happen. For example, this would be a video with debug mode enabled of a player hitting another with a sword with no enchantments, and no armour involved, on a server with only OCM installed. If the bug shows up in these conditions, it will be a lot easier to identify the problem. If it does not, try to get as close to these conditions as possible.
pedrodalben commented 1 year ago

What @Barny1094875 describes is the correct 1.8 behaviour and what OCM attempts to replicate. In fact, the minecraft code for this pre and post-1.9 is the same, all that changed are the immunity times themselves, from 18 ticks to 20 ticks. When an entity is first hit, their immunity time is set to 20 ticks, i.e. 1 second. Before this number goes past halfway, if they receive damage greater than the last damage they are dealt the difference. The "damage" here includes the weapon damage + weapon enchantments, the strength status/weakness status effects, and critical hits. When the immunity ticks goes down past halfway they are no longer immune, meaning the "immunity" lasts half a second when set to 20.

Now, this behaviour is exactly what OCM is coded to do and what I have observed in all my tests, both manual and automated. Thus, to have any chance of identifying where the problem might lie I will need your collaboration. I will need from all of you:

1. A complete list of all plugins running on the server where the bug manifests itself. This is because in order for OCM to register all potential "overdamage" (damage difference during immunity period) it temporarily sets the last damage to 0 before setting it back to the actual value. It is possible some other plugins do not like this and are interfering with it.

2. A "minimal viable example" of the bug happening. This could be a video of the bug happening, like @pedrodalben posted, but with `debug` mode enabled in the config, and the _absolute minimal_ set of plugins and weapons/tools required for the bug to happen. For example, this would be a video with debug mode enabled of a player hitting another with a sword with no enchantments, and no armour involved, on a server with only OCM installed. If the bug shows up in these conditions, it will be a lot easier to identify the problem. If it does not, try to get as close to these conditions as possible.

thinking about what you said... on my server I have mcmmo installed and it may be affecting me, I'm going to do some tests

kernitus commented 1 year ago

@pedrodalben @NotAlexNoyle @Barny1094875 @skbeh In the meantime, can you please try dev build 175. I have changed the order in which the OCM listeners do things to take into account modifications made by other plugins. Hopefully this will at least alleviate the issue.

pedro-dalben commented 1 year ago

@pedrodalben @NotAlexNoyle @Barny1094875 @skbehEnquanto isso, você pode tentar o dev build 175 . Alterei a ordem em que os ouvintes do OCM fazem as coisas para levar em conta as modificações feitas por outros plugins. Espero que isso pelo menos alivie o problema.

testing..

NotAlexNoyle commented 1 year ago

Will test by Monday.

NotAlexNoyle commented 1 year ago

@pedrodalben @NotAlexNoyle @Barny1094875 @skbeh In the meantime, can you please try dev build 175. I have changed the order in which the OCM listeners do things to take into account modifications made by other plugins. Hopefully this will at least alleviate the issue.

In my opinion this solves the problem. The difference is night-and-day. Duels take 3-4x longer now. It feels much more loyal to 1.8.

pedrodalben commented 1 year ago

@pedrodalben @NotAlexNoyle @Barny1094875 @skbeh In the meantime, can you please try dev build 175. I have changed the order in which the OCM listeners do things to take into account modifications made by other plugins. Hopefully this will at least alleviate the issue.

The problem was solved! thank you for your support

kernitus commented 1 year ago

That is good to hear, it seems the problem was conflicts with other plugins. The fix has already been released as part of the 1.12.2 OCM update.

skbeh commented 1 year ago

@kernitus I think that there is more things to do. Take 1.12.2 for example.

With OCM loaded, in EntityLiving.java:884 (if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) {) this.lastDamage is always 0.0, which causes the following check to fail and the damage will always be dealt in the immune period. Please check it.

                    if (f <= this.lastDamage) {
                        this.forceExplosionKnockback = true; // CraftBukkit - SPIGOT-949 - for vanilla consistency, cooldown does not prevent explosion knockback
                        return false;
                    }

f should mean the current damage that will be dealt.

kernitus commented 1 year ago

@kernitus I think that there is more things to do. Take 1.12.2 for example.

With OCM loaded, in EntityLiving.java:884 (if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) {) this.lastDamage is always 0.0, which causes the following check to fail and the damage will always be dealt in the immune period. Please check it.

                    if (f <= this.lastDamage) {
                        this.forceExplosionKnockback = true; // CraftBukkit - SPIGOT-949 - for vanilla consistency, cooldown does not prevent explosion knockback
                        return false;
                    }

f should mean the current damage that will be dealt.

The last damage is deliberately always set to 0 so that no potential attacks are missed as a consequence of the default weapon damage being lower than that set in the config. OCM then checks whether the attack was actually going to land or not depending on the configured damages, and cancel it or apply it.

Please open a new issue with relevant details if you think there is still a problem with the damage calculations.