Files
Hyper-Station-13/code/game/objects/structures.dm
Haha26315 732f1c18f7 Fix version 2, electrification boogaloo
Fixes the ability to climb railings by removing the forcemove call that teleports players and instead refactoring the do_climb and climb_structure procedures in structure code itself.
Uses a similar method to tables of briefly turning collision off for the railing when the object is climbed in order to let players climb it, without moving the player into otherwise occupied space.
2022-09-08 21:19:45 -04:00

148 lines
4.8 KiB
Plaintext

/obj/structure
icon = 'icons/obj/structures.dmi'
pressure_resistance = 8
max_integrity = 300
interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT
var/climb_time = 20
var/climb_stun = 20
var/climbable = FALSE
var/rail_climbing = FALSE
var/passable = FALSE
var/mob/living/structureclimber
var/broken = 0 //similar to machinery's stat BROKEN
/obj/structure/Initialize()
if (!armor)
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
. = ..()
if(smooth)
queue_smooth(src)
queue_smooth_neighbors(src)
icon_state = ""
GLOB.cameranet.updateVisibility(src)
/obj/structure/Destroy()
GLOB.cameranet.updateVisibility(src)
if(smooth)
queue_smooth_neighbors(src)
return ..()
/obj/structure/attack_hand(mob/user)
. = ..()
if(.)
return
if(structureclimber && structureclimber != user)
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
structureclimber.Knockdown(40)
structureclimber.visible_message("<span class='warning'>[structureclimber] has been knocked off [src].", "You're knocked off [src]!", "You see [structureclimber] get knocked off [src].</span>")
/obj/structure/ui_act(action, params)
..()
add_fingerprint(usr)
/obj/structure/MouseDrop_T(atom/movable/O, mob/user)
. = ..()
if(!climbable)
return
if(user == O && iscarbon(O))
if(user.canmove)
climb_structure(user)
return
if(!istype(O, /obj/item) || user.get_active_held_item() != O)
return
if(iscyborg(user))
return
if(!user.dropItemToGround(O))
return
if (O.loc != src.loc)
step(O, get_dir(O, src))
/obj/structure/proc/do_climb(atom/movable/A)
if(climbable)
if(rail_climbing == FALSE)
density = FALSE
. = step(A,get_dir(A,src.loc))
density = TRUE
else
//We're dealing with something like a railing with similar collision to glass and a false density.
passable = TRUE //Passable flag overrites CheckExit and CanPass procs to return true.
if(A.loc == src.loc)
//Step one further than just onto the object, we want to step over it to the next tile if possible.
. = step(A, get_dir(A, get_step(src, src.dir)))
else
. = step(A,get_dir(A,src.loc))
passable = FALSE
A.do_twist(targetangle = 45, timer = 8)
/obj/structure/proc/climb_structure(mob/living/user)
src.add_fingerprint(user)
if(rail_climbing == FALSE)
user.visible_message("<span class='warning'>[user] starts climbing onto [src].</span>", \
"<span class='notice'>You start climbing onto [src]...</span>")
else
user.visible_message("<span class='warning'>[user] starts climbing over [src].</span>", \
"<span class='notice'>You start climbing over [src]...</span>")
var/obj/structure/railing/target = src
if(target.shock(user, 100))
return
// Ensures player is in the proper place for climbing.
if(user.loc != src.loc)
if(user.loc == (get_step(src, get_dir(src.loc, user))))
step(user, get_dir(user.loc,src.loc))
var/adjusted_climb_time = climb_time
if(user.restrained()) //climbing takes twice as long when restrained.
adjusted_climb_time *= 2
if(isalien(user))
adjusted_climb_time *= 0.25 //aliens are terrifyingly fast
if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am???
adjusted_climb_time *= 0.8
structureclimber = user
if(do_mob(user, user, adjusted_climb_time))
if(src.loc) //Checking if structure has been destroyed
if(do_climb(user))
if(rail_climbing == FALSE)
user.visible_message("<span class='warning'>[user] climbs onto [src].</span>", \
"<span class='notice'>You climb onto [src].</span>")
log_combat(user, src, "climbed onto")
else
user.visible_message("<span class='warning'>[user] climbs over [src].</span>", \
"<span class='notice'>You climb over [src].</span>")
log_combat(user, src, "climbed over")
if(climb_stun)
user.Stun(climb_stun)
. = 1
else
if(rail_climbing == FALSE)
to_chat(user, "<span class='warning'>You fail to climb onto [src].</span>")
else
to_chat(user, "<span class='warning'>You fail to climb over [src].</span>")
structureclimber = null
/obj/structure/examine(mob/user)
. = ..()
if(!(resistance_flags & INDESTRUCTIBLE))
if(resistance_flags & ON_FIRE)
. += "<span class='warning'>It's on fire!</span>"
if(broken)
. += "<span class='notice'>It appears to be broken.</span>"
var/examine_status = examine_status(user)
if(examine_status)
. += examine_status
/obj/structure/proc/examine_status(mob/user) //An overridable proc, mostly for falsewalls.
var/healthpercent = (obj_integrity/max_integrity) * 100
switch(healthpercent)
if(50 to 99)
return "It looks slightly damaged."
if(25 to 50)
return "It appears heavily damaged."
if(0 to 25)
if(!broken)
return "<span class='warning'>It's falling apart!</span>"