mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-25 09:31:13 +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
190 lines
4.6 KiB
Plaintext
190 lines
4.6 KiB
Plaintext
/*
|
|
AI ClickOn()
|
|
|
|
Note currently ai restrained() returns 0 in all cases,
|
|
therefore restrained code has been removed
|
|
|
|
The AI can double click to move the camera (this was already true but is cleaner),
|
|
or double click a mob to track them.
|
|
|
|
Note that AI have no need for the adjacency proc, and so this proc is a lot cleaner.
|
|
*/
|
|
/mob/living/silicon/ai/DblClickOn(var/atom/A, params)
|
|
if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked
|
|
build_click(src, client.buildmode, params, A)
|
|
return
|
|
|
|
if(control_disabled || stat) return
|
|
|
|
if(ismob(A))
|
|
ai_actual_track(A)
|
|
else
|
|
A.move_camera_by_click()
|
|
|
|
|
|
/mob/living/silicon/ai/ClickOn(var/atom/A, params)
|
|
if(world.time <= next_click)
|
|
return
|
|
next_click = world.time + 1
|
|
|
|
if(client.buildmode) // comes after object.Click to allow buildmode gui objects to be clicked
|
|
build_click(src, client.buildmode, params, A)
|
|
return
|
|
|
|
if(stat)
|
|
return
|
|
|
|
var/list/modifiers = params2list(params)
|
|
if(modifiers["shift"] && modifiers["ctrl"])
|
|
CtrlShiftClickOn(A)
|
|
return
|
|
if(modifiers["middle"])
|
|
MiddleClickOn(A)
|
|
return
|
|
if(modifiers["shift"])
|
|
ShiftClickOn(A)
|
|
return
|
|
if(modifiers["alt"]) // alt and alt-gr (rightalt)
|
|
AltClickOn(A)
|
|
return
|
|
if(modifiers["ctrl"])
|
|
CtrlClickOn(A)
|
|
return
|
|
|
|
if(control_disabled || !canClick())
|
|
return
|
|
|
|
if(multitool_mode && isobj(A))
|
|
var/obj/O = A
|
|
var/datum/expansion/multitool/MT = LAZYACCESS(O.expansions, /datum/expansion/multitool)
|
|
if(MT)
|
|
MT.interact(aiMulti, src)
|
|
return
|
|
|
|
if(aiCamera.in_camera_mode)
|
|
aiCamera.camera_mode_off()
|
|
aiCamera.captureimage(A, usr)
|
|
return
|
|
|
|
/*
|
|
AI restrained() currently does nothing
|
|
if(restrained())
|
|
RestrainedClickOn(A)
|
|
else
|
|
*/
|
|
A.add_hiddenprint(src)
|
|
A.attack_ai(src)
|
|
|
|
/*
|
|
AI has no need for the UnarmedAttack() and RangedAttack() procs,
|
|
because the AI code is not generic; attack_ai() is used instead.
|
|
The below is only really for safety, or you can alter the way
|
|
it functions and re-insert it above.
|
|
*/
|
|
/mob/living/silicon/ai/UnarmedAttack(atom/A)
|
|
A.attack_ai(src)
|
|
/mob/living/silicon/ai/RangedAttack(atom/A)
|
|
A.attack_ai(src)
|
|
|
|
/atom/proc/attack_ai(mob/user as mob)
|
|
return
|
|
|
|
/*
|
|
Since the AI handles shift, ctrl, and alt-click differently
|
|
than anything else in the game, atoms have separate procs
|
|
for AI shift, ctrl, and alt clicking.
|
|
*/
|
|
|
|
/mob/living/silicon/ai/ShiftClickOn(var/atom/A)
|
|
if(!control_disabled && A.AIShiftClick(src))
|
|
return
|
|
..()
|
|
|
|
/mob/living/silicon/ai/CtrlClickOn(var/atom/A)
|
|
if(!control_disabled && A.AICtrlClick(src))
|
|
return
|
|
..()
|
|
|
|
/mob/living/silicon/ai/AltClickOn(var/atom/A)
|
|
if(!control_disabled && A.AIAltClick(src))
|
|
return
|
|
..()
|
|
|
|
/mob/living/silicon/ai/MiddleClickOn(var/atom/A)
|
|
if(!control_disabled && A.AIMiddleClick(src))
|
|
return
|
|
..()
|
|
|
|
/*
|
|
The following criminally helpful code is just the previous code cleaned up;
|
|
I have no idea why it was in atoms.dm instead of respective files.
|
|
*/
|
|
|
|
/atom/proc/AICtrlShiftClick()
|
|
return
|
|
|
|
/atom/proc/AIShiftClick()
|
|
return
|
|
|
|
/obj/machinery/door/airlock/AIShiftClick() // Opens and closes doors!
|
|
if(density)
|
|
Topic(src, list("command"="open", "activate" = "1"))
|
|
else
|
|
Topic(src, list("command"="open", "activate" = "0"))
|
|
return 1
|
|
|
|
/atom/proc/AICtrlClick(mob/user)
|
|
return
|
|
|
|
/obj/machinery/door/airlock/AICtrlClick() // Bolts doors
|
|
if(locked)
|
|
Topic(src, list("command"="bolts", "activate" = "0"))
|
|
else
|
|
Topic(src, list("command"="bolts", "activate" = "1"))
|
|
return 1
|
|
|
|
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
|
|
Topic(src, list("breaker"="1"))
|
|
return 1
|
|
|
|
/obj/machinery/turretid/AICtrlClick() //turns off/on Turrets
|
|
Topic(src, list("command"="enable", "value"="[!enabled]"))
|
|
return 1
|
|
|
|
/atom/proc/AIAltClick(var/atom/A)
|
|
return AltClick(A)
|
|
|
|
/obj/machinery/door/airlock/AIAltClick() // Electrifies doors.
|
|
if(!electrified_until)
|
|
// permanent shock
|
|
Topic(src, list("command"="electrify_permanently", "activate" = "1"))
|
|
else
|
|
// disable/6 is not in Topic; disable/5 disables both temporary and permanent shock
|
|
Topic(src, list("command"="electrify_permanently", "activate" = "0"))
|
|
return 1
|
|
|
|
/obj/machinery/turretid/AIAltClick() //toggles lethal on turrets
|
|
Topic(src, list("command"="lethal", "value"="[!lethal]"))
|
|
return 1
|
|
|
|
/atom/proc/AIMiddleClick(var/mob/living/silicon/user)
|
|
return 0
|
|
|
|
/obj/machinery/door/airlock/AIMiddleClick() // Toggles door bolt lights.
|
|
|
|
if(..())
|
|
return
|
|
|
|
if(!src.lights)
|
|
Topic(src, list("command"="lights", "activate" = "1"))
|
|
else
|
|
Topic(src, list("command"="lights", "activate" = "0"))
|
|
return 1
|
|
|
|
//
|
|
// Override AdjacentQuick for AltClicking
|
|
//
|
|
|
|
/mob/living/silicon/ai/TurfAdjacent(var/turf/T)
|
|
return (cameranet && cameranet.is_turf_visible(T))
|