mirror of
https://github.com/vgstation-coders/vgstation13.git
synced 2025-12-10 10:21:11 +00:00
* wip refactor old events * refactored events * We're not lazy anymore! I mean we're still are. We just don't call ourselves that. Lazy is the new default option. It's also the only option. God, this took so long.
120 lines
3.2 KiB
Plaintext
120 lines
3.2 KiB
Plaintext
/datum/control
|
|
var/name = "controlling something else"
|
|
var/mob/controller
|
|
var/atom/movable/controlled
|
|
var/control_flags = 0
|
|
var/is_controlled = FALSE //Whether we're in strict control
|
|
|
|
/datum/control/New(var/mob/new_controller, var/atom/new_controlled)
|
|
..()
|
|
controller = new_controller
|
|
controller.register_event(/event/damaged, src, .proc/user_damaged)
|
|
controlled = new_controlled
|
|
|
|
/datum/control/Destroy()
|
|
break_control()
|
|
if(controller)
|
|
controller.control_object.Remove(src)
|
|
controller = null
|
|
controlled = null
|
|
..()
|
|
|
|
/datum/control/proc/user_damaged(kind, amount)
|
|
if(amount > 0 && control_flags & REVERT_ON_CONTROLLER_DAMAGED)
|
|
break_control()
|
|
|
|
/datum/control/proc/break_control()
|
|
if(controller && controller.client)
|
|
controller.client.eye = controller.client.mob
|
|
controller.client.perspective = MOB_PERSPECTIVE
|
|
is_controlled = FALSE
|
|
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
|
|
controller.canmove = 1
|
|
|
|
/datum/control/proc/take_control()
|
|
if(!is_valid(0))
|
|
return
|
|
if(control_flags & LOCK_EYE_TO_CONTROLLED)
|
|
controller.client.perspective = EYE_PERSPECTIVE
|
|
controller.client.eye = controlled
|
|
is_controlled = TRUE
|
|
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
|
|
controller.canmove = 0
|
|
|
|
/datum/control/proc/is_valid(var/check_control = FALSE)
|
|
if(!controller || !controller.client || !controlled || controller.gcDestroyed || controlled.gcDestroyed)
|
|
qdel(src)
|
|
return 0
|
|
if(check_control && !(control_flags & REQUIRES_CONTROL && is_controlled))
|
|
return 0
|
|
return 1
|
|
|
|
/datum/control/proc/Move_object(var/direction)
|
|
if(!is_valid())
|
|
return
|
|
if(controlled)
|
|
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
|
|
controller.canmove = 0
|
|
if(controlled.density)
|
|
step(controlled,direction)
|
|
if(!controlled)
|
|
return
|
|
controlled.dir = direction
|
|
else
|
|
controlled.forceMove(get_step(controlled,direction))
|
|
|
|
/datum/control/proc/Orient_object(var/direction)
|
|
if(!is_valid())
|
|
return
|
|
if(control_flags & LOCK_MOVEMENT_OF_CONTROLLER)
|
|
controller.canmove = 0
|
|
controlled.dir = direction
|
|
|
|
/////////////////////////////LOCK MOVE//////////////////////////////
|
|
|
|
/datum/control/lock_move
|
|
control_flags = LOCK_MOVEMENT_OF_CONTROLLER | LOCK_EYE_TO_CONTROLLED
|
|
|
|
///////////////////////////////SOULBLADE CONTROLLER///////////////////////////////
|
|
|
|
/datum/control/soulblade
|
|
var/obj/item/weapon/melee/soulblade/blade = null
|
|
var/move_delay = 0
|
|
|
|
/datum/control/soulblade/New(var/mob/new_controller, var/atom/new_controlled)
|
|
..()
|
|
blade = new_controlled
|
|
|
|
/datum/control/soulblade/is_valid(var/direction)
|
|
if (blade.blood <= 0 || move_delay || blade.throwing)
|
|
return 0
|
|
if (!isturf(blade.loc))
|
|
if (istype(blade.loc,/obj/structure/cult/altar))
|
|
var/obj/structure/cult/altar/A = blade.loc
|
|
blade.forceMove(A.loc)
|
|
A.blade = null
|
|
playsound(A.loc, 'sound/weapons/blade1.ogg', 50, 1)
|
|
if (A.is_locking(A.lock_type))
|
|
var/mob/M = A.get_locked(A.lock_type)[1]
|
|
A.unlock_atom(M)
|
|
A.update_icon()
|
|
else
|
|
return 0
|
|
return ..()
|
|
|
|
/datum/control/soulblade/Move_object(var/direction)
|
|
if(!controlled)
|
|
return
|
|
var/atom/start = blade.loc
|
|
if(!is_valid())
|
|
return
|
|
step(controlled,direction)
|
|
controlled.dir = direction
|
|
if (blade.loc != start)
|
|
blade.blood = max(blade.blood-1,0)
|
|
move_delay = 1
|
|
spawn(blade.movespeed)
|
|
move_delay = 0
|
|
|
|
controller.DisplayUI("Soulblade")
|