mirror of
https://github.com/quotefox/Hyper-Station-13.git
synced 2026-04-11 04:30:41 +01:00
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.
148 lines
4.8 KiB
Plaintext
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>"
|