|
| 1 | +/mob/living/silicon/ai |
| 2 | + var/atom/movable/currently_tracking = null |
| 3 | + |
1 | 4 | /mob/living/silicon/ai/proc/get_camera_list()
|
2 | 5 |
|
3 | 6 |
|
|
111 | 114 | return
|
112 | 115 | spawn(0)
|
113 | 116 | if(!can_track_atom(target))
|
114 |
| - to_chat(src, "Target is not near any active cameras.") |
| 117 | + to_chat(src, "Target is not trackable by any means.") |
115 | 118 | return
|
116 | 119 | var/obj/machinery/door/airlock/tobeopened
|
117 | 120 | var/dist = -1
|
|
143 | 146 | return
|
144 | 147 |
|
145 | 148 | /mob/living/silicon/ai/proc/can_track_atom(var/atom/target)
|
146 |
| - if(target == src) |
| 149 | + if(!target || target.gcDestroyed || target == src) |
147 | 150 | return FALSE
|
148 | 151 |
|
149 | 152 | var/turf/T = get_turf(target)
|
|
159 | 162 | var/mob/target_mob = target
|
160 | 163 | if(target_mob.digitalcamo)
|
161 | 164 | return FALSE
|
162 |
| - if(ishuman(target)) |
163 |
| - var/mob/living/carbon/human/target_human = target |
164 |
| - if(target_human.wear_id && istype(target_human.wear_id.GetID(), /obj/item/weapon/card/id/syndicate)) |
165 |
| - return FALSE |
166 |
| - if(target_human.is_wearing_item(/obj/item/clothing/mask/gas/voice)) |
167 |
| - return FALSE |
168 |
| - if(target_human.is_wearing_item(/obj/item/clothing/gloves/ninja)) |
169 |
| - return FALSE |
170 |
| - if(target_human.is_wearing_item(/obj/item/clothing/head/tinfoil)) |
171 |
| - return FALSE |
172 |
| - if(target_human.is_holding_item(/obj/item/device/megaphone/madscientist)) |
173 |
| - return FALSE |
| 165 | + for(var/obj/item/I in target_mob.get_all_slots()) |
| 166 | + if(I.blocks_tracking) |
| 167 | + return FALSE |
| 168 | + if(target_mob.is_wearing_item(I,slot_wear_id)) |
| 169 | + var/obj/item/ourID = I.GetID() |
| 170 | + if(ourID && ourID.blocks_tracking) |
| 171 | + return FALSE |
174 | 172 |
|
175 | 173 | if(isalien(target))
|
176 | 174 | return FALSE
|
|
183 | 181 |
|
184 | 182 | return TRUE
|
185 | 183 |
|
186 |
| -/mob/living/silicon/ai/proc/ai_actual_track(var/atom/target) |
187 |
| - if(!istype(target)) |
| 184 | +/mob/living/silicon/ai/proc/ai_actual_track(var/atom/movable/target) |
| 185 | + if(!istype(target) || !eyeobj) |
188 | 186 | return
|
189 | 187 |
|
190 | 188 | if(!can_track_atom(target))
|
191 |
| - to_chat(src, "Target is not near any active camera.") |
| 189 | + to_chat(src, "Target is not trackable by any means.") |
192 | 190 | return
|
193 | 191 |
|
194 |
| - cameraFollow = target |
195 |
| - |
196 |
| - to_chat(src, "Now tracking [target.name] on camera.") |
197 |
| - |
198 |
| - spawn (0) |
199 |
| - while (cameraFollow == target) |
200 |
| - if (cameraFollow == null) |
201 |
| - return |
202 |
| - |
203 |
| - if(!can_track_atom(target)) |
204 |
| - to_chat(src, "Target is not near any active camera.") |
205 |
| - sleep(10 SECONDS) |
206 |
| - continue |
207 |
| - |
208 |
| - if(eyeobj) |
209 |
| - eyeobj.forceMove(get_turf(target)) |
210 |
| - else |
211 |
| - view_core() |
212 |
| - return |
213 |
| - sleep(1 SECONDS) |
| 192 | + stop_ai_tracking() |
| 193 | + currently_tracking = target |
| 194 | + eyeobj.forceMove(get_turf(currently_tracking)) |
| 195 | + currently_tracking.lock_atom(eyeobj,/datum/locking_category/ai_eye) |
| 196 | + |
| 197 | + currently_tracking.register_event(/event/after_move,src,nameof(src::on_camera_change())) |
| 198 | + currently_tracking.register_event(/event/destroyed,src,nameof(src::stop_ai_tracking())) |
| 199 | + currently_tracking.register_event(/event/equipped,src,nameof(src::on_camera_change())) |
| 200 | + //currently_tracking.register_event(/event/unequipped,src,nameof(src::on_camera_change())) |
| 201 | + currently_tracking.register_event(/event/camera_sight_changed,src,nameof(src::on_camera_change())) |
| 202 | + to_chat(src, "Now tracking [currently_tracking.name] on camera.") |
| 203 | + |
| 204 | +/datum/locking_category/ai_eye |
| 205 | + |
| 206 | +/mob/living/silicon/ai/proc/on_camera_change() |
| 207 | + if(eyeobj && currently_tracking) |
| 208 | + var/cantrack = can_track_atom(currently_tracking) |
| 209 | + /*if(!eyeobj.locked_to && cantrack) // Retracking code |
| 210 | + to_chat(src, "Target is trackable again.") |
| 211 | + currently_tracking.lock_atom(eyeobj,/datum/locking_category/ai_eye) |
| 212 | + else */if(!cantrack && eyeobj.locked_to == currently_tracking) |
| 213 | + to_chat(src, "Target is no longer trackable.") |
| 214 | + //eyeobj.unlock_from() |
| 215 | + stop_ai_tracking() // remove this if you want retracking |
| 216 | + |
| 217 | +/mob/living/silicon/ai/proc/stop_ai_tracking() |
| 218 | + if(currently_tracking) |
| 219 | + to_chat(src, "No longer tracking [currently_tracking.name] on camera.") |
| 220 | + currently_tracking.unregister_event(/event/after_move,src,nameof(src::on_camera_change())) |
| 221 | + currently_tracking.unregister_event(/event/destroyed,src,nameof(src::stop_ai_tracking())) |
| 222 | + currently_tracking.unregister_event(/event/equipped,src,nameof(src::on_camera_change())) |
| 223 | + //currently_tracking.unregister_event(/event/unequipped,src,nameof(src::on_camera_change())) |
| 224 | + currently_tracking.unregister_event(/event/camera_sight_changed,src,nameof(src::on_camera_change())) |
| 225 | + if(eyeobj?.locked_to == currently_tracking) |
| 226 | + eyeobj.unlock_from() |
| 227 | + currently_tracking = null |
214 | 228 |
|
215 | 229 | /proc/near_camera(var/mob/living/M)
|
216 | 230 | if (!isturf(M.loc))
|
|
0 commit comments