Merge conflict begone

This commit is contained in:
LemonInTheDark
2020-07-12 17:37:14 -07:00
186 changed files with 4969 additions and 3766 deletions
+7 -2
View File
@@ -905,6 +905,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(!invisibility)
. += "It seems extremely obvious."
/mob/dead/observer/examine_more(mob/user)
if(!IsAdminGhost(user, TRUE))
return ..()
. = list("<span class='notice'><i>You examine [src] closer, and note the following...</i></span>")
. += list("\t><span class='admin'>[ADMIN_FULLMONTY(src)]</span>")
/mob/dead/observer/proc/set_invisibility(value)
invisibility = value
if(!value)
@@ -948,8 +954,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
var/list/t_ray_images = list()
var/static/list/stored_t_ray_images = list()
for(var/obj/O in orange(client.view, src) )
if(O.invisibility == INVISIBILITY_MAXIMUM)
if(HAS_TRAIT(O, TRAIT_T_RAY_VISIBLE))
var/image/I = new(loc = get_turf(O))
var/mutable_appearance/MA = new(O)
MA.alpha = 128
+4 -3
View File
@@ -16,11 +16,10 @@
return
if (action == "orbit")
var/list/pois = getpois(skip_mindless = 1)
var/atom/movable/poi = pois[params["name"]]
var/ref = params["ref"]
var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list)
if (poi != null)
owner.ManualFollow(poi)
ui.close()
/datum/orbit_menu/ui_data(mob/user)
var/list/data = list()
@@ -39,6 +38,8 @@
var/poi = pois[name]
serialized["ref"] = REF(poi)
var/mob/M = poi
if (istype(M))
if (isobserver(M))
+7
View File
@@ -166,6 +166,10 @@
var/power_throw = 0
if(HAS_TRAIT(src, TRAIT_HULK))
power_throw++
if(HAS_TRAIT(src, TRAIT_DWARF))
power_throw--
if(HAS_TRAIT(thrown_thing, TRAIT_DWARF))
power_throw++
if(pulling && grab_state >= GRAB_NECK)
power_throw++
visible_message("<span class='danger'>[src] throws [thrown_thing][power_throw ? " really hard!" : "."]</span>", \
@@ -1184,3 +1188,6 @@
S.generate(BP, W)
S.fake = TRUE
QDEL_NULL(W)
/mob/living/carbon/is_face_visible()
return !(wear_mask?.flags_inv & HIDEFACE) && !(head?.flags_inv & HIDEFACE)
@@ -80,7 +80,7 @@
/mob/living/carbon/update_fire(var/fire_icon = "Generic_mob_burning")
remove_overlay(FIRE_LAYER)
if(on_fire || islava(loc))
if(on_fire || HAS_TRAIT(src, TRAIT_PERMANENTLY_ONFIRE))
var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER)
new_fire_overlay.appearance_flags = RESET_COLOR
overlays_standing[FIRE_LAYER] = new_fire_overlay
@@ -44,6 +44,7 @@
return
if(H.dna.features["moth_wings"] != "Burnt Off" && H.bodytemperature >= 800 && H.fire_stacks > 0) //do not go into the extremely hot light. you will not survive
to_chat(H, "<span class='danger'>Your precious wings burn to a crisp!</span>")
H.dna.features["original_moth_wings"] = H.dna.features["moth_wings"] //Fire apparently destroys DNA, so let's preserve that elsewhere
H.dna.features["moth_wings"] = "Burnt Off"
if(flying_species) //This is all exclusive to if the person has the effects of a potion of flight
if(H.movement_type & FLYING)
@@ -71,3 +72,12 @@
var/datum/gas_mixture/current = H.loc.return_air()
if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible
return TRUE
/datum/species/moth/spec_fully_heal(mob/living/carbon/human/H)
. = ..()
if(H.dna.features["original_moth_wings"] != null)
H.dna.features["moth_wings"] = H.dna.features["original_moth_wings"]
if(H.dna.features["original_moth_wings"] == null && H.dna.features["moth_wings"] == "Burnt Off")
H.dna.features["moth_wings"] = "Plain"
handle_mutant_bodyparts(H)
@@ -34,14 +34,9 @@
bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 50) // about -50c
/datum/species/plasmaman/spec_life(mob/living/carbon/human/H)
var/datum/gas_mixture/environment = H.loc.return_air()
var/atmos_sealed = FALSE
if (H.wear_suit && H.head && istype(H.wear_suit, /obj/item/clothing) && istype(H.head, /obj/item/clothing))
var/obj/item/clothing/CS = H.wear_suit
var/obj/item/clothing/CH = H.head
if (CS.clothing_flags & CH.clothing_flags & STOPSPRESSUREDAMAGE)
atmos_sealed = TRUE
if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves)) && !atmos_sealed)
var/atmos_sealed = CanIgniteMob(H) && (isclothing(H.wear_suit) && H.wear_suit.clothing_flags & STOPSPRESSUREDAMAGE) && (isclothing(H.head) && H.head.clothing_flags & STOPSPRESSUREDAMAGE)
if(!atmos_sealed && (!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves)))
var/datum/gas_mixture/environment = H.loc.return_air()
if(environment)
if(environment.total_moles())
if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen][MOLES]) >= 1) //Same threshhold that extinguishes fire
@@ -50,14 +45,13 @@
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
H.IgniteMob()
internal_fire = TRUE
else
if(H.fire_stacks)
var/obj/item/clothing/under/plasmaman/P = H.w_uniform
if(istype(P))
P.Extinguish(H)
internal_fire = FALSE
else
else if(H.fire_stacks)
var/obj/item/clothing/under/plasmaman/P = H.w_uniform
if(istype(P))
P.Extinguish(H)
internal_fire = FALSE
else
internal_fire = FALSE
H.update_fire()
/datum/species/plasmaman/handle_fire(mob/living/carbon/human/H, no_protection)
-2
View File
@@ -107,8 +107,6 @@
if(EFFECT_IRRADIATE)
if(!HAS_TRAIT(src, TRAIT_RADIMMUNE))
radiation += max(effect * hit_percent, 0)
else
radiation = 0
if(EFFECT_SLUR)
slurring = max(slurring,(effect * hit_percent))
if(EFFECT_STUTTER)
+4
View File
@@ -1556,3 +1556,7 @@
switch(stat) //Current stat.
if(UNCONSCIOUS)
become_blind(UNCONSCIOUS_BLIND)
/// Only defined for carbons who can wear masks and helmets, we just assume other mobs have visible faces
/mob/living/proc/is_face_visible()
return TRUE
@@ -172,7 +172,7 @@ GLOBAL_DATUM_INIT(cameranet, /datum/cameranet, new)
/datum/cameranet/proc/checkTurfVis(turf/position)
var/datum/camerachunk/chunk = chunkGenerated(position.x, position.y, position.z)
var/datum/camerachunk/chunk = getCameraChunk(position.x, position.y, position.z)
if(chunk)
if(chunk.changed)
chunk.hasChanged(1) // Update now, no matter if it's visible or not.
@@ -256,7 +256,7 @@
S.robot_arm = robot_arm
S.healthanalyzer = healthanalyzer
var/obj/item/storage/firstaid/FA = firstaid
S.damagetype_healer = initial(FA.damagetype_healed)
S.damagetype_healer = initial(FA.damagetype_healed) ? initial(FA.damagetype_healed) : BRUTE
qdel(src)
@@ -254,7 +254,7 @@
tipper_name = user.name
/mob/living/simple_animal/bot/medbot/proc/set_right(mob/user)
mobility_flags &= MOBILITY_MOVE
mobility_flags |= MOBILITY_MOVE
var/list/messagevoice
if(user)
@@ -16,7 +16,7 @@
speed = 0
a_intent = INTENT_HARM
stop_automated_movement = 1
AIStatus = AI_ON
AIStatus = AI_OFF
attack_sound = 'sound/weapons/punch1.ogg'
see_in_dark = 7
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
@@ -37,8 +37,6 @@
/mob/living/simple_animal/hostile/eldritch/Initialize()
. = ..()
add_spells()
//by default
mind.add_antag_datum(/datum/antagonist/heretic_monster)
/**
* Add_spells
@@ -20,7 +20,6 @@
maxHealth = 50000
health = 50000
healable = 0
harm_intent_damage = 10
obj_damage = 100
melee_damage_lower = 68
@@ -109,6 +108,9 @@
if(!can_be_seen(get_turf(loc)))
..()
/mob/living/simple_animals/hostile/statue/IsVocal() //we're a statue, of course we can't talk.
return FALSE
/mob/living/simple_animal/hostile/statue/proc/can_be_seen(turf/destination)
if(!cannot_be_seen)
return null
@@ -991,6 +991,6 @@
var/datum/disease/parrot_possession/P = new
P.parrot = src
forceMove(H)
H.ForceContractDisease(P)
H.ForceContractDisease(P, FALSE)
parrot_interest = null
H.visible_message("<span class='danger'>[src] dive bombs into [H]'s chest and vanishes!</span>", "<span class='userdanger'>[src] dive bombs into your chest, vanishing! This can't be good!</span>")
+32 -3
View File
@@ -419,10 +419,12 @@
var/list/result
if(client)
LAZYINITLIST(client.recent_examines)
if(isnull(client.recent_examines[A]) || client.recent_examines[A] < world.time) // originally this wasn't an assoc list, but sometimes the timer failed and atoms stayed in a client's recent_examines, so we check here manually
client.recent_examines[A] = world.time + EXAMINE_MORE_TIME
if(isnull(client.recent_examines[A]) || client.recent_examines[A] < world.time)
result = A.examine(src)
client.recent_examines[A] = world.time + EXAMINE_MORE_TIME // set the value to when the examine cooldown ends
RegisterSignal(A, COMSIG_PARENT_QDELETING, .proc/clear_from_recent_examines, override=TRUE) // to flush the value if deleted early
addtimer(CALLBACK(src, .proc/clear_from_recent_examines, A), EXAMINE_MORE_TIME)
handle_eye_contact(A)
else
result = A.examine_more(src)
else
@@ -432,10 +434,37 @@
SEND_SIGNAL(src, COMSIG_MOB_EXAMINATE, A)
/mob/proc/clear_from_recent_examines(atom/A)
if(QDELETED(A) || !client)
if(!client)
return
UnregisterSignal(A, COMSIG_PARENT_QDELETING)
LAZYREMOVE(client.recent_examines, A)
/**
* handle_eye_contact() is called when we examine() something. If we examine an alive mob with a mind who has examined us in the last second within 5 tiles, we make eye contact!
*
* Note that if either party has their face obscured, the other won't get the notice about the eye contact
* Also note that examine_more() doesn't proc this or extend the timer, just because it's simpler this way and doesn't lose much.
* The nice part about relying on examining is that we don't bother checking visibility, because we already know they were both visible to each other within the last second, and the one who triggers it is currently seeing them
*/
/mob/proc/handle_eye_contact(mob/living/examined_mob)
return
/mob/living/handle_eye_contact(mob/living/examined_mob)
if(!istype(examined_mob) || src == examined_mob || examined_mob.stat >= UNCONSCIOUS || !client || !examined_mob.client?.recent_examines || !(src in examined_mob.client.recent_examines))
return
if(get_dist(src, examined_mob) > EYE_CONTACT_RANGE)
return
// check to see if their face is blocked or, if not, a signal blocks it
if(examined_mob.is_face_visible() && SEND_SIGNAL(src, COMSIG_MOB_EYECONTACT, examined_mob, TRUE) != COMSIG_BLOCK_EYECONTACT)
var/msg = "<span class='smallnotice'>You make eye contact with [examined_mob].</span>"
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, src, msg), 3) // so the examine signal has time to fire and this will print after
if(is_face_visible() && SEND_SIGNAL(examined_mob, COMSIG_MOB_EYECONTACT, src, FALSE) != COMSIG_BLOCK_EYECONTACT)
var/msg = "<span class='smallnotice'>[src] makes eye contact with you.</span>"
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, examined_mob, msg), 3)
/**
* Point at an atom
*
+2 -2
View File
@@ -421,7 +421,7 @@
to_chat(user, "<span class='warning'>[affecting] is already in good condition!</span>")
///Is the passed in mob an admin ghost
/proc/IsAdminGhost(var/mob/user)
/proc/IsAdminGhost(var/mob/user, ignore_AI_interact)
if(!user) //Are they a mob? Auto interface updates call this with a null src
return
if(!user.client) // Do they have a client?
@@ -430,7 +430,7 @@
return
if(!check_rights_for(user.client, R_ADMIN)) // Are they allowed?
return
if(!user.client.AI_Interact) // Do they have it enabled?
if(!ignore_AI_interact && !user.client.AI_Interact) // Do they have it enabled?
return
return TRUE