diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index c630fd0b2f78..04e38c1e2e9c 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -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_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_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): ()
// /mob/living signals
#define COMSIG_LIVING_RESIST "living_resist" //from base of mob/living/resist() (/mob/living)
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 617897571f8a..30ed32b00a65 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -101,7 +101,6 @@
#define FIRE_PRIORITY_SPACEDRIFT 30
#define FIRE_PRIORITY_FIELDS 30
#define FIRE_PRIOTITY_SMOOTHING 35
-#define FIRE_PRIORITY_ORBIT 35
#define FIRE_PRIORITY_NETWORKS 40
#define FIRE_PRIORITY_OBJ 40
#define FIRE_PRIORITY_ACID 40
diff --git a/code/controllers/subsystem/augury.dm b/code/controllers/subsystem/augury.dm
index 875f1ee7d3b0..1b1c7bc3b7b8 100644
--- a/code/controllers/subsystem/augury.dm
+++ b/code/controllers/subsystem/augury.dm
@@ -50,7 +50,7 @@ SUBSYSTEM_DEF(augury)
watchers -= w
continue
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)
/datum/action/innate/augury
diff --git a/code/controllers/subsystem/orbit.dm b/code/controllers/subsystem/orbit.dm
deleted file mode 100644
index 45d280b601b5..000000000000
--- a/code/controllers/subsystem/orbit.dm
+++ /dev/null
@@ -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
-
-
diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm
new file mode 100644
index 000000000000..303beba9fa91
--- /dev/null
+++ b/code/datums/components/orbiter.dm
@@ -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, "Now orbiting [parent].")
+
+/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)
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 988e2d61b307..4017390c7d44 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -34,6 +34,8 @@
var/custom_price
+ var/datum/component/orbiter/orbiters
+
/atom/New(loc, ...)
//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()
@@ -100,6 +102,8 @@
if(reagents)
qdel(reagents)
+ orbiters = null // The component is attached to us normaly and will be deleted elsewhere
+
LAZYCLEARLIST(overlays)
LAZYCLEARLIST(priority_overlays)
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index b0c268df0300..eb9e40e61246 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -34,6 +34,7 @@
var/atom/movable/pulling
var/grab_state = 0
var/throwforce = 0
+ var/datum/component/orbiter/orbiting
/atom/movable/vv_edit_var(var_name, var_value)
var/static/list/banned_edits = list("step_x", "step_y", "step_size")
@@ -299,14 +300,7 @@
if (length(client_mobs_in_contents))
update_parallax_contents()
- if (orbiters)
- for (var/thing in orbiters)
- var/datum/orbit/O = thing
- O.Check()
- if (orbiting)
- orbiting.Check()
-
- return 1
+ return TRUE
/atom/movable/Destroy(force)
QDEL_NULL(proximity_monitor)
@@ -328,6 +322,10 @@
if(pulledby)
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.
// You probably want CanPass()
/atom/movable/Cross(atom/movable/AM)
diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm
index 375d250f59c0..858a1eb21b8f 100644
--- a/code/modules/antagonists/cult/cult_comms.dm
+++ b/code/modules/antagonists/cult/cult_comms.dm
@@ -342,10 +342,7 @@
if(cooldown>world.time)
to_chat(owner, "You aren't ready to place another blood mark yet!")
return
- if(owner.orbiting && owner.orbiting.orbiting)
- target = owner.orbiting.orbiting
- else
- target = get_turf(owner)
+ target = owner.orbiting?.parent || get_turf(owner)
if(!target)
return
C.cult_team.blood_target = target
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 17a04c3a64f5..5b57fb9e890d 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -273,23 +273,12 @@
to_chat(user, "You release the wisp. It begins to bob around your head.")
icon_state = "lantern"
wisp.orbit(user, 20)
- user.update_sight()
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Freed")
else
to_chat(user, "You return the wisp to the lantern.")
-
- 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, "Your vision returns to normal.")
-
icon_state = "lantern-blue"
+ wisp.forceMove(src)
SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned")
/obj/item/wisp_lantern/Initialize()
@@ -302,7 +291,7 @@
qdel(wisp)
else
wisp.visible_message("[wisp] has a sad feeling for a moment, then it passes.")
- ..()
+ return ..()
/obj/effect/wisp
name = "friendly wisp"
@@ -314,6 +303,25 @@
var/sight_flags = SEE_MOBS
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, "The wisp enhances your vision.")
+
+/obj/effect/wisp/stop_orbit(datum/component/orbiter/orbits)
+ . = ..()
+ if(ismob(orbits.parent))
+ UnregisterSignal(orbits.parent, COMSIG_MOB_UPDATE_SIGHT)
+ to_chat(orbits.parent, "Your vision returns to normal.")
+
+/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
/obj/item/warp_cube
name = "blue cube"
@@ -781,19 +789,17 @@
var/turf/T = get_turf(src)
var/list/contents = T.GetAllContents()
var/mob/dead/observer/current_spirits = list()
- var/list/orbiters = list()
for(var/thing in contents)
var/atom/A = thing
- if (A.orbiters)
- orbiters += A.orbiters
+ A.transfer_observers_to(src)
- for(var/thing in orbiters)
- var/datum/orbit/O = thing
- if (isobserver(O.orbiter))
- var/mob/dead/observer/G = O.orbiter
- ghost_counter++
- G.invisibility = 0
- current_spirits |= G
+ for(var/i in orbiters?.orbiters)
+ if(!isobserver(i))
+ continue
+ var/mob/dead/observer/G = i
+ ghost_counter++
+ G.invisibility = 0
+ current_spirits |= G
for(var/mob/dead/observer/G in spirits - current_spirits)
G.invisibility = GLOB.observer_default_invisibility
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index f7f86da4e60d..b2876119fda3 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -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
orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25)
- if(orbiting && orbiting.orbiting != target)
- to_chat(src, "Now orbiting [target].")
-
var/rot_seg
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()
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.
pixel_y = 0
animate(src, pixel_y = 2, time = 10, loop = -1)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 21a80c331d45..b62926d0b0df 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -861,14 +861,7 @@
return
/mob/proc/update_sight()
- for(var/O in orbiters)
- 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)
-
+ SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
sync_lighting_plane_alpha()
/mob/proc/sync_lighting_plane_alpha()
diff --git a/code/modules/orbit/orbit.dm b/code/modules/orbit/orbit.dm
deleted file mode 100644
index 79685b91040c..000000000000
--- a/code/modules/orbit/orbit.dm
+++ /dev/null
@@ -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)
diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm
index 0a54bcab33a3..a5aa47f36568 100644
--- a/code/modules/power/tesla/energy_ball.dm
+++ b/code/modules/power/tesla/energy_ball.dm
@@ -33,8 +33,8 @@
return
/obj/singularity/energy_ball/Destroy()
- if(orbiting && istype(orbiting.orbiting, /obj/singularity/energy_ball))
- var/obj/singularity/energy_ball/EB = orbiting.orbiting
+ if(orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
+ var/obj/singularity/energy_ball/EB = orbiting.parent
EB.orbiting_balls -= src
for(var/ball in orbiting_balls)
@@ -146,8 +146,8 @@
. = ..()
/obj/singularity/energy_ball/stop_orbit()
- if (orbiting && istype(orbiting.orbiting, /obj/singularity/energy_ball))
- var/obj/singularity/energy_ball/orbitingball = orbiting.orbiting
+ if (orbiting && istype(orbiting.parent, /obj/singularity/energy_ball))
+ var/obj/singularity/energy_ball/orbitingball = orbiting.parent
orbitingball.orbiting_balls -= src
orbitingball.dissipate_strength = orbitingball.orbiting_balls.len
..()
diff --git a/tgstation.dme b/tgstation.dme
index 6fb6dc11067c..3717fab667ad 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -238,7 +238,6 @@
#include "code\controllers\subsystem\moods.dm"
#include "code\controllers\subsystem\nightshift.dm"
#include "code\controllers\subsystem\npcpool.dm"
-#include "code\controllers\subsystem\orbit.dm"
#include "code\controllers\subsystem\overlays.dm"
#include "code\controllers\subsystem\pai.dm"
#include "code\controllers\subsystem\parallax.dm"
@@ -351,6 +350,7 @@
#include "code\datums\components\mood.dm"
#include "code\datums\components\nanites.dm"
#include "code\datums\components\ntnet_interface.dm"
+#include "code\datums\components\orbiter.dm"
#include "code\datums\components\paintable.dm"
#include "code\datums\components\rad_insulation.dm"
#include "code\datums\components\radioactive.dm"
@@ -2209,7 +2209,6 @@
#include "code\modules\NTNet\network.dm"
#include "code\modules\NTNet\relays.dm"
#include "code\modules\NTNet\services\_service.dm"
-#include "code\modules\orbit\orbit.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\filingcabinet.dm"
diff --git a/yogstation.dme b/yogstation.dme
index d7b08e2e60c9..3eaafe8c4313 100644
--- a/yogstation.dme
+++ b/yogstation.dme
@@ -247,7 +247,6 @@
#include "code\controllers\subsystem\moods.dm"
#include "code\controllers\subsystem\nightshift.dm"
#include "code\controllers\subsystem\npcpool.dm"
-#include "code\controllers\subsystem\orbit.dm"
#include "code\controllers\subsystem\overlays.dm"
#include "code\controllers\subsystem\pai.dm"
#include "code\controllers\subsystem\parallax.dm"
@@ -361,6 +360,7 @@
#include "code\datums\components\mood.dm"
#include "code\datums\components\nanites.dm"
#include "code\datums\components\ntnet_interface.dm"
+#include "code\datums\components\orbiter.dm"
#include "code\datums\components\paintable.dm"
#include "code\datums\components\rad_insulation.dm"
#include "code\datums\components\radioactive.dm"
@@ -2201,7 +2201,6 @@
#include "code\modules\NTNet\network.dm"
#include "code\modules\NTNet\relays.dm"
#include "code\modules\NTNet\services\_service.dm"
-#include "code\modules\orbit\orbit.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\filingcabinet.dm"