[MIRROR] new syndicate item - bee smoker [MDB IGNORE] (#24450)

* new syndicate item - bee smoker (#78988)

## About The Pull Request
this adds a new item for traitor botanists they can buy for 4 tc. it
releases smoke which hypnotizes bees to follow ur every command, it can
be used on a single bee or it can be used on a hive to hypnotize all the
bees who live there. u can command the bees to enter or exit their
beehive, and u can also command them to spiral around u where they will
follow u and swirl around u to confuse whichever opponent u are
fighting, and u can also command them to attack people. the bee smoker
comes with some fuel but u can recharge it by putting cannabis into it.
the stronger the weed the more fuel it will provide

https://github.com/tgstation/tgstation/assets/138636438/18c9a350-8e24-4c49-abfa-dffb7622502f

## Why It's Good For The Game
adds a traitor item which gives a new gameplay alternative for botanist
and pacifist players. also i noticed the pet targetting datum was using
some copy paste code so i made it a subtpye of the basic targetting
datum

## Changelog
🆑
add: added a new syndicate item - the bee smoker
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>

* new syndicate item - bee smoker

---------

Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
This commit is contained in:
SkyratBot
2023-10-20 00:29:10 -04:00
committed by GitHub
co-authored by MrMelbert Ben10Omintrix
parent 8239cad917
commit cffff937f6
26 changed files with 320 additions and 48 deletions
+2
View File
@@ -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
@@ -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
@@ -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
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?
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
/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(target in living_mob.ai_controller.blackboard[BB_FRIENDS_LIST])
return FALSE
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.
+2 -2
View File
@@ -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),
@@ -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
/**
@@ -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
@@ -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
@@ -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))
@@ -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
@@ -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,
@@ -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
@@ -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,
@@ -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,
)
@@ -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
@@ -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(
@@ -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,
)
@@ -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(
@@ -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
+1 -1
View File
@@ -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
@@ -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
+7
View File
@@ -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)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.
+1
View File
@@ -4027,6 +4027,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"