mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-29 23:17:02 +01:00
Fixes merge conflict in event_container
This commit is contained in:
@@ -164,7 +164,7 @@
|
||||
desc = "This implant with synthesize and pump into your bloodstream a small amount of nutriment when you are starving."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#00AA00"
|
||||
var/hunger_threshold = 150
|
||||
var/hunger_threshold = NUTRITION_LEVEL_STARVING
|
||||
var/synthesizing = 0
|
||||
var/poison_amount = 5
|
||||
slot = "stomach"
|
||||
@@ -195,7 +195,7 @@
|
||||
desc = "This implant will synthesize and pump into your bloodstream a small amount of nutriment when you are hungry."
|
||||
icon_state = "chest_implant"
|
||||
implant_color = "#006607"
|
||||
hunger_threshold = 300
|
||||
hunger_threshold = NUTRITION_LEVEL_HUNGRY
|
||||
poison_amount = 10
|
||||
origin_tech = "materials=5;programming=3;biotech=5"
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
if(mind) //Handles vampires "eating" blood that isn't their own.
|
||||
if(mind in ticker.mode.vampires)
|
||||
for(var/datum/reagent/blood/BL in vessel.reagent_list)
|
||||
if(nutrition >= 450)
|
||||
if(nutrition >= NUTRITION_LEVEL_WELL_FED)
|
||||
break //We don't want blood tranfusions making vampires fat.
|
||||
if(BL.data["donor"] != src)
|
||||
nutrition += (15 * REAGENTS_METABOLISM)
|
||||
@@ -186,6 +186,16 @@
|
||||
temp_chem += R.id
|
||||
temp_chem[R.id] = R.volume
|
||||
B.data["trace_chem"] = list2params(temp_chem)
|
||||
if(mind)
|
||||
B.data["mind"] = mind
|
||||
if(ckey)
|
||||
B.data["ckey"] = ckey
|
||||
|
||||
if(!suiciding)
|
||||
B.data["cloneable"] = 1
|
||||
B.data["gender"] = gender
|
||||
B.data["real_name"] = real_name
|
||||
B.data["factions"] = faction
|
||||
return B
|
||||
|
||||
//For humans, blood does not appear from blue, it comes from vessels.
|
||||
|
||||
@@ -228,10 +228,10 @@ var/list/organ_cache = list()
|
||||
/obj/item/organ/proc/take_damage(amount, var/silent=0)
|
||||
if(tough)
|
||||
return
|
||||
if(src.status & ORGAN_ROBOT)
|
||||
src.damage = between(0, src.damage + (amount * 0.8), max_damage)
|
||||
if(status & ORGAN_ROBOT)
|
||||
damage = between(0, damage + (amount * 0.8), max_damage)
|
||||
else
|
||||
src.damage = between(0, src.damage + amount, max_damage)
|
||||
damage = between(0, damage + amount, max_damage)
|
||||
|
||||
//only show this if the organ is not robotic
|
||||
if(owner && parent_organ && amount > 0)
|
||||
@@ -241,18 +241,18 @@ var/list/organ_cache = list()
|
||||
|
||||
/obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc
|
||||
robotic = 2
|
||||
src.status &= ~ORGAN_BROKEN
|
||||
src.status &= ~ORGAN_BLEEDING
|
||||
src.status &= ~ORGAN_SPLINTED
|
||||
src.status &= ~ORGAN_CUT_AWAY
|
||||
src.status &= ~ORGAN_ATTACHABLE
|
||||
src.status &= ~ORGAN_DESTROYED
|
||||
src.status |= ORGAN_ROBOT
|
||||
src.status |= ORGAN_ASSISTED
|
||||
status &= ~ORGAN_BROKEN
|
||||
status &= ~ORGAN_BLEEDING
|
||||
status &= ~ORGAN_SPLINTED
|
||||
status &= ~ORGAN_CUT_AWAY
|
||||
status &= ~ORGAN_ATTACHABLE
|
||||
status &= ~ORGAN_DESTROYED
|
||||
status |= ORGAN_ROBOT
|
||||
status |= ORGAN_ASSISTED
|
||||
|
||||
/obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc
|
||||
robotize()
|
||||
src.status &= ~ORGAN_ROBOT
|
||||
robotize(1) //Skip the icon/name setting that occurs in robotize to avoid having to reset the icon file.
|
||||
status &= ~ORGAN_ROBOT
|
||||
robotic = 1
|
||||
min_bruised_damage = 15
|
||||
min_broken_damage = 35
|
||||
@@ -309,8 +309,8 @@ var/list/organ_cache = list()
|
||||
|
||||
if(owner && vital && is_primary_organ()) // I'd do another check for species or whatever so that you couldn't "kill" an IPC by removing a human head from them, but it doesn't matter since they'll come right back from the dead
|
||||
if(user)
|
||||
user.attack_log += "\[[time_stamp()]\]<font color='red'> removed a vital organ ([src]) from [key_name(owner)] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
owner.attack_log += "\[[time_stamp()]\]<font color='orange'> had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)])</font>"
|
||||
user.create_attack_log("<font color='red'> removed a vital organ ([src]) from [key_name(owner)] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
owner.create_attack_log("<font color='orange'> had a vital organ ([src]) removed by [key_name(user)] (INTENT: [uppertext(user.a_intent)])</font>")
|
||||
msg_admin_attack("[key_name_admin(user)] removed a vital organ ([src]) from [key_name_admin(owner)]")
|
||||
owner.death()
|
||||
owner = null
|
||||
@@ -325,7 +325,7 @@ var/list/organ_cache = list()
|
||||
affected.internal_organs |= src
|
||||
if(!target.get_int_organ(src))
|
||||
target.internal_organs += src
|
||||
src.loc = target
|
||||
loc = target
|
||||
if(robotic)
|
||||
status |= ORGAN_ROBOT
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
|
||||
/obj/item/organ/internal/heart/prepare_eat()
|
||||
var/obj/S = ..()
|
||||
S.icon_state = "heart-off"
|
||||
S.icon_state = dead_icon
|
||||
return S
|
||||
|
||||
/obj/item/organ/internal/heart/cursed
|
||||
@@ -343,16 +343,47 @@
|
||||
parent_organ = "head"
|
||||
slot = "eyes"
|
||||
var/list/eye_colour = list(0,0,0)
|
||||
var/list/colourmatrix = null
|
||||
var/list/colourblind_matrix = MATRIX_GREYSCALE //Special colourblindness parameters. By default, it's black-and-white.
|
||||
var/colourblind_darkview = null
|
||||
var/dependent_disabilities = null //Gets set by eye-dependent disabilities such as colourblindness so the eyes can transfer the disability during transplantation.
|
||||
var/dark_view = 2 //Default dark_view for Humans.
|
||||
var/weld_proof = null //If set, the eyes will not take damage during welding. eg. IPC optical sensors do not take damage when they weld things while all other eyes will.
|
||||
|
||||
/obj/item/organ/internal/eyes/proc/update_colour()
|
||||
dna.write_eyes_attributes(src)
|
||||
|
||||
/obj/item/organ/internal/eyes/insert(mob/living/carbon/M, special = 0)
|
||||
/obj/item/organ/internal/eyes/proc/get_colourmatrix() //Returns a special colour matrix if the eyes are organic and the mob is colourblind, otherwise it uses the current one.
|
||||
if(!robotic && owner.disabilities & COLOURBLIND)
|
||||
return colourblind_matrix
|
||||
else
|
||||
return colourmatrix
|
||||
|
||||
/obj/item/organ/internal/eyes/proc/get_dark_view() //Returns dark_view (if the eyes are organic) for see_invisible handling in species.dm to be autoprocessed by life().
|
||||
if(!robotic && colourblind_darkview && owner.disabilities & COLOURBLIND) //Returns special darkview value if colourblind and it exists, otherwise reuse current.
|
||||
return colourblind_darkview
|
||||
else
|
||||
return dark_view
|
||||
|
||||
/obj/item/organ/internal/eyes/insert(mob/living/carbon/human/M, special = 0)
|
||||
..()
|
||||
if(istype(M) && eye_colour)
|
||||
var/mob/living/carbon/human/H = M
|
||||
// Apply our eye colour to the target.
|
||||
H.update_body()
|
||||
M.update_body() //Apply our eye colour to the target.
|
||||
|
||||
if(!(M.disabilities & COLOURBLIND) && (dependent_disabilities & COLOURBLIND)) //If the eyes are colourblind and we're not, carry over the gene.
|
||||
dependent_disabilities &= ~COLOURBLIND
|
||||
M.dna.SetSEState(COLOURBLINDBLOCK,1)
|
||||
genemutcheck(M,COLOURBLINDBLOCK,null,MUTCHK_FORCED)
|
||||
else
|
||||
M.update_client_colour() //If we're here, that means the mob acquired the colourblindness gene while they didn't have eyes. Better handle it.
|
||||
|
||||
/obj/item/organ/internal/eyes/remove(mob/living/carbon/human/M, special = 0)
|
||||
if(!special && (M.disabilities & COLOURBLIND)) //If special is set, that means these eyes are getting deleted (i.e. during set_species())
|
||||
if(!(dependent_disabilities & COLOURBLIND)) //We only want to change COLOURBLINDBLOCK and such it the eyes are being surgically removed.
|
||||
dependent_disabilities |= COLOURBLIND
|
||||
M.dna.SetSEState(COLOURBLINDBLOCK,0)
|
||||
genemutcheck(M,COLOURBLINDBLOCK,null,MUTCHK_FORCED)
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/eyes/surgeryize()
|
||||
if(!owner)
|
||||
@@ -362,6 +393,38 @@
|
||||
owner.SetEyeBlurry(0)
|
||||
owner.SetEyeBlind(0)
|
||||
|
||||
/obj/item/organ/internal/robotize(var/icon_bypass) //If icon bypass isn't null, skip the processing here and go straight to the parent call.
|
||||
if(!icon_bypass && !(status & ORGAN_ROBOT)) //Don't override the icons for the already-mechanical IPC organs.
|
||||
var/list/states = icon_states('icons/obj/surgery.dmi') //Insensitive to specially-defined icon files for species like the Drask or whomever else. Everyone gets the same robotic heart.
|
||||
if(slot == "heart" && ("[slot]-prosthetic-on" in states) && ("[slot]-prosthetic-off" in states)) //Give the robotic heart its robotic heart icons if they exist.
|
||||
var/obj/item/organ/internal/heart/H = src
|
||||
H.icon = icon('icons/obj/surgery.dmi')
|
||||
H.icon_base = "[slot]-prosthetic"
|
||||
H.dead_icon = "[slot]-prosthetic-off"
|
||||
H.update_icon()
|
||||
else if("[slot]-prosthetic" in states) //Give the robotic organ its robotic organ icons if they exist.
|
||||
icon = icon('icons/obj/surgery.dmi')
|
||||
icon_state = "[slot]-prosthetic"
|
||||
name = "mechanical [slot]"
|
||||
..() //Go apply all the organ flags/robotic statuses.
|
||||
|
||||
/obj/item/organ/internal/eyes/robotize()
|
||||
colourmatrix = null
|
||||
dark_view = 2
|
||||
..() //Make sure the organ's got the robotic status indicators before updating the client colour.
|
||||
owner.update_client_colour(0) //Since both mechassisted and mechanical eyes give dark_view of 2 and full colour vision atm, just having this here is fine as mechassist() will call it anyway.
|
||||
|
||||
/obj/item/organ/internal/mechassist()
|
||||
..() //Go back, call robotize(), adjust the robotic status indicators and the organ damage parameters.
|
||||
var/list/states = icon_states(icon) //Sensitive to specially-defined icon files since the organs are not fully synthetic.
|
||||
if(slot == "heart" && ("[organ_tag]-assisted-on" in states) && ("[organ_tag]-assisted-off" in states)) //Give the mechassisted heart its mechassisted heart icons if they exist.
|
||||
var/obj/item/organ/internal/heart/H = src
|
||||
H.icon_base = "[organ_tag]-assisted"
|
||||
H.dead_icon = "[organ_tag]-assisted-off"
|
||||
H.update_icon()
|
||||
else if("[organ_tag]-assisted" in states) //Give the mechassisted organ its mechassisted organ icons if they exist.
|
||||
icon_state = "[organ_tag]-assisted"
|
||||
name = "mechanically assisted [initial(name)]" //Avoid setting the organ's name to something like "mechanically assisted mechanical eyes".
|
||||
|
||||
/obj/item/organ/internal/liver
|
||||
name = "liver"
|
||||
@@ -372,7 +435,6 @@
|
||||
var/alcohol_intensity = 1
|
||||
|
||||
/obj/item/organ/internal/liver/process()
|
||||
|
||||
..()
|
||||
|
||||
if(!owner)
|
||||
@@ -526,7 +588,7 @@
|
||||
/obj/item/organ/internal/honktumor/process()
|
||||
if(isturf(loc))
|
||||
visible_message("<span class='warning'>[src] honks in on itself!</span>")
|
||||
new /obj/item/weapon/bananapeel(get_turf(loc))
|
||||
new /obj/item/weapon/grown/bananapeel(get_turf(loc))
|
||||
qdel(src)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/obj/item/organ/internal/eyes/abductor
|
||||
name = "abductor eyeballs"
|
||||
dark_view = 3
|
||||
species = "Abductor"
|
||||
@@ -1,22 +1,3 @@
|
||||
/*/proc/spawn_diona_nymph_from_organ(var/obj/item/organ/organ)
|
||||
if(!istype(organ))
|
||||
return 0
|
||||
|
||||
//This is a terrible hack and I should be ashamed.
|
||||
var/datum/seed/diona = plant_controller.seeds["diona"]
|
||||
if(!diona)
|
||||
return 0
|
||||
|
||||
spawn(1) // So it has time to be thrown about by the gib() proc.
|
||||
var/mob/living/simple_animal/diona/D = new(get_turf(organ))
|
||||
var/datum/ghosttrap/plant/P = get_ghost_trap("living plant")
|
||||
P.request_player(D, "A diona nymph has split off from its gestalt. ")
|
||||
spawn(60)
|
||||
if(D)
|
||||
if(!D.ckey || !D.client)
|
||||
D.death()
|
||||
return 1 */
|
||||
|
||||
/obj/item/organ/external/chest/diona
|
||||
name = "core trunk"
|
||||
max_damage = 200
|
||||
@@ -116,74 +97,42 @@
|
||||
/obj/item/organ/diona/process()
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/heart/diona
|
||||
/obj/item/organ/internal/heart/diona // Turns into a nymph instantly, no transplanting possible.
|
||||
name = "neural strata"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "nymph"
|
||||
organ_tag = "heart" // Turns into a nymph instantly, no transplanting possible.
|
||||
origin_tech = "biotech=3"
|
||||
parent_organ = "chest"
|
||||
slot = "heart"
|
||||
species = "Diona"
|
||||
|
||||
/obj/item/organ/internal/brain/diona
|
||||
/obj/item/organ/internal/brain/diona // Turns into a nymph instantly, no transplanting possible.
|
||||
name = "gas bladder"
|
||||
parent_organ = "head"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "nymph"
|
||||
organ_tag = "brain" // Turns into a nymph instantly, no transplanting possible.
|
||||
origin_tech = "biotech=3"
|
||||
slot = "brain"
|
||||
species = "Diona"
|
||||
|
||||
/obj/item/organ/internal/kidneys/diona
|
||||
/obj/item/organ/internal/kidneys/diona // Turns into a nymph instantly, no transplanting possible.
|
||||
name = "polyp segment"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "nymph"
|
||||
organ_tag = "kidneys" // Turns into a nymph instantly, no transplanting possible.
|
||||
origin_tech = "biotech=3"
|
||||
parent_organ = "groin"
|
||||
slot = "kidneys"
|
||||
species = "Diona"
|
||||
|
||||
/obj/item/organ/internal/appendix/diona
|
||||
/obj/item/organ/internal/appendix/diona // Turns into a nymph instantly, no transplanting possible.
|
||||
name = "anchoring ligament"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
icon_state = "nymph"
|
||||
organ_tag = "appendix" // Turns into a nymph instantly, no transplanting possible.
|
||||
origin_tech = "biotech=3"
|
||||
parent_organ = "groin"
|
||||
slot = "appendix"
|
||||
species = "Diona"
|
||||
|
||||
/obj/item/organ/internal/diona_receptor
|
||||
/obj/item/organ/internal/eyes/diona // Turns into a nymph instantly, no transplanting possible.
|
||||
name = "receptor node"
|
||||
organ_tag = "eyes"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "claw"
|
||||
origin_tech = "biotech=3"
|
||||
parent_organ = "head"
|
||||
slot = "eyes"
|
||||
species = "Diona"
|
||||
|
||||
/obj/item/organ/internal/diona_receptor/surgeryize()
|
||||
if(!owner)
|
||||
return
|
||||
owner.CureNearsighted()
|
||||
owner.CureBlind()
|
||||
owner.SetEyeBlurry(0)
|
||||
owner.SetEyeBlind(0)
|
||||
|
||||
|
||||
//TODO:Make absorb rads on insert
|
||||
|
||||
/obj/item/organ/internal/liver/diona
|
||||
/obj/item/organ/internal/liver/diona // Turns into a nymph instantly, no transplanting possible.
|
||||
name = "nutrient vessel"
|
||||
parent_organ = "chest"
|
||||
organ_tag = "liver"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
icon_state = "claw"
|
||||
slot = "liver"
|
||||
alcohol_intensity = 0.5
|
||||
species = "Diona"
|
||||
|
||||
|
||||
@@ -9,51 +9,29 @@
|
||||
/obj/item/organ/internal/heart/drask
|
||||
name = "drask heart"
|
||||
icon = 'icons/obj/surgery_drask.dmi'
|
||||
icon_state = "heart-on"
|
||||
dead_icon = "heart-off"
|
||||
organ_tag = "heart"
|
||||
parent_organ = "head"
|
||||
slot = "heart"
|
||||
species = "Drask"
|
||||
|
||||
/obj/item/organ/internal/lungs/drask
|
||||
name = "lungs"
|
||||
icon = 'icons/obj/surgery_drask.dmi'
|
||||
icon_state = "lungs"
|
||||
gender = PLURAL
|
||||
organ_tag = "lungs"
|
||||
parent_organ = "chest"
|
||||
slot = "lungs"
|
||||
species = "Drask"
|
||||
|
||||
/obj/item/organ/internal/liver/drask
|
||||
name = "metabolic strainer"
|
||||
icon = 'icons/obj/surgery_drask.dmi'
|
||||
icon_state = "kidneys"
|
||||
gender = PLURAL
|
||||
organ_tag = "kidneys"
|
||||
parent_organ = "groin"
|
||||
slot = "kidneys"
|
||||
alcohol_intensity = 0.8
|
||||
species = "Drask"
|
||||
|
||||
/obj/item/organ/internal/brain/drask
|
||||
name = "brain"
|
||||
icon = 'icons/obj/surgery_drask.dmi'
|
||||
icon_state = "brain2"
|
||||
organ_tag = "brain"
|
||||
slot = "brain"
|
||||
mmi_icon = 'icons/obj/surgery_drask.dmi'
|
||||
mmi_icon_state = "mmi_full"
|
||||
species = "Drask"
|
||||
|
||||
/obj/item/organ/internal/eyes/drask
|
||||
name = "eyes"
|
||||
name = "drask eyeballs"
|
||||
icon = 'icons/obj/surgery_drask.dmi'
|
||||
icon_state = "eyes"
|
||||
gender = PLURAL
|
||||
organ_tag = "eyes"
|
||||
parent_organ = "head"
|
||||
slot = "eyes"
|
||||
desc = "Drask eyes. They look even stranger disembodied"
|
||||
dark_view = 5
|
||||
species = "Drask"
|
||||
|
||||
@@ -14,3 +14,8 @@
|
||||
/obj/item/organ/internal/brain/grey/remove(var/mob/living/carbon/M, var/special = 0)
|
||||
. = ..()
|
||||
M.remove_language("Psionic Communication")
|
||||
|
||||
/obj/item/organ/internal/eyes/grey
|
||||
name = "grey eyeballs"
|
||||
dark_view = 5
|
||||
species = "Grey"
|
||||
|
||||
@@ -117,37 +117,26 @@
|
||||
robotize()
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/optical_sensor
|
||||
/obj/item/organ/internal/eyes/optical_sensor
|
||||
name = "optical sensor"
|
||||
organ_tag = "eyes"
|
||||
parent_organ = "head"
|
||||
icon = 'icons/obj/robot_component.dmi'
|
||||
icon_state = "camera"
|
||||
slot = "eyes"
|
||||
status = ORGAN_ROBOT
|
||||
species = "Machine"
|
||||
// dead_icon = "camera_broken"
|
||||
weld_proof = 1
|
||||
|
||||
/obj/item/organ/internal/optical_sensor/New()
|
||||
/obj/item/organ/internal/eyes/optical_sensor/New()
|
||||
robotize()
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/organ/internal/optical_sensor/remove(var/mob/living/user,special = 0)
|
||||
/obj/item/organ/internal/eyes/optical_sensor/remove(var/mob/living/user,special = 0)
|
||||
if(!special)
|
||||
to_chat(owner, "Error 404:Optical Sensors not found.")
|
||||
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/optical_sensor/surgeryize()
|
||||
if(!owner)
|
||||
return
|
||||
owner.CureNearsighted()
|
||||
owner.CureBlind()
|
||||
owner.SetEyeBlurry(0)
|
||||
owner.SetEyeBlind(0)
|
||||
|
||||
|
||||
// Used for an MMI or posibrain being installed into a human.
|
||||
/obj/item/organ/internal/brain/mmi_holder
|
||||
name = "brain"
|
||||
@@ -160,7 +149,6 @@
|
||||
species = "Machine"
|
||||
var/obj/item/device/mmi/stored_mmi
|
||||
|
||||
|
||||
/obj/item/organ/internal/brain/mmi_holder/Destroy()
|
||||
if(stored_mmi)
|
||||
qdel(stored_mmi)
|
||||
|
||||
@@ -26,8 +26,6 @@
|
||||
icon_state = "crystal-eyes"
|
||||
organ_tag = "luminescent eyes"
|
||||
light_color = "#1C1C00"
|
||||
parent_organ = "head"
|
||||
slot = "eyes"
|
||||
species = "Nucleation"
|
||||
|
||||
/obj/item/organ/internal/eyes/luminescent_crystal/New()
|
||||
@@ -35,8 +33,7 @@
|
||||
..()
|
||||
|
||||
/obj/item/organ/internal/brain/crystal
|
||||
name = "crystalized brain"
|
||||
name = "crystallized brain"
|
||||
icon_state = "crystal-brain"
|
||||
organ_tag = "crystalized brain"
|
||||
slot = "brain"
|
||||
organ_tag = "crystallized brain"
|
||||
species = "Nucleation"
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/obj/item/organ/internal/eyes/shadow
|
||||
name = "dark orbs"
|
||||
dark_view = 8
|
||||
species = "Shadow"
|
||||
@@ -103,7 +103,7 @@
|
||||
can_stand = 1
|
||||
|
||||
/obj/item/organ/external/foot/remove()
|
||||
if(owner.shoes) owner.unEquip(owner.shoes)
|
||||
if(owner && owner.shoes) owner.unEquip(owner.shoes)
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/external/foot/right
|
||||
@@ -128,12 +128,13 @@
|
||||
can_grasp = 1
|
||||
|
||||
/obj/item/organ/external/hand/remove()
|
||||
if(owner.gloves)
|
||||
owner.unEquip(owner.gloves)
|
||||
if(owner.l_hand)
|
||||
owner.unEquip(owner.l_hand,1)
|
||||
if(owner.r_hand)
|
||||
owner.unEquip(owner.r_hand,1)
|
||||
if(owner)
|
||||
if(owner.gloves)
|
||||
owner.unEquip(owner.gloves)
|
||||
if(owner.l_hand)
|
||||
owner.unEquip(owner.l_hand,1)
|
||||
if(owner.r_hand)
|
||||
owner.unEquip(owner.r_hand,1)
|
||||
|
||||
. = ..()
|
||||
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
/obj/item/organ/internal/liver/tajaran
|
||||
alcohol_intensity = 1.4
|
||||
species = "Tajaran"
|
||||
|
||||
/obj/item/organ/internal/eyes/tajaran /*Most Tajara see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
|
||||
unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
|
||||
name = "tajaran eyeballs"
|
||||
species = "Tajaran"
|
||||
colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
|
||||
colourblind_darkview = 8
|
||||
|
||||
/obj/item/organ/internal/eyes/tajaran/farwa //Being the lesser form of Tajara, Farwas have an utterly incurable version of their colourblindness.
|
||||
name = "farwa eyeballs"
|
||||
species = "Farwa"
|
||||
colourmatrix = MATRIX_TAJ_CBLIND
|
||||
dark_view = 8
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
/obj/item/organ/internal/liver/unathi
|
||||
alcohol_intensity = 0.8
|
||||
species = "Unathi"
|
||||
|
||||
/obj/item/organ/internal/eyes/unathi
|
||||
name = "unathi eyeballs"
|
||||
dark_view = 3
|
||||
species = "Unathi"
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
/obj/item/organ/internal/liver/vulpkanin
|
||||
alcohol_intensity = 1.4
|
||||
species = "Vulpkanin"
|
||||
|
||||
/obj/item/organ/internal/eyes/vulpkanin /*Most Vulpkanin see in full colour as a result of genetic augmentation, although it cost them their darksight (darksight = 2)
|
||||
unless they choose otherwise by selecting the colourblind disability in character creation (darksight = 8 but colourblind).*/
|
||||
name = "vulpkanin eyeballs"
|
||||
species = "Vulpkanin"
|
||||
colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
|
||||
colourblind_darkview = 8
|
||||
|
||||
/obj/item/organ/internal/eyes/vulpkanin/wolpin //Being the lesser form of Vulpkanin, Wolpins have an utterly incurable version of their colourblindness.
|
||||
name = "wolpin eyeballs"
|
||||
species = "Wolpin"
|
||||
colourmatrix = MATRIX_VULP_CBLIND
|
||||
dark_view = 8
|
||||
|
||||
@@ -7,3 +7,7 @@
|
||||
parent_organ = "head"
|
||||
slot = "hivenode"
|
||||
species = "Wryn"
|
||||
|
||||
/obj/item/organ/internal/eyes/wryn
|
||||
dark_view = 3
|
||||
species = "Wryn"
|
||||
|
||||
@@ -0,0 +1,455 @@
|
||||
var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt")
|
||||
var/static/regex/weaken_words = regex("drop|fall|trip")
|
||||
var/static/regex/sleep_words = regex("sleep|slumber")
|
||||
var/static/regex/vomit_words = regex("vomit|throw up")
|
||||
var/static/regex/silence_words = regex("shut up|silence|ssh|quiet|hush")
|
||||
var/static/regex/hallucinate_words = regex("see the truth|hallucinate")
|
||||
var/static/regex/wakeup_words = regex("wake up|awaken")
|
||||
var/static/regex/heal_words = regex("live|heal|survive|mend|heroes never die")
|
||||
var/static/regex/hurt_words = regex("die|suffer")
|
||||
var/static/regex/bleed_words = regex("bleed")
|
||||
var/static/regex/burn_words = regex("burn|ignite")
|
||||
var/static/regex/repulse_words = regex("shoo|go away|leave me alone|begone|flee|fus ro dah")
|
||||
var/static/regex/whoareyou_words = regex("who are you|say your name|state your name|identify")
|
||||
var/static/regex/saymyname_words = regex("say my name")
|
||||
var/static/regex/knockknock_words = regex("knock knock")
|
||||
var/static/regex/statelaws_words = regex("state laws|state your laws")
|
||||
var/static/regex/move_words = regex("move")
|
||||
var/static/regex/walk_words = regex("walk|slow down")
|
||||
var/static/regex/run_words = regex("run")
|
||||
var/static/regex/helpintent_words = regex("help")
|
||||
var/static/regex/disarmintent_words = regex("disarm")
|
||||
var/static/regex/grabintent_words = regex("grab")
|
||||
var/static/regex/harmintent_words = regex("harm|fight")
|
||||
var/static/regex/throwmode_words = regex("throw|catch")
|
||||
var/static/regex/flip_words = regex("flip|rotate|revolve|roll|somersault")
|
||||
var/static/regex/rest_words = regex("rest")
|
||||
var/static/regex/getup_words = regex("get up")
|
||||
var/static/regex/sit_words = regex("sit")
|
||||
var/static/regex/stand_words = regex("stand")
|
||||
var/static/regex/dance_words = regex("dance")
|
||||
var/static/regex/jump_words = regex("jump")
|
||||
var/static/regex/salute_words = regex("salute")
|
||||
var/static/regex/deathgasp_words = regex("play dead")
|
||||
var/static/regex/clap_words = regex("clap|applaud")
|
||||
var/static/regex/honk_words = regex("ho+nk") //hooooooonk
|
||||
var/static/regex/multispin_words = regex("like a record baby")
|
||||
|
||||
/obj/item/organ/internal/vocal_cords //organs that are activated through speech with the :x channel
|
||||
name = "vocal cords"
|
||||
icon_state = "appendix"
|
||||
zone = "mouth"
|
||||
slot = "vocal_cords"
|
||||
parent_organ = "mouth"
|
||||
var/spans = null
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/proc/can_speak_with() //if there is any limitation to speaking with these cords
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/proc/speak_with(message) //do what the organ does
|
||||
return
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/proc/handle_speech(message) //change the message
|
||||
return message
|
||||
|
||||
//Colossus drop, forces the listeners to obey certain commands
|
||||
/obj/item/organ/internal/vocal_cords/colossus
|
||||
name = "divine vocal cords"
|
||||
desc = "They carry the voice of an ancient god."
|
||||
icon_state = "voice_of_god"
|
||||
actions_types = list(/datum/action/item_action/organ_action/colossus)
|
||||
var/next_command = 0
|
||||
var/cooldown_stun = 1200
|
||||
var/cooldown_damage = 600
|
||||
var/cooldown_meme = 300
|
||||
var/cooldown_none = 150
|
||||
var/base_multiplier = 1
|
||||
spans = "colossus yell"
|
||||
|
||||
/datum/action/item_action/organ_action/colossus
|
||||
name = "Voice of God"
|
||||
var/obj/item/organ/internal/vocal_cords/colossus/cords = null
|
||||
|
||||
/datum/action/item_action/organ_action/colossus/New()
|
||||
..()
|
||||
cords = target
|
||||
|
||||
/datum/action/item_action/organ_action/colossus/IsAvailable()
|
||||
if(world.time < cords.next_command)
|
||||
return FALSE
|
||||
if(!owner)
|
||||
return FALSE
|
||||
if(!owner.can_speak())
|
||||
return FALSE
|
||||
if(check_flags & AB_CHECK_CONSCIOUS)
|
||||
if(owner.stat)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/action/item_action/organ_action/colossus/Trigger()
|
||||
. = ..()
|
||||
if(!IsAvailable())
|
||||
if(world.time < cords.next_command)
|
||||
to_chat(owner, "<span class='notice'>You must wait [(cords.next_command - world.time)/10] seconds before Speaking again.</span>")
|
||||
return
|
||||
var/command = input(owner, "Speak with the Voice of God", "Command")
|
||||
if(!command)
|
||||
return
|
||||
owner.say(".x[command]")
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/colossus/can_speak_with()
|
||||
if(world.time < next_command)
|
||||
to_chat(owner, "<span class='notice'>You must wait [(next_command - world.time)/10] seconds before Speaking again.</span>")
|
||||
return FALSE
|
||||
if(!owner)
|
||||
return FALSE
|
||||
if(!owner.can_speak())
|
||||
to_chat(owner, "<span class='warning'>You are unable to speak!</span>")
|
||||
return FALSE
|
||||
if(owner.stat)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/colossus/handle_speech(message)
|
||||
spans = "colossus yell" //reset spans, just in case someone gets deculted or the cords change owner
|
||||
if(iscultist(owner))
|
||||
spans += " narsiesmall"
|
||||
return "<span class=\"[spans]\">[uppertext(message)]</span>"
|
||||
|
||||
/obj/item/organ/internal/vocal_cords/colossus/speak_with(message)
|
||||
var/log_message = uppertext(message)
|
||||
message = lowertext(message)
|
||||
playsound(get_turf(owner), 'sound/magic/invoke_general.ogg', 300, 1, 5)
|
||||
|
||||
var/mob/living/list/listeners = list()
|
||||
for(var/mob/living/L in get_mobs_in_view(8, owner, TRUE))
|
||||
if(!L.ear_deaf && !L.null_rod_check() && L != owner && L.stat != DEAD)
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/H = L
|
||||
if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs))
|
||||
continue
|
||||
listeners += L
|
||||
|
||||
if(!listeners.len)
|
||||
next_command = world.time + cooldown_none
|
||||
return
|
||||
|
||||
var/power_multiplier = base_multiplier
|
||||
|
||||
if(owner.mind)
|
||||
//Chaplains are very good at speaking with the voice of god
|
||||
if(owner.mind.assigned_role == "Chaplain")
|
||||
power_multiplier *= 2
|
||||
//Command staff has authority
|
||||
if(owner.mind.assigned_role in command_positions)
|
||||
power_multiplier *= 1.4
|
||||
//Why are you speaking
|
||||
if(owner.mind.assigned_role == "Mime")
|
||||
power_multiplier *= 0.5
|
||||
|
||||
//Cultists are closer to their gods and are more powerful, but they'll give themselves away
|
||||
if(iscultist(owner))
|
||||
power_multiplier *= 2
|
||||
|
||||
//Try to check if the speaker specified a name or a job to focus on
|
||||
var/list/specific_listeners = list()
|
||||
var/found_string = null
|
||||
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
/*if(L.mind && L.mind.devilinfo && findtext(message, L.mind.devilinfo.truename))
|
||||
var/start = findtext(message, L.mind.devilinfo.truename)
|
||||
listeners = list(L) //let's be honest you're never going to find two devils with the same name
|
||||
power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up
|
||||
//Cut out the name so it doesn't trigger commands
|
||||
message = copytext(message, 0, start)+copytext(message, start + length(L.mind.devilinfo.truename), length(message) + 1)
|
||||
break*/
|
||||
if(findtext(message, L.real_name) == 1)
|
||||
specific_listeners += L //focus on those with the specified name
|
||||
//Cut out the name so it doesn't trigger commands
|
||||
found_string = L.real_name
|
||||
|
||||
else if(L.mind && findtext(message, L.mind.assigned_role) == 1)
|
||||
specific_listeners += L //focus on those with the specified job
|
||||
//Cut out the job so it doesn't trigger commands
|
||||
found_string = L.mind.assigned_role
|
||||
|
||||
if(specific_listeners.len)
|
||||
listeners = specific_listeners
|
||||
power_multiplier *= (1 + (1/specific_listeners.len)) //2x on a single guy, 1.5x on two and so on
|
||||
message = copytext(message, 0, 1)+copytext(message, 1 + length(found_string), length(message) + 1)
|
||||
|
||||
//STUN
|
||||
if(findtext(message, stun_words))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.Stun(3 * power_multiplier)
|
||||
next_command = world.time + cooldown_stun
|
||||
|
||||
//WEAKEN
|
||||
else if(findtext(message, weaken_words))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.Weaken(3 * power_multiplier)
|
||||
next_command = world.time + cooldown_stun
|
||||
|
||||
//SLEEP
|
||||
else if((findtext(message, sleep_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.Sleeping(2 * power_multiplier)
|
||||
next_command = world.time + cooldown_stun
|
||||
|
||||
//VOMIT
|
||||
else if((findtext(message, vomit_words)))
|
||||
for(var/mob/living/carbon/C in listeners)
|
||||
C.vomit(10 * power_multiplier)
|
||||
next_command = world.time + cooldown_stun
|
||||
|
||||
//SILENCE
|
||||
else if((findtext(message, silence_words)))
|
||||
for(var/mob/living/carbon/C in listeners)
|
||||
if(owner.mind && (owner.mind.assigned_role == "Librarian" || owner.mind.assigned_role == "Mime"))
|
||||
power_multiplier *= 3
|
||||
C.silent += (10 * power_multiplier)
|
||||
next_command = world.time + cooldown_stun
|
||||
|
||||
//HALLUCINATE
|
||||
else if((findtext(message, hallucinate_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
new /obj/effect/hallucination/delusion(get_turf(L),L,duration=150 * power_multiplier,skip_nearby=0)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//WAKE UP
|
||||
else if((findtext(message, wakeup_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.SetSleeping(0)
|
||||
next_command = world.time + cooldown_damage
|
||||
|
||||
//HEAL
|
||||
else if((findtext(message, heal_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, 0)
|
||||
next_command = world.time + cooldown_damage
|
||||
|
||||
//BRUTE DAMAGE
|
||||
else if((findtext(message, hurt_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.apply_damage(15 * power_multiplier, def_zone = "chest")
|
||||
next_command = world.time + cooldown_damage
|
||||
|
||||
//BLEED
|
||||
else if((findtext(message, bleed_words)))
|
||||
for(var/mob/living/carbon/human/H in listeners)
|
||||
H.drip(100 * power_multiplier)
|
||||
next_command = world.time + cooldown_damage
|
||||
|
||||
//FIRE
|
||||
else if((findtext(message, burn_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.adjust_fire_stacks(1 * power_multiplier)
|
||||
L.IgniteMob()
|
||||
next_command = world.time + cooldown_damage
|
||||
|
||||
//REPULSE
|
||||
else if((findtext(message, repulse_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
var/throwtarget = get_edge_target_turf(owner, get_dir(owner, get_step_away(L, owner)))
|
||||
L.throw_at(throwtarget, 3 * power_multiplier, 1)
|
||||
next_command = world.time + cooldown_damage
|
||||
|
||||
//WHO ARE YOU?
|
||||
else if((findtext(message, whoareyou_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
/*if(L.mind && L.mind.devilinfo)
|
||||
L.say("[L.mind.devilinfo.truename]")
|
||||
else*/
|
||||
L.say("[L.real_name]")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//SAY MY NAME
|
||||
else if((findtext(message, saymyname_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.say("[owner.name]!") //"Unknown!"
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//KNOCK KNOCK
|
||||
else if((findtext(message, knockknock_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.say("Who's there?")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//STATE LAWS
|
||||
else if((findtext(message, statelaws_words)))
|
||||
for(var/mob/living/silicon/S in listeners)
|
||||
S.statelaws(S.laws)
|
||||
next_command = world.time + cooldown_stun
|
||||
|
||||
//MOVE
|
||||
else if((findtext(message, move_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
step(L, pick(cardinal))
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//WALK
|
||||
else if((findtext(message, walk_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(L.m_intent != "walk")
|
||||
L.m_intent = "walk"
|
||||
if(L.hud_used)
|
||||
L.hud_used.move_intent.icon_state = "walking"
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//RUN
|
||||
else if((findtext(message, run_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(L.m_intent != "run")
|
||||
L.m_intent = "run"
|
||||
if(L.hud_used)
|
||||
L.hud_used.move_intent.icon_state = "running"
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//HELP INTENT
|
||||
else if((findtext(message, helpintent_words)))
|
||||
for(var/mob/living/carbon/human/H in listeners)
|
||||
H.a_intent_change(I_HELP)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//DISARM INTENT
|
||||
else if((findtext(message, disarmintent_words)))
|
||||
for(var/mob/living/carbon/human/H in listeners)
|
||||
H.a_intent_change(I_DISARM)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//GRAB INTENT
|
||||
else if((findtext(message, grabintent_words)))
|
||||
for(var/mob/living/carbon/human/H in listeners)
|
||||
H.a_intent_change(I_GRAB)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//HARM INTENT
|
||||
else if((findtext(message, harmintent_words)))
|
||||
for(var/mob/living/carbon/human/H in listeners)
|
||||
H.a_intent_change(I_HARM)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//THROW/CATCH
|
||||
else if((findtext(message, throwmode_words)))
|
||||
for(var/mob/living/carbon/C in listeners)
|
||||
C.throw_mode_on()
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//FLIP
|
||||
else if((findtext(message, flip_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.emote("flip")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//REST
|
||||
else if((findtext(message, rest_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(!L.resting)
|
||||
L.lay_down()
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//GET UP
|
||||
else if((findtext(message, getup_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(L.resting)
|
||||
L.lay_down() //aka get up
|
||||
L.SetStunned(0)
|
||||
L.SetWeakened(0)
|
||||
L.SetParalysis(0) //i said get up i don't care if you're being tazed
|
||||
next_command = world.time + cooldown_damage
|
||||
|
||||
//SIT
|
||||
else if((findtext(message, sit_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
for(var/obj/structure/stool/bed/chair/chair in get_turf(L))
|
||||
chair.buckle_mob(L)
|
||||
break
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//STAND UP
|
||||
else if((findtext(message, stand_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
if(L.buckled && istype(L.buckled, /obj/structure/stool/bed/chair))
|
||||
L.buckled.unbuckle_mob(L)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//DANCE
|
||||
else if((findtext(message, dance_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.emote("dance")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//JUMP
|
||||
else if((findtext(message, jump_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.say("HOW HIGH?!!")
|
||||
L.emote("jump")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//SALUTE
|
||||
else if((findtext(message, salute_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.emote("salute")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//PLAY DEAD
|
||||
else if((findtext(message, deathgasp_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.emote("deathgasp")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//PLEASE CLAP
|
||||
else if((findtext(message, clap_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.emote("clap")
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//HONK
|
||||
else if((findtext(message, honk_words)))
|
||||
spawn(25)
|
||||
playsound(get_turf(owner), "sound/items/bikehorn.ogg", 300, 1)
|
||||
if(owner.mind && owner.mind.assigned_role == "Clown")
|
||||
for(var/mob/living/carbon/C in listeners)
|
||||
C.slip(0,7 * power_multiplier)
|
||||
next_command = world.time + cooldown_stun
|
||||
else
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
//RIGHT ROUND
|
||||
else if((findtext(message, multispin_words)))
|
||||
for(var/V in listeners)
|
||||
var/mob/living/L = V
|
||||
L.SpinAnimation(speed = 10, loops = 5)
|
||||
next_command = world.time + cooldown_meme
|
||||
|
||||
else
|
||||
next_command = world.time + cooldown_none
|
||||
|
||||
message_admins("[key_name_admin(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
|
||||
log_game("[key_name(owner)] has said '[log_message]' with a Voice of God, affecting [english_list(listeners)], with a power multiplier of [power_multiplier].")
|
||||
Reference in New Issue
Block a user