diff --git a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm index 6faf813094b..e8c60b310a0 100644 --- a/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm +++ b/code/modules/mining/lavaland/cain_and_abel/_cain_and_abel.dm @@ -6,7 +6,7 @@ desc = "I cry I pray mon Dieu." icon = 'icons/obj/mining_zones/artefacts.dmi' lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' //same sprite as lefthand + righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' icon_state = "cain_and_abel" inhand_icon_state = "cain_and_abel" attack_verb_continuous = list("attacks", "saws", "slices", "tears", "lacerates", "rips", "dices", "cuts") @@ -36,12 +36,13 @@ var/throw_mode = THROW_MODE_CRYSTALS /// Flames we have up! var/list/current_wisps = list() + /// Have we thrown the second dagger yet? + var/dagger_thrown = FALSE /// Cooldown till we can throw blades again COOLDOWN_DECLARE(throw_cooldown) /obj/item/cain_and_abel/Initialize(mapload) . = ..() - AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = force, force_wielded = force) if (length(animation_steps)) return @@ -64,11 +65,10 @@ source.RemoveElement(/datum/element/relay_attackers) set_combo(new_value = 0, user = source) - UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED)) + UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED, COMSIG_MOB_UPDATE_HELD_ITEMS)) /obj/item/cain_and_abel/equipped(mob/user, slot) . = ..() - if(!(slot & ITEM_SLOT_HANDS)) unset_user(user) return @@ -77,6 +77,7 @@ user.AddElement(/datum/element/relay_attackers) RegisterSignal(user, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked)) + RegisterSignal(user, COMSIG_MOB_UPDATE_HELD_ITEMS, PROC_REF(on_updated_held_items)) /obj/item/cain_and_abel/proc/on_attacked(datum/source, atom/attacker, attack_flags) SIGNAL_HANDLER @@ -86,6 +87,10 @@ if(get_dist(interacting_with, user) > 9 || interacting_with.z != user.z) return NONE + if(!check_wield(user)) + user.balloon_alert(user, "offhand busy!") + return ITEM_INTERACT_BLOCKING + if(!length(current_wisps)) user.balloon_alert(user, "no wisps!") return ITEM_INTERACT_BLOCKING @@ -94,6 +99,14 @@ addtimer(CALLBACK(src, PROC_REF(fire_wisp), user, interacting_with), index * 0.15 SECONDS) return ITEM_INTERACT_SUCCESS +/obj/item/cain_and_abel/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) + . = ..() + if (.) + return + if(!check_wield(user)) + user.balloon_alert(user, "offhand busy!") + return TRUE + /obj/item/cain_and_abel/attack(mob/living/target, mob/living/carbon/human/user) if(!istype(target) || target.mob_size < MOB_SIZE_LARGE || target.stat == DEAD) attack_speed = CLICK_CD_MELEE @@ -129,6 +142,13 @@ combo_count = new_value +/obj/item/cain_and_abel/proc/on_updated_held_items(mob/living/source) + SIGNAL_HANDLER + update_dagger_icon() + +/obj/item/cain_and_abel/proc/update_dagger_icon() + inhand_icon_state = "[src::inhand_icon_state][(dagger_thrown || !check_wield(loc)) ? "_thrown" : ""]" + /obj/item/cain_and_abel/proc/add_wisp(mob/living/user) var/obj/effect/overlay/blood_wisp/new_wisp = new(src) current_wisps += new_wisp @@ -181,6 +201,18 @@ animate(wisp_to_remove, alpha = 0, time = 0.2 SECONDS) QDEL_IN(wisp_to_remove, 0.2 SECONDS) +/obj/item/cain_and_abel/proc/check_wield(mob/living/user) + if (!istype(user)) + return TRUE + var/active_item = (src == user.get_active_held_item()) + var/obj/item/other_held = active_item ? user.get_inactive_held_item() : user.get_active_held_item() + if (!isnull(other_held)) + return FALSE + var/obj/item/bodypart/hand = active_item ? user.get_inactive_hand() : user.get_active_hand() + if (!hand || hand.bodypart_disabled) + return FALSE + return TRUE + /// Frame data for cain & abel wisps so we don't have to make list monstrocities /datum/abel_wisp_frame var/x = 0 diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm index 6a7cbc0d441..f550db4c5a5 100644 --- a/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_abilities.dm @@ -10,12 +10,16 @@ /datum/action/cooldown/dagger_swing/Activate(atom/target_atom) var/mob/living/living_owner = owner - var/obj/item/cain_and_abel = target + var/obj/item/cain_and_abel/cain_and_abel = target if(!living_owner.is_holding(cain_and_abel)) owner.balloon_alert(owner, "must be held") return FALSE + if(!cain_and_abel.check_wield(owner)) + owner.balloon_alert(owner, "offhand busy!") + return TRUE + living_owner.apply_status_effect(/datum/status_effect/dagger_swinging) var/static/list/possible_sounds = list( diff --git a/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm b/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm index 529390c26ee..8574ea59110 100644 --- a/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm +++ b/code/modules/mining/lavaland/cain_and_abel/dagger_throw.dm @@ -11,6 +11,10 @@ user.balloon_alert(user, "unable!") return + if(!check_wield(user)) + user.balloon_alert(user, "offhand busy!") + return + if(get_dist(target, user) > 9) user.balloon_alert(user, "too far away!") return @@ -52,7 +56,8 @@ set_dagger_icon(thrown = FALSE) /obj/item/cain_and_abel/proc/set_dagger_icon(thrown = FALSE) - inhand_icon_state = "[src::inhand_icon_state][thrown ? "_thrown" : ""]" + dagger_thrown = thrown + update_dagger_icon() update_inhand_icon() /obj/item/cain_and_abel/proc/reset_dagger_icon(datum/source) diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi index 09d3d6b8a91..75dd7e5a5f0 100644 Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi index 35e0e2ea224..782aba88096 100644 Binary files a/icons/mob/inhands/equipment/kitchen_righthand.dmi and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ