diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 983e8f0a068..ba6fb18d0e4 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -919,6 +919,27 @@
/obj/item/seeds/eggplant/eggy)
crate_name = "exotic seeds crate"
+/datum/supply_pack/organic/hydroponics/beekeeping_fullkit
+ name = "Beekeeping Starter Kit"
+ cost = 40
+ contains = list(/obj/structure/beebox,
+ /obj/item/honey_frame,
+ /obj/item/honey_frame,
+ /obj/item/honey_frame,
+ /obj/item/queen_bee/bought,
+ /obj/item/clothing/head/beekeeper_head,
+ /obj/item/clothing/suit/beekeeper_suit)
+ crate_name = "beekeeping starter kit"
+
+/datum/supply_pack/organic/hydroponics/beekeeping_suits
+ name = "2 Beekeeper suits"
+ cost = 10
+ contains = list(/obj/item/clothing/head/beekeeper_head,
+ /obj/item/clothing/suit/beekeeper_suit,
+ /obj/item/clothing/head/beekeeper_head,
+ /obj/item/clothing/suit/beekeeper_suit)
+ crate_name = "beekeper suits"
+
/datum/supply_pack/organic/vending
name = "Bartending Supply Crate"
cost = 20
diff --git a/code/modules/hydroponics/beekeeping/BEES.dmi b/code/modules/hydroponics/beekeeping/BEES.dmi
new file mode 100644
index 00000000000..dbd86636831
Binary files /dev/null and b/code/modules/hydroponics/beekeeping/BEES.dmi differ
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
new file mode 100644
index 00000000000..508806a6e15
--- /dev/null
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -0,0 +1,235 @@
+
+#define BEEBOX_MAX_FRAMES 3 //Max frames per box
+#define BEES_RATIO 0.5 //Multiplied by the max number of honeycombs to find the max number of bees
+#define BEE_PROB_NEW_BEE 20 //The chance for spare bee_resources to be turned into new bees
+#define BEE_RESOURCE_HONEYCOMB_COST 100 //The amount of bee_resources for a new honeycomb to be produced, percentage cost 1-100
+#define BEE_RESOURCE_NEW_BEE_COST 50 //The amount of bee_resources for a new bee to be produced, percentage cost 1-100
+
+
+
+/mob/proc/bee_friendly()
+ return 0
+
+
+/mob/living/simple_animal/hostile/poison/bees/bee_friendly()
+ return 1
+
+
+/mob/living/carbon/human/bee_friendly()
+ if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL)))
+ return 1
+ return 0
+
+
+/obj/structure/beebox
+ name = "apiary"
+ desc = "Dr Miles Manners is just your average Wasp themed super hero by day, but by night he becomes DR BEES!"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "beebox"
+ anchored = 1
+ density = 1
+ var/mob/living/simple_animal/hostile/poison/bees/queen/queen_bee = null
+ var/list/bees = list() //bees owned by the box, not those inside it
+ var/list/honeycombs = list()
+ var/list/honey_frames = list()
+ var/bee_resources = 0
+
+
+/obj/structure/beebox/New()
+ ..()
+ SSobj.processing += src
+
+
+/obj/structure/beebox/Destroy()
+ SSobj.processing -= src
+ bees.Cut()
+ bees = null
+ honeycombs.Cut()
+ honeycombs = null
+ queen_bee = null
+ return ..()
+
+
+//Premade apiaries can spawn with a random reagent
+/obj/structure/beebox/premade
+ var/random_reagent = FALSE
+
+
+/obj/structure/beebox/premade/New()
+ ..()
+
+ var/datum/reagent/R = null
+ if(random_reagent)
+ R = pick(subtypesof(/datum/reagent))
+ R = chemical_reagents_list[initial(R.id)]
+
+ queen_bee = new(src)
+ queen_bee.beehome = src
+ bees += queen_bee
+ queen_bee.assign_reagent(R)
+
+ for(var/i in 1 to BEEBOX_MAX_FRAMES)
+ var/obj/item/honey_frame/HF = new(src)
+ honey_frames += HF
+
+ for(var/i in 1 to get_max_bees())
+ var/mob/living/simple_animal/hostile/poison/bees/B = new(src)
+ bees += B
+ B.beehome = src
+ B.assign_reagent(R)
+
+
+/obj/structure/beebox/premade/random
+ random_reagent = TRUE
+
+
+/obj/structure/beebox/process()
+ if(queen_bee)
+ if(bee_resources >= BEE_RESOURCE_HONEYCOMB_COST)
+ if(honeycombs.len < get_max_honeycomb())
+ bee_resources = max(bee_resources-BEE_RESOURCE_HONEYCOMB_COST, 0)
+ var/obj/item/weapon/reagent_containers/honeycomb/HC = new(src)
+ if(queen_bee.beegent)
+ HC.set_reagent(queen_bee.beegent.id)
+ honeycombs += HC
+
+ if(bees.len < get_max_bees())
+ var/freebee = FALSE //a freebee, geddit?, hahaha HAHAHAHA
+ if(!bees.len) //there's always one set of worker bees, this isn't colony collapse disorder its 2d spessmen
+ freebee = TRUE
+ if((bee_resources >= BEE_RESOURCE_NEW_BEE_COST && prob(BEE_PROB_NEW_BEE)) || freebee)
+ if(!freebee)
+ bee_resources = max(bee_resources - BEE_RESOURCE_NEW_BEE_COST, 0)
+ var/mob/living/simple_animal/hostile/poison/bees/B = new(src)
+ B.beehome = src
+ B.assign_reagent(queen_bee.beegent)
+ bees += B
+
+
+/obj/structure/beebox/proc/get_max_honeycomb()
+ . = 0
+ for(var/hf in honey_frames)
+ var/obj/item/honey_frame/HF = hf
+ . += HF.honeycomb_capacity
+
+
+/obj/structure/beebox/proc/get_max_bees()
+ . = get_max_honeycomb() * BEES_RATIO
+
+
+/obj/structure/beebox/examine(mob/user)
+ ..()
+
+ if(!queen_bee)
+ user << "There is no queen bee!"
+
+ if(bees.len >= get_max_bees()*0.5)
+ user << "This place is a BUZZ with activity..."
+
+ if(bee_resources)
+ user << "[bee_resources]/100 honey supply."
+ user << "[bee_resources]% towards a new honeycomb."
+ user << "[bee_resources*2]% towards a new bee."
+
+ if(honeycombs.len >= get_max_honeycomb())
+ user << "there's no room for more honeycomb!"
+
+
+/obj/structure/beebox/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/honey_frame))
+ var/obj/item/honey_frame/HF = I
+ if(honey_frames.len < BEEBOX_MAX_FRAMES)
+ visible_message("[user] adds a frame to the apiary.")
+ user.unEquip(HF)
+ HF.loc = src
+ honey_frames += HF
+ else
+ user << "There's no room for anymore frames in the apiary!"
+
+ if(istype(I, /obj/item/weapon/wrench))
+ if(default_unfasten_wrench(user, I, time = 20))
+ return
+
+ if(istype(I, /obj/item/queen_bee))
+ var/obj/item/queen_bee/qb = I
+ user.unEquip(qb)
+
+ qb.queen.loc = src
+ bees += qb.queen
+ queen_bee = qb.queen
+ qb.queen = null
+
+ if(qb.queen)
+ visible_message("[user] sets [qb] down inside the apiary, making it their new home.")
+ var/relocated = 0
+ for(var/b in bees)
+ var/mob/living/simple_animal/hostile/poison/bees/B = b
+ if(B.reagent_incompatible(queen_bee))
+ bees -= B
+ B.beehome = null
+ if(B.loc == src)
+ B.loc = get_turf(src)
+ relocated++
+ if(relocated)
+ user << "This queen has a different reagent to some of the bees who live here, those bees will not return to this apiary!"
+
+ else
+ user << "The queen bee disappeared! bees disappearing has been in the news lately..."
+
+ qdel(qb)
+
+
+/obj/structure/beebox/attack_hand(mob/user)
+ if(istype(user, /mob/living/carbon/human))
+ if(!user.bee_friendly())
+ //Time to get stung!
+ var/bees = FALSE
+ for(var/b in bees) //everyone who's ever lived here now instantly hates you, suck it assistant!
+ var/mob/living/simple_animal/hostile/poison/bees/B = b
+ if(B.isqueen)
+ continue
+ if(B.loc == src)
+ B.loc = get_turf(src)
+ B.target = user
+ bees = TRUE
+ if(bees)
+ visible_message("[user] disturbs the bees!")
+ else
+ var/option = alert(user, "What Action do you wish to perform?","Apiary","Remove a Honey Frame","Remove the Queen Bee")
+ switch(option)
+ if("Remove a Honey Frame")
+ if(!honey_frames.len)
+ user << "There are no honey frames to remove!"
+ return
+
+ var/obj/item/honey_frame/HF = pick_n_take(honey_frames)
+ if(HF)
+ if(!user.put_in_active_hand(HF))
+ HF.loc = get_turf(src)
+ visible_message("[user] removes a frame from the apiary.")
+
+ var/amtH = honeycombs.len
+ var/maxH = get_max_honeycomb()
+ var/fallen = 0
+ while(amtH > maxH) //let's pretend you always grab the frame with the most honeycomb on it
+ var/obj/item/weapon/reagent_containers/honeycomb/HC = pick_n_take(honeycombs)
+ if(HC)
+ honeycombs -= HC
+ HC.loc = get_turf(user)
+ amtH--
+ fallen++
+ if(fallen)
+ var/multiple = fallen > 1
+ visible_message("[user] scapes [multiple ? "[fallen]" : "a"] honeycomb[multiple ? "s" : ""] off of the frame.")
+
+ if("Remove the Queen Bee")
+ if(!queen_bee)
+ user << "There is no queen bee to remove!"
+ return
+ var/obj/item/queen_bee/QB = new()
+ queen_bee.loc = QB
+ QB.queen = queen_bee
+ QB.name = queen_bee.name
+ if(!user.put_in_active_hand(QB))
+ QB.loc = get_turf(src)
+ visible_message("[user] removes the queen from the apiary.")
\ No newline at end of file
diff --git a/code/modules/hydroponics/beekeeping/beekeeper_suit.dm b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
new file mode 100644
index 00000000000..889c807971b
--- /dev/null
+++ b/code/modules/hydroponics/beekeeping/beekeeper_suit.dm
@@ -0,0 +1,16 @@
+
+/obj/item/clothing/head/beekeeper_head
+ name = "beekeeper hat"
+ desc = "keeps the lil buzzing buggers out of your eyes"
+ icon_state = "beekeeper"
+ item_state = "beekeeper"
+ flags = THICKMATERIAL
+
+
+/obj/item/clothing/suit/beekeeper_suit
+ name = "beekeeper suit"
+ desc = "keeps the lil buzzing buggers away from your squishy bits"
+ icon_state = "beekeeper"
+ item_state = "beekeeper"
+ flags = THICKMATERIAL
+
diff --git a/code/modules/hydroponics/beekeeping/honey_frame.dm b/code/modules/hydroponics/beekeeping/honey_frame.dm
new file mode 100644
index 00000000000..e98187d99e7
--- /dev/null
+++ b/code/modules/hydroponics/beekeeping/honey_frame.dm
@@ -0,0 +1,12 @@
+
+/obj/item/honey_frame
+ name = "honey frame"
+ desc = "a scaffold for bees to build honeycomb on"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "honey_frame"
+ var/honeycomb_capacity = 10 //10 Honeycomb per frame by default, researchable frames perhaps?
+
+
+/obj/item/honey_frame/New()
+ pixel_x = rand(8,-8)
+ pixel_y = rand(8,-8)
diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm
new file mode 100644
index 00000000000..fb56fe1b804
--- /dev/null
+++ b/code/modules/hydroponics/beekeeping/honeycomb.dm
@@ -0,0 +1,41 @@
+
+/obj/item/weapon/reagent_containers/honeycomb
+ name = "honeycomb"
+ desc = "a hexagonal mesh of honeycomb"
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "honeycomb"
+ possible_transfer_amounts = null
+ spillable = 0
+ disease_amount = 0
+ volume = 10
+ amount_per_transfer_from_this = 0
+ list_reagents = list("honey" = 5)
+ var/honey_color = ""
+
+/obj/item/weapon/reagent_containers/honeycomb/New()
+ ..()
+ pixel_x = rand(8,-8)
+ pixel_y = rand(8,-8)
+ update_icon()
+
+
+/obj/item/weapon/reagent_containers/honeycomb/update_icon()
+ overlays.Cut()
+ var/image/honey
+ if(honey_color)
+ honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "greyscale_honey")
+ honey.color = honey_color
+ else
+ honey = image(icon = 'icons/obj/hydroponics/harvest.dmi', icon_state = "honey")
+ overlays += honey
+
+
+/obj/item/weapon/reagent_containers/honeycomb/proc/set_reagent(reagent)
+ var/datum/reagent/R = chemical_reagents_list[reagent]
+ if(istype(R))
+ name = "honeycomb ([R.name])"
+ honey_color = R.color
+ reagents.add_reagent(R.id,5)
+ else
+ honey_color = ""
+ update_icon()
\ No newline at end of file
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 3ea195fb3e8..ed838591dc4 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -23,6 +23,7 @@
var/obj/item/seeds/myseed = null //The currently planted seed
var/rating = 1
var/unwrenchable = 1
+ var/recent_bee_visit = FALSE //Have we been visited by a bee recently, so bees dont overpolinate one plant
pixel_y=8
diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm
index b6bbf83133c..96b768aa6cf 100644
--- a/code/modules/mob/living/simple_animal/hostile/bees.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bees.dm
@@ -1,8 +1,18 @@
+
+#define BEE_IDLE_ROAMING 70 //The value of idle at which a bee in a beebox will try to wander
+#define BEE_IDLE_GOHOME 0 //The value of idle at which a bee will try to go home
+#define BEE_PROB_GOHOME 35 //Probability to go home when idle is below BEE_IDLE_GOHOME
+#define BEE_PROB_GOROAM 5 //Probability to go roaming when idle is above BEE_IDLE_ROAMING
+#define BEE_TRAY_RECENT_VISIT 200 //How long in deciseconds until a tray can be visited by a bee again
+#define BEE_DEFAULT_COLOUR "#e5e500" //the colour we make the stripes of the bee if our reagent has no colour (or we have no reagent)
+
+
/mob/living/simple_animal/hostile/poison/bees
- name = "space bee swarm"
- desc = ""
- icon_state = "bee_1"
- icon_living = "bee"
+ name = "bee"
+ desc = "buzzy buzzy bee, stingy sti- Ouch!"
+ icon_state = ""
+ icon_living = ""
+ icon = 'icons/mob/bees.dmi'
speak_emote = list("buzzes")
emote_hear = list("buzzes")
turns_per_move = 0
@@ -22,33 +32,223 @@
mob_size = MOB_SIZE_SMALL
flying = 1
gold_core_spawnable = 1
+ search_objects = 1 //have to find those plant trays!
//Spaceborn beings don't get hurt by space
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
del_on_death = 1
+ var/datum/reagent/beegent = null //hehe, beegent
+ var/obj/structure/beebox/beehome = null
+ var/idle = 0
+ var/isqueen = FALSE
+ var/icon_base = "bee"
+ var/static/list/bee_icons = list()
+
+
/mob/living/simple_animal/hostile/poison/bees/Process_Spacemove(movement_dir = 0)
return 1
+
/mob/living/simple_animal/hostile/poison/bees/New()
..()
- update_bees()
+ generate_bee_visuals()
-/mob/living/simple_animal/hostile/poison/bees/Life()
+
+/mob/living/simple_animal/hostile/poison/bees/Destroy()
+ if(beehome)
+ beehome.bees -= src
+ beehome = null
+ beegent = null
+ return ..()
+
+
+/mob/living/simple_animal/hostile/poison/bees/death(gibbed)
+ if(beehome)
+ beehome.bees -= src
+ beehome = null
+ beegent = null
..()
- update_bees()
-/mob/living/simple_animal/hostile/poison/bees/proc/update_bees()
- while(overlays.len != health-1) //how many bees do we have in the swarm?
- var/N = rand(1, 4)
- var/image/I = image(icon='icons/mob/animal.dmi',icon_state="bee_[N]", pixel_x = rand(-8, 8), pixel_y = rand(-8, 8))
- if(overlays.len < health-1)
- overlays.Add(I)
- if(overlays.len > health-1)
- overlays.Remove(I)
- poison_per_bite = health * 0.5 //each bee is half a toxin reagent
- if(health > 1)
- desc = "A buzzy swarm of [health] poisonous space bees, renowned for their aggressiveness"
+
+/mob/living/simple_animal/hostile/poison/bees/proc/generate_bee_visuals()
+ overlays.Cut()
+
+ var/col = BEE_DEFAULT_COLOUR
+ if(beegent && beegent.color)
+ col = beegent.color
+
+ var/image/base
+ if(!bee_icons["[icon_base]_base"])
+ bee_icons["[icon_base]_base"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_base")
+ base = bee_icons["[icon_base]_base"]
+ overlays += base
+
+ var/image/greyscale
+ if(!bee_icons["[icon_base]_grey_[col]"])
+ bee_icons["[icon_base]_grey_[col]"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_grey")
+ greyscale = bee_icons["[icon_base]_grey_[col]"]
+ greyscale.color = col
+ overlays += greyscale
+
+ var/image/wings
+ if(!bee_icons["[icon_base]_wings"])
+ bee_icons["[icon_base]_wings"] = image(icon = 'icons/mob/bees.dmi', icon_state = "[icon_base]_wings")
+ wings = bee_icons["[icon_base]_wings"]
+ overlays += wings
+
+
+//We don't attack beekeepers/people dressed as bees//Todo: bee costume
+/mob/living/simple_animal/hostile/poison/bees/CanAttack(atom/the_target)
+ . = ..()
+ if(!.)
+ return 0
+ if(ishuman(the_target))
+ var/mob/living/carbon/human/H = the_target
+ return !H.bee_friendly()
+
+
+/mob/living/simple_animal/hostile/poison/bees/Found(atom/A)
+ if(istype(A, /obj/machinery/hydroponics))
+ var/obj/machinery/hydroponics/Hydro = A
+ if(Hydro.myseed && !Hydro.dead && !Hydro.recent_bee_visit)
+ wanted_objects |= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
+ return 1
+ if(ishuman(A))
+ var/mob/living/carbon/human/H = A
+ return !H.bee_friendly()
+ return 0
+
+
+/mob/living/simple_animal/hostile/poison/bees/AttackingTarget()
+ //Pollinate
+ if(istype(target, /obj/machinery/hydroponics))
+ var/obj/machinery/hydroponics/Hydro = target
+ pollinate(Hydro)
+ else if(target == beehome)
+ var/obj/structure/beebox/BB = target
+ loc = BB
+ target = null
+ wanted_objects -= /obj/structure/beebox //so we don't attack beeboxes when not going home
else
- desc = "Although now lonely, this single space bee is still poisonous and very angry at you."
+ if(beegent && isliving(target))
+ var/mob/living/L = target
+ beegent.reaction_mob(L, TOUCH)
+ target.attack_animal(src)
+
+
+/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R)
+ if(istype(R))
+ beegent = R
+ name = "[initial(name)] ([R.name])"
+ generate_bee_visuals()
+
+
+/mob/living/simple_animal/hostile/poison/bees/proc/pollinate(obj/machinery/hydroponics/Hydro)
+ if(!istype(Hydro) || !Hydro.myseed || Hydro.dead || Hydro.recent_bee_visit)
+ target = null
+ return
+
+ target = null //so we pick a new hydro tray next FindTarget(), instead of loving the same plant for eternity
+ wanted_objects -= /obj/machinery/hydroponics //so we only hunt them while they're alive/seeded/not visisted
+ Hydro.recent_bee_visit = TRUE
+ spawn(BEE_TRAY_RECENT_VISIT)
+ if(Hydro)
+ Hydro.recent_bee_visit = FALSE
+
+ var/growth = health //Health also means how many bees are in the swarm, roughly.
+ //better healthier plants!
+ Hydro.health += growth
+ Hydro.pestlevel = max(0, --Hydro.pestlevel)
+ Hydro.yieldmod++
+
+ if(beehome)
+ beehome.bee_resources = min(beehome.bee_resources + growth, 100)
+
+
+/mob/living/simple_animal/hostile/poison/bees/handle_automated_action()
+ . = ..()
+ if(!.)
+ return
+
+ if(!isqueen)
+ if(loc == beehome)
+ idle = min(100, ++idle)
+ if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM))
+ loc = get_turf(beehome)
+ else
+ idle = max(0, --idle)
+ if(idle <= BEE_IDLE_GOHOME && prob(BEE_PROB_GOHOME))
+ if(!FindTarget())
+ wanted_objects += /obj/structure/beebox //so we don't attack beeboxes when not going home
+ target = beehome
+ if(!beehome) //add outselves to a beebox (of the same reagent) if we have no home
+ for(var/obj/structure/beebox/BB in view(vision_range, src))
+ if(reagent_incompatible(BB.queen_bee) || BB.bees.len >= BB.get_max_bees())
+ continue
+ BB.bees |= src
+ beehome = BB
+
+
+ /mob/living/simple_animal/hostile/poison/bees/queen
+ name = "queen bee"
+ desc = "she's the queen of bees, BZZ BZZ"
+ icon_base = "queen"
+ isqueen = TRUE
+
+
+ //the Queen doesn't leave the box on her own, and she CERTAINLY doesn't pollinate by herself
+/mob/living/simple_animal/hostile/poison/bees/queen/Found(atom/A)
+ return 0
+
+
+//leave pollination for the peasent bees
+/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget()
+ if(beegent && isliving(target))
+ var/mob/living/L = target
+ beegent.reaction_mob(L, TOUCH)
+ target.attack_animal(src)
+
+
+//PEASENT BEES
+/mob/living/simple_animal/hostile/poison/bees/queen/pollinate()
+ return
+
+
+/mob/living/simple_animal/hostile/poison/bees/proc/reagent_incompatible(mob/living/simple_animal/hostile/poison/bees/B)
+ if(!B)
+ return 1
+ if(B.beegent && beegent && B.beegent.id != beegent.id || B.beegent && beegent || !B.beegent && beegent)
+ return 1
+ return 0
+
+
+/obj/item/queen_bee
+ name = "queen bee"
+ desc = "she's the queen of bees, BZZ BZZ"
+ icon_state = "queen_item"
+ item_state = ""
+ icon = 'icons/mob/bees.dmi'
+ var/mob/living/simple_animal/hostile/poison/bees/queen/queen
+
+
+/obj/item/queen_bee/attackby(obj/item/I, mob/user, params)
+ if(istype(I,/obj/item/weapon/reagent_containers/syringe))
+ var/obj/item/weapon/reagent_containers/syringe/S = I
+ var/datum/reagent/R = chemical_reagents_list[S.reagents.get_master_reagent_id()]
+ if(R)
+ queen.assign_reagent(R)
+ user.visible_message("[user] injects [src]'s genome with [R.name], mutating it's DNA!","You inject [src]'s genome with [R.name], mutating it's DNA!")
+ name = queen.name
+ ..()
+
+
+/obj/item/queen_bee/bought/New()
+ ..()
+ queen = new(src)
+
+
+/obj/item/queen_bee/Destroy()
+ qdel(queen)
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 6422b8d4548..52fedd9f8bd 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -159,7 +159,7 @@
return 0
return 1
if(isobj(the_target))
- if(the_target.type in wanted_objects)
+ if(is_type_in_list(the_target, wanted_objects))
return 1
return 0
diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
index ce1ae64d158..828c8bf1cd6 100644
--- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
+++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm
@@ -56,7 +56,8 @@
//All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.!
/obj/item/weapon/reagent_containers/pill = list(),
- /obj/item/weapon/reagent_containers/food = list()
+ /obj/item/weapon/reagent_containers/food = list(),
+ /obj/item/weapon/reagent_containers/honeycomb = list()
)
var/list/juice_items = list (
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index 835f3f4f205..65d5c446d62 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -423,3 +423,17 @@
/datum/reagent/consumable/corn_syrup/on_mob_life(mob/living/M)
holder.add_reagent("sugar", 3)
..()
+
+/datum/reagent/consumable/honey
+ name = "honey"
+ id = "honey"
+ description = "Sweet sweet honey, decays into sugar."
+ color = "#d3a308"
+ nutriment_factor = 15 * REAGENTS_METABOLISM
+
+/datum/reagent/consumable/honey/on_mob_life(mob/living/M)
+ M.reagents.add_reagent("sugar",3)
+ M.reagents.remove_reagent("honey", 1)
+ if(prob(20))
+ M.heal_organ_damage(3,1)
+ ..()
diff --git a/icons/mob/bees.dmi b/icons/mob/bees.dmi
new file mode 100644
index 00000000000..5d9bfea48b6
Binary files /dev/null and b/icons/mob/bees.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index f8c2c5105ce..864a618735a 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index e04bebfc4d0..78150d96bc7 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index b86194de078..0e75c0d2c17 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index aadcde0b0c4..edc4e46e371 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/hydroponics/equipment.dmi b/icons/obj/hydroponics/equipment.dmi
index 904eb38c53c..b7781f5fd98 100644
Binary files a/icons/obj/hydroponics/equipment.dmi and b/icons/obj/hydroponics/equipment.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index 482f07dba4f..40ea8a4df70 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 0c8522e1b94..29695e19f64 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1099,6 +1099,10 @@
#include "code\modules\hydroponics\plant_genes.dm"
#include "code\modules\hydroponics\seed_extractor.dm"
#include "code\modules\hydroponics\seeds.dm"
+#include "code\modules\hydroponics\beekeeping\beebox.dm"
+#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm"
+#include "code\modules\hydroponics\beekeeping\honey_frame.dm"
+#include "code\modules\hydroponics\beekeeping\honeycomb.dm"
#include "code\modules\hydroponics\grown\ambrosia.dm"
#include "code\modules\hydroponics\grown\apple.dm"
#include "code\modules\hydroponics\grown\banana.dm"