mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-30 20:13:53 +00:00
Checks if what they're attacking 'bare-handed' is adjacent to the cyborg, and has something buckled to it. If not, it passes the click on to AI click like usual.
105 lines
3.4 KiB
Plaintext
105 lines
3.4 KiB
Plaintext
/obj
|
|
var/can_buckle = 0
|
|
var/buckle_movable = 0
|
|
var/buckle_dir = 0
|
|
var/buckle_lying = -1 //bed-like behavior, forces mob.lying = buckle_lying if != -1
|
|
var/buckle_require_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes
|
|
var/mob/living/buckled_mob = null
|
|
|
|
/obj/attack_hand(mob/living/user)
|
|
. = ..()
|
|
if(can_buckle && buckled_mob)
|
|
user_unbuckle_mob(user)
|
|
|
|
/obj/attack_robot(mob/living/user)
|
|
if(Adjacent(user) && buckled_mob) //Checks if what we're touching is adjacent to us and has someone buckled to it. This should prevent interacting with anti-robot manual valves among other things.
|
|
return attack_hand(user) //Process as if we're a normal person touching the object.
|
|
return ..() //Otherwise, treat this as an AI click like usual.
|
|
|
|
/obj/MouseDrop_T(mob/living/M, mob/living/user)
|
|
. = ..()
|
|
if(can_buckle && istype(M))
|
|
user_buckle_mob(M, user)
|
|
|
|
//Cleanup
|
|
/obj/Del()
|
|
unbuckle_mob()
|
|
return ..()
|
|
|
|
/obj/Destroy()
|
|
unbuckle_mob()
|
|
return ..()
|
|
|
|
|
|
/obj/proc/buckle_mob(mob/living/M)
|
|
if(!can_buckle || !istype(M) || (M.loc != loc) || M.buckled || M.pinned.len || (buckle_require_restraints && !M.restrained()))
|
|
return 0
|
|
if(buckled_mob) //Handles trying to buckle yourself to the chair when someone is on it
|
|
M << "<span class='notice'>\The [src] already has someone buckled to it.</span>"
|
|
return 0
|
|
|
|
M.buckled = src
|
|
M.facing_dir = null
|
|
M.set_dir(buckle_dir ? buckle_dir : dir)
|
|
M.update_canmove()
|
|
buckled_mob = M
|
|
|
|
post_buckle_mob(M)
|
|
return 1
|
|
|
|
/obj/proc/unbuckle_mob()
|
|
if(buckled_mob && buckled_mob.buckled == src)
|
|
. = buckled_mob
|
|
buckled_mob.buckled = null
|
|
buckled_mob.anchored = initial(buckled_mob.anchored)
|
|
buckled_mob.update_canmove()
|
|
buckled_mob = null
|
|
|
|
post_buckle_mob(.)
|
|
|
|
/obj/proc/post_buckle_mob(mob/living/M)
|
|
return
|
|
|
|
/obj/proc/user_buckle_mob(mob/living/M, mob/user)
|
|
if(!ticker)
|
|
user << "<span class='warning'>You can't buckle anyone in before the game starts.</span>"
|
|
if(!user.Adjacent(M) || user.restrained() || user.lying || user.stat || istype(user, /mob/living/silicon/pai))
|
|
return
|
|
if(M == buckled_mob)
|
|
return
|
|
if(istype(M, /mob/living/carbon/slime))
|
|
user << "<span class='warning'>The [M] is too squishy to buckle in.</span>"
|
|
return
|
|
|
|
add_fingerprint(user)
|
|
unbuckle_mob()
|
|
|
|
if(buckle_mob(M))
|
|
if(M == user)
|
|
M.visible_message(\
|
|
"<span class='notice'>[M.name] buckles themselves to [src].</span>",\
|
|
"<span class='notice'>You buckle yourself to [src].</span>",\
|
|
"<span class='notice'>You hear metal clanking.</span>")
|
|
else
|
|
M.visible_message(\
|
|
"<span class='danger'>[M.name] is buckled to [src] by [user.name]!</span>",\
|
|
"<span class='danger'>You are buckled to [src] by [user.name]!</span>",\
|
|
"<span class='notice'>You hear metal clanking.</span>")
|
|
|
|
/obj/proc/user_unbuckle_mob(mob/user)
|
|
var/mob/living/M = unbuckle_mob()
|
|
if(M)
|
|
if(M != user)
|
|
M.visible_message(\
|
|
"<span class='notice'>[M.name] was unbuckled by [user.name]!</span>",\
|
|
"<span class='notice'>You were unbuckled from [src] by [user.name].</span>",\
|
|
"<span class='notice'>You hear metal clanking.</span>")
|
|
else
|
|
M.visible_message(\
|
|
"<span class='notice'>[M.name] unbuckled themselves!</span>",\
|
|
"<span class='notice'>You unbuckle yourself from [src].</span>",\
|
|
"<span class='notice'>You hear metal clanking.</span>")
|
|
add_fingerprint(user)
|
|
return M
|
|
|