mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-21 20:20:33 +01:00
Merge conflict begone
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user