diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 8da220bf671..7cfa15e53a2 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -142,7 +142,7 @@
if(ismob(A))
var/mob/M = A
if(client_check && !M.client)
- L = recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
+ L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
continue
if(sight_check && !isInSight(A, O))
continue
@@ -155,7 +155,7 @@
L |= A
if(isobj(A) || ismob(A))
- L = recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
+ L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio)
return L
// The old system would loop through lists for a total of 5000 per function call, in an empty server.
@@ -182,7 +182,7 @@
hear += A
if(isobj(A) || ismob(A))
- hear = recursive_mob_check(A, hear, 3, 1, 0, 1)
+ hear |= recursive_mob_check(A, hear, 3, 1, 0, 1)
return hear
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index cb840a1d90e..112c3431e52 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -55,6 +55,7 @@
RestrainedClickOn(A)
else
*/
+ A.add_hiddenprint(src)
A.attack_ai(src)
/*
diff --git a/code/_onclick/cyborg.dm b/code/_onclick/cyborg.dm
index 640a09d045f..d86faacbd1f 100644
--- a/code/_onclick/cyborg.dm
+++ b/code/_onclick/cyborg.dm
@@ -48,6 +48,7 @@
// Cyborgs have no range-checking unless there is item use
if(!W)
+ A.add_hiddenprint(src)
A.attack_robot(src)
return
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index c9dfd7cf403..5f11d9f6230 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -18,6 +18,7 @@
var/log_adminwarn = 0 // log warnings admins get about bomb construction and such
var/log_pda = 0 // log pda messages
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
+ var/log_runtime = 0 // logs world.log to a file
var/sql_enabled = 1 // for sql switching
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
var/allow_vote_restart = 0 // allow votes to restart
@@ -245,6 +246,9 @@
if ("log_hrefs")
config.log_hrefs = 1
+ if ("log_runtime")
+ config.log_runtime = 1
+
if("allow_admin_ooccolor")
config.allow_admin_ooccolor = 1
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index ad757325b95..ee73d537d8e 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -80,6 +80,7 @@
if(instant || do_after(user, 50))
new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype)
user << "You finish drawing."
+ target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on.
if(uses)
uses--
if(!uses)
@@ -97,4 +98,4 @@
user << "\red You ate your crayon!"
del(src)
else
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index ab8884d96c3..eb59003aced 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -163,6 +163,7 @@
if("boiling")
watertemp = "normal"
user.visible_message("[user] adjusts the shower with the [I].", "You adjust the shower with the [I].")
+ add_fingerprint(user)
/obj/machinery/shower/update_icon() //this is terribly unreadable, but basically it makes the shower mist up
overlays.Cut() //once it's been on for a while, in addition to handling the water overlay.
@@ -412,4 +413,4 @@
/obj/structure/sink/puddle/attackby(obj/item/O as obj, mob/user as mob)
icon_state = "puddle-splash"
..()
- icon_state = "puddle"
\ No newline at end of file
+ icon_state = "puddle"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 54a865955ad..b09712350c1 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -804,7 +804,11 @@
if (ismob(M))
if(!check_if_greater_rights_than(M.client))
return
- M << "\red You have been kicked from the server"
+ var/reason = input("Please enter reason")
+ if(!reason)
+ M << "\red You have been kicked from the server"
+ else
+ M << "\red You have been kicked from the server: [reason]"
log_admin("[key_name(usr)] booted [key_name(M)].")
message_admins("\blue [key_name_admin(usr)] booted [key_name_admin(M)].", 1)
//M.client = null
diff --git a/code/modules/mob/living/carbon/monkey/diona.dm b/code/modules/mob/living/carbon/monkey/diona.dm
index 442d33e2ace..3ec9b817c5d 100644
--- a/code/modules/mob/living/carbon/monkey/diona.dm
+++ b/code/modules/mob/living/carbon/monkey/diona.dm
@@ -64,6 +64,10 @@
set name = "Evolve"
set desc = "Grow to a more complex form."
+ if(!is_alien_whitelisted(src, "Diona") && config.usealienwhitelist)
+ src << alert("You are currently not whitelisted to play [client.prefs.species].")
+ return 0
+
if(donors.len < 5)
src << "You are not yet ready for your growth..."
return
diff --git a/code/world.dm b/code/world.dm
index 3d1ad20db98..de70b60fe65 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -11,7 +11,6 @@
/world/New()
//logs
var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day")
- log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM")].log") //funtimelog
href_logfile = file("data/logs/[date_string] hrefs.htm")
diary = file("data/logs/[date_string].log")
diaryofmeanpeople = file("data/logs/[date_string] Attack.log")
@@ -28,6 +27,9 @@
// dumb and hardcoded but I don't care~
config.server_name += " #[(world.port % 1000) / 100]"
+ if(config && config.log_runtime)
+ log = file("data/logs/runtime/[time2text(world.realtime,"YYYY-MM-DD-(hh-mm-ss)")]-runtime.log")
+
callHook("startup")
//Emergency Fix
load_mods()
diff --git a/config/example/config.txt b/config/example/config.txt
index 1075a5ab677..783adb23afa 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -61,6 +61,9 @@ LOG_PDA
## log all Topic() calls (for use by coders in tracking down Topic issues)
# LOG_HREFS
+## log world.log and runtime errors to a file
+# LOG_RUNTIME
+
## log admin warning messages
##LOG_ADMINWARN ## Also duplicates a bunch of other messages.
@@ -234,4 +237,4 @@ USEALIENWHITELIST
ALLOW_CULT_GHOSTWRITER
## Sets the minimum number of cultists needed for ghosts to write in blood.
-REQ_CULT_GHOSTWRITER 6
\ No newline at end of file
+REQ_CULT_GHOSTWRITER 6
diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi
index e269d169aa7..0fb7e01d0d7 100644
Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ