mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 04:27:35 +01:00
Basic mobs targeting, attacks, and pig migration. (#28987)
* Basic mobs targeting, attacks, and pig migration. * run updatepaths * fix duplicate macro def * Update code/datums/ai/basic_mobs/basic_ai_behaviors/basic_attacking.dm Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com> Signed-off-by: warriorstar-orion <orion@snowfrost.garden> --------- Signed-off-by: warriorstar-orion <orion@snowfrost.garden> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
co-authored by
Burzah
parent
5da3694877
commit
efc8adb6dd
@@ -0,0 +1,113 @@
|
||||
// Proximity monitor that checks to see if anything interesting enters our bounds
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking
|
||||
edge_is_a_field = TRUE
|
||||
/// The ai behavior who owns us
|
||||
var/datum/ai_behavior/find_potential_targets/owning_behavior
|
||||
/// The ai controller we're using
|
||||
var/datum/ai_controller/controller
|
||||
/// The target key we're trying to fill
|
||||
var/target_key
|
||||
/// The targeting strategy KEY we're using
|
||||
var/targeting_strategy_key
|
||||
/// The hiding location key we're using
|
||||
var/hiding_location_key
|
||||
|
||||
/// The targeting strategy we're using
|
||||
var/datum/targeting_strategy/filter
|
||||
/// If we've built our field yet
|
||||
/// Prevents wasted work on the first build (since the behavior did it)
|
||||
var/first_build = TRUE
|
||||
|
||||
// Initially, run the check manually
|
||||
// If that fails, set up a field and have it manage the behavior fully
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/New(atom/_host, range, _ignore_if_not_on_turf = TRUE, datum/ai_behavior/find_potential_targets/owning_behavior, datum/ai_controller/controller, target_key, targeting_strategy_key, hiding_location_key)
|
||||
. = ..()
|
||||
src.owning_behavior = owning_behavior
|
||||
src.controller = controller
|
||||
src.target_key = target_key
|
||||
src.targeting_strategy_key = targeting_strategy_key
|
||||
src.hiding_location_key = hiding_location_key
|
||||
src.filter = GET_TARGETING_STRATEGY(controller.blackboard[targeting_strategy_key])
|
||||
RegisterSignal(controller, COMSIG_PARENT_QDELETING, PROC_REF(controller_deleted))
|
||||
RegisterSignal(controller, COMSIG_AI_CONTROLLER_PICKED_BEHAVIORS, PROC_REF(controller_think))
|
||||
RegisterSignal(controller, COMSIG_AI_CONTROLLER_POSSESSED_PAWN, PROC_REF(pawn_changed))
|
||||
RegisterSignal(controller, AI_CONTROLLER_BEHAVIOR_QUEUED(owning_behavior.type), PROC_REF(behavior_requeued))
|
||||
RegisterSignal(controller, COMSIG_AI_BLACKBOARD_KEY_SET(targeting_strategy_key), PROC_REF(targeting_datum_changed))
|
||||
RegisterSignal(controller, COMSIG_AI_BLACKBOARD_KEY_CLEARED(targeting_strategy_key), PROC_REF(targeting_datum_cleared))
|
||||
recalculate_field(full_recalc = TRUE)
|
||||
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/Destroy()
|
||||
. = ..()
|
||||
if(!QDELETED(controller) && owning_behavior)
|
||||
controller.modify_cooldown(owning_behavior, owning_behavior.get_cooldown(controller))
|
||||
owning_behavior = null
|
||||
controller = null
|
||||
target_key = null
|
||||
targeting_strategy_key = null
|
||||
hiding_location_key = null
|
||||
filter = null
|
||||
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/recalculate_field(full_recalc = FALSE)
|
||||
. = ..()
|
||||
first_build = FALSE
|
||||
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/setup_field_turf(turf/target)
|
||||
. = ..()
|
||||
if(first_build)
|
||||
return
|
||||
owning_behavior.new_turf_found(target, controller, filter)
|
||||
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/field_turf_crossed(atom/movable/movable, turf/location, turf/old_location)
|
||||
. = ..()
|
||||
|
||||
if(!owning_behavior.atom_allowed(movable, filter, controller.pawn))
|
||||
return
|
||||
|
||||
owning_behavior.new_atoms_found(list(movable), controller, target_key, filter, hiding_location_key)
|
||||
|
||||
/// React to controller planning
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/proc/controller_deleted(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
qdel(src)
|
||||
|
||||
/// React to the pawn goin byebye
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/proc/pawn_changed(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
qdel(src)
|
||||
|
||||
/// React to controller planning
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/proc/controller_think(datum/ai_controller/source, list/datum/ai_behavior/old_behaviors, list/datum/ai_behavior/new_behaviors)
|
||||
SIGNAL_HANDLER
|
||||
// If our parent was forgotten, nuke ourselves
|
||||
if(!new_behaviors[owning_behavior])
|
||||
qdel(src)
|
||||
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/proc/behavior_requeued(datum/source, list/new_arguments)
|
||||
SIGNAL_HANDLER
|
||||
check_new_args(arglist(new_arguments))
|
||||
|
||||
/// Ensure our args and locals are up to date
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/proc/check_new_args(target_key, targeting_strategy_key, hiding_location_key)
|
||||
var/update_filter = FALSE
|
||||
if(src.target_key != target_key)
|
||||
src.target_key = target_key
|
||||
if(src.targeting_strategy_key != targeting_strategy_key)
|
||||
src.targeting_strategy_key = targeting_strategy_key
|
||||
update_filter = TRUE
|
||||
if(src.hiding_location_key != hiding_location_key)
|
||||
src.hiding_location_key = hiding_location_key
|
||||
if(update_filter)
|
||||
targeting_datum_changed(null)
|
||||
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/proc/targeting_datum_changed(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
filter = controller.blackboard[targeting_strategy_key]
|
||||
// Filter changed, need to do a full reparse
|
||||
// Fucking 9 * 9 out here I stg
|
||||
for(var/turf/in_field as anything in field_turfs + edge_turfs)
|
||||
owning_behavior.new_turf_found(in_field, controller, filter)
|
||||
|
||||
/datum/proximity_monitor/advanced/ai_target_tracking/proc/targeting_datum_cleared(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
// Go fuckin home bros
|
||||
qdel(src)
|
||||
Reference in New Issue
Block a user