Files
VOREStation/code/modules/holodeck/HolodeckObjects.dm
Cameron Lennox d5849910e5 Begin clickcode attack_self fix (#18797)
* Begin clickcode attack_self fix

Begins the work to make everything call back to parent for attack_self so that signals are sacred.

* Makes MORE things call the attack_self() parent

Yes, I could make special_handling a var on obj/item HOWEVER i want it to be specific so it can be tracked down later and ONLY the objects that use it can be refactored instead of sitting there literally forever and it just becoming 'a thing'.

* Finishes making the rest of attack_self call parent.

As mentioned, things such as 'specialty_goggles' 'special_handling' and the such are only there to help with attack_self until the attack_self is recoded for those items.

* begone foul demon

* some more cleanup

* These

* GOD this was annoying

* yeh

* Fix this

* fLARES

* Thesee too

* toys!

* Even more!

* More fixes

* Even more

* rest of em

* these too

* Update syndie.dm

* hardref clear

* Update code/game/gamemodes/nuclear/pinpointer.dm

* Update code/game/objects/effects/mines.dm

* Update code/game/objects/items/blueprints_vr.dm

* Update code/game/objects/items/blueprints_vr.dm

* Update code/game/objects/items/contraband_vr.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/gunbox.dm

* Update code/game/objects/items/gunbox.dm

* Update code/game/objects/items/gunbox_vr.dm

* Update code/game/objects/items/gunbox_vr.dm

* Update code/game/objects/items/weapons/gift_wrappaper.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/crayons.dm

* Update code/game/objects/items/gunbox.dm

* these too

* Update maintpanel_stack.dm

* angry warning

* Fixes packaged snacks.

Fixes improper var default.

* Special handling for these

* proper poly types

* Fixes magclaws

Makes the 'features' it had just part  of base magboots that can be adjusted via varswap.

* Fixes jackets

Fixes https://github.com/VOREStation/VOREStation/issues/18941

* Small bugfix

Makes p_Theyre properly capitialize
Makes examine show proper wording

* Update gift_wrappaper.dm
2025-12-29 13:21:10 -05:00

536 lines
15 KiB
Plaintext

// Holographic Items!
// Holographic tables are in code/modules/tables/presets.dm
// Holographic racks are in code/modules/tables/rack.dm
/turf/simulated/floor/holofloor
desc = "A convincing simulation."
thermal_conductivity = 0
flags = TURF_ACID_IMMUNE
/turf/simulated/floor/holofloor/attackby(obj/item/W as obj, mob/user as mob)
return
// HOLOFLOOR DOES NOT GIVE A FUCK
/turf/simulated/floor/holofloor/set_flooring()
return
/turf/simulated/floor/holofloor/carpet
name = "carpet"
icon = 'icons/turf/flooring/carpet.dmi'
icon_state = "carpet"
initial_flooring = /decl/flooring/carpet
/turf/simulated/floor/holofloor/tiled
name = "floor"
icon = 'icons/turf/flooring/tiles.dmi'
icon_state = "steel"
initial_flooring = /decl/flooring/tiling
/turf/simulated/floor/holofloor/tiled/dark
name = "dark floor"
icon_state = "dark"
initial_flooring = /decl/flooring/tiling/dark
/turf/simulated/floor/holofloor/lino
name = "lino"
icon = 'icons/turf/flooring/linoleum.dmi'
icon_state = "lino"
initial_flooring = /decl/flooring/linoleum
/turf/simulated/floor/holofloor/wood
name = "wooden floor"
icon = 'icons/turf/flooring/wood.dmi'
icon_state = "wood"
initial_flooring = /decl/flooring/wood
/turf/simulated/floor/holofloor/grass
name = "lush grass"
icon = 'icons/turf/flooring/grass.dmi'
icon_state = "grass0"
initial_flooring = /decl/flooring/grass
/turf/simulated/floor/holofloor/grass/jungle
icon = 'icons/jungle.dmi'
icon_state = "grass2"
/turf/simulated/floor/holofloor/grass/hive
icon = 'icons/turf/flooring/misc_vr.dmi'
icon_state = "hive"
name = "giant honeycomb"
/turf/simulated/floor/holofloor/wood/diona
icon = 'icons/turf/floors.dmi'
icon_state = "diona"
/turf/simulated/floor/holofloor/snow
name = "snow"
base_name = "snow"
icon = 'icons/turf/floors.dmi'
base_icon = 'icons/turf/floors.dmi'
icon_state = "snow"
base_icon_state = "snow"
/turf/simulated/floor/holofloor/space
icon = 'icons/turf/space.dmi'
plane = SPACE_PLANE
name = "\proper space"
icon_state = "white"
/turf/simulated/floor/holofloor/space/update_icon()
. = ..()
add_overlay(SSskybox.dust_cache["[((x + y) ^ ~(x * y) + z) % 25]"])
/turf/simulated/floor/holofloor/reinforced
icon = 'icons/turf/flooring/tiles.dmi'
initial_flooring = /decl/flooring/reinforced
name = "reinforced holofloor"
icon_state = "reinforced"
/turf/simulated/floor/holofloor/beach
desc = "Uncomfortably gritty for a hologram."
base_desc = "Uncomfortably gritty for a hologram."
icon = 'icons/misc/beach.dmi'
base_icon = 'icons/misc/beach.dmi'
initial_flooring = null
/turf/simulated/floor/holofloor/beach/sand
name = "sand"
icon_state = "desert"
base_icon_state = "desert"
/turf/simulated/floor/holofloor/beach/coastline
name = "coastline"
icon = 'icons/misc/beach2.dmi'
icon_state = "sandwater"
base_icon_state = "sandwater"
/turf/simulated/floor/holofloor/beach/water
name = "water"
icon_state = "seashallow"
base_icon_state = "seashallow"
/turf/simulated/floor/holofloor/desert
name = "desert sand"
base_name = "desert sand"
desc = "Uncomfortably gritty for a hologram."
base_desc = "Uncomfortably gritty for a hologram."
icon_state = "asteroid"
base_icon_state = "asteroid"
icon = 'icons/turf/flooring/asteroid.dmi'
base_icon = 'icons/turf/flooring/asteroid.dmi'
initial_flooring = null
/turf/simulated/floor/holofloor/desert/Initialize(mapload)
. = ..()
if(prob(10))
add_overlay("asteroid[rand(0,9)]")
/turf/simulated/floor/holofloor/bmarble
name = "marble"
icon = 'icons/turf/flooring/misc.dmi'
icon_state = "darkmarble"
initial_flooring = /decl/flooring/bmarble
/turf/simulated/floor/holofloor/wmarble
name = "marble"
icon = 'icons/turf/flooring/misc.dmi'
icon_state = "lightmarble"
initial_flooring = /decl/flooring/wmarble
/obj/structure/holostool
name = "stool"
desc = "Apply butt."
icon = 'icons/obj/furniture.dmi'
icon_state = "stool_padded_preview"
anchored = TRUE
unacidable = TRUE
pressure_resistance = 15
/obj/item/clothing/gloves/boxing/hologlove
name = "boxing gloves"
desc = "Because you really needed another excuse to punch your crewmates."
icon_state = "boxing"
unacidable = TRUE
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_gloves.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi',
)
item_state = "boxing"
special_attack_type = /datum/unarmed_attack/holopugilism
/datum/unarmed_attack/holopugilism
sparring_variant_type = /datum/unarmed_attack/holopugilism
is_punch = TRUE
/datum/unarmed_attack/holopugilism/unarmed_override(var/mob/living/carbon/human/user,var/mob/living/carbon/human/target,var/zone)
user.do_attack_animation(src)
var/damage = rand(0, 9)
if(!damage)
playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
target.visible_message(span_danger("[user] has attempted to punch [target]!"))
return TRUE
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting))
var/armor_block = target.run_armor_check(affecting, "melee")
if(HULK in user.mutations)
damage += 5
playsound(target, "punch", 25, 1, -1)
target.visible_message(span_bolddanger("[user] has punched [target]!"))
target.apply_damage(damage, HALLOSS, affecting, armor_block)
if(damage >= 9)
target.visible_message(span_bolddanger("[user] has weakened [target]!"))
target.apply_effect(4, WEAKEN, armor_block)
return TRUE
/obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob)
if(!istype(W))
return//I really wish I did not need this
if (istype(W, /obj/item/grab) && get_dist(src,user)<2)
var/obj/item/grab/G = W
if(isliving(G.affecting))
var/mob/living/M = G.affecting
var/state = G.state
qdel(W) //gotta delete it here because if window breaks, it won't get deleted
switch (state)
if(1)
M.visible_message(span_warning("[user] slams [M] against \the [src]!"))
M.apply_damage(7)
hit(10)
if(2)
M.visible_message(span_danger("[user] bashes [M] against \the [src]!"))
if (prob(50))
M.Weaken(1)
M.apply_damage(10)
hit(25)
if(3)
M.visible_message(span_danger("<big>[user] crushes [M] against \the [src]!</big>"))
M.Weaken(5)
M.apply_damage(20)
hit(50)
return
if(W.flags & NOBLUDGEON) return
if(W.has_tool_quality(TOOL_SCREWDRIVER))
to_chat(user, span_notice("It's a holowindow, you can't unfasten it!"))
else if(W.has_tool_quality(TOOL_CROWBAR) && reinf && state <= 1)
to_chat(user, span_notice("It's a holowindow, you can't pry it!"))
else if(W.has_tool_quality(TOOL_WRENCH) && !anchored && (!state || !reinf))
to_chat(user, span_notice("It's a holowindow, you can't dismantle it!"))
else
if(W.damtype == BRUTE || W.damtype == BURN)
hit(W.force)
if(health <= 7)
anchored = FALSE
update_nearby_icons()
step(src, get_dir(user, src))
else
playsound(src, 'sound/effects/Glasshit.ogg', 75, 1)
..()
return
/obj/structure/window/reinforced/holowindow/shatter(var/display_message = 1)
playsound(src, "shatter", 70, 1)
if(display_message)
visible_message("[src] fades away as it shatters!")
qdel(src)
return
/obj/machinery/door/window/holowindoor/attackby(obj/item/I as obj, mob/user as mob)
if (src.operating == 1)
return
if(src.density && istype(I, /obj/item) && !istype(I, /obj/item/card))
var/aforce = I.force
playsound(src, 'sound/effects/Glasshit.ogg', 75, 1)
visible_message(span_bolddanger("[src] was hit by [I]."))
if(I.damtype == BRUTE || I.damtype == BURN)
take_damage(aforce)
return
src.add_fingerprint(user)
if (!src.requiresID())
user = null
if (src.allowed(user))
if (src.density)
open()
else
close()
else if (src.density)
flick(text("[]deny", src.base_state), src)
return
/obj/machinery/door/window/holowindoor/shatter(var/display_message = 1)
src.density = FALSE
playsound(src, "shatter", 70, 1)
if(display_message)
visible_message("[src] fades away as it shatters!")
qdel(src)
/obj/structure/bed/chair/holochair/attackby(obj/item/W as obj, mob/user as mob)
if(W.has_tool_quality(TOOL_WRENCH))
to_chat(user, span_notice("It's a holochair, you can't dismantle it!"))
return
//VOREStation Add
/obj/structure/bed/holobed/attackby(obj/item/W as obj, mob/user as mob)
if(W.has_tool_quality(TOOL_WRENCH))
to_chat(user, span_notice("It's a holochair, you can't dismantle it!"))
return
//VOREStation Add End
/obj/item/holo
damtype = HALLOSS
no_attack_log = 1
no_random_knockdown = TRUE
/obj/item/holo/esword
name = "holographic energy sword"
desc = "May the force be within you. Sorta."
icon_state = "esword"
var/lcolor
var/rainbow = FALSE
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi',
)
force = 3.0
throw_speed = 1
throw_range = 5
throwforce = 0
w_class = ITEMSIZE_SMALL
flags = NOBLOODY
unacidable = TRUE
var/active = 0
/obj/item/holo/esword/green
lcolor = "#008000"
/obj/item/holo/esword/red
lcolor = "#FF0000"
/obj/item/holo/esword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(active && default_parry_check(user, attacker, damage_source) && prob(50))
user.visible_message(span_danger("\The [user] parries [attack_text] with \the [src]!"))
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
return TRUE
return FALSE
/obj/item/holo/esword/attack_self(mob/user)
. = ..(user)
if(.)
return TRUE
active = !active
if (active)
force = 30
item_state = "[icon_state]_blade"
w_class = ITEMSIZE_LARGE
playsound(src, 'sound/weapons/saberon.ogg', 50, 1)
to_chat(user, span_notice("[src] is now active."))
else
force = 3
item_state = "[icon_state]"
w_class = ITEMSIZE_SMALL
playsound(src, 'sound/weapons/saberoff.ogg', 50, 1)
to_chat(user, span_notice("[src] can now be concealed."))
update_icon()
add_fingerprint(user)
return
/obj/item/holo/esword/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/multitool) && !active)
if(!rainbow)
rainbow = TRUE
else
rainbow = FALSE
to_chat(user, span_notice("You manipulate the color controller in [src]."))
update_icon()
return ..()
/obj/item/holo/esword/update_icon()
. = ..()
var/mutable_appearance/blade_overlay = mutable_appearance(icon, "[icon_state]_blade")
blade_overlay.color = lcolor
cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
if(active)
add_overlay(blade_overlay)
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
H.update_inv_l_hand()
H.update_inv_r_hand()
//BASKETBALL OBJECTS
/obj/item/beach_ball/holoball
icon = 'icons/obj/balls_vr.dmi'
icon_state = "basketball"
name = "basketball"
desc = "Here's your chance, do your dance at the Space Jam."
w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets
unacidable = TRUE
drop_sound = 'sound/items/drop/basketball.ogg'
pickup_sound = 'sound/items/pickup/basketball.ogg'
/obj/structure/holohoop
name = "basketball hoop"
desc = "Boom, Shakalaka!"
icon = 'icons/obj/32x64.dmi'
icon_state = "hoop"
anchored = TRUE
density = TRUE
unacidable = TRUE
throwpass = 1
/obj/structure/holohoop/attackby(obj/item/W as obj, mob/user as mob)
if (istype(W, /obj/item/grab) && get_dist(src,user)<2)
var/obj/item/grab/G = W
if(G.state<2)
to_chat(user, span_warning("You need a better grip to do that!"))
return
G.affecting.loc = src.loc
G.affecting.Weaken(5)
visible_message(span_warning("[G.assailant] dunks [G.affecting] into the [src]!"), 3)
qdel(W)
return
else if (istype(W, /obj/item) && get_dist(src,user)<2)
user.drop_item(src.loc)
visible_message(span_notice("[user] dunks [W] into the [src]!"), 3)
return
/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target)
if (istype(mover,/obj/item) && mover.throwing)
var/obj/item/I = mover
if(istype(I, /obj/item/projectile))
return TRUE
if(prob(50))
I.forceMove(loc)
visible_message(span_notice("Swish! \the [I] lands in \the [src]."), 3)
else
visible_message(span_warning("\The [I] bounces off of \the [src]'s rim!"), 3)
return FALSE
return ..()
/obj/machinery/readybutton
name = "Ready Declaration Device"
desc = "This device is used to declare ready. If all devices in an area are ready, the event will begin!"
icon = 'icons/obj/monitors.dmi'
icon_state = "auth_off"
layer = ABOVE_WINDOW_LAYER
var/ready = 0
var/area/currentarea = null
var/eventstarted = 0
unacidable = TRUE
anchored = TRUE
use_power = USE_POWER_IDLE
idle_power_usage = 2
active_power_usage = 6
power_channel = ENVIRON
/obj/machinery/readybutton/attack_ai(mob/user)
to_chat(user, "The station AI is not to interact with these devices!")
return
/obj/machinery/readybutton/attackby(obj/item/W, mob/user)
to_chat(user, "The device is a solid button, there's nothing you can do with it!")
/obj/machinery/readybutton/attack_hand(mob/user)
if(user.stat || stat & (NOPOWER|BROKEN))
to_chat(user, "This device is not powered.")
return
if(!user.IsAdvancedToolUser())
return 0
currentarea = get_area(src.loc)
if(!currentarea)
qdel(src)
if(eventstarted)
to_chat(user, "The event has already begun!")
return
ready = !ready
update_icon()
var/numbuttons = 0
var/numready = 0
for(var/obj/machinery/readybutton/button in currentarea)
numbuttons++
if (button.ready)
numready++
if(numbuttons == numready)
begin_event()
/obj/machinery/readybutton/update_icon()
if(ready)
icon_state = "auth_on"
else
icon_state = "auth_off"
/obj/machinery/readybutton/proc/begin_event()
eventstarted = 1
for(var/obj/structure/window/reinforced/holowindow/disappearing/W in currentarea)
qdel(W)
for(var/mob/M in currentarea)
to_chat(M, "FIGHT!")
// A window that disappears when the ready button is pressed
/obj/structure/window/reinforced/holowindow/disappearing
name = "Event Window"
//Holocarp
/mob/living/simple_mob/animal/space/carp/holodeck
icon = 'icons/mob/AI.dmi'
icon_state = "holo4"
icon_living = "holo4"
icon_dead = "holo4"
alpha = 127
icon_gib = null
meat_amount = 0
meat_type = null
/mob/living/simple_mob/animal/space/carp/holodeck/Initialize(mapload)
. = ..()
set_light(2) //hologram lighting
/mob/living/simple_mob/animal/space/carp/holodeck/proc/set_safety(var/safe)
if (safe)
faction = FACTION_NEUTRAL
melee_damage_lower = 0
melee_damage_upper = 0
else
faction = FACTION_CARP
melee_damage_lower = initial(melee_damage_lower)
melee_damage_upper = initial(melee_damage_upper)
/mob/living/simple_mob/animal/space/carp/holodeck/gib()
derez() //holograms can't gib
/mob/living/simple_mob/animal/space/carp/holodeck/death()
..()
derez()
/mob/living/simple_mob/animal/space/carp/holodeck/proc/derez()
visible_message(span_infoplain(span_bold("\The [src]") + " fades away!"))
qdel(src)