diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 2867ba4a6fc..72d756c0554 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -45,6 +45,8 @@ #define BB_CURRENT_HOME "BB_current_home" ///the hydro we will pollinate #define BB_TARGET_HYDRO "BB_target_hydro" +///key to swarm around +#define BB_SWARM_TARGET "BB_swarm_target" // bear keys ///the hive with honey that we will steal from diff --git a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm index 551cb12f3b1..07d2a17cc8d 100644 --- a/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm +++ b/code/datums/ai/basic_mobs/basic_ai_behaviors/run_away_from_target.dm @@ -55,7 +55,7 @@ var/list/airlocks = SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock) for(var/i in 1 to run_distance) var/turf/test_destination = get_ranged_target_turf_direct(source, target, range = i, offset = angle) - if(test_destination.is_blocked_turf(exclude_mobs = !source.density, source_atom = source, ignore_atoms = airlocks)) + if(test_destination.is_blocked_turf(source_atom = source, ignore_atoms = airlocks)) break return_turf = test_destination return return_turf diff --git a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm b/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm index f1bd411fd29..e2081bf308e 100644 --- a/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm +++ b/code/datums/ai/basic_mobs/targetting_datums/dont_target_friends.dm @@ -1,43 +1,25 @@ /// Don't target an atom in our friends list (or turfs), anything else is fair game -/datum/targetting_datum/not_friends +/datum/targetting_datum/basic/not_friends /// Stop regarding someone as a valid target once they pass this stat level, setting it to DEAD means you will happily attack corpses var/attack_until_past_stat = HARD_CRIT /// If we can try to closed turfs or not var/attack_closed_turf = FALSE ///Returns true or false depending on if the target can be attacked by the mob -/datum/targetting_datum/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range) - if (!target) - return FALSE - if (attack_closed_turf) - if (isopenturf(target)) - return FALSE - else - if (isturf(target)) - return FALSE - - if (ismob(target)) - var/mob/mob_target = target - if (mob_target.status_flags & GODMODE) - return FALSE - if (mob_target.stat > attack_until_past_stat) - return FALSE +/datum/targetting_datum/basic/not_friends/can_attack(mob/living/living_mob, atom/target, vision_range) + if(attack_closed_turf && isclosedturf(target)) + return TRUE - if (living_mob.see_invisible < target.invisibility) - return FALSE - if (isturf(target.loc) && living_mob.z != target.z) // z check will always fail if target is in a mech - return FALSE - if (!living_mob.ai_controller) // How did you get here? + if(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST]) return FALSE - if (!(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST])) - // We don't have any friends, anything's fair game - // OR This is not our friend, fire at will - return TRUE + return ..() +///friends dont care about factions +/datum/targetting_datum/basic/not_friends/faction_check(mob/living/living_mob, mob/living/the_target) return FALSE -/datum/targetting_datum/not_friends/attack_closed_turfs +/datum/targetting_datum/basic/not_friends/attack_closed_turfs attack_closed_turf = TRUE /// Subtype that allows us to target items while deftly avoiding attacking our allies. Be careful when it comes to targetting items as an AI could get trapped targetting something it can't destroy. diff --git a/code/datums/ai/dog/dog_controller.dm b/code/datums/ai/dog/dog_controller.dm index 1ac19d01022..a95e3d57b6b 100644 --- a/code/datums/ai/dog/dog_controller.dm +++ b/code/datums/ai/dog/dog_controller.dm @@ -2,7 +2,7 @@ blackboard = list( BB_DOG_HARASS_HARM = TRUE, BB_VISION_RANGE = AI_DOG_VISION_RANGE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_movement = /datum/ai_movement/basic_avoidance idle_behavior = /datum/idle_behavior/idle_dog @@ -19,7 +19,7 @@ blackboard = list( BB_DOG_HARASS_HARM = TRUE, BB_VISION_RANGE = AI_DOG_VISION_RANGE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, // Find nearby mobs with tongs in hand. BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/holding_object(/obj/item/kitchen/tongs), BB_BABIES_PARTNER_TYPES = list(/mob/living/basic/pet/dog), diff --git a/code/datums/components/pet_commands/pet_commands_basic.dm b/code/datums/components/pet_commands/pet_commands_basic.dm index ff29b8f37d2..ea9612c4ada 100644 --- a/code/datums/components/pet_commands/pet_commands_basic.dm +++ b/code/datums/components/pet_commands/pet_commands_basic.dm @@ -41,13 +41,15 @@ radial_icon = 'icons/testing/turf_analysis.dmi' radial_icon_state = "red_arrow" speech_commands = list("heel", "follow") + ///the behavior we use to follow + var/follow_behavior = /datum/ai_behavior/pet_follow_friend /datum/pet_command/follow/set_command_active(mob/living/parent, mob/living/commander) . = ..() set_command_target(parent, commander) /datum/pet_command/follow/execute_action(datum/ai_controller/controller) - controller.queue_behavior(/datum/ai_behavior/pet_follow_friend, BB_CURRENT_PET_TARGET) + controller.queue_behavior(follow_behavior, BB_CURRENT_PET_TARGET) return SUBTREE_RETURN_FINISH_PLANNING /** diff --git a/code/datums/looping_sounds/item_sounds.dm b/code/datums/looping_sounds/item_sounds.dm index d38dd6737a3..f8ed5d89b20 100644 --- a/code/datums/looping_sounds/item_sounds.dm +++ b/code/datums/looping_sounds/item_sounds.dm @@ -40,3 +40,7 @@ end_volume = 35 volume = 40 ignore_walls = FALSE + +/datum/looping_sound/beesmoke + mid_sounds = list('sound/weapons/beesmoke.ogg' = 1) + volume = 5 diff --git a/code/modules/hydroponics/beekeeping/bee_smoker.dm b/code/modules/hydroponics/beekeeping/bee_smoker.dm new file mode 100644 index 00000000000..fc296339a9f --- /dev/null +++ b/code/modules/hydroponics/beekeeping/bee_smoker.dm @@ -0,0 +1,117 @@ +/// multiplier to decide how much fuel we add to a smoker +#define WEED_WINE_MULTIPLIER 0.2 + +/obj/item/bee_smoker + name = "bee smoker" + desc = "A device which can be used to hypnotize bees!" + icon = 'icons/obj/service/hydroponics/equipment.dmi' + icon_state = "bee_smoker" + inhand_icon_state = "bee_smoker" + lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi' + item_flags = NOBLUDGEON + /// current level of fuel we have + var/current_herb_fuel = 50 + /// maximum amount of fuel we can hold + var/max_herb_fuel = 50 + /// are we currently activated? + var/activated = FALSE + /// sound to play when releasing smoke + var/datum/looping_sound/beesmoke/beesmoke_loop + ///how much fuel it costs to use this item + var/single_use_cost = 5 + +/obj/item/bee_smoker/Initialize(mapload) + . = ..() + beesmoke_loop = new(src) + +/obj/item/bee_smoker/attack_self(mob/user) + . = ..() + if(.) + return TRUE + if(!activated && current_herb_fuel <= 0) + user.balloon_alert(user, "no fuel!") + return TRUE + alter_state() + user.balloon_alert(user, "[activated ? "activated" : "deactivated"]") + return TRUE + +/obj/item/bee_smoker/afterattack(atom/attacked_atom, mob/living/user, proximity) + . = ..() + + if(!proximity) + return + + . |= AFTERATTACK_PROCESSED_ITEM + + if(!activated) + user.balloon_alert(user, "not activated!") + return + + if(current_herb_fuel < single_use_cost) + user.balloon_alert(user, "not enough fuel!") + return + + current_herb_fuel -= single_use_cost + playsound(src, 'sound/effects/spray2.ogg', 100, TRUE) + var/turf/target_turf = get_turf(attacked_atom) + new /obj/effect/temp_visual/mook_dust(target_turf) + + for(var/mob/living/basic/bee/friend in target_turf) + if(friend.flags_1 & HOLOGRAM_1) + continue + friend.befriend(user) + + if(!istype(attacked_atom, /obj/structure/beebox)) + return + + var/obj/structure/beebox/hive = attacked_atom + for(var/mob/living/bee as anything in hive.bees) + if(bee.flags_1 & HOLOGRAM_1) + continue + bee.befriend(user) + +/obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers) + . = ..() + if(.) + return + if(!istype(herb, /obj/item/food/grown/cannabis)) + return + var/obj/item/food/grown/cannabis/weed = herb + if(isnull(weed.wine_power)) + return TRUE + if(current_herb_fuel == max_herb_fuel) + user.balloon_alert(user, "already at maximum fuel!") + return TRUE + var/fuel_worth = weed.wine_power * WEED_WINE_MULTIPLIER + current_herb_fuel = (current_herb_fuel + fuel_worth > max_herb_fuel) ? max_herb_fuel : current_herb_fuel + fuel_worth + user.balloon_alert(user, "fuel added") + qdel(weed) + return TRUE + +/obj/item/bee_smoker/process(seconds_per_tick) + current_herb_fuel-- + if(current_herb_fuel <= 0) + alter_state() + +/obj/item/bee_smoker/proc/alter_state() + activated = !activated + playsound(src, 'sound/items/welderdeactivate.ogg', 50, TRUE) + + if(!activated) + beesmoke_loop.stop() + QDEL_NULL(particles) + STOP_PROCESSING(SSobj, src) + return + + beesmoke_loop.start() + START_PROCESSING(SSobj, src) + particles = new /particles/smoke/bee_smoke + +/particles/smoke/bee_smoke + lifespan = 0.4 SECONDS + position = list(-12, 7, 0) + velocity = list(0, 0.15, 0) + fade = 2 + +#undef WEED_WINE_MULTIPLIER diff --git a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm index 655d08aa864..692a7f108d1 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/_bee.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/_bee.dm @@ -54,6 +54,16 @@ var/icon_base = "bee" ///the bee is a queen? var/is_queen = FALSE + ///commands we follow + var/list/pet_commands = list( + /datum/pet_command/idle, + /datum/pet_command/free, + /datum/pet_command/beehive/enter, + /datum/pet_command/beehive/exit, + /datum/pet_command/follow/bee, + /datum/pet_command/point_targetting/attack/swirl, + /datum/pet_command/scatter, + ) /mob/living/basic/bee/Initialize(mapload) . = ..() @@ -62,6 +72,7 @@ AddElement(/datum/element/simple_flying) AddComponent(/datum/component/clickbox, x_offset = -2, y_offset = -2) AddComponent(/datum/component/swarming) + AddComponent(/datum/component/obeys_commands, pet_commands) AddElement(/datum/element/swabable, CELL_LINE_TABLE_QUEEN_BEE, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack)) diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm index 3c8b018cc93..67e98a5f3d3 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_behavior.dm @@ -102,9 +102,149 @@ return FALSE var/atom/bee_hive = bee_ai.blackboard[BB_CURRENT_HOME] - if(bee_hive && get_dist(target, bee_hive) > AGGRO_DISTANCE_FROM_HIVE) + if(bee_hive && get_dist(target, bee_hive) > AGGRO_DISTANCE_FROM_HIVE && can_see(owner, bee_hive, 9)) return FALSE return !(mob_target.bee_friendly()) + +///pet commands +/datum/pet_command/follow/bee + ///the behavior we use to follow + follow_behavior = /datum/ai_behavior/pet_follow_friend/bee + +/datum/ai_behavior/pet_follow_friend/bee + required_distance = 0 + +///swirl around the owner in menacing fashion +/datum/pet_command/point_targetting/attack/swirl + command_name = "Swirl" + command_desc = "Your pets will swirl around you and attack whoever you point at!" + speech_commands = list("swirl", "spiral", "swarm") + pointed_reaction = null + refuse_reaction = null + command_feedback = null + ///the owner we will swarm around + var/key_to_swarm = BB_SWARM_TARGET + +/datum/pet_command/point_targetting/attack/swirl/try_activate_command(mob/living/commander) + var/mob/living/living_pawn = weak_parent.resolve() + if(isnull(living_pawn)) + return + var/datum/ai_controller/basic_controller/controller = living_pawn.ai_controller + if(isnull(controller)) + return + controller.clear_blackboard_key(BB_CURRENT_PET_TARGET) + controller.set_blackboard_key(key_to_swarm, commander) + return ..() + +/datum/pet_command/point_targetting/attack/swirl/execute_action(datum/ai_controller/controller) + if(controller.blackboard_key_exists(BB_CURRENT_PET_TARGET)) + return ..() + controller.queue_behavior(/datum/ai_behavior/swirl_around_target, BB_SWARM_TARGET) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/swirl_around_target + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_MOVE_AND_PERFORM + required_distance = 0 + ///chance to swirl + var/swirl_chance = 60 + +/datum/ai_behavior/swirl_around_target/setup(datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + if(QDELETED(target)) + return FALSE + set_movement_target(controller, target) + +/datum/ai_behavior/swirl_around_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key) + . = ..() + var/atom/target = controller.blackboard[target_key] + var/mob/living/living_pawn = controller.pawn + + if(QDELETED(target)) + finish_action(controller, TRUE) + + if(get_dist(target, living_pawn) > 1) + set_movement_target(controller, target) + return + + if(!SPT_PROB(swirl_chance, seconds_per_tick)) + return + + var/list/possible_turfs = list() + + for(var/turf/possible_turf in oview(2, target)) + if(possible_turf.is_blocked_turf(source_atom = living_pawn)) + continue + possible_turfs += possible_turf + + if(!length(possible_turfs)) + return + + if(isnull(controller.movement_target_source) || controller.movement_target_source == type) + set_movement_target(controller, pick(possible_turfs)) + + +/datum/pet_command/beehive + radial_icon = 'icons/obj/service/hydroponics/equipment.dmi' + radial_icon_state = "beebox" + +/datum/pet_command/beehive/try_activate_command(mob/living/commander) + var/mob/living/living_pawn = weak_parent.resolve() + if(isnull(living_pawn)) + return + var/datum/ai_controller/basic_controller/controller = living_pawn.ai_controller + if(isnull(controller)) + return + var/obj/hive = controller.blackboard[BB_CURRENT_HOME] + if(isnull(hive)) + return + if(!check_beehive_conditions(living_pawn, hive)) + return + return ..() + +/datum/pet_command/beehive/proc/check_beehive_conditions(obj/structure/hive) + return + +/datum/pet_command/beehive/execute_action(datum/ai_controller/controller) + controller.queue_behavior(/datum/ai_behavior/enter_exit_hive, BB_CURRENT_HOME) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/pet_command/beehive/enter + command_name = "Enter beehive" + command_desc = "Your bees will enter their beehive." + speech_commands = list("enter", "home", "in") + +/datum/pet_command/beehive/enter/check_beehive_conditions(mob/living/living_pawn, obj/structure/hive) + if(living_pawn in hive) //already in hive + return FALSE + return can_see(living_pawn, hive, 9) + +/datum/pet_command/beehive/exit + command_name = "Exit beehive" + command_desc = "Your bees will exit their beehive." + speech_commands = list("exit", "leave", "out") + +/datum/pet_command/beehive/exit/check_beehive_conditions(mob/living/living_pawn, obj/structure/hive) + return (living_pawn in hive) + +/datum/pet_command/scatter + command_name = "Scatter" + command_desc = "Command your pets to scatter all around you!" + speech_commands = list("disperse", "spread", "scatter") + +/datum/pet_command/scatter/set_command_active(mob/living/parent, mob/living/commander) + . = ..() + set_command_target(parent, commander) + +/datum/pet_command/scatter/execute_action(datum/ai_controller/controller) + controller.queue_behavior(/datum/ai_behavior/run_away_from_target/scatter, BB_CURRENT_PET_TARGET) + controller.clear_blackboard_key(BB_ACTIVE_PET_COMMAND) + return SUBTREE_RETURN_FINISH_PLANNING + +/datum/ai_behavior/run_away_from_target/scatter + run_distance = 4 + #undef AGGRO_DISTANCE_FROM_HIVE diff --git a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm index e2d6ac04f7e..6379f239ba0 100644 --- a/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm +++ b/code/modules/mob/living/basic/farm_animals/bee/bee_ai_subtree.dm @@ -1,6 +1,7 @@ /datum/ai_controller/basic_controller/bee blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/bee, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED @@ -8,6 +9,7 @@ idle_behavior = /datum/idle_behavior/idle_random_walk planning_subtrees = list( + /datum/ai_planning_subtree/pet_planning, /datum/ai_planning_subtree/find_valid_home, /datum/ai_planning_subtree/enter_exit_home, /datum/ai_planning_subtree/find_and_hunt_target/pollinate, diff --git a/code/modules/mob/living/basic/heretic/star_gazer.dm b/code/modules/mob/living/basic/heretic/star_gazer.dm index bef9924efe0..c55a3dafe9d 100644 --- a/code/modules/mob/living/basic/heretic/star_gazer.dm +++ b/code/modules/mob/living/basic/heretic/star_gazer.dm @@ -79,7 +79,7 @@ /datum/ai_controller/basic_controller/star_gazer blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/star_gazer(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends/attack_closed_turfs(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends/attack_closed_turfs, ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm index 4d67a71d4d4..e3f9fe083a6 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling_ai.dm @@ -1,7 +1,7 @@ /datum/ai_controller/basic_controller/seedling blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_WEEDLEVEL_THRESHOLD = 3, BB_WATERLEVEL_THRESHOLD = 90, ) @@ -142,7 +142,7 @@ /datum/ai_controller/basic_controller/seedling/meanie blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) planning_subtrees = list( /datum/ai_planning_subtree/pet_planning, diff --git a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm index fe1c4150315..7e7a72ec412 100644 --- a/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm +++ b/code/modules/mob/living/basic/lavaland/goldgrub/goldgrub_ai.dm @@ -1,7 +1,7 @@ /datum/ai_controller/basic_controller/goldgrub blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_ORE_IGNORE_TYPES = list(/obj/item/stack/ore/iron, /obj/item/stack/ore/glass), BB_STORM_APPROACHING = FALSE, ) diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm index cfc359bd54f..6ca9c59c926 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook_abilities.dm @@ -135,6 +135,8 @@ icon_state = "mook_leap_cloud" layer = BELOW_MOB_LAYER plane = GAME_PLANE + pixel_x = -16 + pixel_y = -16 base_pixel_y = -16 base_pixel_x = -16 duration = 1 SECONDS diff --git a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm index 6a04742d471..0fc2873531e 100644 --- a/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm +++ b/code/modules/mob/living/basic/lavaland/mook/mook_ai.dm @@ -267,7 +267,7 @@ GLOBAL_LIST_INIT(mook_commands, list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/mook, BB_MAXIMUM_DISTANCE_TO_VILLAGE = 10, BB_STORM_APPROACHING = FALSE, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) idle_behavior = /datum/idle_behavior/walk_near_target/mook_village planning_subtrees = list( diff --git a/code/modules/mob/living/basic/minebots/minebot_ai.dm b/code/modules/mob/living/basic/minebots/minebot_ai.dm index 33e9821dbc4..f4a2adda9e1 100644 --- a/code/modules/mob/living/basic/minebots/minebot_ai.dm +++ b/code/modules/mob/living/basic/minebots/minebot_ai.dm @@ -1,7 +1,7 @@ /datum/ai_controller/basic_controller/minebot blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_BLACKLIST_MINERAL_TURFS = list(/turf/closed/mineral/gibtonite), BB_AUTOMATED_MINING = FALSE, ) diff --git a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm index 9d967c5a8b0..5bf664d1687 100644 --- a/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm +++ b/code/modules/mob/living/basic/space_fauna/carp/carp_controllers.dm @@ -9,8 +9,9 @@ */ /datum/ai_controller/basic_controller/carp blackboard = list( + BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETTING_DATUM = new /datum/targetting_datum/basic/allow_items, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends ) ai_movement = /datum/ai_movement/basic_avoidance @@ -35,9 +36,9 @@ */ /datum/ai_controller/basic_controller/carp/pet blackboard = list( - BB_ALWAYS_IGNORE_FACTION = TRUE, + BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends ) ai_traits = STOP_MOVING_WHEN_PULLED planning_subtrees = list( @@ -79,8 +80,9 @@ */ /datum/ai_controller/basic_controller/carp/passive blackboard = list( + BB_BASIC_MOB_STOP_FLEEING = TRUE, BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED planning_subtrees = list( diff --git a/code/modules/mob/living/basic/vermin/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach.dm index 5c69ad90447..639a9720dbc 100644 --- a/code/modules/mob/living/basic/vermin/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach.dm @@ -61,7 +61,7 @@ /datum/ai_controller/basic_controller/cockroach blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, ) ai_traits = STOP_MOVING_WHEN_PULLED diff --git a/code/modules/mob/living/basic/vermin/frog.dm b/code/modules/mob/living/basic/vermin/frog.dm index 64dbafb45f8..7ff5260ccb7 100644 --- a/code/modules/mob/living/basic/vermin/frog.dm +++ b/code/modules/mob/living/basic/vermin/frog.dm @@ -78,7 +78,7 @@ /datum/ai_controller/basic_controller/frog blackboard = list( BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends ) ai_movement = /datum/ai_movement/basic_avoidance diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 6043cceb4b1..2929085fb93 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -411,8 +411,8 @@ /// AI controller for rats, slightly more complex than mice becuase they attack people /datum/ai_controller/basic_controller/mouse/rat blackboard = list( - BB_TARGETTING_DATUM = new /datum/targetting_datum/basic(), - BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/not_friends(), + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_PET_TARGETTING_DATUM = new /datum/targetting_datum/basic/not_friends, BB_BASIC_MOB_CURRENT_TARGET = null, // heathen BB_CURRENT_HUNTING_TARGET = null, // cheese BB_LOW_PRIORITY_HUNTING_TARGET = null, // cable diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index dca19777471..9fe0dbe0a92 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -336,3 +336,10 @@ item = /obj/item/seeds/seedling/evil cost = 8 restricted_roles = list(JOB_BOTANIST) + +/datum/uplink_item/role_restricted/bee_smoker + name = "Bee Smoker" + desc = "A device that runs on cannabis, turning it into a gas that can hypnotize bees to follow our commands." + item = /obj/item/bee_smoker + cost = 4 + restricted_roles = list(JOB_BOTANIST) diff --git a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi index 031909dbf82..5f771404f26 100644 Binary files a/icons/mob/inhands/equipment/hydroponics_lefthand.dmi and b/icons/mob/inhands/equipment/hydroponics_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/hydroponics_righthand.dmi b/icons/mob/inhands/equipment/hydroponics_righthand.dmi index a2cac9c47f3..11b91952032 100644 Binary files a/icons/mob/inhands/equipment/hydroponics_righthand.dmi and b/icons/mob/inhands/equipment/hydroponics_righthand.dmi differ diff --git a/icons/obj/service/hydroponics/equipment.dmi b/icons/obj/service/hydroponics/equipment.dmi index afcc4de5235..ed339a8a420 100644 Binary files a/icons/obj/service/hydroponics/equipment.dmi and b/icons/obj/service/hydroponics/equipment.dmi differ diff --git a/sound/weapons/beesmoke.ogg b/sound/weapons/beesmoke.ogg new file mode 100644 index 00000000000..5e29f37a224 Binary files /dev/null and b/sound/weapons/beesmoke.ogg differ diff --git a/tgstation.dme b/tgstation.dme index bdb23a0f0d3..3e7776beaa0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4035,6 +4035,7 @@ #include "code\modules\hydroponics\seed_extractor.dm" #include "code\modules\hydroponics\seeds.dm" #include "code\modules\hydroponics\unique_plant_genes.dm" +#include "code\modules\hydroponics\beekeeping\bee_smoker.dm" #include "code\modules\hydroponics\beekeeping\beebox.dm" #include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" #include "code\modules\hydroponics\beekeeping\honey_frame.dm"