diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm index d4155bd6a7..db9717a87c 100644 --- a/code/modules/mob/living/living_active_block.dm +++ b/code/modules/mob/living/living_active_block.dm @@ -23,7 +23,7 @@ active_block_item = null REMOVE_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_BLOCK_TRAIT) remove_movespeed_modifier(MOVESPEED_ID_ACTIVE_BLOCK) - var/datum/block_parry_data/data = get_block_parry_data(I.block_parry_data) + var/datum/block_parry_data/data = I.get_block_parry_data() if(timeToNextMove() < data.block_end_click_cd_add) changeNext_move(data.block_end_click_cd_add) return TRUE @@ -33,7 +33,7 @@ return FALSE if(!(I in held_items)) return FALSE - var/datum/block_parry_data/data = get_block_parry_data(I.block_parry_data) + var/datum/block_parry_data/data = I.get_block_parry_data() if(!istype(data)) //Typecheck because if an admin/coder screws up varediting or something we do not want someone being broken forever, the CRASH logs feedback so we know what happened. CRASH("start_active_blocking called with an item with no valid data: [I] --> [I.block_parry_data]!") active_blocking = TRUE @@ -95,10 +95,10 @@ if(!I) to_chat(src, "You can't block with your bare hands!") return - if(!(I.item_flags & ITEM_CAN_BLOCK)) + if(!(I.can_active_block()) to_chat(src, "[I] is not capable of actively being used to block!") return - var/datum/block_parry_data/data = get_block_parry_data(I.block_parry_data) + var/datum/block_parry_data/data = I.get_block_parry_data() var/delay = data.block_start_delay active_block_starting = TRUE animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = delay, FALSE, SINE_EASING | EASE_IN) @@ -119,9 +119,21 @@ stop_active_blocking(FALSE) return TRUE +/** + * Gets our datum/block_parry_data + */ +/obj/item/proc/get_block_parry_data() + return get_block_parray_data(block_parry_data) + +/** + * Returns if we can actively block. + */ +/obj/item/proc/can_active_block() + return item_flags & ITEM_CAN_BLOCK + /// The amount of damage that is blocked. /obj/item/proc/active_block_damage_mitigation(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) - var/datum/block_parry_data/data = get_block_parry_data(block_parry_data) + var/datum/block_parry_data/data = get_block_parry_data() var/absorption = data.block_damage_absorption_override["[attack_type]"] var/efficiency = data.block_damage_multiplier_override["[attack_type]"] var/limit = data.block_damage_limit_override["[attack_type]"] @@ -146,7 +158,7 @@ /// Amount of stamina from damage blocked. Note that the damage argument is damage_blocked. /obj/item/proc/active_block_stamina_cost(mob/living/owner, atom/object, damage_blocked, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) - var/datum/block_parry_data/data = get_block_parry_data(block_parry_data) + var/datum/block_parry_data/data = get_block_parry_data() var/efficiency = data.block_stamina_efficiency_override["[attack_type]"] if(isnull(efficiency)) efficiency = data.block_stamina_efficiency @@ -159,7 +171,7 @@ /// Apply the stamina damage to our user, notice how damage argument is stamina_amount. /obj/item/proc/active_block_do_stamina_damage(mob/living/owner, atom/object, stamina_amount, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) - var/datum/block_parry_data/data = get_block_parry_data(block_parry_data) + var/datum/block_parry_data/data = get_block_parry_data() if(iscarbon(owner)) var/mob/living/carbon/C = owner var/held_index = C.get_held_index_of_item(src) @@ -178,9 +190,9 @@ owner.adjustStaminaLossBuffered(stamina_amount) /obj/item/proc/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) - if(!CHECK_BITFIELD(item_flags, ITEM_CAN_BLOCK)) + if(!can_active_block()) return BLOCK_NONE - var/datum/block_parry_data/data = get_block_parry_data(block_parry_data) + var/datum/block_parry_data/data = get_block_parry_data() var/incoming_direction = get_dir(get_turf(attacker) || get_turf(object), src) if(!CHECK_MOBILITY(owner, MOBILITY_STAND) && !(data.block_resting_attack_types_anydir & attack_type) && (!(data.block_resting_attack_types_directional & attack_type) || !can_block_direction(owner.dir, incoming_direction))) return BLOCK_NONE @@ -203,7 +215,7 @@ playsound(loc, pickweight(data.block_sounds), 75, TRUE) /obj/item/proc/check_active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) - if(!CHECK_BITFIELD(item_flags, ITEM_CAN_BLOCK)) + if(!can_active_block()) return var/incoming_direction = get_dir(get_turf(attacker) || get_turf(object), src) if(!can_block_direction(owner.dir, incoming_direction)) @@ -215,7 +227,7 @@ * Gets the list of directions we can block. Include DOWN to block attacks from our same tile. */ /obj/item/proc/blockable_directions() - var/datum/block_parry_data/data = get_block_parry_data(block_parry_data) + var/datum/block_parry_data/data = get_block_parry_data() return data.can_block_directions /** diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm index 83de7d65c7..4d79eb8c93 100644 --- a/code/modules/mob/living/living_blocking_parrying.dm +++ b/code/modules/mob/living/living_blocking_parrying.dm @@ -133,7 +133,6 @@ GLOBAL_LIST_EMPTY(block_parry_data) return /// Yadda yadda WIP access block/parry data... -/* /mob/living/proc/get_parry_stage() if(!parrying) return NOT_PARRYING @@ -169,12 +168,10 @@ GLOBAL_LIST_EMPTY(block_parry_data) /mob/living/proc/get_parry_time() return world.time - parry_start_time -*/ /// same return values as normal blocking, called with absolute highest priority in the block "chain". /mob/living/proc/run_parry(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list()) -/* /// Run counterattack if any /mob/living/proc/run_parry_countereffects(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list()) var/datum/block_parry_data/data = get_parry_data() @@ -201,10 +198,9 @@ GLOBAL_LIST_EMPTY(block_parry_data) /// Gets the datum/block_parry_data we're going to use to parry. /mob/living/proc/get_parry_data() if(parrying == ITEM_PARRY) - return get_block_parry_data(active_parry_item.block_parry_data) + return active_parry_item.get_block_parry_data() else if(parrying == UNARMED_PARRY) return get_block_parry_data(block_parry_data) else if(parrying == MARTIAL_PARRY) return get_block_parry_data(mind.martial_art.block_parry_data) -*/