Migrates /obj/item/stack to the new attack chain (#31709)

* e

* stuff not in the stack folder

* A

* Update gift_wrappaper.dm

* golg

* dancing around SHOULD_NOT_SLEEP and storage still being legacy

* Update asteroid_floors.dm

* Update medical_packs.dm

* Update medical_packs.dm
This commit is contained in:
CRUNCH
2026-04-02 02:32:15 +00:00
committed by GitHub
parent 07b4ab0b4c
commit d030b8afb8
20 changed files with 559 additions and 434 deletions
+24 -23
View File
@@ -65,20 +65,21 @@ GLOBAL_LIST_INIT(glass_recipes, list (
. = ..()
recipes = GLOB.glass_recipes
/obj/item/stack/sheet/glass/attackby__legacy__attackchain(obj/item/W, mob/user, params)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
/obj/item/stack/sheet/glass/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(istype(used, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = used
if(CC.get_amount() < 5)
to_chat(user, "<b>There is not enough wire in this coil. You need 5 lengths.</b>")
return
to_chat(user, SPAN_WARNING("[used] doesn't have enough cable! You need 5 lengths."))
return ITEM_INTERACT_COMPLETE
CC.use(5)
to_chat(user, SPAN_NOTICE("You attach wire to [src]."))
new /obj/item/stack/light_w(user.loc)
use(1)
return
return ITEM_INTERACT_COMPLETE
if(istype(W, /obj/item/stack/rods))
var/obj/item/stack/rods/V = W
if(istype(used, /obj/item/stack/rods))
var/obj/item/stack/rods/V = used
var/obj/item/stack/sheet/rglass/RG = new (user.loc)
RG.add_fingerprint(user)
V.use(1)
@@ -88,7 +89,7 @@ GLOBAL_LIST_INIT(glass_recipes, list (
G.use(1)
if(!G && !RG && replace)
user.put_in_hands(RG)
return
return ITEM_INTERACT_COMPLETE
return ..()
@@ -186,22 +187,22 @@ GLOBAL_LIST_INIT(pglass_recipes, list (
. = ..()
recipes = GLOB.pglass_recipes
/obj/item/stack/sheet/plasmaglass/attackby__legacy__attackchain(obj/item/W, mob/user, params)
..()
if(istype(W, /obj/item/stack/rods))
var/obj/item/stack/rods/V = W
var/obj/item/stack/sheet/plasmarglass/RG = new (user.loc)
RG.add_fingerprint(user)
V.use(1)
var/obj/item/stack/sheet/glass/G = src
src = null
var/replace = (user.get_inactive_hand()==G)
G.use(1)
if(!G && !RG && replace)
user.put_in_hands(RG)
else
/obj/item/stack/sheet/plasmaglass/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!istype(used, /obj/item/stack/rods))
return ..()
var/obj/item/stack/rods/V = used
var/obj/item/stack/sheet/plasmarglass/RG = new (user.loc)
RG.add_fingerprint(user)
V.use(1)
var/obj/item/stack/sheet/glass/G = src
src = null
var/replace = (user.get_inactive_hand() == G)
G.use(1)
if(!G && !RG && replace)
user.put_in_hands(RG)
return ITEM_INTERACT_COMPLETE
//////////////////////////////
// MARK: REINFORCED PLASMA GLASS
//////////////////////////////
+119 -89
View File
@@ -187,48 +187,62 @@ GLOBAL_LIST_INIT(sinew_recipes, list (
/obj/item/clothing/head/hooded/explorer,
/obj/item/clothing/head/helmet/space/plasmaman/mining))
/obj/item/stack/sheet/animalhide/goliath_hide/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag)
if(!proximity_flag)
return
/obj/item/stack/sheet/animalhide/goliath_hide/interact_with_atom(atom/target, mob/living/user, list/modifiers)
if(is_type_in_typecache(target, goliath_platable_armor_typecache))
var/obj/item/clothing/C = target
var/datum/armor/current_armor = C.armor
if(current_armor.getRating(MELEE) < 75)
if(!use(1))
to_chat(user, SPAN_NOTICE("You dont have enough [src] for this!"))
return
C.armor = current_armor.setRating(melee_value = min(current_armor.getRating(MELEE) + 15, 75))
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against melee attacks."))
else
if(current_armor.getRating(MELEE) >= 75)
to_chat(user, SPAN_WARNING("You can't improve [C] any further!"))
else if(istype(target, /obj/mecha/working/ripley))
return ITEM_INTERACT_COMPLETE
if(!use(1))
to_chat(user, SPAN_WARNING("You dont have enough [src] for this!"))
return ITEM_INTERACT_COMPLETE
C.armor = current_armor.setRating(melee_value = min(current_armor.getRating(MELEE) + 15, 75))
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against melee attacks."))
return ITEM_INTERACT_COMPLETE
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/D = target
if(D.hides < HIDES_COVERED_FULL && !D.plates && !D.drake_hides)
if(!use(1))
to_chat(user, SPAN_NOTICE("You dont have enough [src] for this!"))
return
D.hides++
D.armor = D.armor.setRating(melee_value = min(D.armor.getRating(MELEE) + 10, 70))
D.armor = D.armor.setRating(bullet_value = min(D.armor.getRating(BULLET) + 7, 60))
D.armor = D.armor.setRating(laser_value = min(D.armor.getRating(LASER) + 7, 60))
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against attacks."))
D.update_appearance(UPDATE_DESC|UPDATE_OVERLAYS)
else
if(D.hides >= HIDES_COVERED_FULL)
to_chat(user, SPAN_WARNING("You can't improve [D] any further!"))
else if(isrobot(target))
return ITEM_INTERACT_COMPLETE
if(D.plates || D.drake_hides)
to_chat(user, SPAN_WARNING("[D] is already protected by a different kind of armor!"))
return ITEM_INTERACT_COMPLETE
if(!use(1))
to_chat(user, SPAN_WARNING("You dont have enough [src] for this!"))
return ITEM_INTERACT_COMPLETE
D.hides++
D.armor = D.armor.setRating(melee_value = min(D.armor.getRating(MELEE) + 10, 70))
D.armor = D.armor.setRating(bullet_value = min(D.armor.getRating(BULLET) + 7, 60))
D.armor = D.armor.setRating(laser_value = min(D.armor.getRating(LASER) + 7, 60))
D.update_appearance(UPDATE_DESC|UPDATE_OVERLAYS)
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against attacks."))
return ITEM_INTERACT_COMPLETE
if(isrobot(target))
var/mob/living/silicon/robot/R = target
if(istype(R.module, /obj/item/robot_module/miner))
var/datum/armor/current_armor = R.armor
if(current_armor.getRating(MELEE) < 75)
if(!use(1))
to_chat(user, SPAN_NOTICE("You dont have enough [src] for this!"))
return
R.armor = current_armor.setRating(melee_value = min(current_armor.getRating(MELEE) + 15, 75))
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against melee attacks."))
else
to_chat(user, SPAN_WARNING("You can't improve [R] any further!"))
else
to_chat(user, SPAN_WARNING("[R]'s armor can not be improved!"))
if(!istype(R.module, /obj/item/robot_module/miner))
to_chat(user, SPAN_WARNING("[R]'s armor can not be improved, only mining modules have hardpoints for attaching [src]!"))
return ITEM_INTERACT_COMPLETE
var/datum/armor/current_armor = R.armor
if(current_armor.getRating(MELEE) >= 75)
to_chat(user, SPAN_WARNING("You can't improve the armor on [R] any further!"))
return ITEM_INTERACT_COMPLETE
if(!use(1))
to_chat(user, SPAN_WARNING("You dont have enough [src] for this!"))
return ITEM_INTERACT_COMPLETE
R.armor = current_armor.setRating(melee_value = min(current_armor.getRating(MELEE) + 15, 75))
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against melee attacks."))
return ITEM_INTERACT_COMPLETE
/obj/item/stack/sheet/animalhide/armor_plate
name = "armor plate"
@@ -240,26 +254,29 @@ GLOBAL_LIST_INIT(sinew_recipes, list (
layer = MOB_LAYER
materials = list(MAT_METAL = 20000, MAT_TITANIUM = 5000)
/obj/item/stack/sheet/animalhide/armor_plate/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag)
if(!proximity_flag)
return
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/D = target
if(D.plates < PLATES_COVERED_FULL && !D.hides && !D.drake_hides)
if(!use(1))
to_chat(user, SPAN_NOTICE("You dont have enough [src] for this!"))
return
D.plates++
D.armor = D.armor.setRating(melee_value = min(D.armor.getRating(MELEE) + 7, 60))
D.armor = D.armor.setRating(bullet_value = min(D.armor.getRating(BULLET) + 4, 50))
D.armor = D.armor.setRating(laser_value = min(D.armor.getRating(LASER) + 4, 50))
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against attacks."))
D.update_appearance(UPDATE_DESC|UPDATE_OVERLAYS)
else
to_chat(user, SPAN_WARNING("You can't improve [D] any further!"))
/obj/item/stack/sheet/animalhide/armor_plate/interact_with_atom(atom/target, mob/living/user, list/modifiers)
if(!istype(target, /obj/mecha/working/ripley))
return ..()
/obj/item/stack/sheet/animalhide/armor_plate/attackby__legacy__attackchain(obj/item/W, mob/user, params)
return // no steel leather for ya
var/obj/mecha/working/ripley/D = target
if(D.plates >= PLATES_COVERED_FULL)
to_chat(user, SPAN_WARNING("You can't improve [D] any further!"))
return ITEM_INTERACT_COMPLETE
if(D.hides || D.drake_hides)
to_chat(user, SPAN_WARNING("[D] is already protected by a different kind of armor!"))
return ITEM_INTERACT_COMPLETE
if(!use(1))
to_chat(user, SPAN_NOTICE("You dont have enough [src] for this!"))
return ITEM_INTERACT_COMPLETE
D.plates++
D.armor = D.armor.setRating(melee_value = min(D.armor.getRating(MELEE) + 7, 60))
D.armor = D.armor.setRating(bullet_value = min(D.armor.getRating(BULLET) + 4, 50))
D.armor = D.armor.setRating(laser_value = min(D.armor.getRating(LASER) + 4, 50))
D.update_appearance(UPDATE_DESC|UPDATE_OVERLAYS)
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against attacks."))
/obj/item/stack/sheet/animalhide/ashdrake
name = "ash drake hide"
@@ -270,45 +287,58 @@ GLOBAL_LIST_INIT(sinew_recipes, list (
layer = MOB_LAYER
dynamic_icon_state = TRUE
/obj/item/stack/sheet/animalhide/ashdrake/afterattack__legacy__attackchain(atom/target, mob/user, proximity_flag)
if(!proximity_flag)
return
if(istype(target, /obj/mecha/working/ripley))
var/obj/mecha/working/ripley/D = target
if(D.drake_hides < DRAKE_HIDES_COVERED_FULL && !D.hides && !D.plates)
if(!use(3))
to_chat(user, SPAN_NOTICE("You dont have enough [src] for this!"))
return
D.drake_hides++
D.max_integrity += 50
D.obj_integrity += 50
D.armor = D.armor.setRating(melee_value = min(D.armor.getRating(MELEE) + 13, 80))
D.armor = D.armor.setRating(bullet_value = min(D.armor.getRating(BULLET) + 7, 60))
D.armor = D.armor.setRating(laser_value = min(D.armor.getRating(LASER) + 7, 60))
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against attacks."))
D.update_appearance(UPDATE_DESC|UPDATE_OVERLAYS)
else
to_chat(user, SPAN_WARNING("You can't improve [D] any further!"))
/obj/item/stack/sheet/animalhide/ashdrake/interact_with_atom(atom/target, mob/living/user, list/modifiers)
if(!istype(target, /obj/mecha/working/ripley))
return ..()
var/obj/mecha/working/ripley/D = target
if(D.drake_hides >= DRAKE_HIDES_COVERED_FULL)
to_chat(user, SPAN_WARNING("You can't improve [D] any further!"))
return ITEM_INTERACT_COMPLETE
if(D.hides || D.plates)
to_chat(user, SPAN_WARNING("[D] is already protected by a different kind of armor!"))
return ITEM_INTERACT_COMPLETE
if(!use(3))
to_chat(user, SPAN_NOTICE("You dont have enough [src] for this!"))
return ITEM_INTERACT_COMPLETE
D.drake_hides++
D.max_integrity += 50
D.obj_integrity += 50
D.armor = D.armor.setRating(melee_value = min(D.armor.getRating(MELEE) + 13, 80))
D.armor = D.armor.setRating(bullet_value = min(D.armor.getRating(BULLET) + 7, 60))
D.armor = D.armor.setRating(laser_value = min(D.armor.getRating(LASER) + 7, 60))
D.update_appearance(UPDATE_DESC|UPDATE_OVERLAYS)
to_chat(user, SPAN_NOTICE("You strengthen [target], improving its resistance against attacks."))
//Step one - dehairing.
/obj/item/stack/sheet/animalhide/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!used.sharp)
return ..()
/obj/item/stack/sheet/animalhide/attackby__legacy__attackchain(obj/item/W, mob/user, params)
if(W.sharp)
user.visible_message("[user] starts cutting hair off \the [src].", SPAN_NOTICE("You start cutting the hair off \the [src]..."), SPAN_ITALICS("You hear the sound of a knife rubbing against flesh."))
if(do_after(user, 50 * W.toolspeed, target = src))
to_chat(user, SPAN_NOTICE("You cut the hair from this [src.singular_name]."))
//Try locating an exisitng stack on the tile and add to there if possible
for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc)
if(HS.amount < 50)
HS.amount++
src.use(1)
break
//If it gets to here it means it did not find a suitable stack on the tile.
var/obj/item/stack/sheet/hairlesshide/HS = new(usr.loc)
HS.amount = 1
user.visible_message(
SPAN_NOTICE("[user] starts cutting hair off [src]."),
SPAN_NOTICE("You start cutting the hair off [src]..."),
SPAN_WARNING("You hear the sound of a knife rubbing against flesh!")
)
if(!do_after(user, 50 * used.toolspeed, target = src))
return ITEM_INTERACT_COMPLETE
to_chat(user, SPAN_NOTICE("You cut the hair from this [src.singular_name]."))
//Try locating an exisitng stack on the tile and add to there if possible
for(var/obj/item/stack/sheet/hairlesshide/hide in usr.loc)
if(hide.amount < 50)
hide.amount++
src.use(1)
else
..()
return ITEM_INTERACT_COMPLETE
//If it gets to here it means it did not find a suitable stack on the tile.
var/obj/item/stack/sheet/hairlesshide/hide = new(usr.loc)
hide.amount = 1
src.use(1)
return ITEM_INTERACT_COMPLETE
//Step two - washing (also handled by water reagent code and washing machine code)
/obj/item/stack/sheet/hairlesshide/water_act(volume, temperature, source, method = REAGENT_TOUCH)
+18 -12
View File
@@ -12,16 +12,22 @@
flags = CONDUCT
max_amount = 60
/obj/item/stack/light_w/attackby__legacy__attackchain(obj/item/I, mob/user, params)
..()
if(istype(I, /obj/item/wirecutters))
var/obj/item/stack/cable_coil/CC = new(user.loc)
CC.amount = 5
new/obj/item/stack/sheet/glass(user.loc)
use(1)
/obj/item/stack/light_w/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!istype(used, /obj/item/stack/sheet/metal))
return ..()
if(istype(I, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = I
M.use(1)
new /obj/item/stack/tile/light(user.loc)
use(1)
var/obj/item/stack/sheet/metal/M = used
M.use(1)
new /obj/item/stack/tile/light(user.loc)
use(1)
return ITEM_INTERACT_COMPLETE
/obj/item/stack/light_w/wirecutter_act(mob/living/user, obj/item/I)
if(!istype(I, /obj/item/wirecutters))
return
var/obj/item/stack/cable_coil/CC = new(user.loc)
CC.amount = 5
new/obj/item/stack/sheet/glass(user.loc)
use(1)
return ITEM_INTERACT_COMPLETE
@@ -197,19 +197,21 @@ GLOBAL_LIST_INIT(sandbag_recipes, list (
icon = 'icons/obj/stacks/miscellaneous.dmi'
icon_state = "empty-sandbags"
w_class = WEIGHT_CLASS_TINY
new_attack_chain = TRUE
/obj/item/emptysandbag/attackby__legacy__attackchain(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stack/ore/glass))
var/obj/item/stack/ore/glass/G = I
to_chat(user, SPAN_NOTICE("You fill the sandbag."))
var/obj/item/stack/sheet/mineral/sandbags/S = new /obj/item/stack/sheet/mineral/sandbags(drop_location())
qdel(src)
if(Adjacent(user) && !issilicon(user))
user.put_in_hands(S)
G.use(1)
else
/obj/item/emptysandbag/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!istype(used, /obj/item/stack/ore/glass))
return ..()
to_chat(user, SPAN_NOTICE("You fill the sandbag."))
var/obj/item/stack/sheet/mineral/sandbags/S = new /obj/item/stack/sheet/mineral/sandbags(drop_location())
if(Adjacent(user) && ishuman(user))
user.put_in_hands(S)
var/obj/item/stack/ore/glass/G = used
G.use(1)
qdel(src)
return ITEM_INTERACT_COMPLETE
/obj/item/stack/sheet/mineral/diamond
name = "diamond"
desc = "Sparkles like a twinkling star."
@@ -311,12 +313,13 @@ GLOBAL_LIST_INIT(sandbag_recipes, list (
log_and_set_aflame(user, I)
return TRUE
/obj/item/stack/sheet/mineral/plasma/attackby__legacy__attackchain(obj/item/I, mob/living/user, params)
if(I.get_heat())
log_and_set_aflame(user, I)
else
/obj/item/stack/sheet/mineral/plasma/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!used.get_heat())
return ..()
log_and_set_aflame(user, used)
return ITEM_INTERACT_COMPLETE
/obj/item/stack/sheet/mineral/plasma/proc/log_and_set_aflame(mob/user, obj/item/I)
var/turf/T = get_turf(src)
message_admins("Plasma sheets ignited by [key_name_admin(user)]([ADMIN_QUE(user, "?")]) ([ADMIN_FLW(user, "FLW")]) in ([COORD(T)] - [ADMIN_JMP(T)]")
@@ -535,15 +535,16 @@ GLOBAL_LIST_INIT(cardboard_recipes, list (
)),
))
/obj/item/stack/sheet/cardboard/attackby__legacy__attackchain(obj/item/I, mob/user, params)
if(istype(I, /obj/item/stamp/clown) && !isstorage(loc))
/obj/item/stack/sheet/cardboard/item_interaction(mob/living/user, obj/item/used, list/modifiers)
if(!istype(used, /obj/item/stamp/clown) || isstorage(loc))
return ..()
if(use(1))
var/atom/droploc = drop_location()
if(use(1))
playsound(I, 'sound/items/bikehorn.ogg', 50, TRUE, -1)
to_chat(user, SPAN_NOTICE("You stamp the cardboard! It's a clown box! Honk!"))
new/obj/item/storage/box/clown(droploc) //bugfix
else
. = ..()
to_chat(user, SPAN_NOTICE("You stamp the cardboard! It's a clown box! Honk!"))
playsound(used, 'sound/items/bikehorn.ogg', 50, TRUE, -1)
new/obj/item/storage/box/clown(droploc)
return ITEM_INTERACT_COMPLETE
/// BubbleWrap
/obj/item/stack/sheet/cardboard
@@ -621,15 +622,14 @@ GLOBAL_LIST_INIT(cult_recipes, list (
icon_state = GET_CULT_DATA(runed_metal_icon_state, initial(icon_state))
recipes = GLOB.cult_recipes
/obj/item/stack/sheet/runed_metal/attack_self__legacy__attackchain(mob/living/user)
if(!IS_CULTIST(user))
/obj/item/stack/sheet/runed_metal/activate_self(mob/user)
if(!IS_CULTIST(user) || user.holy_check())
to_chat(user, SPAN_WARNING("Only one with forbidden knowledge could hope to work this metal..."))
return
if(usr.holy_check())
return
return ITEM_INTERACT_COMPLETE
if(!is_level_reachable(user.z))
to_chat(user, SPAN_WARNING("The energies of this place interfere with the metal shaping!"))
return
return ITEM_INTERACT_COMPLETE
return ..()