/* Tables and Racks * Contains: * Tables * Glass Tables * Wooden Tables * Reinforced Tables * Racks * Rack Parts */ /* * Tables */ /obj/structure/table name = "table" desc = "A square piece of metal standing on four metal legs. It can not move." icon = 'icons/obj/smooth_structures/table.dmi' icon_state = "table" density = TRUE anchored = TRUE layer = TABLE_LAYER climbable = TRUE obj_flags = CAN_BE_HIT|SHOVABLE_ONTO pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE var/frame = /obj/structure/table_frame var/framestack = /obj/item/stack/rods var/buildstack = /obj/item/stack/sheet/metal var/busy = FALSE var/buildstackamount = 1 var/framestackamount = 2 var/deconstruction_ready = 1 max_integrity = 100 integrity_failure = 0.33 smooth = SMOOTH_TRUE canSmoothWith = list(/obj/structure/table, /obj/structure/table/reinforced, /obj/structure/table/greyscale) /obj/structure/table/examine(mob/user) . = ..() . += deconstruction_hints(user) /obj/structure/table/proc/deconstruction_hints(mob/user) return "The top is screwed on, but the main bolts are also visible." /obj/structure/table/update_icon() if(smooth) queue_smooth(src) queue_smooth_neighbors(src) /obj/structure/table/narsie_act() var/atom/A = loc qdel(src) new /obj/structure/table/wood(A) /obj/structure/table/ratvar_act() var/atom/A = loc qdel(src) new /obj/structure/table/reinforced/brass(A) /obj/structure/table/attack_paw(mob/user) return attack_hand(user) /obj/structure/table/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) if(Adjacent(user) && user.pulling) if(isliving(user.pulling)) var/mob/living/pushed_mob = user.pulling if(pushed_mob.buckled) to_chat(user, "[pushed_mob] is buckled to [pushed_mob.buckled]!") return if(user.a_intent == INTENT_GRAB) if(user.grab_state < GRAB_AGGRESSIVE) to_chat(user, "You need a better grip to do that!") return if(user.grab_state >= GRAB_NECK || HAS_TRAIT(user, TRAIT_MAULER)) tablelimbsmash(user, pushed_mob) else tablepush(user, pushed_mob) if(user.a_intent == INTENT_HELP) pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \ "[user] begins to place [pushed_mob] onto [src]...") if(do_after(user, 35, target = pushed_mob)) tableplace(user, pushed_mob) else return user.stop_pulling() else if(user.pulling.pass_flags & PASSTABLE) user.Move_Pulled(src) if (user.pulling.loc == loc) user.visible_message("[user] places [user.pulling] onto [src].", "You place [user.pulling] onto [src].") user.stop_pulling() return ..() /obj/structure/table/attack_robot(mob/user) on_attack_hand(user) /obj/structure/table/attack_tk() return FALSE /obj/structure/table/CanPass(atom/movable/mover, turf/target) if(istype(mover) && (mover.pass_flags & PASSTABLE)) return 1 if(mover.throwing) return 1 if(locate(/obj/structure/table) in get_turf(mover)) return 1 else return !density /obj/structure/table/CanAStarPass(ID, dir, caller) . = !density if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) /obj/structure/table/proc/tableplace(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(src.loc) pushed_mob.set_resting(TRUE, FALSE) pushed_mob.visible_message("[user] places [pushed_mob] onto [src].", \ "[user] places [pushed_mob] onto [src].") log_combat(user, pushed_mob, "placed") /obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) if(HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!") return var/added_passtable = FALSE if(!(pushed_mob.pass_flags & PASSTABLE)) added_passtable = TRUE pushed_mob.pass_flags |= PASSTABLE pushed_mob.Move(src.loc) if(added_passtable) pushed_mob.pass_flags &= ~PASSTABLE if(pushed_mob.loc != loc) //Something prevented the tabling return pushed_mob.DefaultCombatKnockdown(40) pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \ "[user] slams you onto [src]!") log_combat(user, pushed_mob, "tabled", null, "onto [src]") if(!ishuman(pushed_mob)) return var/mob/living/carbon/human/H = pushed_mob if(iscatperson(H)) H.emote("nya") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table) /obj/structure/table/proc/tablelimbsmash(mob/living/user, mob/living/pushed_mob) pushed_mob.Knockdown(30) var/obj/item/bodypart/banged_limb = pushed_mob.get_bodypart(user.zone_selected) || pushed_mob.get_bodypart(BODY_ZONE_HEAD) var/extra_wound = 0 if(HAS_TRAIT(user, TRAIT_HULK) || HAS_TRAIT(user, TRAIT_MAULER)) extra_wound = 20 banged_limb.receive_damage(30, wound_bonus = extra_wound) pushed_mob.apply_damage(60, STAMINA) take_damage(50) playsound(pushed_mob, 'sound/effects/bang.ogg', 90, TRUE) pushed_mob.visible_message("[user] smashes [pushed_mob]'s [banged_limb.name] against \the [src]!", "[user] smashes your [banged_limb.name] against \the [src]") log_combat(user, pushed_mob, "head slammed", null, "against [src]") SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table_limbsmash, banged_limb) /obj/structure/table/shove_act(mob/living/target, mob/living/user) if(CHECK_MOBILITY(target, MOBILITY_STAND)) target.DefaultCombatKnockdown(SHOVE_KNOCKDOWN_TABLE) user.visible_message("[user.name] shoves [target.name] onto \the [src]!", "You shove [target.name] onto \the [src]!", null, COMBAT_MESSAGE_RANGE) target.forceMove(loc) log_combat(user, target, "shoved", "onto [src] (table)") return TRUE /obj/structure/table/attackby(obj/item/I, mob/user, params) if(!(flags_1 & NODECONSTRUCT_1)) if(I.tool_behaviour == TOOL_SCREWDRIVER && deconstruction_ready) to_chat(user, "You start disassembling [src]...") if(I.use_tool(src, user, 20, volume=50)) deconstruct(TRUE) return if(I.tool_behaviour == TOOL_WRENCH && deconstruction_ready) to_chat(user, "You start deconstructing [src]...") if(I.use_tool(src, user, 40, volume=50)) playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) deconstruct(TRUE, 1) return if(istype(I, /obj/item/storage/bag/tray)) var/obj/item/storage/bag/tray/T = I if(T.contents.len > 0) // If the tray isn't empty for(var/x in T.contents) var/obj/item/item = x AfterPutItemOnTable(item, user) SEND_SIGNAL(I, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) user.visible_message("[user] empties [I] on [src].") return // If the tray IS empty, continue on (tray will be placed on the table like other items) if(user.a_intent != INTENT_HARM && !(I.item_flags & ABSTRACT)) if(user.transferItemToLoc(I, drop_location())) var/list/click_params = params2list(params) //Center the icon where the user clicked. if(!click_params || !click_params["icon-x"] || !click_params["icon-y"]) return //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) I.pixel_x = clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2) I.pixel_y = clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2) AfterPutItemOnTable(I, user) return TRUE else return ..() /obj/structure/table/proc/AfterPutItemOnTable(obj/item/I, mob/living/user) return /obj/structure/table/alt_attack_hand(mob/user) if(!user.CheckActionCooldown(CLICK_CD_MELEE)) return user.DelayNextAction() if(user && Adjacent(user) && !user.incapacitated()) if(istype(user) && user.a_intent == INTENT_HARM) user.visible_message("[user] slams [user.p_their()] palms down on [src].", "You slam your palms down on [src].") playsound(src, 'sound/weapons/sonic_jackhammer.ogg', 50, 1) else user.visible_message("[user] slaps [user.p_their()] hands on [src].", "You slap your hands on [src].") playsound(src, 'sound/weapons/tap.ogg', 50, 1) user.do_attack_animation(src) return TRUE /obj/structure/table/deconstruct(disassembled = TRUE, wrench_disassembly = 0) if(!(flags_1 & NODECONSTRUCT_1)) var/turf/T = get_turf(src) if(buildstack) new buildstack(T, buildstackamount) else for(var/i in custom_materials) var/datum/material/M = i new M.sheet_type(T, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) if(!wrench_disassembly) new frame(T) else new framestack(T, framestackamount) qdel(src) /obj/structure/table/greyscale icon = 'icons/obj/smooth_structures/table_greyscale.dmi' icon_state = "table" material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS buildstack = null //No buildstack, so generate from mat datums ///Table on wheels /obj/structure/table/rolling name = "Rolling table" desc = "A NT brand \"Rolly poly\" rolling table. It can and will move." anchored = FALSE smooth = SMOOTH_FALSE canSmoothWith = list() icon = 'icons/obj/smooth_structures/rollingtable.dmi' icon_state = "rollingtable" var/list/attached_items = list() /obj/structure/table/rolling/AfterPutItemOnTable(obj/item/I, mob/living/user) . = ..() attached_items += I RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/RemoveItemFromTable) //Listen for the pickup event, unregister on pick-up so we aren't moved /obj/structure/table/rolling/proc/RemoveItemFromTable(datum/source, newloc, dir) if(newloc != loc) //Did we not move with the table? because that shit's ok return FALSE attached_items -= source UnregisterSignal(source, COMSIG_MOVABLE_MOVED) /obj/structure/table/rolling/Moved(atom/OldLoc, Dir) . = ..() for(var/mob/M in OldLoc.contents)//Kidnap everyone on top M.forceMove(loc) for(var/x in attached_items) var/atom/movable/AM = x if(!AM.Move(loc)) RemoveItemFromTable(AM, AM.loc) /* * Glass tables */ /obj/structure/table/glass name = "glass table" desc = "What did I say about leaning on the glass tables? Now you need surgery." icon = 'icons/obj/smooth_structures/glass_table.dmi' icon_state = "glass_table" buildstack = /obj/item/stack/sheet/glass canSmoothWith = null max_integrity = 70 resistance_flags = ACID_PROOF armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) var/list/debris = list() /obj/structure/table/glass/New() . = ..() debris += new frame debris += new /obj/item/shard /obj/structure/table/glass/Destroy() QDEL_LIST(debris) . = ..() /obj/structure/table/glass/Crossed(atom/movable/AM) . = ..() if(flags_1 & NODECONSTRUCT_1) return if(!isliving(AM)) return // Don't break if they're just flying past if(AM.throwing) addtimer(CALLBACK(src, .proc/throw_check, AM), 5) else check_break(AM) /obj/structure/table/glass/proc/throw_check(mob/living/M) if(M.loc == get_turf(src)) check_break(M) /obj/structure/table/glass/proc/check_break(mob/living/M) if(M.has_gravity() && M.mob_size > MOB_SIZE_SMALL && !(M.movement_type & FLYING)) table_shatter(M) /obj/structure/table/glass/proc/table_shatter(mob/living/L) visible_message("[src] breaks!", "You hear breaking glass.") var/turf/T = get_turf(src) playsound(T, "shatter", 50, 1) for(var/I in debris) var/atom/movable/AM = I AM.forceMove(T) debris -= AM if(istype(AM, /obj/item/shard)) AM.throw_impact(L) L.DefaultCombatKnockdown(100) qdel(src) /obj/structure/table/glass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) ..() return else var/turf/T = get_turf(src) playsound(T, "shatter", 50, 1) for(var/X in debris) var/atom/movable/AM = X AM.forceMove(T) debris -= AM qdel(src) /obj/structure/table/glass/narsie_act() color = NARSIE_WINDOW_COLOUR for(var/obj/item/shard/S in debris) S.color = NARSIE_WINDOW_COLOUR /* * Plasmaglass tables */ /obj/structure/table/plasmaglass name = "plasmaglass table" desc = "A glasstable, but it's pink and more sturdy. What will Nanotrasen design next with plasma?" icon = 'icons/obj/smooth_structures/plasmaglass_table.dmi' icon_state = "plasmaglass_table" climbable = TRUE buildstack = /obj/item/stack/sheet/plasmaglass canSmoothWith = null max_integrity = 270 resistance_flags = ACID_PROOF armor = list("melee" = 10, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 100) var/list/debris = list() /obj/structure/table/plasmaglass/New() . = ..() debris += new frame debris += new /obj/item/shard/plasma /obj/structure/table/plasmaglass/Destroy() QDEL_LIST(debris) . = ..() /obj/structure/table/plasmaglass/proc/check_break(mob/living/M) return /obj/structure/table/plasmaglass/deconstruct(disassembled = TRUE, wrench_disassembly = 0) if(!(flags_1 & NODECONSTRUCT_1)) if(disassembled) ..() return else var/turf/T = get_turf(src) playsound(T, "shatter", 50, 1) for(var/X in debris) var/atom/movable/AM = X AM.forceMove(T) debris -= AM qdel(src) /obj/structure/table/plasmaglass/narsie_act() color = NARSIE_WINDOW_COLOUR for(var/obj/item/shard/S in debris) S.color = NARSIE_WINDOW_COLOUR /* * Wooden tables */ /obj/structure/table/wood name = "wooden table" desc = "Do not apply fire to this. Rumour says it burns easily." icon = 'icons/obj/smooth_structures/wood_table.dmi' icon_state = "wood_table" frame = /obj/structure/table_frame/wood framestack = /obj/item/stack/sheet/mineral/wood buildstack = /obj/item/stack/sheet/mineral/wood resistance_flags = FLAMMABLE max_integrity = 70 canSmoothWith = list(/obj/structure/table/wood, /obj/structure/table/wood/poker, /obj/structure/table/wood/bar) /obj/structure/table/wood/narsie_act(total_override = TRUE) if(!total_override) ..() /obj/structure/table/wood/poker //No specialties, Just a mapping object. name = "gambling table" desc = "A seedy table for seedy dealings in seedy places." icon = 'icons/obj/smooth_structures/poker_table.dmi' icon_state = "poker_table" buildstack = /obj/item/stack/tile/carpet /obj/structure/table/wood/poker/narsie_act() ..(FALSE) /obj/structure/table/wood/fancy name = "fancy table" desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth." icon = 'icons/obj/structures.dmi' icon_state = "fancy_table" frame = /obj/structure/table_frame framestack = /obj/item/stack/rods buildstack = /obj/item/stack/tile/carpet canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black, /obj/structure/table/wood/fancy/blackred, /obj/structure/table/wood/fancy/monochrome, /obj/structure/table/wood/fancy/blue, /obj/structure/table/wood/fancy/cyan, /obj/structure/table/wood/fancy/green, /obj/structure/table/wood/fancy/orange, /obj/structure/table/wood/fancy/purple, /obj/structure/table/wood/fancy/red, /obj/structure/table/wood/fancy/royalblack, /obj/structure/table/wood/fancy/royalblue) var/smooth_icon = 'icons/obj/smooth_structures/fancy_table.dmi' // see Initialize() /obj/structure/table/wood/fancy/Initialize() . = ..() // Needs to be set dynamically because table smooth sprites are 32x34, // which the editor treats as a two-tile-tall object. The sprites are that // size so that the north/south corners look nice - examine the detail on // the sprites in the editor to see why. icon = smooth_icon /obj/structure/table/wood/fancy/black icon_state = "fancy_table_black" buildstack = /obj/item/stack/tile/carpet/black smooth_icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' /obj/structure/table/wood/fancy/blackred icon_state = "fancy_table_blackred" buildstack = /obj/item/stack/tile/carpet/blackred smooth_icon = 'icons/obj/smooth_structures/fancy_table_blackred.dmi' /obj/structure/table/wood/fancy/monochrome icon_state = "fancy_table_monochrome" buildstack = /obj/item/stack/tile/carpet/monochrome smooth_icon = 'icons/obj/smooth_structures/fancy_table_monochrome.dmi' /obj/structure/table/wood/fancy/blue icon_state = "fancy_table_blue" buildstack = /obj/item/stack/tile/carpet/blue smooth_icon = 'icons/obj/smooth_structures/fancy_table_blue.dmi' /obj/structure/table/wood/fancy/cyan icon_state = "fancy_table_cyan" buildstack = /obj/item/stack/tile/carpet/cyan smooth_icon = 'icons/obj/smooth_structures/fancy_table_cyan.dmi' /obj/structure/table/wood/fancy/green icon_state = "fancy_table_green" buildstack = /obj/item/stack/tile/carpet/green smooth_icon = 'icons/obj/smooth_structures/fancy_table_green.dmi' /obj/structure/table/wood/fancy/orange icon_state = "fancy_table_orange" buildstack = /obj/item/stack/tile/carpet/orange smooth_icon = 'icons/obj/smooth_structures/fancy_table_orange.dmi' /obj/structure/table/wood/fancy/purple icon_state = "fancy_table_purple" buildstack = /obj/item/stack/tile/carpet/purple smooth_icon = 'icons/obj/smooth_structures/fancy_table_purple.dmi' /obj/structure/table/wood/fancy/red icon_state = "fancy_table_red" buildstack = /obj/item/stack/tile/carpet/red smooth_icon = 'icons/obj/smooth_structures/fancy_table_red.dmi' /obj/structure/table/wood/fancy/royalblack icon_state = "fancy_table_royalblack" buildstack = /obj/item/stack/tile/carpet/royalblack smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblack.dmi' /obj/structure/table/wood/fancy/royalblue icon_state = "fancy_table_royalblue" buildstack = /obj/item/stack/tile/carpet/royalblue smooth_icon = 'icons/obj/smooth_structures/fancy_table_royalblue.dmi' /* * Reinforced tables */ /obj/structure/table/reinforced name = "reinforced table" desc = "A reinforced version of the four legged table." icon = 'icons/obj/smooth_structures/reinforced_table.dmi' icon_state = "r_table" deconstruction_ready = 0 buildstack = /obj/item/stack/sheet/plasteel max_integrity = 200 integrity_failure = 0.25 armor = list("melee" = 10, "bullet" = 30, "laser" = 30, "energy" = 100, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) /obj/structure/table/reinforced/deconstruction_hints(mob/user) if(deconstruction_ready) return "The top cover has been welded loose and the main frame's bolts are exposed." return "The top cover is firmly welded on." /obj/structure/table/reinforced/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_WELDER) if(!W.tool_start_check(user, amount=0)) return if(deconstruction_ready) to_chat(user, "You start strengthening the reinforced table...") if (W.use_tool(src, user, 50, volume=50)) to_chat(user, "You strengthen the table.") deconstruction_ready = 0 else to_chat(user, "You start weakening the reinforced table...") if (W.use_tool(src, user, 50, volume=50)) to_chat(user, "You weaken the table.") deconstruction_ready = 1 else . = ..() /obj/structure/table/reinforced/brass name = "brass table" desc = "A solid, slightly beveled brass table." icon = 'icons/obj/smooth_structures/brass_table.dmi' icon_state = "brass_table" resistance_flags = FIRE_PROOF | ACID_PROOF frame = /obj/structure/table_frame/brass framestack = /obj/item/stack/tile/brass buildstack = /obj/item/stack/tile/brass framestackamount = 1 buildstackamount = 1 canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze) /obj/structure/table/reinforced/brass/New() change_construction_value(2) ..() /obj/structure/table/reinforced/brass/Destroy() change_construction_value(-2) return ..() /obj/structure/table/reinforced/brass/tablelimbsmash(mob/living/user, mob/living/pushed_mob) .= ..() playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) /obj/structure/table/reinforced/brass/narsie_act() take_damage(rand(15, 45), BRUTE) if(src) //do we still exist? var/previouscolor = color color = "#960000" animate(src, color = previouscolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) /obj/structure/table/reinforced/brass/ratvar_act() obj_integrity = max_integrity /obj/structure/table/bronze name = "bronze table" desc = "A solid table made out of bronze." icon = 'icons/obj/smooth_structures/brass_table.dmi' icon_state = "brass_table" resistance_flags = FIRE_PROOF | ACID_PROOF buildstack = /obj/item/stack/sheet/bronze canSmoothWith = list(/obj/structure/table/reinforced/brass, /obj/structure/table/bronze) /obj/structure/table/bronze/tablelimbsmash(mob/living/user, mob/living/pushed_mob) ..() playsound(src, 'sound/magic/clockwork/fellowship_armory.ogg', 50, TRUE) /* * Surgery Tables */ /obj/structure/table/optable name = "operating table" desc = "Used for advanced medical procedures." icon = 'icons/obj/surgery.dmi' icon_state = "optable" buildstack = /obj/item/stack/sheet/mineral/silver smooth = SMOOTH_FALSE can_buckle = 1 buckle_lying = 1 buckle_requires_restraints = 1 var/mob/living/carbon/human/patient = null var/obj/machinery/computer/operating/computer = null /obj/structure/table/optable/New() ..() for(var/direction in GLOB.cardinals) computer = locate(/obj/machinery/computer/operating, get_step(src, direction)) if(computer) computer.table = src break /obj/structure/table/optable/tablelimbsmash(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(loc) pushed_mob.set_resting(TRUE, TRUE) visible_message("[user] has laid [pushed_mob] on [src].") check_patient() /obj/structure/table/optable/proc/check_patient() var/mob/living/carbon/human/H = locate() in loc if(H) if(!CHECK_MOBILITY(H, MOBILITY_STAND)) patient = H return TRUE else patient = null return FALSE /* * Racks */ /obj/structure/rack name = "rack" desc = "Different from the Middle Ages version." icon = 'icons/obj/objects.dmi' icon_state = "rack" layer = TABLE_LAYER density = TRUE anchored = TRUE pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density. max_integrity = 20 attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE /obj/structure/rack/examine(mob/user) . = ..() . += "It's held together by a couple of bolts." /obj/structure/rack/CanPass(atom/movable/mover, turf/target) if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!| return 1 if(istype(mover) && (mover.pass_flags & PASSTABLE)) return 1 else return 0 /obj/structure/rack/CanAStarPass(ID, dir, caller) . = !density if(ismovable(caller)) var/atom/movable/mover = caller . = . || (mover.pass_flags & PASSTABLE) /obj/structure/rack/MouseDrop_T(obj/O, mob/user) . = ..() if ((!( istype(O, /obj/item) ) || user.get_active_held_item() != O)) return if(!user.dropItemToGround(O)) return if(O.loc != src.loc) step(O, get_dir(O, src)) /obj/structure/rack/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_WRENCH && !(flags_1 & NODECONSTRUCT_1)) W.play_tool_sound(src) deconstruct(TRUE) return if(user.a_intent == INTENT_HARM) return ..() if(user.transferItemToLoc(W, drop_location())) return 1 /obj/structure/rack/attack_paw(mob/living/user) attack_hand(user) /obj/structure/rack/on_attack_hand(mob/living/user, act_intent = user.a_intent, unarmed_attack_flags) . = ..() if(.) return if(CHECK_MULTIPLE_BITFIELDS(user.mobility_flags, MOBILITY_STAND|MOBILITY_MOVE) || user.get_num_legs() < 2) return user.do_attack_animation(src, ATTACK_EFFECT_KICK) user.visible_message("[user] kicks [src].", null, null, COMBAT_MESSAGE_RANGE) take_damage(rand(4,8), BRUTE, "melee", 1) /obj/structure/rack/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) if(damage_amount) playsound(loc, 'sound/items/dodgeball.ogg', 80, 1) else playsound(loc, 'sound/weapons/tap.ogg', 50, 1) if(BURN) playsound(loc, 'sound/items/welder.ogg', 40, 1) /* * Rack destruction */ /obj/structure/rack/deconstruct(disassembled = TRUE) if(!(flags_1&NODECONSTRUCT_1)) density = FALSE var/obj/item/rack_parts/newparts = new(loc) transfer_fingerprints_to(newparts) qdel(src) /* * Rack Parts */ /obj/item/rack_parts name = "rack parts" desc = "Parts of a rack." icon = 'icons/obj/items_and_weapons.dmi' icon_state = "rack_parts" flags_1 = CONDUCT_1 custom_materials = list(/datum/material/iron=2000) var/building = FALSE /obj/item/rack_parts/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_WRENCH) new /obj/item/stack/sheet/metal(user.loc) qdel(src) else . = ..() /obj/item/rack_parts/attack_self(mob/user) if(building) return building = TRUE to_chat(user, "You start constructing a rack...") if(do_after(user, 50, target = user, progress=TRUE)) if(!user.temporarilyRemoveItemFromInventory(src)) return var/obj/structure/rack/R = new /obj/structure/rack(user.loc) user.visible_message("[user] assembles \a [R].\ ", "You assemble \a [R].") R.add_fingerprint(user) qdel(src) building = FALSE