mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-29 19:42:42 +00:00
Ports (and adjusts) Baystation12/Baystation12#12521 et al. Essentially brings our visualnet code up to the standard of three years ago, rather than five. Side effects of merging may include but are not limited to loss of AI vision, helmet camera failure, garbage collection implosion, infinite turf loops, and unintended layer shenanigans. High-level changes: Overall, visualnet/chunk procs have been renamed and refactored to be clear as to their function. Fix some layering issues related to magic numbers, these have been set to constants. Visualnets now track source movement rather than overriding individual mob/obj procs. Adds obfuscation underlay to complicate memory fudging to remove camera static. Cameras now only add themselves to the cameranet if they're on open (non-restricted) networks. Helmet cameras now use cameras themselves rather than network defines. Adds a sorted object list insertion helper. The Camera MIU (presently unused) should now function properly. Unused cultnet / cult mask deleted because refactoring that would likely kill the few brain cells I have left
95 lines
3.8 KiB
Plaintext
95 lines
3.8 KiB
Plaintext
/var/global/datum/topic_state/default/default_state = new()
|
|
|
|
/datum/topic_state/default/href_list(var/mob/user)
|
|
return list()
|
|
|
|
/datum/topic_state/default/can_use_topic(var/src_object, var/mob/user)
|
|
return user.default_can_use_topic(src_object)
|
|
|
|
/mob/proc/default_can_use_topic(var/src_object)
|
|
return STATUS_CLOSE // By default no mob can do anything with NanoUI
|
|
|
|
/mob/abstract/observer/default_can_use_topic(var/src_object)
|
|
if(can_admin_interact())
|
|
return STATUS_INTERACTIVE // Admins are more equal
|
|
if(!client || get_dist(src_object, src) > client.view) // Preventing ghosts from having a million windows open by limiting to objects in range
|
|
return STATUS_CLOSE
|
|
return STATUS_UPDATE // Ghosts can view updates
|
|
|
|
/mob/living/silicon/pai/default_can_use_topic(var/src_object)
|
|
if((src_object == src || src_object == radio) && !stat)
|
|
return STATUS_INTERACTIVE
|
|
else
|
|
return ..()
|
|
|
|
/mob/living/silicon/robot/default_can_use_topic(var/src_object)
|
|
. = shared_nano_interaction()
|
|
if(. <= STATUS_DISABLED)
|
|
return
|
|
|
|
// robots can interact with things they can see within their view range
|
|
if((src_object in view(src)) && get_dist(src_object, src) <= src.client.view)
|
|
return STATUS_INTERACTIVE // interactive (green visibility)
|
|
return STATUS_DISABLED // no updates, completely disabled (red visibility)
|
|
|
|
/mob/living/silicon/ai/default_can_use_topic(var/src_object)
|
|
. = shared_nano_interaction()
|
|
if(. != STATUS_INTERACTIVE)
|
|
return
|
|
|
|
// Prevents the AI from using Topic on admin levels (by for example viewing through the court/thunderdome cameras)
|
|
// unless it's on the same level as the object it's interacting with.
|
|
var/turf/T = get_turf(src_object)
|
|
if(!T || !(z == T.z || isStationLevel(T.z)))
|
|
return STATUS_CLOSE
|
|
|
|
// If an object is in view then we can interact with it
|
|
if(src_object in view(client.view, src))
|
|
return STATUS_INTERACTIVE
|
|
|
|
// If we're installed in a chassi, rather than transfered to an inteliCard or other container, then check if we have camera view
|
|
if(is_in_chassis())
|
|
//stop AIs from leaving windows open and using then after they lose vision
|
|
if(cameranet && !cameranet.is_turf_visible(get_turf(src_object)))
|
|
return STATUS_CLOSE
|
|
return STATUS_INTERACTIVE
|
|
else if(get_dist(src_object, src) <= client.view) // View does not return what one would expect while installed in an inteliCard
|
|
return STATUS_INTERACTIVE
|
|
|
|
return STATUS_CLOSE
|
|
|
|
//Some atoms such as vehicles might have special rules for how mobs inside them interact with NanoUI.
|
|
/atom/proc/contents_nano_distance(var/src_object, var/mob/living/user)
|
|
return user.shared_living_nano_distance(src_object)
|
|
|
|
/mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object)
|
|
if (!(src_object in view(4, src))) // If the src object is not in visable, disable updates
|
|
return STATUS_CLOSE
|
|
|
|
var/dist = get_dist(src_object, src)
|
|
if (dist <= 1)
|
|
return STATUS_INTERACTIVE // interactive (green visibility)
|
|
else if (dist <= 2)
|
|
return STATUS_UPDATE // update only (orange visibility)
|
|
else if (dist <= 4)
|
|
return STATUS_DISABLED // no updates, completely disabled (red visibility)
|
|
return STATUS_CLOSE
|
|
|
|
/mob/living/default_can_use_topic(var/src_object)
|
|
. = shared_nano_interaction(src_object)
|
|
if(. != STATUS_CLOSE)
|
|
if(loc)
|
|
. = min(., loc.contents_nano_distance(src_object, src))
|
|
if(STATUS_INTERACTIVE)
|
|
return STATUS_UPDATE
|
|
|
|
/mob/living/carbon/human/default_can_use_topic(var/src_object)
|
|
. = shared_nano_interaction(src_object)
|
|
if(. != STATUS_CLOSE)
|
|
if(loc)
|
|
. = min(., loc.contents_nano_distance(src_object, src))
|
|
else
|
|
. = min(., shared_living_nano_distance(src_object))
|
|
if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction.
|
|
return STATUS_INTERACTIVE
|