diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm
index 61c6f980fd..50e1e6b07f 100644
--- a/code/datums/spells/mind_transfer.dm
+++ b/code/datums/spells/mind_transfer.dm
@@ -57,7 +57,7 @@ Also, you never added distance checking after target is selected. I've went ahea
var/mob/caster = user//The wizard/whomever doing the body transferring.
//SPELL LOSS BEGIN
- admin_attack_log(caster, victim, "Used mind transfer on", "Had mind transfer used on him by", "used mind transfer on")
+ admin_attack_log(caster, victim, "Used mind transfer", "Was the victim of mind transfer", "used mind transfer on")
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
var/obj/effect/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly.
diff --git a/code/defines/procs/admin.dm b/code/defines/procs/admin.dm
index 2bfb8b9436..1ae066d640 100644
--- a/code/defines/procs/admin.dm
+++ b/code/defines/procs/admin.dm
@@ -2,12 +2,30 @@ proc/log_and_message_admins(var/message as text)
log_admin(usr ? "[key_name(usr)] [message]" : "EVENT [message]")
message_admins(usr ? "[key_name(usr)] [message]" : "EVENT [message]")
+proc/log_and_message_admins_many(var/list/mob/users, var/message)
+ if(!users || !users.len)
+ return
+
+ var/list/user_keys = list()
+ for(var/mob/user in users)
+ user_keys += key_name(user)
+
+ log_admin("[english_list(user_keys)] [message]")
+ message_admins("[english_list(user_keys)] [message]")
+
proc/admin_log_and_message_admins(var/message as text)
log_admin(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]")
message_admins(usr ? "[key_name_admin(usr)] [message]" : "EVENT [message]", 1)
proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, var/victim_message, var/admin_message)
- victim.attack_log += text("\[[time_stamp()]\] [victim_message] [key_name(attacker)]")
- attacker.attack_log += text("\[[time_stamp()]\] [attacker_message] [key_name(victim)]")
+ victim.attack_log += text("\[[time_stamp()]\] [key_name(attacker)] - [victim_message]")
+ attacker.attack_log += text("\[[time_stamp()]\] [key_name(victim)] - [attacker_message]")
msg_admin_attack("[key_name(attacker)] [admin_message] [key_name(victim)] (INTENT: [uppertext(attacker.a_intent)]) (JMP)")
+
+proc/admin_attacker_log_many_victims(var/mob/attacker, var/list/mob/victims, var/attacker_message, var/victim_message, var/admin_message)
+ if(!victims || !victims.len)
+ return
+
+ for(var/mob/victim in victims)
+ admin_attack_log(attacker, victim, attacker_message, victim_message, admin_message)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 041575c4b7..fab1607a27 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -460,6 +460,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
if(do_after(user, 50))
+ var/area/A = get_area(user)
+ log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].")
if(usr.get_active_hand() != src)
return
var/mob/living/carbon/human/H = user
@@ -517,6 +519,8 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/mob/living/carbon/human/H = user
R.blood_DNA = list()
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
+ var/area/A = get_area(user)
+ log_and_message_admins("created \an [r] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].")
switch(r)
if("teleport")
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 21c0b8e78b..c7df1e5381 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -111,7 +111,7 @@ var/list/sacrificed = list()
else
usr << "You sense that the power of the dark one is already working away at them."
return
-
+
usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
converting |= target
@@ -156,7 +156,7 @@ var/list/sacrificed = list()
if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate
waiting_for_input[target] = 1
-
+ admin_attack_log(usr, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on")
if(!is_convertable_to_cult(target.mind) || jobban_isbanned(target, "cultist"))//putting jobban check here because is_convertable uses mind as argument
//waiting_for_input ensures this is only shown once, so they basically auto-resist from here on out. They still need to find a way to get off the freaking rune if they don't want to burn to death, though.
target << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
@@ -179,12 +179,13 @@ var/list/sacrificed = list()
/////////////////////////////////////////FOURTH RUNE
tearreality()
- var/cultist_count = 0
+ var/list/cultists = new()
for(var/mob/M in range(1,src))
if(iscultist(M) && !M.stat)
M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
- cultist_count += 1
- if(cultist_count >= 9)
+ cultists += 1
+ if(cultists.len >= 9)
+ log_and_message_admins_many(cultists, "summoned Nar-sie.")
new /obj/machinery/singularity/narsie/large(src.loc)
if(ticker.mode.name == "cult")
ticker.mode:eldergod = 0
@@ -195,6 +196,7 @@ var/list/sacrificed = list()
/////////////////////////////////////////FIFTH RUNE
emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist
+ log_and_message_admins("activated an EMP rune.")
if(istype(src,/obj/effect/rune))
usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
else
@@ -216,6 +218,7 @@ var/list/sacrificed = list()
if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
for(var/mob/living/carbon/D in R.loc)
if(D.stat!=2)
+ admin_attack_log(usr, D, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on")
var/bdrain = rand(1,25)
D << "\red You feel weakened."
D.take_overall_damage(bdrain, 0)
@@ -456,6 +459,7 @@ var/list/sacrificed = list()
D << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible truth. The veil of reality has been ripped away and in the festering wound left behind something sinister takes root."
D << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
+ log_and_message_admins("used a manifest rune.")
var/mob/living/user = usr
while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
@@ -624,7 +628,7 @@ var/list/sacrificed = list()
C.say("Barhah hra zar[pick("'","`")]garis!")
for(var/mob/H in victims)
-
+ var/accepted = 0
var/worth = 0
if(istype(H,/mob/living/carbon/human))
var/mob/living/carbon/human/lamb = H
@@ -639,6 +643,7 @@ var/list/sacrificed = list()
H.dust()//To prevent the MMI from remaining
else
H.gib()
+ accepted = 1
usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
else
usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
@@ -646,9 +651,11 @@ var/list/sacrificed = list()
if(cultsinrange.len >= 3)
if(H.stat !=2)
if(prob(80) || worth)
+ accepted = 1
usr << "\red The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice."
ticker.mode:grant_runeword(usr)
else
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, this soul was not enough to gain His favor."
if(isrobot(H))
@@ -657,9 +664,11 @@ var/list/sacrificed = list()
H.gib()
else
if(prob(40) || worth)
+ accepted = 1
usr << "\red The Geometer of blood accepts this [worth ? "exotic " : ""]sacrifice."
ticker.mode:grant_runeword(usr)
else
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
@@ -671,9 +680,11 @@ var/list/sacrificed = list()
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else
if(prob(40))
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
else
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
@@ -684,9 +695,11 @@ var/list/sacrificed = list()
if(cultsinrange.len >= 3)
if(H.stat !=2)
if(prob(80))
+ accepted = 1
usr << "\red The Geometer of Blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
else
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, this soul was not enough to gain His favor."
if(isrobot(H))
@@ -695,9 +708,11 @@ var/list/sacrificed = list()
H.gib()
else
if(prob(40))
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
else
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
@@ -709,15 +724,20 @@ var/list/sacrificed = list()
usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
else
if(prob(40))
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
ticker.mode:grant_runeword(usr)
else
+ accepted = 1
usr << "\red The Geometer of blood accepts this sacrifice."
usr << "\red However, a mere dead body is not enough to satisfy Him."
if(isrobot(H))
H.dust()//To prevent the MMI from remaining
else
H.gib()
+ if(accepted)
+ admin_attack_log(usr, H, "Used a sacrifice rune.", "Was victim of a sacrifice rune.", "used a sacrifice rune on")
+ log_and_message_admins_many(cultsinrange - usr, "Assisted activating a sacrifice rune.")
for(var/mob/living/carbon/monkey/M in src.loc)
if (ticker.mode.name == "cult")
if(M.mind == ticker.mode:sacrifice_target)
@@ -888,7 +908,7 @@ var/list/sacrificed = list()
deafen()
if(istype(src,/obj/effect/rune))
- var/affected = 0
+ var/list/affected = new()
for(var/mob/living/carbon/C in range(7,src))
if (iscultist(C))
continue
@@ -897,17 +917,18 @@ var/list/sacrificed = list()
continue
C.ear_deaf += 50
C.show_message("\red The world around you suddenly becomes quiet.", 3)
- affected++
+ affected += C
if(prob(1))
C.sdisabilities |= DEAF
- if(affected)
+ if(affected.len)
usr.say("Sti[pick("'","`")] kaliedir!")
usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust."
+ admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
del(src)
else
return fizzle()
else
- var/affected = 0
+ var/list/affected = new()
for(var/mob/living/carbon/C in range(7,usr))
if (iscultist(C))
continue
@@ -917,10 +938,11 @@ var/list/sacrificed = list()
C.ear_deaf += 30
//talismans is weaker.
C.show_message("\red The world around you suddenly becomes quiet.", 3)
- affected++
- if(affected)
+ affected += C
+ if(affected.len)
usr.whisper("Sti[pick("'","`")] kaliedir!")
usr << "\red Your talisman turns into gray dust, deafening everyone around."
+ admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
for (var/mob/V in orange(1,src))
if(!(iscultist(V)))
V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
@@ -928,7 +950,7 @@ var/list/sacrificed = list()
blind()
if(istype(src,/obj/effect/rune))
- var/affected = 0
+ var/list/affected = new()
for(var/mob/living/carbon/C in viewers(src))
if (iscultist(C))
continue
@@ -942,15 +964,16 @@ var/list/sacrificed = list()
if(prob(10))
C.sdisabilities |= BLIND
C.show_message("\red Suddenly you see red flash that blinds you.", 3)
- affected++
- if(affected)
+ affected += C
+ if(affected.len)
usr.say("Sti[pick("'","`")] kaliesin!")
usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
+ admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
del(src)
else
return fizzle()
else
- var/affected = 0
+ var/list/affected = new()
for(var/mob/living/carbon/C in view(2,usr))
if (iscultist(C))
continue
@@ -960,11 +983,12 @@ var/list/sacrificed = list()
C.eye_blurry += 30
C.eye_blind += 10
//talismans is weaker.
- affected++
+ affected += C
C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
- if(affected)
+ if(affected.len)
usr.whisper("Sti[pick("'","`")] kaliesin!")
usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
+ admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
return
@@ -975,12 +999,13 @@ var/list/sacrificed = list()
if (istype(H.current,/mob/living/carbon))
cultists+=H.current
*/
- var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood.
+ var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood.
+ var/list/victims = new
// var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood.
for(var/mob/living/carbon/C in orange(1,src))
if(iscultist(C) && !C.stat)
- culcount++
- if(culcount>=3)
+ cultists+=C
+ if(cultists.len>=3)
for(var/mob/living/carbon/M in viewers(usr))
if(iscultist(M))
continue
@@ -989,6 +1014,7 @@ var/list/sacrificed = list()
continue
M.take_overall_damage(51,51)
M << "\red Your blood boils!"
+ victims += M
if(prob(5))
spawn(5)
M.gib()
@@ -999,6 +1025,8 @@ var/list/sacrificed = list()
if(iscultist(C) && !C.stat)
C.say("Dedo ol[pick("'","`")]btoh!")
C.take_overall_damage(15, 0)
+ admin_attacker_log_many_victims(usr, victims, "Used a blood boil rune.", "Was the victim of a blood boil rune.", "used a blood boil rune on")
+ log_and_message_admins_many(cultists - usr, "assisted activating a blood boil rune.")
del(src)
else
return fizzle()
@@ -1038,7 +1066,6 @@ var/list/sacrificed = list()
if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
usr.say("Fuu ma[pick("'","`")]jin!")
for(var/mob/living/L in viewers(src))
-
if(iscarbon(L))
var/mob/living/carbon/C = L
flick("e_flash", C.flash)
@@ -1047,11 +1074,13 @@ var/list/sacrificed = list()
C.Weaken(1)
C.Stun(1)
C.show_message("\red The rune explodes in a bright flash.", 3)
+ admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
else if(issilicon(L))
var/mob/living/silicon/S = L
S.Weaken(5)
S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3)
+ admin_attack_log(usr, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
del(src)
else ///When invoked as talisman, stun and mute the target mob.
usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
@@ -1065,7 +1094,7 @@ var/list/sacrificed = list()
if(issilicon(T))
T.Weaken(15)
-
+ admin_attack_log(usr, T, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
else if(iscarbon(T))
var/mob/living/carbon/C = T
flick("e_flash", C.flash)
@@ -1073,6 +1102,7 @@ var/list/sacrificed = list()
C.silent += 15
C.Weaken(25)
C.Stun(25)
+ admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
return
/////////////////////////////////////////TWENTY-FIFTH RUNE
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 0f17664427..f20b04de8a 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -290,7 +290,7 @@ var/list/admin_verbs_mentor = list(
if(holder.rights & R_SERVER) verbs += admin_verbs_server
if(holder.rights & R_DEBUG)
verbs += admin_verbs_debug
- if(config.debugparanoid && !check_rights(R_ADMIN))
+ if(config.debugparanoid && !(holder.rights & R_ADMIN))
verbs.Remove(admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on.
if(holder.rights & R_POSSESS) verbs += admin_verbs_possess
if(holder.rights & R_PERMISSIONS) verbs += admin_verbs_permissions
diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm
index 5ac54a0498..dae2c09cbd 100644
--- a/code/modules/client/preferences_gear.dm
+++ b/code/modules/client/preferences_gear.dm
@@ -661,6 +661,12 @@ var/global/list/gear_datums = list()
cost = 2
slot = slot_shoes
+/datum/gear/toeless_jackboots
+ display_name = "toe-less jackboots"
+ path = /obj/item/clothing/shoes/jackboots/fluff/kecer_eldraran //permisson of owner of custom item was granted
+ cost = 2
+ slot = slot_shoes
+
/datum/gear/sandal
display_name = "sandals"
path = /obj/item/clothing/shoes/sandal
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 38f2f1610d..6c91d2de03 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -194,7 +194,7 @@
update_icon()
/obj/item/weapon/paper/proc/get_signature(var/obj/item/weapon/pen/P, mob/user as mob)
- if(P)
+ if(P && istype(P, /obj/item/weapon/pen))
return P.get_signature(user)
return (user && user.real_name) ? user.real_name : "Anonymous"
@@ -324,7 +324,17 @@
if(href_list["write"])
var/id = href_list["write"]
//var/t = strip_html_simple(input(usr, "What text do you wish to add to " + (id=="end" ? "the end of the paper" : "field "+id) + "?", "[name]", null),8192) as message
- var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, MAX_PAPER_MESSAGE_LEN)
+
+ var/textlimit = MAX_PAPER_MESSAGE_LEN - length(info)
+ if(textlimit <= 0)
+ usr << "You're trying to find a free place on paper, but can't!"
+ return
+
+ var/t = strip_html_simple(input("Enter what you want to write:", "Write", null, null) as message, textlimit)
+
+ if(!t)
+ return
+
var/obj/item/i = usr.get_active_hand() // Check to see if he still got that darn pen, also check if he's using a crayon or pen.
var/iscrayon = 0
if(!istype(i, /obj/item/weapon/pen))
@@ -347,10 +357,18 @@
message_admins("PAPER: [usr] ([usr.ckey]) tried to use forbidden word in [src]: [bad].")
return
*/
+ var last_fields_value = fields
+
t = html_encode(t)
t = replacetext(t, "\n", "
")
t = parsepencode(t, i, usr, iscrayon) // Encode everything from pencode to html
+
+ if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield()
+ usr << "Too many fields. Sorry, you can't do this."
+ fields = last_fields_value
+ return
+
if(id!="end")
addtofield(text2num(id), t) // He wants to edit a field, let him.
else