mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
Merge pull request #2681 from yogstation13/upstream-merge-40433
[MIRROR] Componentizes orbiting
This commit is contained in:
@@ -129,6 +129,7 @@
|
|||||||
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
|
#define COMSIG_MOB_ITEM_AFTERATTACK "mob_item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, proximity_flag, click_parameters)
|
||||||
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params)
|
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged" //from base of mob/RangedAttack(): (atom/A, params)
|
||||||
#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target)
|
#define COMSIG_MOB_THROW "mob_throw" //from base of /mob/throw_item(): (atom/target)
|
||||||
|
#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): ()
|
||||||
|
|
||||||
// /mob/living signals
|
// /mob/living signals
|
||||||
#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
|
#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
|
||||||
|
|||||||
@@ -101,7 +101,6 @@
|
|||||||
#define FIRE_PRIORITY_SPACEDRIFT 30
|
#define FIRE_PRIORITY_SPACEDRIFT 30
|
||||||
#define FIRE_PRIORITY_FIELDS 30
|
#define FIRE_PRIORITY_FIELDS 30
|
||||||
#define FIRE_PRIOTITY_SMOOTHING 35
|
#define FIRE_PRIOTITY_SMOOTHING 35
|
||||||
#define FIRE_PRIORITY_ORBIT 35
|
|
||||||
#define FIRE_PRIORITY_NETWORKS 40
|
#define FIRE_PRIORITY_NETWORKS 40
|
||||||
#define FIRE_PRIORITY_OBJ 40
|
#define FIRE_PRIORITY_OBJ 40
|
||||||
#define FIRE_PRIORITY_ACID 40
|
#define FIRE_PRIORITY_ACID 40
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ SUBSYSTEM_DEF(augury)
|
|||||||
watchers -= w
|
watchers -= w
|
||||||
continue
|
continue
|
||||||
var/mob/dead/observer/O = w
|
var/mob/dead/observer/O = w
|
||||||
if(biggest_doom && (!O.orbiting || O.orbiting.orbiting != biggest_doom))
|
if(biggest_doom && (!O.orbiting || O.orbiting.parent != biggest_doom))
|
||||||
O.ManualFollow(biggest_doom)
|
O.ManualFollow(biggest_doom)
|
||||||
|
|
||||||
/datum/action/innate/augury
|
/datum/action/innate/augury
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
SUBSYSTEM_DEF(orbit)
|
|
||||||
name = "Orbits"
|
|
||||||
priority = FIRE_PRIORITY_ORBIT
|
|
||||||
wait = 2
|
|
||||||
flags = SS_NO_INIT|SS_TICKER
|
|
||||||
|
|
||||||
var/list/currentrun = list()
|
|
||||||
var/list/processing = list()
|
|
||||||
|
|
||||||
/datum/controller/subsystem/orbit/stat_entry()
|
|
||||||
..("P:[processing.len]")
|
|
||||||
|
|
||||||
|
|
||||||
/datum/controller/subsystem/orbit/fire(resumed = 0)
|
|
||||||
if (!resumed)
|
|
||||||
src.currentrun = processing.Copy()
|
|
||||||
|
|
||||||
//cache for sanic speed (lists are references anyways)
|
|
||||||
var/list/currentrun = src.currentrun
|
|
||||||
|
|
||||||
while (currentrun.len)
|
|
||||||
var/datum/orbit/O = currentrun[currentrun.len]
|
|
||||||
currentrun.len--
|
|
||||||
if (!O)
|
|
||||||
processing -= O
|
|
||||||
if (MC_TICK_CHECK)
|
|
||||||
return
|
|
||||||
continue
|
|
||||||
if (!O.orbiter)
|
|
||||||
qdel(O)
|
|
||||||
if (MC_TICK_CHECK)
|
|
||||||
return
|
|
||||||
continue
|
|
||||||
if (O.lastprocess >= world.time) //we already checked recently
|
|
||||||
if (MC_TICK_CHECK)
|
|
||||||
return
|
|
||||||
continue
|
|
||||||
var/targetloc = get_turf(O.orbiting)
|
|
||||||
if (targetloc != O.lastloc || O.orbiter.loc != targetloc)
|
|
||||||
O.Check(targetloc)
|
|
||||||
if (MC_TICK_CHECK)
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
112
code/datums/components/orbiter.dm
Normal file
112
code/datums/components/orbiter.dm
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/datum/component/orbiter
|
||||||
|
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
|
||||||
|
var/list/orbiters
|
||||||
|
var/datum/callback/orbiter_spy
|
||||||
|
|
||||||
|
//radius: range to orbit at, radius of the circle formed by orbiting (in pixels)
|
||||||
|
//clockwise: whether you orbit clockwise or anti clockwise
|
||||||
|
//rotation_speed: how fast to rotate (how many ds should it take for a rotation to complete)
|
||||||
|
//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default.
|
||||||
|
//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts
|
||||||
|
//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts)
|
||||||
|
/datum/component/orbiter/Initialize(atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
|
||||||
|
if(!istype(orbiter) || !isatom(parent))
|
||||||
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
|
||||||
|
orbiters = list()
|
||||||
|
orbiter_spy = CALLBACK(src, .proc/orbiter_move_react)
|
||||||
|
|
||||||
|
var/atom/master = parent
|
||||||
|
master.orbiters = src
|
||||||
|
|
||||||
|
begin_orbit(orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
|
||||||
|
|
||||||
|
/datum/component/orbiter/RegisterWithParent()
|
||||||
|
if(ismovableatom(parent))
|
||||||
|
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/move_react)
|
||||||
|
|
||||||
|
/datum/component/orbiter/UnregisterFromParent()
|
||||||
|
UnregisterSignal(parent, COMSIG_MOVABLE_MOVED)
|
||||||
|
|
||||||
|
/datum/component/orbiter/Destroy()
|
||||||
|
var/atom/master = parent
|
||||||
|
master.orbiters = src
|
||||||
|
orbiters = null
|
||||||
|
orbiter_spy = null
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/datum/component/orbiter/InheritComponent(datum/component/orbiter/newcomp, original, list/arguments)
|
||||||
|
if(arguments)
|
||||||
|
begin_orbit(arglist(arguments))
|
||||||
|
return
|
||||||
|
// The following only happens on component transfers
|
||||||
|
var/atom/master = parent
|
||||||
|
var/atom/other_master = newcomp.parent
|
||||||
|
newcomp.move_react(other_master.loc, master.loc) // We're moving the orbiters to where we are first
|
||||||
|
orbiters += newcomp.orbiters
|
||||||
|
|
||||||
|
/datum/component/orbiter/proc/begin_orbit(atom/movable/orbiter, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
|
||||||
|
orbiters[orbiter] = lockinorbit
|
||||||
|
orbiter.orbiting = src
|
||||||
|
RegisterSignal(orbiter, list(COMSIG_MOVABLE_MOVED), orbiter_spy)
|
||||||
|
var/matrix/initial_transform = matrix(orbiter.transform)
|
||||||
|
|
||||||
|
// Head first!
|
||||||
|
if(pre_rotation)
|
||||||
|
var/matrix/M = matrix(orbiter.transform)
|
||||||
|
var/pre_rot = 90
|
||||||
|
if(!clockwise)
|
||||||
|
pre_rot = -90
|
||||||
|
M.Turn(pre_rot)
|
||||||
|
orbiter.transform = M
|
||||||
|
|
||||||
|
var/matrix/shift = matrix(orbiter.transform)
|
||||||
|
shift.Translate(0, radius)
|
||||||
|
orbiter.transform = shift
|
||||||
|
|
||||||
|
orbiter.SpinAnimation(rotation_speed, -1, clockwise, rotation_segments)
|
||||||
|
|
||||||
|
//we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit
|
||||||
|
orbiter.transform = initial_transform
|
||||||
|
orbiter.forceMove(get_turf(parent))
|
||||||
|
to_chat(orbiter, "<span class='notice'>Now orbiting [parent].</span>")
|
||||||
|
|
||||||
|
/datum/component/orbiter/proc/end_orbit(atom/movable/orbiter)
|
||||||
|
if(isnull(orbiters[orbiter]))
|
||||||
|
return
|
||||||
|
orbiter.SpinAnimation(0, 0)
|
||||||
|
orbiters -= orbiter
|
||||||
|
orbiter.stop_orbit(src)
|
||||||
|
if(!length(orbiters))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/datum/component/orbiter/proc/move_react(atom/orbited, atom/oldloc, direction)
|
||||||
|
var/turf/oldturf = get_turf(oldloc)
|
||||||
|
var/turf/newturf = get_turf(parent)
|
||||||
|
for(var/i in orbiters)
|
||||||
|
var/atom/movable/thing = i
|
||||||
|
if(!newturf || (!orbiters[thing] && thing.loc != oldturf && thing.loc != newturf))
|
||||||
|
end_orbit(thing)
|
||||||
|
continue
|
||||||
|
thing.forceMove(newturf)
|
||||||
|
CHECK_TICK
|
||||||
|
|
||||||
|
/datum/component/orbiter/proc/orbiter_move_react(atom/movable/orbiter, atom/oldloc, direction)
|
||||||
|
if(orbiter.loc == get_turf(parent))
|
||||||
|
return
|
||||||
|
end_orbit(orbiter)
|
||||||
|
|
||||||
|
/////////////////////
|
||||||
|
|
||||||
|
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE)
|
||||||
|
if(!istype(A))
|
||||||
|
return
|
||||||
|
|
||||||
|
return A.AddComponent(/datum/component/orbiter, src, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
|
||||||
|
|
||||||
|
/atom/movable/proc/stop_orbit(datum/component/orbiter/orbits)
|
||||||
|
return // We're just a simple hook
|
||||||
|
|
||||||
|
/atom/proc/transfer_observers_to(atom/target)
|
||||||
|
var/datum/component/orbiter/orbits = GetComponent(/datum/component/orbiter)
|
||||||
|
target.TakeComponent(orbits)
|
||||||
@@ -34,6 +34,8 @@
|
|||||||
|
|
||||||
var/custom_price
|
var/custom_price
|
||||||
|
|
||||||
|
var/datum/component/orbiter/orbiters
|
||||||
|
|
||||||
/atom/New(loc, ...)
|
/atom/New(loc, ...)
|
||||||
//atom creation method that preloads variables at creation
|
//atom creation method that preloads variables at creation
|
||||||
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
|
if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New()
|
||||||
@@ -100,6 +102,8 @@
|
|||||||
if(reagents)
|
if(reagents)
|
||||||
qdel(reagents)
|
qdel(reagents)
|
||||||
|
|
||||||
|
orbiters = null // The component is attached to us normaly and will be deleted elsewhere
|
||||||
|
|
||||||
LAZYCLEARLIST(overlays)
|
LAZYCLEARLIST(overlays)
|
||||||
LAZYCLEARLIST(priority_overlays)
|
LAZYCLEARLIST(priority_overlays)
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
var/atom/movable/pulling
|
var/atom/movable/pulling
|
||||||
var/grab_state = 0
|
var/grab_state = 0
|
||||||
var/throwforce = 0
|
var/throwforce = 0
|
||||||
|
var/datum/component/orbiter/orbiting
|
||||||
|
|
||||||
/atom/movable/vv_edit_var(var_name, var_value)
|
/atom/movable/vv_edit_var(var_name, var_value)
|
||||||
var/static/list/banned_edits = list("step_x", "step_y", "step_size")
|
var/static/list/banned_edits = list("step_x", "step_y", "step_size")
|
||||||
@@ -299,14 +300,7 @@
|
|||||||
if (length(client_mobs_in_contents))
|
if (length(client_mobs_in_contents))
|
||||||
update_parallax_contents()
|
update_parallax_contents()
|
||||||
|
|
||||||
if (orbiters)
|
return TRUE
|
||||||
for (var/thing in orbiters)
|
|
||||||
var/datum/orbit/O = thing
|
|
||||||
O.Check()
|
|
||||||
if (orbiting)
|
|
||||||
orbiting.Check()
|
|
||||||
|
|
||||||
return 1
|
|
||||||
|
|
||||||
/atom/movable/Destroy(force)
|
/atom/movable/Destroy(force)
|
||||||
QDEL_NULL(proximity_monitor)
|
QDEL_NULL(proximity_monitor)
|
||||||
@@ -328,6 +322,10 @@
|
|||||||
if(pulledby)
|
if(pulledby)
|
||||||
pulledby.stop_pulling()
|
pulledby.stop_pulling()
|
||||||
|
|
||||||
|
if(orbiting)
|
||||||
|
orbiting.end_orbit(src)
|
||||||
|
orbiting = null
|
||||||
|
|
||||||
// Make sure you know what you're doing if you call this, this is intended to only be called by byond directly.
|
// Make sure you know what you're doing if you call this, this is intended to only be called by byond directly.
|
||||||
// You probably want CanPass()
|
// You probably want CanPass()
|
||||||
/atom/movable/Cross(atom/movable/AM)
|
/atom/movable/Cross(atom/movable/AM)
|
||||||
|
|||||||
@@ -342,10 +342,7 @@
|
|||||||
if(cooldown>world.time)
|
if(cooldown>world.time)
|
||||||
to_chat(owner, "<span class='cultbold'>You aren't ready to place another blood mark yet!</span>")
|
to_chat(owner, "<span class='cultbold'>You aren't ready to place another blood mark yet!</span>")
|
||||||
return
|
return
|
||||||
if(owner.orbiting && owner.orbiting.orbiting)
|
target = owner.orbiting?.parent || get_turf(owner)
|
||||||
target = owner.orbiting.orbiting
|
|
||||||
else
|
|
||||||
target = get_turf(owner)
|
|
||||||
if(!target)
|
if(!target)
|
||||||
return
|
return
|
||||||
C.cult_team.blood_target = target
|
C.cult_team.blood_target = target
|
||||||
|
|||||||
@@ -273,23 +273,12 @@
|
|||||||
to_chat(user, "<span class='notice'>You release the wisp. It begins to bob around your head.</span>")
|
to_chat(user, "<span class='notice'>You release the wisp. It begins to bob around your head.</span>")
|
||||||
icon_state = "lantern"
|
icon_state = "lantern"
|
||||||
wisp.orbit(user, 20)
|
wisp.orbit(user, 20)
|
||||||
user.update_sight()
|
|
||||||
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Freed")
|
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Freed")
|
||||||
|
|
||||||
else
|
else
|
||||||
to_chat(user, "<span class='notice'>You return the wisp to the lantern.</span>")
|
to_chat(user, "<span class='notice'>You return the wisp to the lantern.</span>")
|
||||||
|
|
||||||
var/mob/target
|
|
||||||
if(wisp.orbiting)
|
|
||||||
target = wisp.orbiting.orbiting
|
|
||||||
wisp.stop_orbit()
|
|
||||||
wisp.forceMove(src)
|
|
||||||
|
|
||||||
if (istype(target))
|
|
||||||
target.update_sight()
|
|
||||||
to_chat(target, "<span class='notice'>Your vision returns to normal.</span>")
|
|
||||||
|
|
||||||
icon_state = "lantern-blue"
|
icon_state = "lantern-blue"
|
||||||
|
wisp.forceMove(src)
|
||||||
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned")
|
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned")
|
||||||
|
|
||||||
/obj/item/wisp_lantern/Initialize()
|
/obj/item/wisp_lantern/Initialize()
|
||||||
@@ -302,7 +291,7 @@
|
|||||||
qdel(wisp)
|
qdel(wisp)
|
||||||
else
|
else
|
||||||
wisp.visible_message("<span class='notice'>[wisp] has a sad feeling for a moment, then it passes.</span>")
|
wisp.visible_message("<span class='notice'>[wisp] has a sad feeling for a moment, then it passes.</span>")
|
||||||
..()
|
return ..()
|
||||||
|
|
||||||
/obj/effect/wisp
|
/obj/effect/wisp
|
||||||
name = "friendly wisp"
|
name = "friendly wisp"
|
||||||
@@ -314,6 +303,25 @@
|
|||||||
var/sight_flags = SEE_MOBS
|
var/sight_flags = SEE_MOBS
|
||||||
var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
var/lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
|
||||||
|
|
||||||
|
/obj/effect/wisp/orbit(atom/thing, radius, clockwise, rotation_speed, rotation_segments, pre_rotation, lockinorbit)
|
||||||
|
. = ..()
|
||||||
|
if(ismob(thing))
|
||||||
|
RegisterSignal(thing, COMSIG_MOB_UPDATE_SIGHT, .proc/update_user_sight)
|
||||||
|
var/mob/being = thing
|
||||||
|
being.update_sight()
|
||||||
|
to_chat(thing, "<span class='notice'>The wisp enhances your vision.</span>")
|
||||||
|
|
||||||
|
/obj/effect/wisp/stop_orbit(datum/component/orbiter/orbits)
|
||||||
|
. = ..()
|
||||||
|
if(ismob(orbits.parent))
|
||||||
|
UnregisterSignal(orbits.parent, COMSIG_MOB_UPDATE_SIGHT)
|
||||||
|
to_chat(orbits.parent, "<span class='notice'>Your vision returns to normal.</span>")
|
||||||
|
|
||||||
|
/obj/effect/wisp/proc/update_user_sight(mob/user)
|
||||||
|
user.sight |= sight_flags
|
||||||
|
if(!isnull(lighting_alpha))
|
||||||
|
user.lighting_alpha = min(user.lighting_alpha, lighting_alpha)
|
||||||
|
|
||||||
//Red/Blue Cubes
|
//Red/Blue Cubes
|
||||||
/obj/item/warp_cube
|
/obj/item/warp_cube
|
||||||
name = "blue cube"
|
name = "blue cube"
|
||||||
@@ -781,19 +789,17 @@
|
|||||||
var/turf/T = get_turf(src)
|
var/turf/T = get_turf(src)
|
||||||
var/list/contents = T.GetAllContents()
|
var/list/contents = T.GetAllContents()
|
||||||
var/mob/dead/observer/current_spirits = list()
|
var/mob/dead/observer/current_spirits = list()
|
||||||
var/list/orbiters = list()
|
|
||||||
for(var/thing in contents)
|
for(var/thing in contents)
|
||||||
var/atom/A = thing
|
var/atom/A = thing
|
||||||
if (A.orbiters)
|
A.transfer_observers_to(src)
|
||||||
orbiters += A.orbiters
|
|
||||||
|
|
||||||
for(var/thing in orbiters)
|
for(var/i in orbiters?.orbiters)
|
||||||
var/datum/orbit/O = thing
|
if(!isobserver(i))
|
||||||
if (isobserver(O.orbiter))
|
continue
|
||||||
var/mob/dead/observer/G = O.orbiter
|
var/mob/dead/observer/G = i
|
||||||
ghost_counter++
|
ghost_counter++
|
||||||
G.invisibility = 0
|
G.invisibility = 0
|
||||||
current_spirits |= G
|
current_spirits |= G
|
||||||
|
|
||||||
for(var/mob/dead/observer/G in spirits - current_spirits)
|
for(var/mob/dead/observer/G in spirits - current_spirits)
|
||||||
G.invisibility = GLOB.observer_default_invisibility
|
G.invisibility = GLOB.observer_default_invisibility
|
||||||
|
|||||||
@@ -417,9 +417,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
var/orbitsize = (I.Width()+I.Height())*0.5
|
var/orbitsize = (I.Width()+I.Height())*0.5
|
||||||
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
|
||||||
|
|
||||||
if(orbiting && orbiting.orbiting != target)
|
|
||||||
to_chat(src, "<span class='notice'>Now orbiting [target].</span>")
|
|
||||||
|
|
||||||
var/rot_seg
|
var/rot_seg
|
||||||
|
|
||||||
switch(ghost_orbit)
|
switch(ghost_orbit)
|
||||||
@@ -438,10 +435,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
|
|
||||||
/mob/dead/observer/orbit()
|
/mob/dead/observer/orbit()
|
||||||
setDir(2)//reset dir so the right directional sprites show up
|
setDir(2)//reset dir so the right directional sprites show up
|
||||||
..()
|
return ..()
|
||||||
|
|
||||||
/mob/dead/observer/stop_orbit()
|
/mob/dead/observer/stop_orbit(datum/component/orbiter/orbits)
|
||||||
..()
|
. = ..()
|
||||||
//restart our floating animation after orbit is done.
|
//restart our floating animation after orbit is done.
|
||||||
pixel_y = 0
|
pixel_y = 0
|
||||||
animate(src, pixel_y = 2, time = 10, loop = -1)
|
animate(src, pixel_y = 2, time = 10, loop = -1)
|
||||||
|
|||||||
@@ -861,14 +861,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/mob/proc/update_sight()
|
/mob/proc/update_sight()
|
||||||
for(var/O in orbiters)
|
SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
|
||||||
var/datum/orbit/orbit = O
|
|
||||||
var/obj/effect/wisp/wisp = orbit.orbiter
|
|
||||||
if (istype(wisp))
|
|
||||||
sight |= wisp.sight_flags
|
|
||||||
if(!isnull(wisp.lighting_alpha))
|
|
||||||
lighting_alpha = min(lighting_alpha, wisp.lighting_alpha)
|
|
||||||
|
|
||||||
sync_lighting_plane_alpha()
|
sync_lighting_plane_alpha()
|
||||||
|
|
||||||
/mob/proc/sync_lighting_plane_alpha()
|
/mob/proc/sync_lighting_plane_alpha()
|
||||||
|
|||||||
@@ -1,135 +0,0 @@
|
|||||||
/datum/orbit
|
|
||||||
var/atom/movable/orbiter
|
|
||||||
var/atom/orbiting
|
|
||||||
var/lock = TRUE
|
|
||||||
var/turf/lastloc
|
|
||||||
var/lastprocess
|
|
||||||
|
|
||||||
/datum/orbit/New(_orbiter, _orbiting, _lock)
|
|
||||||
orbiter = _orbiter
|
|
||||||
orbiting = _orbiting
|
|
||||||
SSorbit.processing += src
|
|
||||||
if (!orbiting.orbiters)
|
|
||||||
orbiting.orbiters = list()
|
|
||||||
orbiting.orbiters += src
|
|
||||||
|
|
||||||
if (orbiter.orbiting)
|
|
||||||
orbiter.stop_orbit()
|
|
||||||
orbiter.orbiting = src
|
|
||||||
Check()
|
|
||||||
lock = _lock
|
|
||||||
|
|
||||||
//do not qdel directly, use stop_orbit on the orbiter. (This way the orbiter can bind to the orbit stopping)
|
|
||||||
/datum/orbit/Destroy(force = FALSE)
|
|
||||||
SSorbit.processing -= src
|
|
||||||
if (orbiter)
|
|
||||||
orbiter.orbiting = null
|
|
||||||
orbiter = null
|
|
||||||
if (orbiting)
|
|
||||||
if (orbiting.orbiters)
|
|
||||||
orbiting.orbiters -= src
|
|
||||||
if (!orbiting.orbiters.len)//we are the last orbit, delete the list
|
|
||||||
orbiting.orbiters = null
|
|
||||||
orbiting = null
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
/datum/orbit/proc/Check(turf/targetloc, list/checked_already = list())
|
|
||||||
//Avoid infinite loops for people who end up orbiting themself through another orbiter
|
|
||||||
checked_already[src] = TRUE
|
|
||||||
if (!orbiter)
|
|
||||||
qdel(src)
|
|
||||||
return
|
|
||||||
if (!orbiting)
|
|
||||||
orbiter.stop_orbit()
|
|
||||||
return
|
|
||||||
if (!orbiter.orbiting) //admin wants to stop the orbit.
|
|
||||||
orbiter.orbiting = src //set it back to us first
|
|
||||||
orbiter.stop_orbit()
|
|
||||||
var/atom/movable/AM = orbiting
|
|
||||||
if(istype(AM) && AM.orbiting && AM.orbiting.orbiting == orbiter)
|
|
||||||
orbiter.stop_orbit()
|
|
||||||
return
|
|
||||||
lastprocess = world.time
|
|
||||||
if (!targetloc)
|
|
||||||
targetloc = get_turf(orbiting)
|
|
||||||
if (!targetloc || (!lock && orbiter.loc != lastloc && orbiter.loc != targetloc))
|
|
||||||
orbiter.stop_orbit()
|
|
||||||
return
|
|
||||||
var/turf/old_turf = get_turf(orbiter)
|
|
||||||
var/turf/new_turf = get_turf(targetloc)
|
|
||||||
if (old_turf?.z != new_turf?.z)
|
|
||||||
orbiter.onTransitZ(old_turf?.z, new_turf?.z)
|
|
||||||
// DO NOT PORT TO FORCEMOVE - MEMECODE WILL KILL MC
|
|
||||||
orbiter.loc = targetloc
|
|
||||||
orbiter.update_parallax_contents()
|
|
||||||
orbiter.update_light()
|
|
||||||
lastloc = orbiter.loc
|
|
||||||
for(var/other_orbit in orbiter.orbiters)
|
|
||||||
var/datum/orbit/OO = other_orbit
|
|
||||||
//Skip if checked already
|
|
||||||
if(checked_already[OO])
|
|
||||||
continue
|
|
||||||
OO.Check(targetloc, checked_already)
|
|
||||||
|
|
||||||
/atom/movable/var/datum/orbit/orbiting = null
|
|
||||||
/atom/var/list/orbiters = null
|
|
||||||
|
|
||||||
//A: atom to orbit
|
|
||||||
//radius: range to orbit at, radius of the circle formed by orbiting (in pixels)
|
|
||||||
//clockwise: whether you orbit clockwise or anti clockwise
|
|
||||||
//rotation_speed: how fast to rotate (how many ds should it take for a rotation to complete)
|
|
||||||
//rotation_segments: the resolution of the orbit circle, less = a more block circle, this can be used to produce hexagons (6 segments) triangles (3 segments), and so on, 36 is the best default.
|
|
||||||
//pre_rotation: Chooses to rotate src 90 degress towards the orbit dir (clockwise/anticlockwise), useful for things to go "head first" like ghosts
|
|
||||||
//lockinorbit: Forces src to always be on A's turf, otherwise the orbit cancels when src gets too far away (eg: ghosts)
|
|
||||||
|
|
||||||
/atom/movable/proc/orbit(atom/A, radius = 10, clockwise = FALSE, rotation_speed = 20, rotation_segments = 36, pre_rotation = TRUE, lockinorbit = FALSE)
|
|
||||||
if (!istype(A))
|
|
||||||
return
|
|
||||||
|
|
||||||
new/datum/orbit(src, A, lockinorbit)
|
|
||||||
if (!orbiting) //something failed, and our orbit datum deleted itself
|
|
||||||
return
|
|
||||||
var/matrix/initial_transform = matrix(transform)
|
|
||||||
|
|
||||||
//Head first!
|
|
||||||
if (pre_rotation)
|
|
||||||
var/matrix/M = matrix(transform)
|
|
||||||
var/pre_rot = 90
|
|
||||||
if(!clockwise)
|
|
||||||
pre_rot = -90
|
|
||||||
M.Turn(pre_rot)
|
|
||||||
transform = M
|
|
||||||
|
|
||||||
var/matrix/shift = matrix(transform)
|
|
||||||
shift.Translate(0,radius)
|
|
||||||
transform = shift
|
|
||||||
|
|
||||||
SpinAnimation(rotation_speed, -1, clockwise, rotation_segments)
|
|
||||||
|
|
||||||
//we stack the orbits up client side, so we can assign this back to normal server side without it breaking the orbit
|
|
||||||
transform = initial_transform
|
|
||||||
|
|
||||||
/atom/movable/proc/stop_orbit()
|
|
||||||
SpinAnimation(0,0)
|
|
||||||
qdel(orbiting)
|
|
||||||
|
|
||||||
/atom/Destroy(force = FALSE)
|
|
||||||
. = ..()
|
|
||||||
if (orbiters)
|
|
||||||
for (var/thing in orbiters)
|
|
||||||
var/datum/orbit/O = thing
|
|
||||||
if (O.orbiter)
|
|
||||||
O.orbiter.stop_orbit()
|
|
||||||
|
|
||||||
/atom/movable/Destroy(force = FALSE)
|
|
||||||
. = ..()
|
|
||||||
if (orbiting)
|
|
||||||
stop_orbit()
|
|
||||||
|
|
||||||
/atom/movable/proc/transfer_observers_to(atom/movable/target)
|
|
||||||
if(orbiters)
|
|
||||||
for(var/thing in orbiters)
|
|
||||||
var/datum/orbit/O = thing
|
|
||||||
if(O.orbiter && isobserver(O.orbiter))
|
|
||||||
var/mob/dead/observer/D = O.orbiter
|
|
||||||
D.ManualFollow(target)
|
|
||||||
@@ -33,8 +33,8 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
/obj/singularity/energy_ball/Destroy()
|
/obj/singularity/energy_ball/Destroy()
|
||||||
if(orbiting && istype(orbiting.orbiting, /obj/singularity/energy_ball))
|
if(orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
|
||||||
var/obj/singularity/energy_ball/EB = orbiting.orbiting
|
var/obj/singularity/energy_ball/EB = orbiting.parent
|
||||||
EB.orbiting_balls -= src
|
EB.orbiting_balls -= src
|
||||||
|
|
||||||
for(var/ball in orbiting_balls)
|
for(var/ball in orbiting_balls)
|
||||||
@@ -146,8 +146,8 @@
|
|||||||
|
|
||||||
. = ..()
|
. = ..()
|
||||||
/obj/singularity/energy_ball/stop_orbit()
|
/obj/singularity/energy_ball/stop_orbit()
|
||||||
if (orbiting && istype(orbiting.orbiting, /obj/singularity/energy_ball))
|
if (orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
|
||||||
var/obj/singularity/energy_ball/orbitingball = orbiting.orbiting
|
var/obj/singularity/energy_ball/orbitingball = orbiting.parent
|
||||||
orbitingball.orbiting_balls -= src
|
orbitingball.orbiting_balls -= src
|
||||||
orbitingball.dissipate_strength = orbitingball.orbiting_balls.len
|
orbitingball.dissipate_strength = orbitingball.orbiting_balls.len
|
||||||
..()
|
..()
|
||||||
|
|||||||
@@ -238,7 +238,6 @@
|
|||||||
#include "code\controllers\subsystem\moods.dm"
|
#include "code\controllers\subsystem\moods.dm"
|
||||||
#include "code\controllers\subsystem\nightshift.dm"
|
#include "code\controllers\subsystem\nightshift.dm"
|
||||||
#include "code\controllers\subsystem\npcpool.dm"
|
#include "code\controllers\subsystem\npcpool.dm"
|
||||||
#include "code\controllers\subsystem\orbit.dm"
|
|
||||||
#include "code\controllers\subsystem\overlays.dm"
|
#include "code\controllers\subsystem\overlays.dm"
|
||||||
#include "code\controllers\subsystem\pai.dm"
|
#include "code\controllers\subsystem\pai.dm"
|
||||||
#include "code\controllers\subsystem\parallax.dm"
|
#include "code\controllers\subsystem\parallax.dm"
|
||||||
@@ -351,6 +350,7 @@
|
|||||||
#include "code\datums\components\mood.dm"
|
#include "code\datums\components\mood.dm"
|
||||||
#include "code\datums\components\nanites.dm"
|
#include "code\datums\components\nanites.dm"
|
||||||
#include "code\datums\components\ntnet_interface.dm"
|
#include "code\datums\components\ntnet_interface.dm"
|
||||||
|
#include "code\datums\components\orbiter.dm"
|
||||||
#include "code\datums\components\paintable.dm"
|
#include "code\datums\components\paintable.dm"
|
||||||
#include "code\datums\components\rad_insulation.dm"
|
#include "code\datums\components\rad_insulation.dm"
|
||||||
#include "code\datums\components\radioactive.dm"
|
#include "code\datums\components\radioactive.dm"
|
||||||
@@ -2209,7 +2209,6 @@
|
|||||||
#include "code\modules\NTNet\network.dm"
|
#include "code\modules\NTNet\network.dm"
|
||||||
#include "code\modules\NTNet\relays.dm"
|
#include "code\modules\NTNet\relays.dm"
|
||||||
#include "code\modules\NTNet\services\_service.dm"
|
#include "code\modules\NTNet\services\_service.dm"
|
||||||
#include "code\modules\orbit\orbit.dm"
|
|
||||||
#include "code\modules\paperwork\clipboard.dm"
|
#include "code\modules\paperwork\clipboard.dm"
|
||||||
#include "code\modules\paperwork\contract.dm"
|
#include "code\modules\paperwork\contract.dm"
|
||||||
#include "code\modules\paperwork\filingcabinet.dm"
|
#include "code\modules\paperwork\filingcabinet.dm"
|
||||||
|
|||||||
@@ -247,7 +247,6 @@
|
|||||||
#include "code\controllers\subsystem\moods.dm"
|
#include "code\controllers\subsystem\moods.dm"
|
||||||
#include "code\controllers\subsystem\nightshift.dm"
|
#include "code\controllers\subsystem\nightshift.dm"
|
||||||
#include "code\controllers\subsystem\npcpool.dm"
|
#include "code\controllers\subsystem\npcpool.dm"
|
||||||
#include "code\controllers\subsystem\orbit.dm"
|
|
||||||
#include "code\controllers\subsystem\overlays.dm"
|
#include "code\controllers\subsystem\overlays.dm"
|
||||||
#include "code\controllers\subsystem\pai.dm"
|
#include "code\controllers\subsystem\pai.dm"
|
||||||
#include "code\controllers\subsystem\parallax.dm"
|
#include "code\controllers\subsystem\parallax.dm"
|
||||||
@@ -361,6 +360,7 @@
|
|||||||
#include "code\datums\components\mood.dm"
|
#include "code\datums\components\mood.dm"
|
||||||
#include "code\datums\components\nanites.dm"
|
#include "code\datums\components\nanites.dm"
|
||||||
#include "code\datums\components\ntnet_interface.dm"
|
#include "code\datums\components\ntnet_interface.dm"
|
||||||
|
#include "code\datums\components\orbiter.dm"
|
||||||
#include "code\datums\components\paintable.dm"
|
#include "code\datums\components\paintable.dm"
|
||||||
#include "code\datums\components\rad_insulation.dm"
|
#include "code\datums\components\rad_insulation.dm"
|
||||||
#include "code\datums\components\radioactive.dm"
|
#include "code\datums\components\radioactive.dm"
|
||||||
@@ -2201,7 +2201,6 @@
|
|||||||
#include "code\modules\NTNet\network.dm"
|
#include "code\modules\NTNet\network.dm"
|
||||||
#include "code\modules\NTNet\relays.dm"
|
#include "code\modules\NTNet\relays.dm"
|
||||||
#include "code\modules\NTNet\services\_service.dm"
|
#include "code\modules\NTNet\services\_service.dm"
|
||||||
#include "code\modules\orbit\orbit.dm"
|
|
||||||
#include "code\modules\paperwork\clipboard.dm"
|
#include "code\modules\paperwork\clipboard.dm"
|
||||||
#include "code\modules\paperwork\contract.dm"
|
#include "code\modules\paperwork\contract.dm"
|
||||||
#include "code\modules\paperwork\filingcabinet.dm"
|
#include "code\modules\paperwork\filingcabinet.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user