Midweek bugfix release (#16867)

* fix adminjump to area (#16853)

* fix a runtime in the keyloop (#16852)

* fix a runtime in the keyloop

* also fix that

* gloves runtime

* do it proper

* fix stun effect act (#16850)

* fix a runtime and some usr to user (#16849)

* fix a runtimg and some usr to user

* .

* .

* more usr

* fix some bad replaces (#16856)

* fix a lot of map issues (#16857)

* fix a lot of map issues

* fix SM template...

* fix change turf (#16860)

* Fluff item for Beeholddrbeesphb/Evelynn (#16859)

* Fix synth_color not working (#16866)

* Fix synth_color not working

* Fix spawnpoint pref

* living

* oups

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
Co-authored-by: ShadowLarkens <shadowlarkens@gmail.com>
This commit is contained in:
Selis
2025-01-08 16:05:01 +01:00
committed by GitHub
co-authored by Kashargul ShadowLarkens
parent b586f26e1c
commit 35172fd5eb
51 changed files with 103 additions and 4537 deletions
+1 -1
View File
@@ -20,7 +20,7 @@
if(areaname)
A = return_sorted_areas()[areaname]
else
A = tgui_input_list(usr, "Pick an area:", "Jump to Area", return_sorted_areas())
A = return_sorted_areas()[tgui_input_list(usr, "Pick an area:", "Jump to Area", return_sorted_areas())]
if(!A)
return
@@ -63,7 +63,7 @@
. += span_bold("Biological Sex:") + " <a href='byond://?src=\ref[src];bio_gender=1'><b>[gender2text(pref.biological_gender)]</b></a><br>"
. += span_bold("Pronouns:") + " <a href='byond://?src=\ref[src];id_gender=1'><b>[gender2text(pref.identifying_gender)]</b></a><br>"
. += span_bold("Age:") + " <a href='byond://?src=\ref[src];age=1'>[pref.read_preference(/datum/preference/numeric/human/age)]</a> <b>Birthday:</b> <a href='byond://?src=\ref[src];bday_month=1'>[pref.read_preference(/datum/preference/numeric/human/bday_month)]</a><b>/</b><a href='byond://?src=\ref[src];bday_day=1'>[pref.read_preference(/datum/preference/numeric/human/bday_day)]</a> - <b>Announce?:</b> <a href='byond://?src=\ref[src];bday_announce=1'>[pref.read_preference(/datum/preference/toggle/human/bday_announce) ? "Yes" : "No"]</a><br>"
. += span_bold("Spawn Point:") + " <a href='byond://?src=\ref[src];spawnpoint=1'>[pref.read_preference(/datum/preference/choiced/human/spawnpoint)]</a><br>"
. += span_bold("Spawn Point:") + " <a href='byond://?src=\ref[src];spawnpoint=1'>[pref.read_preference(/datum/preference/choiced/living/spawnpoint)]</a><br>"
if(CONFIG_GET(flag/allow_metadata))
. += span_bold("OOC Notes: <a href='byond://?src=\ref[src];edit_ooc_notes=1'>Edit</a><a href='byond://?src=\ref[src];edit_ooc_note_likes=1'>Likes</a><a href='byond://?src=\ref[src];edit_ooc_note_dislikes=1'>Dislikes</a>") + "<br>"
. = jointext(.,null)
@@ -183,7 +183,7 @@
spawnkeys += spawntype
var/choice = tgui_input_list(user, "Where would you like to spawn when late-joining?", "Late-Join Choice", spawnkeys)
if(!choice || !spawntypes[choice] || !CanUseTopic(user)) return TOPIC_NOACTION
pref.update_preference_by_type(/datum/preference/choiced/human/spawnpoint, choice)
pref.update_preference_by_type(/datum/preference/choiced/living/spawnpoint, choice)
return TOPIC_REFRESH
else if(href_list["edit_ooc_notes"])
@@ -159,17 +159,17 @@
/datum/preference/toggle/human/name_is_always_random/apply_to_human(mob/living/carbon/human/target, value)
return // handled in copy_to
/datum/preference/choiced/human/spawnpoint
/datum/preference/choiced/living/spawnpoint
category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
savefile_key = "spawnpoint"
savefile_identifier = PREFERENCE_CHARACTER
can_randomize = FALSE
/datum/preference/choiced/human/spawnpoint/init_possible_values()
/datum/preference/choiced/living/spawnpoint/init_possible_values()
var/list/spawnkeys = list()
for(var/spawntype in spawntypes)
for(var/spawntype in get_spawn_points())
spawnkeys += spawntype
return spawnkeys
/datum/preference/choiced/human/spawnpoint/apply_to_human(mob/living/carbon/human/target, value)
/datum/preference/choiced/living/spawnpoint/apply_to_living(mob/living/target, value)
return // handled in job_controller
@@ -56,7 +56,7 @@
/datum/preference/color/human/synth_color
category = PREFERENCE_CATEGORY_MANUALLY_RENDERED
savefile_identifier = PREFERENCE_CHARACTER
savefile_key = "synth_color"
savefile_key = "synth_color_rgb"
can_randomize = FALSE
/datum/preference/color/human/synth_color/apply_to_human(mob/living/carbon/human/target, value)
@@ -6,6 +6,11 @@ var/list/spawntypes = list()
var/datum/spawnpoint/S = new type()
spawntypes[S.display_name] = S
/proc/get_spawn_points()
if(!LAZYLEN(spawntypes))
populate_spawn_points()
return spawntypes
/datum/spawnpoint
var/msg //Message to display on the arrivals computer.
var/list/turfs //List of turfs to spawn on.
@@ -103,4 +108,4 @@ var/global/list/latejoin_tram = list()
/datum/spawnpoint/tram/New()
..()
turfs = latejoin_tram
turfs = latejoin_tram
+1 -1
View File
@@ -155,7 +155,7 @@
for(var/mob/viewer in m_viewers)
if(viewer.client && viewer.client.prefs?.read_preference(/datum/preference/toggle/show_looc))
receivers |= viewer.client
else if(isobserver(viewer)) // For AI eyes and the like
else if(isEye(viewer)) // For AI eyes and the like
var/mob/observer/eye/E = viewer
if(E.owner && E.owner.client)
receivers |= E.owner.client
@@ -131,6 +131,9 @@ These should come standard with the Protean rigsuit, unless you want them to wor
/obj/item/rig_module/protean/armor/process()
if(active)
var/mob/living/carbon/human/H = holder.wearer
if(!H)
deactivate(1)
return
if(istype(H.species, /datum/species/protean))
to_chat(H, span_warning("Your Protean modules do not function on yourself."))
deactivate(1)
@@ -185,7 +188,10 @@ These should come standard with the Protean rigsuit, unless you want them to wor
if(active)
var/mob/living/carbon/human/H = holder.wearer
var/mob/living/P = holder?:myprotean
if((istype(H.species, /datum/species/protean)) || !H || !P)
if(!H || !P)
deactivate()
return
if(istype(H.species, /datum/species/protean))
to_chat(H, span_warning("Your Protean modules do not function on yourself."))
deactivate()
return
@@ -10,6 +10,7 @@
icon = DRINK_ICON_FILE
var/base_icon = "square" // Base icon name
volume = 30
icon_state = "square"
var/list/filling_states // List of percentages full that have icons
@@ -571,10 +571,11 @@ emp_act
/mob/living/carbon/human/proc/bloody_hands(var/mob/living/source, var/amount = 2)
if (gloves)
gloves.add_blood(source)
gloves:transfer_blood = amount
gloves:bloody_hands_mob = source
if (istype(gloves, /obj/item/clothing/gloves))
var/obj/item/clothing/gloves/gl = gloves
gl.add_blood(source)
gl.transfer_blood = amount
gl.bloody_hands_mob = source
else
add_blood(source)
bloody_hands = amount
+1 -1
View File
@@ -150,7 +150,7 @@
apply_effect(EYE_BLUR, stun_amount)
if (agony_amount)
apply_damage(agony_amount, HALLOSS, def_zone, 0, used_weapon)
apply_damage(agony_amount, HALLOSS, def_zone, 0, used_weapon=used_weapon)
apply_effect(STUTTER, agony_amount/10)
apply_effect(EYE_BLUR, agony_amount/10)
+1 -1
View File
@@ -102,7 +102,7 @@
return
// Don't let AI eyes yeet themselves off the map
if(isobserver(A))
if(isEye(A))
return
if(A.lost_in_space())
+1 -1
View File
@@ -87,7 +87,7 @@
if(!camera)
return
var/obj/item/photo/selection = camera.selectpicture()
var/obj/item/photo/selection = camera.selectpicture(ui.user)
if (!selection)
return
+35 -33
View File
@@ -21,29 +21,29 @@
p.name = "Image [photos_taken][sufix]"
aipictures += p
/obj/item/camera/siliconcam/proc/injectmasteralbum(obj/item/photo/p) //stores image information to a list similar to that of the datacore
var/mob/living/silicon/robot/C = usr
/obj/item/camera/siliconcam/proc/injectmasteralbum(mob/user, obj/item/photo/p) //stores image information to a list similar to that of the datacore
var/mob/living/silicon/robot/C = user
if(C.connected_ai)
C.connected_ai.aiCamera.injectaialbum(p.copy(1), " (synced from [C.name])")
to_chat(C.connected_ai, span_unconscious("Image uploaded by [C.name]"))
to_chat(usr, span_unconscious("Image synced to remote database")) //feedback to the Cyborg player that the picture was taken
to_chat(user, span_unconscious("Image synced to remote database")) //feedback to the Cyborg player that the picture was taken
else
to_chat(usr, span_unconscious("Image recorded"))
to_chat(user, span_unconscious("Image recorded"))
// Always save locally
injectaialbum(p)
/obj/item/camera/siliconcam/proc/selectpicture(obj/item/camera/siliconcam/cam)
/obj/item/camera/siliconcam/proc/selectpicture(mob/user, obj/item/camera/siliconcam/cam)
if(!cam)
cam = getsource()
cam = getsource(user)
var/list/nametemp = list()
var/find
if(cam.aipictures.len == 0)
to_chat(usr, span_userdanger("No images saved"))
to_chat(user, span_userdanger("No images saved"))
return
for(var/obj/item/photo/t in cam.aipictures)
nametemp += t.name
find = tgui_input_list(usr, "Select image (numbered in order taken)", "Picture Choice", nametemp)
find = tgui_input_list(user, "Select image (numbered in order taken)", "Picture Choice", nametemp)
if(!find)
return
@@ -51,48 +51,50 @@
if(q.name == find)
return q
/obj/item/camera/siliconcam/proc/viewpictures()
var/obj/item/photo/selection = selectpicture()
/obj/item/camera/siliconcam/proc/viewpictures(mob/user)
var/obj/item/photo/selection = selectpicture(user)
if(!selection)
return
selection.show(usr)
to_chat(usr,selection.desc)
selection.show(user)
/obj/item/camera/siliconcam/proc/deletepicture(obj/item/camera/siliconcam/cam)
var/selection = selectpicture(cam)
if(selection.desc)
to_chat(user,selection.desc)
/obj/item/camera/siliconcam/proc/deletepicture(mob/user, obj/item/camera/siliconcam/cam)
var/selection = selectpicture(user, cam)
if(!selection)
return
aipictures -= selection
to_chat(usr, span_unconscious("Local image deleted"))
to_chat(user, span_unconscious("Local image deleted"))
/obj/item/camera/siliconcam/ai_camera/can_capture_turf(turf/T, mob/user)
var/mob/living/silicon/ai = user
return ai.TurfAdjacent(T)
/obj/item/camera/siliconcam/proc/toggle_camera_mode()
/obj/item/camera/siliconcam/proc/toggle_camera_mode(mob/user)
if(in_camera_mode)
camera_mode_off()
camera_mode_off(user)
else
camera_mode_on()
camera_mode_on(user)
/obj/item/camera/siliconcam/proc/camera_mode_off()
/obj/item/camera/siliconcam/proc/camera_mode_off(mob/user)
src.in_camera_mode = 0
to_chat(usr, span_infoplain(span_bold("Camera Mode deactivated")))
to_chat(user, span_infoplain(span_bold("Camera Mode deactivated")))
/obj/item/camera/siliconcam/proc/camera_mode_on()
/obj/item/camera/siliconcam/proc/camera_mode_on(mob/user)
src.in_camera_mode = 1
to_chat(usr, span_infoplain(span_bold("Camera Mode activated")))
to_chat(user, span_infoplain(span_bold("Camera Mode activated")))
/obj/item/camera/siliconcam/ai_camera/printpicture(mob/user, obj/item/photo/p)
injectaialbum(p)
to_chat(usr, span_unconscious("Image recorded"))
to_chat(user, span_unconscious("Image recorded"))
/obj/item/camera/siliconcam/robot_camera/printpicture(mob/user, obj/item/photo/p)
injectmasteralbum(p)
injectmasteralbum(user, p)
/mob/living/silicon/ai/proc/take_image()
set category = "AI.Commands"
@@ -100,7 +102,7 @@
set desc = "Takes an image"
if(aiCamera)
aiCamera.toggle_camera_mode()
aiCamera.toggle_camera_mode(src)
/mob/living/silicon/ai/proc/view_images()
set category = "AI.Commands"
@@ -108,7 +110,7 @@
set desc = "View images"
if(aiCamera)
aiCamera.viewpictures()
aiCamera.viewpictures(src)
/mob/living/silicon/ai/proc/delete_images()
set category = "AI.Commands"
@@ -116,7 +118,7 @@
set desc = "Delete image"
if(aiCamera)
aiCamera.deletepicture()
aiCamera.deletepicture(src)
/mob/living/silicon/robot/proc/take_image()
set category ="Abilities.Silicon"
@@ -124,7 +126,7 @@
set desc = "Takes an image"
if(aiCamera)
aiCamera.toggle_camera_mode()
aiCamera.toggle_camera_mode(src)
/mob/living/silicon/robot/proc/view_images()
set category ="Abilities.Silicon"
@@ -132,7 +134,7 @@
set desc = "View images"
if(aiCamera)
aiCamera.viewpictures()
aiCamera.viewpictures(src)
/mob/living/silicon/robot/proc/delete_images()
set category = "Abilities.Silicon"
@@ -140,13 +142,13 @@
set desc = "Delete a local image"
if(aiCamera)
aiCamera.deletepicture()
aiCamera.deletepicture(src)
/obj/item/camera/siliconcam/proc/getsource()
/obj/item/camera/siliconcam/proc/getsource(mob/user)
if(isAI(src.loc))
return src
var/mob/living/silicon/robot/C = usr
var/mob/living/silicon/robot/C = user
var/obj/item/camera/siliconcam/Cinfo
if(C.connected_ai)
Cinfo = C.connected_ai.aiCamera
@@ -157,4 +159,4 @@
/mob/living/silicon/proc/GetPicture()
if(!aiCamera)
return
return aiCamera.selectpicture()
return aiCamera.selectpicture(src)
+7 -7
View File
@@ -208,7 +208,7 @@ var/list/possible_cable_coil_colours = list(
if(c.d1 == UP || c.d2 == UP)
qdel(c)
investigate_log("was cut by [key_name(usr, usr.client)] in [user.loc.loc]","wires")
investigate_log("was cut by [key_name(user, user.client)] in [user.loc.loc]","wires")
qdel(src)
return
@@ -245,7 +245,7 @@ var/list/possible_cable_coil_colours = list(
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start()
if(usr.stunned)
if(user.stunned)
return 1
return 0
@@ -601,8 +601,8 @@ var/list/possible_cable_coil_colours = list(
/obj/item/stack/cable_coil/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/multitool))
var/selected_type = tgui_input_list(usr, "Pick new colour.", "Cable Colour", possible_cable_coil_colours)
set_cable_color(selected_type, usr)
var/selected_type = tgui_input_list(user, "Pick new colour.", "Cable Colour", possible_cable_coil_colours)
set_cable_color(selected_type, user)
return
return ..()
@@ -981,7 +981,7 @@ var/list/possible_cable_coil_colours = list(
/obj/item/stack/cable_coil/alien/attack_hand(mob/user as mob)
if (user.get_inactive_hand() == src)
var/N = tgui_input_number(usr, "How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1, amount)
var/N = tgui_input_number(user, "How many units of wire do you want to take from [src]? You can only take up to [amount] at a time.", "Split stacks", 1, amount)
if(N && N <= amount)
var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc)
CC.amount = N
@@ -992,8 +992,8 @@ var/list/possible_cable_coil_colours = list(
src.add_fingerprint(user)
CC.add_fingerprint(user)
spawn(0)
if (src && usr.machine==src)
src.interact(usr)
if (src && user.machine==src)
src.interact(user)
else
return
else
+2 -2
View File
@@ -18,10 +18,10 @@
return
if(W.has_tool_quality(TOOL_WIRECUTTER))
to_chat(usr, span_blue("These cables are too tough to be cut with those [W.name]."))
to_chat(user, span_blue("These cables are too tough to be cut with those [W.name]."))
return
else if(istype(W, /obj/item/stack/cable_coil))
to_chat(usr, span_blue("You will need heavier cables to connect to these."))
to_chat(user, span_blue("You will need heavier cables to connect to these."))
return
else
..()
+1 -1
View File
@@ -134,4 +134,4 @@
tgui_alert_async(new_user,"Your current species, [new_user.client.prefs.species], is not available for play on the station.")
return 0
new_user.AttemptLateSpawn(job, new_user.read_preference(/datum/preference/choiced/human/spawnpoint))
new_user.AttemptLateSpawn(job, new_user.read_preference(/datum/preference/choiced/living/spawnpoint))
@@ -1579,3 +1579,11 @@
icon = 'icons/inventory/accessory/item.dmi'
icon_state = "silver"
//beeholddrbeesphb: Evelynn
/obj/item/laser_pointer/evelynn_fluff
name = "Evelynn's Laser Pointer"
desc = "A small, furry, and fluffy toy that looks like a bee. It has laser eyes. Upon firing, the lasers make a buzzing noise."
icon = 'icons/vore/custom_items_vr.dmi'
icon_state = "evelynn"
pointer_icon_state = "purple_laser"
+1 -1
View File
@@ -91,7 +91,7 @@
// Okay we can start saving the data
if(new_spawn_point_type && prefs.persistence_settings & PERSIST_SPAWN)
prefs.update_preference_by_type(/datum/preference/choiced/human/spawnpoint, initial(new_spawn_point_type.display_name))
prefs.update_preference_by_type(/datum/preference/choiced/living/spawnpoint, initial(new_spawn_point_type.display_name))
if(ishuman(occupant) && occupant.stat != DEAD)
var/mob/living/carbon/human/H = occupant
testing("Persist (PID): Saving stuff from [H] to [prefs] (\ref[prefs]).")