diff --git a/assets/js/hooks/Mapper/components/map/hooks/api/useSelectSystems.ts b/assets/js/hooks/Mapper/components/map/hooks/api/useSelectSystems.ts index 6366864d..ac942436 100644 --- a/assets/js/hooks/Mapper/components/map/hooks/api/useSelectSystems.ts +++ b/assets/js/hooks/Mapper/components/map/hooks/api/useSelectSystems.ts @@ -1,7 +1,7 @@ -import { useReactFlow } from 'reactflow'; -import { useCallback, useRef } from 'react'; -import { CommandSelectSystems } from '@/hooks/Mapper/types'; import { OnMapSelectionChange } from '@/hooks/Mapper/components/map/map.types.ts'; +import { CommandSelectSystems } from '@/hooks/Mapper/types'; +import { useCallback, useRef } from 'react'; +import { useReactFlow } from 'reactflow'; export const useSelectSystems = (onSelectionChange: OnMapSelectionChange) => { const rf = useReactFlow(); diff --git a/assets/js/hooks/Mapper/components/map/hooks/useMapHandlers.ts b/assets/js/hooks/Mapper/components/map/hooks/useMapHandlers.ts index 21d45b52..bd0068c3 100644 --- a/assets/js/hooks/Mapper/components/map/hooks/useMapHandlers.ts +++ b/assets/js/hooks/Mapper/components/map/hooks/useMapHandlers.ts @@ -1,4 +1,3 @@ -import { ForwardedRef, useImperativeHandle, useRef } from 'react'; import { CommandAddConnections, CommandAddSystems, @@ -19,8 +18,11 @@ import { CommandUpdateSystems, MapHandlers, } from '@/hooks/Mapper/types/mapHandlers.ts'; +import { ForwardedRef, useImperativeHandle, useRef } from 'react'; +import { OnMapSelectionChange } from '@/hooks/Mapper/components/map/map.types.ts'; import { + useCenterSystem, useCommandsCharacters, useCommandsConnections, useMapAddSystems, @@ -28,10 +30,8 @@ import { useMapInit, useMapRemoveSystems, useMapUpdateSystems, - useCenterSystem, useSelectSystems, } from './api'; -import { OnMapSelectionChange } from '@/hooks/Mapper/components/map/map.types.ts'; export const useMapHandlers = (ref: ForwardedRef, onSelectionChange: OnMapSelectionChange) => { const mapInit = useMapInit(); @@ -49,91 +49,87 @@ export const useMapHandlers = (ref: ForwardedRef, onSelectionChange const { charactersUpdated, presentCharacters, characterAdded, characterRemoved, characterUpdated } = useCommandsCharacters(); - useImperativeHandle( - ref, - () => { - return { - command(type, data) { - switch (type) { - case Commands.init: - mapInit(data as CommandInit); - break; - case Commands.addSystems: - setTimeout(() => mapAddSystems(data as CommandAddSystems), 100); - break; - case Commands.updateSystems: - mapUpdateSystems(data as CommandUpdateSystems); - break; - case Commands.removeSystems: - setTimeout(() => removeSystems(data as CommandRemoveSystems), 100); - break; - case Commands.addConnections: - setTimeout(() => addConnections(data as CommandAddConnections), 100); - break; - case Commands.removeConnections: - setTimeout(() => removeConnections(data as CommandRemoveConnections), 100); - break; - case Commands.charactersUpdated: - charactersUpdated(data as CommandCharactersUpdated); - break; - case Commands.characterAdded: - characterAdded(data as CommandCharacterAdded); - break; - case Commands.characterRemoved: - characterRemoved(data as CommandCharacterRemoved); - break; - case Commands.characterUpdated: - characterUpdated(data as CommandCharacterUpdated); - break; - case Commands.presentCharacters: - presentCharacters(data as CommandPresentCharacters); - break; - case Commands.updateConnection: - updateConnection(data as CommandUpdateConnection); - break; - case Commands.mapUpdated: - mapUpdated(data as CommandMapUpdated); - break; - case Commands.killsUpdated: - killsUpdated(data as CommandKillsUpdated); - break; + useImperativeHandle(ref, () => { + return { + command(type, data) { + switch (type) { + case Commands.init: + mapInit(data as CommandInit); + break; + case Commands.addSystems: + setTimeout(() => mapAddSystems(data as CommandAddSystems), 100); + break; + case Commands.updateSystems: + mapUpdateSystems(data as CommandUpdateSystems); + break; + case Commands.removeSystems: + setTimeout(() => removeSystems(data as CommandRemoveSystems), 100); + break; + case Commands.addConnections: + setTimeout(() => addConnections(data as CommandAddConnections), 100); + break; + case Commands.removeConnections: + setTimeout(() => removeConnections(data as CommandRemoveConnections), 100); + break; + case Commands.charactersUpdated: + charactersUpdated(data as CommandCharactersUpdated); + break; + case Commands.characterAdded: + characterAdded(data as CommandCharacterAdded); + break; + case Commands.characterRemoved: + characterRemoved(data as CommandCharacterRemoved); + break; + case Commands.characterUpdated: + characterUpdated(data as CommandCharacterUpdated); + break; + case Commands.presentCharacters: + presentCharacters(data as CommandPresentCharacters); + break; + case Commands.updateConnection: + updateConnection(data as CommandUpdateConnection); + break; + case Commands.mapUpdated: + mapUpdated(data as CommandMapUpdated); + break; + case Commands.killsUpdated: + killsUpdated(data as CommandKillsUpdated); + break; - case Commands.centerSystem: - setTimeout(() => { - const systemId = `${data}`; - centerSystem(systemId as CommandSelectSystem); - }, 100); - break; + case Commands.centerSystem: + setTimeout(() => { + const systemId = `${data}`; + centerSystem(systemId as CommandSelectSystem); + }, 100); + break; - case Commands.selectSystem: - selectSystems({ systems: [data as string], delay: 500 }); - break; + case Commands.selectSystem: + selectSystems({ systems: [data as string], delay: 500 }); + break; - case Commands.selectSystems: - selectSystems(data as CommandSelectSystems); - break; + case Commands.selectSystems: + selectSystems(data as CommandSelectSystems); + break; - case Commands.pingAdded: - case Commands.pingCancelled: - case Commands.routes: - case Commands.signaturesUpdated: - case Commands.linkSignatureToSystem: - case Commands.detailedKillsUpdated: - case Commands.characterActivityData: - case Commands.trackingCharactersData: - case Commands.updateActivity: - case Commands.updateTracking: - case Commands.userSettingsUpdated: - // do nothing - break; + case Commands.pingAdded: + case Commands.pingCancelled: + case Commands.routes: + case Commands.signaturesUpdated: + case Commands.linkSignatureToSystem: + case Commands.detailedKillsUpdated: + case Commands.characterActivityData: + case Commands.trackingCharactersData: + case Commands.updateActivity: + case Commands.updateTracking: + case Commands.userSettingsUpdated: + // do nothing + break; - default: - console.warn(`Map handlers: Unknown command: ${type}`, data); - break; - } - }, - }; - }, - [], - ); + default: + console.warn(`Map handlers: Unknown command: ${type}`, data); + break; + } + }, + }; + }, []); }; diff --git a/assets/js/hooks/Mapper/hooks/index.ts b/assets/js/hooks/Mapper/hooks/index.ts index 6cb2efae..440bdada 100644 --- a/assets/js/hooks/Mapper/hooks/index.ts +++ b/assets/js/hooks/Mapper/hooks/index.ts @@ -1,6 +1,7 @@ export * from './useClipboard'; +export * from './useConfirmPopup'; +export * from './useEventBuffer'; export * from './useHotkey'; export * from './usePageVisibility'; export * from './useSkipContextMenu'; export * from './useThrottle'; -export * from './useConfirmPopup'; diff --git a/assets/js/hooks/Mapper/hooks/useEventBuffer.ts b/assets/js/hooks/Mapper/hooks/useEventBuffer.ts new file mode 100644 index 00000000..00a28fa0 --- /dev/null +++ b/assets/js/hooks/Mapper/hooks/useEventBuffer.ts @@ -0,0 +1,41 @@ +import debounce from 'lodash.debounce'; +import { useCallback, useRef } from 'react'; +export type UseEventBufferHandler = (event: T) => void; + +export const useEventBuffer = (handler: UseEventBufferHandler) => { + // @ts-ignore + const eventsBufferRef = useRef([]); + + const eventTick = useCallback( + debounce(() => { + if (eventsBufferRef.current.length === 0) { + return; + } + + const event = eventsBufferRef.current.shift()!; + handler(event); + + // TODO - do not delete THIS code it needs for debug + // console.log('JOipP', `Tick Buff`, eventsBufferRef.current.length); + + if (eventsBufferRef.current.length > 0) { + eventTick(); + } + }, 10), + [], + ); + const eventTickRef = useRef(eventTick); + eventTickRef.current = eventTick; + + // @ts-ignore + const handleEvent = useCallback(event => { + if (!eventTickRef.current) { + return; + } + + eventsBufferRef.current.push(event); + eventTickRef.current(); + }, []); + + return { handleEvent }; +}; diff --git a/assets/js/hooks/Mapper/mapRootProvider/hooks/api/useMapInit.ts b/assets/js/hooks/Mapper/mapRootProvider/hooks/api/useMapInit.ts index 622dbb12..afed6da3 100644 --- a/assets/js/hooks/Mapper/mapRootProvider/hooks/api/useMapInit.ts +++ b/assets/js/hooks/Mapper/mapRootProvider/hooks/api/useMapInit.ts @@ -1,7 +1,7 @@ -import { useCallback } from 'react'; -import { CommandInit } from '@/hooks/Mapper/types'; import { MapRootData, useMapRootState } from '@/hooks/Mapper/mapRootProvider'; import { useLoadSystemStatic } from '@/hooks/Mapper/mapRootProvider/hooks/useLoadSystemStatic.ts'; +import { CommandInit } from '@/hooks/Mapper/types'; +import { useCallback } from 'react'; export const useMapInit = () => { const { update } = useMapRootState(); diff --git a/assets/js/hooks/Mapper/mapRootProvider/hooks/useMapRootHandlers.ts b/assets/js/hooks/Mapper/mapRootProvider/hooks/useMapRootHandlers.ts index ecc8e440..1c7c7c57 100644 --- a/assets/js/hooks/Mapper/mapRootProvider/hooks/useMapRootHandlers.ts +++ b/assets/js/hooks/Mapper/mapRootProvider/hooks/useMapRootHandlers.ts @@ -1,4 +1,3 @@ -import { ForwardedRef, useImperativeHandle } from 'react'; import { CommandAddConnections, CommandAddSystems, @@ -8,24 +7,25 @@ import { CommandCharactersUpdated, CommandCharacterUpdated, CommandCommentAdd, + CommandCommentRemoved, CommandInit, CommandLinkSignatureToSystem, CommandMapUpdated, + CommandPingAdded, + CommandPingCancelled, CommandPresentCharacters, CommandRemoveConnections, CommandRemoveSystems, CommandRoutes, + Commands, CommandSignaturesUpdated, CommandTrackingCharactersData, CommandUpdateConnection, CommandUpdateSystems, CommandUserSettingsUpdated, - Commands, MapHandlers, - CommandCommentRemoved, - CommandPingAdded, - CommandPingCancelled, } from '@/hooks/Mapper/types/mapHandlers.ts'; +import { ForwardedRef, useImperativeHandle } from 'react'; import { useCommandComments, @@ -39,9 +39,9 @@ import { useUserRoutes, } from './api'; -import { useCommandsActivity } from './api/useCommandsActivity'; import { emitMapEvent } from '@/hooks/Mapper/events'; import { DetailedKill } from '../../types/kills'; +import { useCommandsActivity } from './api/useCommandsActivity'; export const useMapRootHandlers = (ref: ForwardedRef) => { const mapInit = useMapInit(); @@ -63,127 +63,123 @@ export const useMapRootHandlers = (ref: ForwardedRef) => { const { pingAdded, pingCancelled } = useCommandPings(); const { characterActivityData, trackingCharactersData, userSettingsUpdated } = useCommandsActivity(); - useImperativeHandle( - ref, - () => { - return { - command(type, data) { - switch (type) { - case Commands.init: // USED - mapInit(data as CommandInit); - break; - case Commands.addSystems: // USED - addSystems(data as CommandAddSystems); - break; - case Commands.updateSystems: // USED - updateSystems(data as CommandUpdateSystems); - break; - case Commands.removeSystems: // USED - removeSystems(data as CommandRemoveSystems); - break; - case Commands.addConnections: // USED - addConnections(data as CommandAddConnections); - break; - case Commands.removeConnections: // USED - removeConnections(data as CommandRemoveConnections); - break; - case Commands.updateConnection: // USED - updateConnection(data as CommandUpdateConnection); - break; - case Commands.charactersUpdated: // USED - charactersUpdated(data as CommandCharactersUpdated); - break; - case Commands.characterAdded: // USED - characterAdded(data as CommandCharacterAdded); - break; - case Commands.characterRemoved: // USED - characterRemoved(data as CommandCharacterRemoved); - break; - case Commands.characterUpdated: // USED - characterUpdated(data as CommandCharacterUpdated); - break; - case Commands.presentCharacters: // USED - presentCharacters(data as CommandPresentCharacters); - break; - case Commands.mapUpdated: // USED - mapUpdated(data as CommandMapUpdated); - break; - case Commands.routes: - mapRoutes(data as CommandRoutes); - break; - case Commands.userRoutes: - mapUserRoutes(data as CommandRoutes); - break; + useImperativeHandle(ref, () => { + return { + command(type, data) { + switch (type) { + case Commands.init: // USED + mapInit(data as CommandInit); + break; + case Commands.addSystems: // USED + addSystems(data as CommandAddSystems); + break; + case Commands.updateSystems: // USED + updateSystems(data as CommandUpdateSystems); + break; + case Commands.removeSystems: // USED + removeSystems(data as CommandRemoveSystems); + break; + case Commands.addConnections: // USED + addConnections(data as CommandAddConnections); + break; + case Commands.removeConnections: // USED + removeConnections(data as CommandRemoveConnections); + break; + case Commands.updateConnection: // USED + updateConnection(data as CommandUpdateConnection); + break; + case Commands.charactersUpdated: // USED + charactersUpdated(data as CommandCharactersUpdated); + break; + case Commands.characterAdded: // USED + characterAdded(data as CommandCharacterAdded); + break; + case Commands.characterRemoved: // USED + characterRemoved(data as CommandCharacterRemoved); + break; + case Commands.characterUpdated: // USED + characterUpdated(data as CommandCharacterUpdated); + break; + case Commands.presentCharacters: // USED + presentCharacters(data as CommandPresentCharacters); + break; + case Commands.mapUpdated: // USED + mapUpdated(data as CommandMapUpdated); + break; + case Commands.routes: + mapRoutes(data as CommandRoutes); + break; + case Commands.userRoutes: + mapUserRoutes(data as CommandRoutes); + break; - case Commands.signaturesUpdated: // USED - updateSystemSignatures(data as CommandSignaturesUpdated); - break; + case Commands.signaturesUpdated: // USED + updateSystemSignatures(data as CommandSignaturesUpdated); + break; - case Commands.linkSignatureToSystem: // USED - setTimeout(() => { - updateLinkSignatureToSystem(data as CommandLinkSignatureToSystem); - }, 200); - break; + case Commands.linkSignatureToSystem: // USED + setTimeout(() => { + updateLinkSignatureToSystem(data as CommandLinkSignatureToSystem); + }, 200); + break; - case Commands.centerSystem: // USED - // do nothing here - break; + case Commands.centerSystem: // USED + // do nothing here + break; - case Commands.selectSystem: // USED - // do nothing here - break; + case Commands.selectSystem: // USED + // do nothing here + break; - case Commands.killsUpdated: - // do nothing here - break; + case Commands.killsUpdated: + // do nothing here + break; - case Commands.detailedKillsUpdated: - updateDetailedKills(data as Record); - break; + case Commands.detailedKillsUpdated: + updateDetailedKills(data as Record); + break; - case Commands.characterActivityData: - characterActivityData(data as CommandCharacterActivityData); - break; + case Commands.characterActivityData: + characterActivityData(data as CommandCharacterActivityData); + break; - case Commands.trackingCharactersData: - trackingCharactersData(data as CommandTrackingCharactersData); - break; + case Commands.trackingCharactersData: + trackingCharactersData(data as CommandTrackingCharactersData); + break; - case Commands.updateActivity: - break; + case Commands.updateActivity: + break; - case Commands.updateTracking: - break; + case Commands.updateTracking: + break; - case Commands.userSettingsUpdated: - userSettingsUpdated(data as CommandUserSettingsUpdated); - break; + case Commands.userSettingsUpdated: + userSettingsUpdated(data as CommandUserSettingsUpdated); + break; - case Commands.systemCommentAdded: - addComment(data as CommandCommentAdd); - break; + case Commands.systemCommentAdded: + addComment(data as CommandCommentAdd); + break; - case Commands.systemCommentRemoved: - removeComment(data as CommandCommentRemoved); - break; + case Commands.systemCommentRemoved: + removeComment(data as CommandCommentRemoved); + break; - case Commands.pingAdded: - pingAdded(data as CommandPingAdded); - break; + case Commands.pingAdded: + pingAdded(data as CommandPingAdded); + break; - case Commands.pingCancelled: - pingCancelled(data as CommandPingCancelled); - break; + case Commands.pingCancelled: + pingCancelled(data as CommandPingCancelled); + break; - default: - console.warn(`JOipP Interface handlers: Unknown command: ${type}`, data); - break; - } + default: + console.warn(`JOipP Interface handlers: Unknown command: ${type}`, data); + break; + } - emitMapEvent({ name: type, data }); - }, - }; - }, - [], - ); + emitMapEvent({ name: type, data }); + }, + }; + }, []); }; diff --git a/assets/js/hooks/Mapper/useMapperHandlers.ts b/assets/js/hooks/Mapper/useMapperHandlers.ts index ab45337f..282b21b8 100644 --- a/assets/js/hooks/Mapper/useMapperHandlers.ts +++ b/assets/js/hooks/Mapper/useMapperHandlers.ts @@ -1,7 +1,8 @@ +import { useEventBuffer } from '@/hooks/Mapper/hooks'; +import usePageVisibility from '@/hooks/Mapper/hooks/usePageVisibility.ts'; + import { MapHandlers } from '@/hooks/Mapper/types/mapHandlers.ts'; import { RefObject, useCallback, useEffect, useRef } from 'react'; -import debounce from 'lodash.debounce'; -import usePageVisibility from '@/hooks/Mapper/hooks/usePageVisibility.ts'; // const inIndex = 0; // const prevEventTime = +new Date(); @@ -10,10 +11,28 @@ const LAST_VERSION_KEY = 'wandererLastVersion'; // @ts-ignore export const useMapperHandlers = (handlerRefs: RefObject[], hooksRef: RefObject) => { const visible = usePageVisibility(); + const wasHiddenOnce = useRef(false); const visibleRef = useRef(visible); visibleRef.current = visible; + // @ts-ignore + const handleBufferedEvent = useCallback(({ type, body }) => { + if (!visibleRef.current) { + return; + } + + handlerRefs.forEach(ref => { + if (!ref.current) { + return; + } + + ref.current?.command(type, body); + }); + }, []); + + const { handleEvent: handleMapEvent } = useEventBuffer(handleBufferedEvent); + // TODO - do not delete THIS code it needs for debug // const [record, setRecord] = useLocalStorageState('record', { // defaultValue: false, @@ -54,52 +73,6 @@ export const useMapperHandlers = (handlerRefs: RefObject[], hooksRe [hooksRef.current], ); - // @ts-ignore - const eventsBufferRef = useRef<{ type; body }[]>([]); - - const eventTick = useCallback( - debounce(() => { - if (eventsBufferRef.current.length === 0) { - return; - } - - const { type, body } = eventsBufferRef.current.shift()!; - handlerRefs.forEach(ref => { - if (!ref.current) { - return; - } - - ref.current?.command(type, body); - }); - - // TODO - do not delete THIS code it needs for debug - // console.log('JOipP', `Tick Buff`, eventsBufferRef.current.length); - - if (eventsBufferRef.current.length > 0) { - eventTick(); - } - }, 10), - [], - ); - const eventTickRef = useRef(eventTick); - eventTickRef.current = eventTick; - - // @ts-ignore - const handleMapEvent = useCallback(({ type, body }) => { - // TODO - do not delete THIS code it needs for debug - // const currentTime = +new Date(); - // const timeDiff = currentTime - prevEventTime; - // prevEventTime = currentTime; - // console.log('JOipP', `IN [${inIndex++}] [${timeDiff}] ${getFormattedTime()}`, { type, body }); - - if (!eventTickRef.current || !visibleRef.current) { - return; - } - - eventsBufferRef.current.push({ type, body }); - eventTickRef.current(); - }, []); - useEffect(() => { if (!visible && !wasHiddenOnce.current) { wasHiddenOnce.current = true; diff --git a/lib/wanderer_app/map/server/map_server_characters_impl.ex b/lib/wanderer_app/map/server/map_server_characters_impl.ex index 0363fa9d..3b9b56d8 100644 --- a/lib/wanderer_app/map/server/map_server_characters_impl.ex +++ b/lib/wanderer_app/map/server/map_server_characters_impl.ex @@ -216,8 +216,7 @@ defmodule WandererApp.Map.Server.CharactersImpl do {:ok, presence_character_ids} = WandererApp.Cache.lookup("map_#{map_id}:presence_character_ids", []) - WandererApp.Cache.lookup!("maps:#{map_id}:tracked_characters", []) - |> Enum.filter(fn character_id -> character_id in presence_character_ids end) + presence_character_ids |> Enum.map(fn character_id -> Task.start_link(fn -> character_updates = diff --git a/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex b/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex index 0bb82211..eee3dfb9 100644 --- a/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex +++ b/lib/wanderer_app_web/live/map/event_handlers/map_core_event_handler.ex @@ -703,6 +703,18 @@ defmodule WandererAppWeb.MapCoreEventHandler do Process.send_after(self(), %{event: :load_map_pings}, 200) + Process.send_after( + self(), + %{ + event: :maybe_select_system, + payload: %{ + character_id: main_character_id, + solar_system_id: nil + } + }, + 200 + ) + if needs_tracking_setup do Process.send_after(self(), %{event: :show_tracking}, 10) diff --git a/lib/wanderer_app_web/live/map/event_handlers/map_systems_event_handler.ex b/lib/wanderer_app_web/live/map/event_handlers/map_systems_event_handler.ex index 942020c1..50441b33 100644 --- a/lib/wanderer_app_web/live/map/event_handlers/map_systems_event_handler.ex +++ b/lib/wanderer_app_web/live/map/event_handlers/map_systems_event_handler.ex @@ -44,16 +44,24 @@ defmodule WandererAppWeb.MapSystemsEventHandler do current_user: current_user, tracked_characters: tracked_characters, map_id: map_id, - map_user_settings: map_user_settings + map_user_settings: map_user_settings, + main_character_eve_id: main_character_eve_id, + following_character_eve_id: following_character_eve_id } } = socket ) do character = - tracked_characters - |> Enum.find(fn tracked_character -> tracked_character.id == character_id end) + if is_nil(character_id) do + tracked_characters + |> Enum.find(fn tracked_character -> + tracked_character.eve_id == (following_character_eve_id || main_character_eve_id) + end) + else + tracked_characters + |> Enum.find(fn tracked_character -> tracked_character.id == character_id end) + end - is_user_character = - not is_nil(character) + is_user_character = not is_nil(character) is_select_on_spash = map_user_settings @@ -61,10 +69,9 @@ defmodule WandererAppWeb.MapSystemsEventHandler do |> WandererApp.MapUserSettingsRepo.get_boolean_setting("select_on_spash") is_following = - case WandererApp.MapUserSettingsRepo.get(map_id, current_user.id) do - {:ok, %{following_character_eve_id: following_character_eve_id}} - when not is_nil(following_character_eve_id) -> - is_user_character && following_character_eve_id == character.eve_id + case is_user_character && not is_nil(following_character_eve_id) do + true -> + following_character_eve_id == character.eve_id _ -> false @@ -77,8 +84,17 @@ defmodule WandererAppWeb.MapSystemsEventHandler do else # Always select the system when auto-select is enabled (following or select_on_spash). # The frontend will handle deselecting other systems + # + select_solar_system_id = + if not is_nil(solar_system_id) do + "#{solar_system_id}" + else + {:ok, character} = WandererApp.Character.get_map_character(map_id, character.id) + "#{character.solar_system_id}" + end + socket - |> MapEventHandler.push_map_event("select_system", solar_system_id) + |> MapEventHandler.push_map_event("select_system", select_solar_system_id) end end