Skip to content

Commit

Permalink
Merge Upstream 19.09.2024 (#1528)
Browse files Browse the repository at this point in the history
Вау, это мерге апстрима и без конфликта? Это реально? ЭТО МНЕ?!

## Changelog

:cl: ParadiseSS13
add: Стат панель теперь имеет размер текста и шрифт как в настройках у
чата.
add: Добавлена новая вкладка настроек в чат - "Stat Panel". В ней вы
можете отвязать стат панель от чата и задать настройки отдельно, либо
сменить вид вкладок в ней.
add: Импланты теперь показывают орган/часть тела в который их можно
вставить при осмотре.
tweak: Некрополис наложит проклятие на ваш ховерборд, если вы
используете его против мегафауны.
tweak: Те, кто не использует ховерборд, считают езду на скейтборде по
базальту утомительной из-за мелких камней и получают урон выносливости
при езде.
tweak: Удалён уровень технологий из ручного телепорта, капитанской
рапиры, кастетов КМа и дефибриллятора CMO.
tweak: Гравитационные аномалии теперь находятся над предметами. Мобы,
растения и структуры которые могут закрывать игроков, всё ещё закрывают
аномалию.
fix: Мобы, которые были предложены призракам, больше не могут быть
захвачены их прежними владельцами.
fix: Трубки для курения снова можно зажечь.
fix: Термостойкие двери больше не будут пропускать тепло и плавиться.
fix: Клоунская мини-бомба больше не имеет уровень технологий как у
обычной.
fix: Борги снова могут подбирать плитку, нанопасту и шины.
/:cl:
  • Loading branch information
dj-34 authored Sep 19, 2024
2 parents 0f05150 + af3077b commit a2005d8
Show file tree
Hide file tree
Showing 66 changed files with 1,832 additions and 1,397 deletions.
2 changes: 1 addition & 1 deletion _maps/map_files/stations/metastation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -41741,7 +41741,7 @@
},
/obj/effect/turf_decal/stripes/line,
/obj/item/target/alien,
/turf/simulated/floor/plating/airless,
/turf/simulated/floor/indestructible/airless,
/area/station/science/toxins/test)
"cZc" = (
/obj/structure/cable,
Expand Down
32 changes: 19 additions & 13 deletions code/__HELPERS/unsorted.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1037,19 +1037,25 @@ Returns 1 if the chain up to the area contains the given typepath


/proc/parse_zone(zone)
if(zone == "r_hand") return "right hand"
else if(zone == "l_hand") return "left hand"
else if(zone == "l_arm") return "left arm"
else if(zone == "r_arm") return "right arm"
else if(zone == "l_leg") return "left leg"
else if(zone == "r_leg") return "right leg"
else if(zone == "l_foot") return "left foot"
else if(zone == "r_foot") return "right foot"
else if(zone == "l_hand") return "left hand"
else if(zone == "r_hand") return "right hand"
else if(zone == "l_foot") return "left foot"
else if(zone == "r_foot") return "right foot"
else return zone
switch(zone)
if("r_hand")
return "right hand"
if("l_hand")
return "left hand"
if("r_arm")
return "right arm"
if("l_arm")
return "left arm"
if("r_foot")
return "right foot"
if("l_foot")
return "left foot"
if("r_leg")
return "right leg"
if("l_leg")
return "left leg"
else
return zone

/*
Expand Down
4 changes: 2 additions & 2 deletions code/datums/components/defibrillator.dm
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@
)

busy = TRUE
var/mob/dead/observer/ghost = target.get_ghost(TRUE)
if(ghost?.can_reenter_corpse)
var/mob/dead/observer/ghost = target.get_ghost()
if(ghost)
to_chat(ghost, "<span class='ghostalert'>Your heart is being defibrillated. Return to your body if you want to be revived!</span> (Verbs -> Ghost -> Re-enter corpse)")
window_flash(ghost.client)
SEND_SOUND(ghost, sound('sound/effects/genetics.ogg'))
Expand Down
2 changes: 1 addition & 1 deletion code/datums/mind.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1768,7 +1768,7 @@

/datum/mind/proc/get_ghost(even_if_they_cant_reenter)
for(var/mob/dead/observer/G in GLOB.dead_mob_list)
if(G.mind == src)
if(G.mind == src && G.mind.key == G.key)
if(G.can_reenter_corpse || even_if_they_cant_reenter)
return G
break
Expand Down
10 changes: 2 additions & 8 deletions code/game/data_huds.dm
Original file line number Diff line number Diff line change
Expand Up @@ -200,14 +200,8 @@
revivable_state = "flatline"
else if(!mind)
revivable_state = "dead"
else
var/foundghost = FALSE
for(var/mob/dead/observer/G in GLOB.player_list)
if(G.mind.current == src)
foundghost = (G.can_reenter_corpse && G.client)
break
if(foundghost || key)
revivable_state = "hassoul"
else if(get_ghost() || key)
revivable_state = "hassoul"

holder.icon_state = "hud[revivable_state]"

Expand Down
2 changes: 1 addition & 1 deletion code/game/jobs/job/supervisor.dm
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@
department_flag = JOBCAT_ENGSEC
total_positions = 1
spawn_positions = 1
supervisors = "the Nanotrasen Supreme Court"
supervisors = "Nanotrasen Asset Protection"
department_head = list("Captain")
selection_color = "#ddddff"
req_admin_notify = TRUE
Expand Down
8 changes: 6 additions & 2 deletions code/game/machinery/computer/cloning.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
var/feedback
/// The desired outcome of the cloning process.
var/datum/cloning_data/desired_data

/// Is the scanner currently scanning someone?
var/currently_scanning = FALSE
COOLDOWN_DECLARE(scancooldown)

/obj/machinery/computer/cloning/Initialize(mapload)
Expand Down Expand Up @@ -157,6 +158,7 @@

if(scanner)
data["has_scanned"] = scanner.has_scanned
data["currently_scanning"] = currently_scanning
else
data["has_scanned"] = FALSE

Expand Down Expand Up @@ -231,7 +233,6 @@
switch(text2num(params["tab"]))
if(TAB_MAIN)
tab = TAB_MAIN
scanner?.update_scan_status()
return TRUE
if(TAB_DAMAGES_BREAKDOWN)
tab = TAB_DAMAGES_BREAKDOWN
Expand All @@ -256,6 +257,7 @@
if(!scanner.occupant)
return FALSE

currently_scanning = TRUE
scanner.occupant.notify_ghost_cloning()
feedback = list("text" = "Scanning occupant! Please wait...", "color" = "good", "scan_succeeded" = FALSE)
COOLDOWN_START(src, scancooldown, 10 SECONDS)
Expand Down Expand Up @@ -318,6 +320,7 @@
if("eject")
if(scanner?.occupant)
scanner.remove_mob(scanner.occupant)
currently_scanning = FALSE
return TRUE


Expand Down Expand Up @@ -352,5 +355,6 @@
feedback = list("text" = "Successfully scanned the patient.", "color" = "good", "scan_succeeded" = TRUE)
desired_data = generate_healthy_data(scan)

currently_scanning = FALSE
#undef TAB_MAIN
#undef TAB_DAMAGES_BREAKDOWN
8 changes: 5 additions & 3 deletions code/game/machinery/doors/door.dm
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,11 @@
return !density

/obj/machinery/door/get_superconductivity(direction)
if(density)
return superconductivity
return ..()
if(!density)
return ..()
if(heat_proof)
return ZERO_HEAT_TRANSFER_COEFFICIENT
return superconductivity

/obj/machinery/door/proc/bumpopen(mob/user)
if(operating)
Expand Down
2 changes: 2 additions & 0 deletions code/game/machinery/portable_turret.dm
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,8 @@ GLOBAL_LIST_EMPTY(turret_icons)

/obj/machinery/porta_turret/crowbar_act(mob/living/user, obj/item/I)
. = TRUE
if(!(stat & BROKEN) || syndicate) // No disasembling active turrets or syndicate ones
return
to_chat(user, "<span class='notice'>You begin prying the metal coverings off.</span>")
if(!I.use_tool(src, user, 2 SECONDS, 0, 50))
return FALSE
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/effects/anomalies.dm
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
icon_state = "shield2"
density = FALSE
appearance_flags = PIXEL_SCALE|LONG_GLIDE
layer = OBJ_LAYER // Mobs will appear above this
var/boing = FALSE
var/knockdown = FALSE
aSignal = /obj/item/assembly/signaler/anomaly/grav
Expand Down
20 changes: 8 additions & 12 deletions code/game/objects/items/robot/robot_parts.dm
Original file line number Diff line number Diff line change
Expand Up @@ -234,19 +234,15 @@
return

if(!M.brainmob.key)
var/ghost_can_reenter = FALSE
if(M.brainmob.mind)
for(var/mob/dead/observer/G in GLOB.player_list)
if(G.can_reenter_corpse && G.mind == M.brainmob.mind)
ghost_can_reenter = TRUE
if(M.next_possible_ghost_ping < world.time)
G.notify_cloning("Somebody is trying to borg you! Re-enter your corpse if you want to be borged!", 'sound/voice/liveagain.ogg', src)
M.next_possible_ghost_ping = world.time + 30 SECONDS // Avoid spam
break
if(!ghost_can_reenter)
to_chat(user, "<span class='notice'>[M] is completely unresponsive; there's no point.</span>")
var/mob/dead/observer/G = M.brainmob.get_ghost()
if(G)
if(M.next_possible_ghost_ping < world.time)
G.notify_cloning("Somebody is trying to borg you! Re-enter your corpse if you want to be borged!", 'sound/voice/liveagain.ogg', src)
M.next_possible_ghost_ping = world.time + 30 SECONDS // Avoid spam
else
to_chat(user, "<span class='warning'>[M] is currently inactive. Try again later.</span>")
to_chat(user, "<span class='notice'>[M] is completely unresponsive; there's no point.</span>")
return
to_chat(user, "<span class='warning'>[M] is currently inactive. Try again later.</span>")
return

if(M.brainmob.stat == DEAD)
Expand Down
3 changes: 3 additions & 0 deletions code/game/objects/items/stacks/medical_packs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@
healverb = "salve"
heal_burn = 10
dynamic_icon_state = TRUE
merge_type = /obj/item/stack/medical/ointment

/obj/item/stack/medical/ointment/apply(mob/living/M, mob/user)
if(..())
Expand Down Expand Up @@ -258,6 +259,7 @@
belt_icon = "burnkit"
heal_burn = 25
dynamic_icon_state = FALSE
merge_type = /obj/item/stack/medical/ointment/advanced

/obj/item/stack/medical/ointment/advanced/cyborg
energy_type = /datum/robot_storage/energy/medical/adv_burn_kit
Expand Down Expand Up @@ -308,6 +310,7 @@
icon_state = "splint"
unique_handling = TRUE
self_delay = 100
merge_type = /obj/item/stack/medical/splint
var/other_delay = 0

/obj/item/stack/medical/splint/apply(mob/living/M, mob/user)
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/items/stacks/nanopaste.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
amount = 6
max_amount = 6
toolspeed = 1
merge_type = /obj/item/stack/nanopaste

/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob)
if(!istype(M) || !istype(user))
Expand Down
2 changes: 2 additions & 0 deletions code/game/objects/items/stacks/stack.dm
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,8 @@
// We don't only use istype here, since that will match subtypes, and stack things that shouldn't stack
if(!istype(check, merge_type) || check.merge_type != merge_type)
return FALSE
if(amount <= 0 || check.amount <= 0) // no merging empty stacks that are in the process of being qdel'd
return FALSE
if(is_cyborg) // No merging cyborg stacks into other stacks
return FALSE
if(ismob(loc) && !inhand) // no merging with items that are on the mob
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/items/stacks/tiles/tile_types.dm
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@
mineralType = "metal"
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, RAD = 0, FIRE = 100, ACID = 70)
resistance_flags = FIRE_PROOF
merge_type = /obj/item/stack/tile/plasteel

/obj/item/stack/tile/plasteel/cyborg
energy_type = /datum/robot_storage/energy/metal_tile
Expand Down
3 changes: 3 additions & 0 deletions code/game/objects/items/weapons/cigs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,9 @@ LIGHTERS ARE IN LIGHTERS.DM
qdel(O)
else
to_chat(user, "<span class='warning'>You need to dry this first!</span>")
return

return ..()

/obj/item/clothing/mask/cigarette/pipe/cobpipe
name = "corn cob pipe"
Expand Down
3 changes: 2 additions & 1 deletion code/game/objects/items/weapons/defib.dm
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,9 @@
hardened = TRUE // EMP-proof (on the component), but not emag-proof.
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF // Objective item, better not have it destroyed.
heart_attack_probability = 10
origin_tech = null
/// To prevent spam from the emagging message on the advanced defibrillator.
var/next_emp_message
var/next_emp_message

/obj/item/defibrillator/compact/advanced/examine(mob/user)
. = ..()
Expand Down
1 change: 1 addition & 0 deletions code/game/objects/items/weapons/grenades/syndieminibomb.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
qdel(src)

/obj/item/grenade/syndieminibomb/fake
origin_tech = "materials=3;magnets=4;syndicate=1" // no clown, this bomb not exactly the same

/obj/item/grenade/syndieminibomb/fake/examine(mob/user)
. = ..()
Expand Down
13 changes: 5 additions & 8 deletions code/game/objects/items/weapons/holy_weapons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@
if(!V.get_ability(/datum/vampire_passive/full))
to_chat(M, "<span class='warning'>The nullrod's power interferes with your own!</span>")
V.adjust_nullification(30 + sanctify_force, 15 + sanctify_force)
if(!sanctify_force)
return
if(isliving(M))
var/mob/living/L = M
L.adjustFireLoss(sanctify_force) // Bonus fire damage for sanctified (ERT) versions of nullrod

/obj/item/nullrod/pickup(mob/living/user)
. = ..()
Expand Down Expand Up @@ -96,14 +101,6 @@
return FALSE
return TRUE

/obj/item/nullrod/afterattack(atom/movable/AM, mob/user, proximity)
. = ..()
if(!sanctify_force)
return
if(isliving(AM))
var/mob/living/L = AM
L.adjustFireLoss(sanctify_force) // Bonus fire damage for sanctified (ERT) versions of nullrod

/// fluff subtype to be used for all donator nullrods
/obj/item/nullrod/fluff
reskin_selectable = FALSE
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/knuckledusters.dm
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
icon_state = "knuckleduster_nt"
force = 10
throwforce = 5
origin_tech = "combat=3"
origin_tech = null
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF // Steal objectives shouldnt be easy to destroy.
materials = list(MAT_GOLD = 500, MAT_TITANIUM = 200, MAT_PLASMA = 200)
trauma = 10
Expand Down
15 changes: 8 additions & 7 deletions code/game/objects/items/weapons/melee/energy_melee_weapons.dm
Original file line number Diff line number Diff line change
Expand Up @@ -311,13 +311,14 @@
return
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
if(P.reflectability == REFLECTABILITY_NEVER) //only 1 magic spell does this, but hey, needed
owner.visible_message("<span class='danger'>[owner] blocks [attack_text] with [src]!</span>")
playsound(src, 'sound/weapons/effects/ric3.ogg', 100, TRUE)
return TRUE
owner.visible_message("<span class='danger'>[owner] parries [attack_text] with [src]!</span>")
add_attack_logs(P.firer, src, "hit by [P.type] but got parried by [src]")
return -1
if(P.reflectability == REFLECTABILITY_ENERGY)
owner.visible_message("<span class='danger'>[owner] parries [attack_text] with [src]!</span>")
add_attack_logs(P.firer, src, "hit by [P.type] but got parried by [src]")
return -1
owner.visible_message("<span class='danger'>[owner] blocks [attack_text] with [src]!</span>")
playsound(src, 'sound/weapons/effects/ric3.ogg', 100, TRUE)
return TRUE

return TRUE

//////////////////////////////
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/melee/melee_misc.dm
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
w_class = WEIGHT_CLASS_BULKY
armour_penetration_percentage = 75
sharp = TRUE
origin_tech = "combat=5"
origin_tech = null
attack_verb = list("lunged at", "stabbed")
hitsound = 'sound/weapons/rapierhit.ogg'
materials = list(MAT_METAL = 1000)
Expand Down
6 changes: 2 additions & 4 deletions code/game/objects/items/weapons/storage/storage_base.dm
Original file line number Diff line number Diff line change
Expand Up @@ -468,20 +468,18 @@

if(!prevent_warning)
// all mobs with clients attached, sans the item's user
var/viewer_list = GLOB.player_list - user

// the item's user will always get a notification
to_chat(user, "<span class='notice'>You put [I] into [src].</span>")

// if the item less than normal sized, only people within 1 tile get the message, otherwise, everybody in view gets it
if(I.w_class < WEIGHT_CLASS_NORMAL)
for(var/mob/M in viewer_list)
for(var/mob/M in range(1, user))
if(in_range(M, user))
M.show_message("<span class='notice'>[user] puts [I] into [src].</span>")
else
// restrict player list to include only those in view
viewer_list = viewer_list & viewers(world.view, user)
for(var/mob/M in viewer_list)
for(var/mob/M in oviewers(7, user))
M.show_message("<span class='notice'>[user] puts [I] into [src].</span>")

orient2hud(user)
Expand Down
2 changes: 1 addition & 1 deletion code/game/objects/items/weapons/teleportation.dm
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=10000)
origin_tech = "magnets=3;bluespace=4"
origin_tech = null
armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, RAD = 0, FIRE = 100, ACID = 100)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
var/icon_state_inactive = "hand_tele_inactive"
Expand Down
Loading

0 comments on commit a2005d8

Please sign in to comment.