mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-30 11:32:20 +00:00
* Fixes some invisible inhands from the transforming component (#73807) ## About The Pull Request The original issue caused by #70037 Esword issue caused by #73716 Originally the transforming component did not override the inhand icon state of the the item on its own (instead putting the onus on the item itself if they wanted unique behavior). It was changed to always update inhand icon state, most of which don't have one I don't really like this fix, it should be explicit "I want inhand to change" and not default, but this will work for now Also the PR that fixed the Jaws issue didn't actually set the var they created Fixes #73805 Fixes #73711 (Actually) ## Why It's Good For The Game Invisible sword bad ## Changelog 🆑 Melbert fix: Fixed a eswords, some tools, and some other misc. items from being invisible while extended / active fix: Teleshields and other misc items not extending in hand when active fix: Switchblades click on extend again fix: Pendrivers click on extend /🆑 * Fixes some invisible inhands from the transforming component --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
454 lines
16 KiB
Plaintext
454 lines
16 KiB
Plaintext
/obj/item/melee
|
|
item_flags = NEEDS_PERMIT
|
|
|
|
/obj/item/melee/proc/check_martial_counter(mob/living/carbon/human/target, mob/living/carbon/human/user)
|
|
if(target.check_block())
|
|
target.visible_message(span_danger("[target.name] blocks [src] and twists [user]'s arm behind [user.p_their()] back!"),
|
|
span_userdanger("You block the attack!"))
|
|
user.Stun(40)
|
|
return TRUE
|
|
|
|
|
|
/obj/item/melee/chainofcommand
|
|
name = "chain of command"
|
|
desc = "A tool used by great men to placate the frothing masses."
|
|
icon_state = "chain"
|
|
inhand_icon_state = "chain"
|
|
worn_icon_state = "whip"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
flags_1 = CONDUCT_1
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 10
|
|
throwforce = 7
|
|
demolition_mod = 0.25
|
|
wound_bonus = 15
|
|
bare_wound_bonus = 10
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
attack_verb_continuous = list("flogs", "whips", "lashes", "disciplines")
|
|
attack_verb_simple = list("flog", "whip", "lash", "discipline")
|
|
hitsound = 'sound/weapons/chainhit.ogg'
|
|
custom_materials = list(/datum/material/iron = 1000)
|
|
|
|
/obj/item/melee/chainofcommand/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
return OXYLOSS
|
|
|
|
/obj/item/melee/synthetic_arm_blade
|
|
name = "synthetic arm blade"
|
|
desc = "A grotesque blade that on closer inspection seems to be made out of synthetic flesh, it still feels like it would hurt very badly as a weapon."
|
|
icon = 'icons/obj/weapons/changeling_items.dmi'
|
|
icon_state = "arm_blade"
|
|
inhand_icon_state = "arm_blade"
|
|
lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi'
|
|
w_class = WEIGHT_CLASS_HUGE
|
|
force = 20
|
|
throwforce = 10
|
|
hitsound = 'sound/weapons/bladeslice.ogg'
|
|
attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts")
|
|
attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut")
|
|
sharpness = SHARP_EDGED
|
|
|
|
/obj/item/melee/synthetic_arm_blade/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/butchering, \
|
|
speed = 6 SECONDS, \
|
|
effectiveness = 80, \
|
|
)
|
|
//very imprecise
|
|
|
|
/obj/item/melee/sabre
|
|
name = "officer's sabre"
|
|
desc = "An elegant weapon, its monomolecular edge is capable of cutting through flesh and bone with ease."
|
|
icon_state = "sabre"
|
|
inhand_icon_state = "sabre"
|
|
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
|
flags_1 = CONDUCT_1
|
|
obj_flags = UNIQUE_RENAME
|
|
force = 15
|
|
throwforce = 10
|
|
demolition_mod = 0.75 //but not metal
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
block_chance = 50
|
|
armour_penetration = 75
|
|
sharpness = SHARP_EDGED
|
|
attack_verb_continuous = list("slashes", "cuts")
|
|
attack_verb_simple = list("slash", "cut")
|
|
hitsound = 'sound/weapons/rapierhit.ogg'
|
|
custom_materials = list(/datum/material/iron = 1000)
|
|
wound_bonus = 10
|
|
bare_wound_bonus = 25
|
|
|
|
/obj/item/melee/sabre/Initialize(mapload)
|
|
. = ..()
|
|
AddComponent(/datum/component/butchering, \
|
|
speed = 3 SECONDS, \
|
|
effectiveness = 95, \
|
|
bonus_modifier = 5, \
|
|
)
|
|
//fast and effective, but as a sword, it might damage the results.
|
|
|
|
/obj/item/melee/sabre/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
|
|
if(attack_type == PROJECTILE_ATTACK)
|
|
final_block_chance = 0 //Don't bring a sword to a gunfight
|
|
return ..()
|
|
|
|
/obj/item/melee/sabre/on_exit_storage(datum/storage/container)
|
|
var/obj/item/storage/belt/sabre/sabre = container.real_location?.resolve()
|
|
if(istype(sabre))
|
|
playsound(sabre, 'sound/items/unsheath.ogg', 25, TRUE)
|
|
|
|
/obj/item/melee/sabre/on_enter_storage(datum/storage/container)
|
|
var/obj/item/storage/belt/sabre/sabre = container.real_location?.resolve()
|
|
if(istype(sabre))
|
|
playsound(sabre, 'sound/items/sheath.ogg', 25, TRUE)
|
|
|
|
/obj/item/melee/sabre/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] is trying to cut off all [user.p_their()] limbs with [src]! it looks like [user.p_theyre()] trying to commit suicide!"))
|
|
var/i = 0
|
|
ADD_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
|
if(iscarbon(user))
|
|
var/mob/living/carbon/Cuser = user
|
|
var/obj/item/bodypart/holding_bodypart = Cuser.get_holding_bodypart_of_item(src)
|
|
var/list/limbs_to_dismember
|
|
var/list/arms = list()
|
|
var/list/legs = list()
|
|
var/obj/item/bodypart/bodypart
|
|
|
|
for(bodypart in Cuser.bodyparts)
|
|
if(bodypart == holding_bodypart)
|
|
continue
|
|
if(bodypart.body_part & ARMS)
|
|
arms += bodypart
|
|
else if (bodypart.body_part & LEGS)
|
|
legs += bodypart
|
|
|
|
limbs_to_dismember = arms + legs
|
|
if(holding_bodypart)
|
|
limbs_to_dismember += holding_bodypart
|
|
|
|
var/speedbase = abs((4 SECONDS) / limbs_to_dismember.len)
|
|
for(bodypart in limbs_to_dismember)
|
|
i++
|
|
addtimer(CALLBACK(src, PROC_REF(suicide_dismember), user, bodypart), speedbase * i)
|
|
addtimer(CALLBACK(src, PROC_REF(manual_suicide), user), (5 SECONDS) * i)
|
|
return MANUAL_SUICIDE
|
|
|
|
/obj/item/melee/sabre/proc/suicide_dismember(mob/living/user, obj/item/bodypart/affecting)
|
|
if(!QDELETED(affecting) && affecting.dismemberable && affecting.owner == user && !QDELETED(user))
|
|
playsound(user, hitsound, 25, TRUE)
|
|
affecting.dismember(BRUTE)
|
|
user.adjustBruteLoss(20)
|
|
|
|
/obj/item/melee/sabre/proc/manual_suicide(mob/living/user, originally_nodropped)
|
|
if(!QDELETED(user))
|
|
user.adjustBruteLoss(200)
|
|
user.death(FALSE)
|
|
REMOVE_TRAIT(src, TRAIT_NODROP, SABRE_SUICIDE_TRAIT)
|
|
|
|
/obj/item/melee/beesword
|
|
name = "The Stinger"
|
|
desc = "Taken from a giant bee and folded over one thousand times in pure honey. Can sting through anything."
|
|
icon = 'icons/obj/weapons/items_and_weapons.dmi'
|
|
icon_state = "beesword"
|
|
inhand_icon_state = "stinger"
|
|
worn_icon_state = "stinger"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 5
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
sharpness = SHARP_EDGED
|
|
throwforce = 10
|
|
attack_speed = CLICK_CD_RAPID
|
|
block_chance = 20
|
|
armour_penetration = 65
|
|
attack_verb_continuous = list("slashes", "stings", "prickles", "pokes")
|
|
attack_verb_simple = list("slash", "sting", "prickle", "poke")
|
|
hitsound = 'sound/weapons/rapierhit.ogg'
|
|
|
|
/obj/item/melee/beesword/afterattack(atom/target, mob/user, proximity)
|
|
. = ..()
|
|
if(!proximity)
|
|
return
|
|
if(iscarbon(target))
|
|
var/mob/living/carbon/carbon_target = target
|
|
carbon_target.reagents.add_reagent(/datum/reagent/toxin, 4)
|
|
|
|
/obj/item/melee/beesword/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] is stabbing [user.p_them()]self in the throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
|
|
playsound(get_turf(src), hitsound, 75, TRUE, -1)
|
|
return TOXLOSS
|
|
|
|
/obj/item/melee/supermatter_sword
|
|
name = "supermatter sword"
|
|
desc = "In a station full of bad ideas, this might just be the worst."
|
|
icon = 'icons/obj/weapons/items_and_weapons.dmi'
|
|
icon_state = "supermatter_sword"
|
|
inhand_icon_state = "supermatter_sword"
|
|
lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi'
|
|
slot_flags = null
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
force = 0.001
|
|
armour_penetration = 1000
|
|
force_string = "INFINITE"
|
|
item_flags = NEEDS_PERMIT|NO_BLOOD_ON_ITEM
|
|
var/obj/machinery/power/supermatter_crystal/shard
|
|
var/balanced = 1
|
|
|
|
/obj/item/melee/supermatter_sword/Initialize(mapload)
|
|
. = ..()
|
|
shard = new /obj/machinery/power/supermatter_crystal(src)
|
|
qdel(shard.countdown)
|
|
shard.countdown = null
|
|
START_PROCESSING(SSobj, src)
|
|
visible_message(span_warning("[src] appears, balanced ever so perfectly on its hilt. This isn't ominous at all."))
|
|
|
|
/obj/item/melee/supermatter_sword/process()
|
|
if(balanced || throwing || ismob(src.loc) || isnull(src.loc))
|
|
return
|
|
if(!isturf(src.loc))
|
|
var/atom/target = src.loc
|
|
forceMove(target.loc)
|
|
consume_everything(target)
|
|
else
|
|
var/turf/turf = get_turf(src)
|
|
if(!isspaceturf(turf))
|
|
consume_turf(turf)
|
|
|
|
/obj/item/melee/supermatter_sword/afterattack(target, mob/user, proximity_flag)
|
|
. = ..()
|
|
if(user && target == user)
|
|
user.dropItemToGround(src)
|
|
if(proximity_flag)
|
|
consume_everything(target)
|
|
return . | AFTERATTACK_PROCESSED_ITEM
|
|
|
|
/obj/item/melee/supermatter_sword/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
|
|
..()
|
|
if(ismob(hit_atom))
|
|
var/mob/mob = hit_atom
|
|
if(src.loc == mob)
|
|
mob.dropItemToGround(src)
|
|
consume_everything(hit_atom)
|
|
|
|
/obj/item/melee/supermatter_sword/pickup(user)
|
|
..()
|
|
balanced = 0
|
|
|
|
/obj/item/melee/supermatter_sword/ex_act(severity, target)
|
|
visible_message(
|
|
span_danger("The blast wave smacks into [src] and rapidly flashes to ash."),
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat.")
|
|
)
|
|
consume_everything()
|
|
|
|
/obj/item/melee/supermatter_sword/acid_act()
|
|
visible_message(span_danger("The acid smacks into [src] and rapidly flashes to ash."),\
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat."))
|
|
consume_everything()
|
|
return TRUE
|
|
|
|
/obj/item/melee/supermatter_sword/bullet_act(obj/projectile/projectile)
|
|
visible_message(span_danger("[projectile] smacks into [src] and rapidly flashes to ash."),\
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat."))
|
|
consume_everything(projectile)
|
|
return BULLET_ACT_HIT
|
|
|
|
/obj/item/melee/supermatter_sword/suicide_act(mob/living/user)
|
|
user.visible_message(span_suicide("[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!"))
|
|
user.dropItemToGround(src, TRUE)
|
|
shard.Bumped(user)
|
|
|
|
/obj/item/melee/supermatter_sword/proc/consume_everything(target)
|
|
if(isnull(target))
|
|
shard.Bump(target)
|
|
else if(!isturf(target))
|
|
shard.Bumped(target)
|
|
else
|
|
consume_turf(target)
|
|
|
|
/obj/item/melee/supermatter_sword/proc/consume_turf(turf/turf)
|
|
var/oldtype = turf.type
|
|
var/turf/newT = turf.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
|
if(newT.type == oldtype)
|
|
return
|
|
playsound(turf, 'sound/effects/supermatter.ogg', 50, TRUE)
|
|
turf.visible_message(
|
|
span_danger("[turf] smacks into [src] and rapidly flashes to ash."),
|
|
span_hear("You hear a loud crack as you are washed with a wave of heat."),
|
|
)
|
|
shard.Bump(turf)
|
|
|
|
/obj/item/melee/curator_whip
|
|
name = "curator's whip"
|
|
desc = "Somewhat eccentric and outdated, it still stings like hell to be hit by."
|
|
icon_state = "whip"
|
|
inhand_icon_state = "chain"
|
|
lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
|
|
worn_icon_state = "whip"
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 15
|
|
demolition_mod = 0.25
|
|
w_class = WEIGHT_CLASS_NORMAL
|
|
attack_verb_continuous = list("flogs", "whips", "lashes", "disciplines")
|
|
attack_verb_simple = list("flog", "whip", "lash", "discipline")
|
|
hitsound = 'sound/weapons/whip.ogg'
|
|
|
|
/obj/item/melee/curator_whip/afterattack(target, mob/user, proximity_flag)
|
|
. = ..()
|
|
if(ishuman(target) && proximity_flag)
|
|
var/mob/living/carbon/human/human_target = target
|
|
human_target.drop_all_held_items()
|
|
human_target.visible_message(span_danger("[user] disarms [human_target]!"), span_userdanger("[user] disarmed you!"))
|
|
|
|
/obj/item/melee/roastingstick
|
|
name = "advanced roasting stick"
|
|
desc = "A telescopic roasting stick with a miniature shield generator designed to ensure entry into various high-tech shielded cooking ovens and firepits."
|
|
icon_state = "roastingstick"
|
|
inhand_icon_state = null
|
|
worn_icon_state = "tele_baton"
|
|
slot_flags = ITEM_SLOT_BELT
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
item_flags = NONE
|
|
force = 0
|
|
attack_verb_continuous = list("hits", "pokes")
|
|
attack_verb_simple = list("hit", "poke")
|
|
/// The sausage attatched to our stick.
|
|
var/obj/item/food/sausage/held_sausage
|
|
/// Static list of things our roasting stick can interact with.
|
|
var/static/list/ovens
|
|
/// The beam that links to the oven we use
|
|
var/datum/beam/beam
|
|
/// Whether or stick is extended and can recieve sausage
|
|
var/extended = FALSE
|
|
|
|
/obj/item/melee/roastingstick/Initialize(mapload)
|
|
. = ..()
|
|
if (!ovens)
|
|
ovens = typecacheof(list(/obj/singularity, /obj/energy_ball, /obj/machinery/power/supermatter_crystal, /obj/structure/bonfire))
|
|
AddComponent(/datum/component/transforming, \
|
|
hitsound_on = hitsound, \
|
|
clumsy_check = FALSE, \
|
|
inhand_icon_change = FALSE, \
|
|
)
|
|
RegisterSignal(src, COMSIG_TRANSFORMING_PRE_TRANSFORM, PROC_REF(attempt_transform))
|
|
RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform))
|
|
|
|
/*
|
|
* Signal proc for [COMSIG_TRANSFORMING_PRE_TRANSFORM].
|
|
*
|
|
* If there is a sausage attached, returns COMPONENT_BLOCK_TRANSFORM.
|
|
*/
|
|
/obj/item/melee/roastingstick/proc/attempt_transform(obj/item/source, mob/user, active)
|
|
SIGNAL_HANDLER
|
|
|
|
if(held_sausage)
|
|
to_chat(user, span_warning("You can't retract [src] while [held_sausage] is attached!"))
|
|
return COMPONENT_BLOCK_TRANSFORM
|
|
|
|
/*
|
|
* Signal proc for [COMSIG_TRANSFORMING_ON_TRANSFORM].
|
|
*
|
|
* Gives feedback on stick extension.
|
|
*/
|
|
/obj/item/melee/roastingstick/proc/on_transform(obj/item/source, mob/user, active)
|
|
SIGNAL_HANDLER
|
|
|
|
extended = active
|
|
inhand_icon_state = active ? "nullrod" : null
|
|
balloon_alert(user, "[active ? "extended" : "collapsed"] [src]")
|
|
playsound(user ? user : src, 'sound/weapons/batonextend.ogg', 50, TRUE)
|
|
return COMPONENT_NO_DEFAULT_MESSAGE
|
|
|
|
/obj/item/melee/roastingstick/attackby(atom/target, mob/user)
|
|
..()
|
|
if (istype(target, /obj/item/food/sausage))
|
|
if (!extended)
|
|
to_chat(user, span_warning("You must extend [src] to attach anything to it!"))
|
|
return
|
|
if (held_sausage)
|
|
to_chat(user, span_warning("[held_sausage] is already attached to [src]!"))
|
|
return
|
|
if (user.transferItemToLoc(target, src))
|
|
held_sausage = target
|
|
else
|
|
to_chat(user, span_warning("[target] doesn't seem to want to get on [src]!"))
|
|
update_appearance()
|
|
|
|
/obj/item/melee/roastingstick/attack_hand(mob/user, list/modifiers)
|
|
..()
|
|
if (held_sausage)
|
|
user.put_in_hands(held_sausage)
|
|
held_sausage = null
|
|
update_appearance()
|
|
|
|
/obj/item/melee/roastingstick/update_overlays()
|
|
. = ..()
|
|
if(held_sausage)
|
|
. += mutable_appearance(icon, "roastingstick_sausage")
|
|
|
|
/obj/item/melee/roastingstick/handle_atom_del(atom/target)
|
|
if (target == held_sausage)
|
|
held_sausage = null
|
|
update_appearance()
|
|
|
|
/obj/item/melee/roastingstick/afterattack(atom/target, mob/user, proximity)
|
|
. = ..()
|
|
if (!extended)
|
|
return
|
|
if (!is_type_in_typecache(target, ovens))
|
|
return
|
|
if (istype(target, /obj/singularity) && get_dist(user, target) < 10)
|
|
to_chat(user, span_notice("You send [held_sausage] towards [target]."))
|
|
playsound(src, 'sound/items/rped.ogg', 50, TRUE)
|
|
beam = user.Beam(target, icon_state = "rped_upgrade", time = 10 SECONDS)
|
|
else if (user.Adjacent(target))
|
|
to_chat(user, span_notice("You extend [src] towards [target]."))
|
|
playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, TRUE)
|
|
else
|
|
return
|
|
finish_roasting(user, target)
|
|
|
|
/obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target)
|
|
if(do_after(user, 100, target = user))
|
|
to_chat(user, span_notice("You finish roasting [held_sausage]."))
|
|
playsound(src, 'sound/items/welder2.ogg', 50, TRUE)
|
|
held_sausage.add_atom_colour(rgb(103, 63, 24), FIXED_COLOUR_PRIORITY)
|
|
held_sausage.name = "[target.name]-roasted [held_sausage.name]"
|
|
held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]."
|
|
update_appearance()
|
|
else
|
|
QDEL_NULL(beam)
|
|
playsound(src, 'sound/weapons/batonextend.ogg', 50, TRUE)
|
|
to_chat(user, span_notice("You put [src] away."))
|
|
|
|
/obj/item/melee/cleric_mace
|
|
name = "cleric mace"
|
|
desc = "The grandson of the club, yet the grandfather of the baseball bat. Most notably used by holy orders in days past."
|
|
icon = 'icons/obj/weapons/cleric_mace.dmi'
|
|
icon_state = "default"
|
|
inhand_icon_state = "default"
|
|
worn_icon_state = "default_worn"
|
|
|
|
greyscale_config = /datum/greyscale_config/cleric_mace
|
|
greyscale_config_inhand_left = /datum/greyscale_config/cleric_mace_lefthand
|
|
greyscale_config_inhand_right = /datum/greyscale_config/cleric_mace_righthand
|
|
greyscale_config_worn = /datum/greyscale_config/cleric_mace
|
|
greyscale_colors = "#FFFFFF"
|
|
|
|
material_flags = MATERIAL_EFFECTS | MATERIAL_ADD_PREFIX | MATERIAL_GREYSCALE | MATERIAL_AFFECT_STATISTICS //Material type changes the prefix as well as the color.
|
|
custom_materials = list(/datum/material/iron = 12000) //Defaults to an Iron Mace.
|
|
slot_flags = ITEM_SLOT_BELT
|
|
force = 14
|
|
w_class = WEIGHT_CLASS_BULKY
|
|
throwforce = 8
|
|
block_chance = 10
|
|
armour_penetration = 50
|
|
attack_verb_continuous = list("smacks", "strikes", "cracks", "beats")
|
|
attack_verb_simple = list("smack", "strike", "crack", "beat")
|