diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 1d68fb54e8e..45e0cbbf96f 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -29,9 +29,10 @@
user.lastattacked = M
M.lastattacker = user
- user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])"
- M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])"
- msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" )
+ if(!no_attack_log)
+ user.attack_log += "\[[time_stamp()]\] Attacked [M.name] ([M.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])"
+ M.attack_log += "\[[time_stamp()]\] Attacked by [user.name] ([user.ckey]) with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])"
+ msg_admin_attack("[key_name(user)] attacked [key_name(M)] with [name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(damtype)])" )
/////////////////////////
var/power = force
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 1c29aa80880..4b9a89bda19 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -10,6 +10,7 @@
var/hitsound = null
var/w_class = 3.0
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
+ var/no_attack_log = 0 //If it's an item we don't want to log attack_logs with, set this to 1
pass_flags = PASSTABLE
pressure_resistance = 5
// causeerrorheresoifixthis
@@ -599,4 +600,4 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!cannotzoom)
usr.visible_message("[zoomdevicename ? "[usr] looks up from the [src.name]" : "[usr] lowers the [src.name]"].")
- return
\ No newline at end of file
+ return
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 8b4d7f9ef10..cf00e4f78b9 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -1,5 +1,11 @@
/var/global/spacevines_spawned = 0
+/datum/event/spacevine
+ announceWhen = 10
+
/datum/event/spacevine/start()
spacevine_infestation()
spacevines_spawned = 1
+
+/datum/event/spacevine/announce()
+ command_announcement.Announce("Confirmed outbreak of level 7 biohazard aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", new_sound = 'sound/AI/outbreak7.ogg')
diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm
index 1dabe9f3452..b463ec42090 100644
--- a/code/modules/holodeck/HolodeckObjects.dm
+++ b/code/modules/holodeck/HolodeckObjects.dm
@@ -192,6 +192,7 @@
/obj/item/weapon/holo
damtype = HALLOSS
+ no_attack_log = 1
/obj/item/weapon/holo/esword
desc = "May the force be within you. Sorta."
diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm
index 68e6fbce373..daa3586fd7c 100644
--- a/code/modules/hydroponics/trays/tray_process.dm
+++ b/code/modules/hydroponics/trays/tray_process.dm
@@ -120,6 +120,14 @@
harvest = 1
lastproduce = age
+ // If we're a vine which is not in a closed tray and is at least half mature, and there's no vine currently on our turf: make one (maybe)
+ if(!closed_system && \
+ seed.get_trait(TRAIT_SPREAD) == 2 && \
+ 2 * age >= seed.get_trait(TRAIT_MATURATION) && \
+ !(locate(/obj/effect/plant) in get_turf(src)) && \
+ prob(2 * seed.get_trait(TRAIT_POTENCY)))
+ new /obj/effect/plant(get_turf(src), seed)
+
if(prob(3)) // On each tick, there's a chance the pest population will increase
pestlevel += 0.1 * HYDRO_SPEED_MULTIPLIER
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 8f24273eb29..2bd77f34428 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -180,16 +180,17 @@
visible_message("\The [target_mob] is hit by \the [src] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
//admin logs
- if(istype(firer, /mob))
- target_mob.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [target_mob]/[target_mob.ckey] with a [src.type]"
- firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [target_mob]/[target_mob.ckey] with a [src.type]"
- msg_admin_attack("[firer] ([firer.ckey]) shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
- else if(firer)
- target_mob.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [target_mob]/[target_mob.ckey] with a [src]"
- msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
- else
- target_mob.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [target_mob]/[target_mob.ckey] with a [src]"
- msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
+ if(!no_attack_log)
+ if(istype(firer, /mob))
+ target_mob.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [target_mob]/[target_mob.ckey] with a [src.type]"
+ firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [target_mob]/[target_mob.ckey] with a [src.type]"
+ msg_admin_attack("[firer] ([firer.ckey]) shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
+ else if(firer)
+ target_mob.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [target_mob]/[target_mob.ckey] with a [src]"
+ msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
+ else
+ target_mob.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [target_mob]/[target_mob.ckey] with a [src]"
+ msg_admin_attack("UNKNOWN shot [target_mob] ([target_mob.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
//sometimes bullet_act() will want the projectile to continue flying
if (target_mob.bullet_act(src, def_zone) == -1)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index cbe1ad5625b..eb515298ef3 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -68,6 +68,7 @@
icon_state = "bluelaser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 0
+ no_attack_log = 1
damage_type = BURN
check_armour = "laser"
@@ -87,6 +88,7 @@
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 0
+ no_attack_log = 1
damage_type = BURN
check_armour = "laser"
diff --git a/html/changelogs/PsiOmegaDelta-LevelSevenBioHazard.yml b/html/changelogs/PsiOmegaDelta-LevelSevenBioHazard.yml
new file mode 100644
index 00000000000..c9a3d08e226
--- /dev/null
+++ b/html/changelogs/PsiOmegaDelta-LevelSevenBioHazard.yml
@@ -0,0 +1,5 @@
+author: PsiOmegaDelta
+delete-after: True
+
+changes:
+ - rscadd: "The space vine event now comes with a station announcement."