diff --git a/_maps/map_files/Talos/TGS_Talos.dmm b/_maps/map_files/Talos/TGS_Talos.dmm index 8316466457c..5a16988c3b8 100644 --- a/_maps/map_files/Talos/TGS_Talos.dmm +++ b/_maps/map_files/Talos/TGS_Talos.dmm @@ -20372,13 +20372,6 @@ /obj/effect/turf_decal/siding/metal, /turf/open/floor/mainship/metal, /area/mainship/hallways/port_hallway) -"mgc" = ( -/obj/item/tool/mop, -/obj/effect/turf_decal/siding/metal{ - dir = 8 - }, -/turf/open/floor/mainship/metal, -/area/mainship/hallways/bow_hallway) "mgh" = ( /obj/effect/turf_decal/warning_stripes/cargo/yellow, /obj/item/radio/intercom/general{ @@ -71014,7 +71007,7 @@ fkO taD fkO fkO -mgc +fkO uoK rBl xkT diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index ff7ae348c79..d7986661308 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -276,7 +276,7 @@ #define COMSIG_MOVABLE_POST_THROW "movable_post_throw" //called on tail of atom/movable/throw_at() #define COMSIG_MOVABLE_DISPOSING "movable_disposing" //called when the movable is added to a disposal holder object for disposal movement: (obj/structure/disposalholder/holder, obj/machinery/disposal/source) #define COMSIG_MOVABLE_HEAR "movable_hear" //from base of atom/movable/Hear(): (message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode) -#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/onTransitZ(): (old_z, new_z) +#define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" //from base of atom/movable/on_changed_z_level(): (old_z, new_z) #define COMSIG_MOVABLE_PREBUMP_TURF "movable_prebump_turf" #define COMSIG_MOVABLE_PREBUMP_MOVABLE "movable_prebump_movable" #define COMPONENT_MOVABLE_PREBUMP_STOPPED (1<<0) diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index eea42b10851..73c8ec5127b 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -88,9 +88,10 @@ if(fs_view == client_view) return if(screen_loc != "CENTER-7,CENTER-7") - var/list/actualview = getviewsize(client_view) - fs_view = client_view - transform = matrix(actualview[1] / FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2] / FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) + return + var/list/actualview = getviewsize(client_view) + fs_view = client_view + transform = matrix(actualview[1] / FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2] / FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) /atom/movable/screen/fullscreen/proc/should_show_to(mob/mob) if(!show_when_dead && mob.stat == DEAD) diff --git a/code/game/atoms/atom_movable.dm b/code/game/atoms/atom_movable.dm index 1dba7a53cee..d421e50688b 100644 --- a/code/game/atoms/atom_movable.dm +++ b/code/game/atoms/atom_movable.dm @@ -434,10 +434,8 @@ RU TGMC EDIT */ old_area.Exited(src, movement_dir) var/turf/oldturf = get_turf(oldloc) var/turf/destturf = get_turf(destination) - var/old_z = (oldturf ? oldturf.z : null) - var/dest_z = (destturf ? destturf.z : null) - if(old_z != dest_z) - onTransitZ(old_z, dest_z) + if(oldturf?.z != destturf?.z) + on_changed_z_level(oldturf, destturf) destination.Entered(src, oldloc) if(destarea && old_area != destarea) destarea.Entered(src, oldloc) @@ -848,13 +846,22 @@ RU TGMC EDIT */ H.selected_default_language = . . = chosen_langtype +/** + * Called when a movable changes z-levels. + * + * Arguments: + * * old_turf - The previous turf they were on before. + * * new_turf - The turf they have now entered. + * * notify_contents - Whether or not to notify the movable's contents that their z-level has changed. NOTE, IF YOU SET THIS, YOU NEED TO MANUALLY SET PLANE OF THE CONTENTS LATER + */ +/atom/movable/proc/on_changed_z_level(turf/old_turf, turf/new_turf, notify_contents = TRUE) + SHOULD_CALL_PARENT(TRUE) + SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_turf?.z, new_turf?.z) -/atom/movable/proc/onTransitZ(old_z,new_z) - SEND_SIGNAL(src, COMSIG_MOVABLE_Z_CHANGED, old_z, new_z) - for(var/item in src) // Notify contents of Z-transition. This can be overridden IF we know the items contents do not care. - var/atom/movable/AM = item - AM.onTransitZ(old_z,new_z) - + if(!notify_contents) + return + for(var/atom/movable/content as anything in src) + content.on_changed_z_level(old_turf, new_turf) /atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, force = MOVE_FORCE_STRONG) if(anchored || (force < (move_resist * MOVE_FORCE_THROW_RATIO)) || (move_resist == INFINITY)) diff --git a/code/game/objects/machinery/squad_supply/supply_beacon.dm b/code/game/objects/machinery/squad_supply/supply_beacon.dm index 089afae4871..ebb1e9a8f73 100644 --- a/code/game/objects/machinery/squad_supply/supply_beacon.dm +++ b/code/game/objects/machinery/squad_supply/supply_beacon.dm @@ -121,10 +121,10 @@ SIGNAL_HANDLER beacon_datum = null -/obj/item/beacon/supply_beacon/onTransitZ(old_z,new_z) +/obj/item/beacon/supply_beacon/on_changed_z_level(old_turf, new_turf, notify_contents) . = ..() //Assumes doMove sets loc before onTransitZ - if(beacon_datum) // RUTGMC ADDITION, supply beacon runtime fix + if(beacon_datum) beacon_datum.drop_location = loc /obj/item/beacon/supply_beacon/activate(mob/living/carbon/human/H) diff --git a/code/game/objects/machinery/vending/marine_vending.dm b/code/game/objects/machinery/vending/marine_vending.dm index 01712b0d980..915a3ff5f5c 100644 --- a/code/game/objects/machinery/vending/marine_vending.dm +++ b/code/game/objects/machinery/vending/marine_vending.dm @@ -165,6 +165,7 @@ /obj/item/ammo_magazine/rifle/pepperball/pepperball_mini = -1, /obj/item/attachable/stock/t76 = -1, /obj/item/attachable/flamer_nozzle = -1, + /obj/item/attachable/flamer_nozzle/wide = -1, /obj/item/attachable/flamer_nozzle/long = -1, ), "Boxes" = list( @@ -375,6 +376,7 @@ /obj/item/ammo_magazine/rifle/pepperball/pepperball_mini = -1, /obj/item/attachable/stock/t76 = -1, /obj/item/attachable/flamer_nozzle = -1, + /obj/item/attachable/flamer_nozzle/wide = -1, /obj/item/attachable/flamer_nozzle/long = -1, ), "Boxes" = list( @@ -621,6 +623,7 @@ /obj/item/ammo_magazine/rifle/pepperball/pepperball_mini = -1, /obj/item/attachable/stock/t76 = -1, /obj/item/attachable/flamer_nozzle = -1, + /obj/item/attachable/flamer_nozzle/wide = -1, /obj/item/attachable/flamer_nozzle/long = -1, ), "Boxes" = list( diff --git a/code/game/sound.dm b/code/game/sound.dm index f5fc4ea888a..5f89017d467 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -49,44 +49,50 @@ A good representation is: 'byond applies a volume reduction to the sound every X /proc/playsound(atom/source, soundin, vol, vary, sound_range, falloff, is_global, frequency, channel = 0, ambient_sound = FALSE) var/turf/turf_source = get_turf(source) - if(!turf_source) + if(!turf_source || !soundin || !vol) return //allocate a channel if necessary now so its the same for everyone channel = channel || SSsounds.random_available_channel() if(!sound_range) - sound_range = round(0.5*vol) //if no specific range, the max range is equal to half the volume. + sound_range = round(0.5 * vol) //if no specific range, the max range is equal to half the volume. if(!frequency) - frequency = GET_RANDOM_FREQ // Same frequency for everybody - // Looping through the player list has the added bonus of working for mobs inside containers + frequency = GET_RANDOM_FREQ var/sound/S = sound(get_sfx(soundin)) - var/source_z = turf_source.z - var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy() - for(var/mob/listening_mob in listeners | SSmobs.dead_players_by_zlevel[source_z]) - if(get_dist(listening_mob, turf_source) > sound_range) + var/list/listeners = SSmobs.clients_by_zlevel[turf_source.z].Copy() + for(var/mob/ai_eye AS in GLOB.aiEyes) + var/turf/eye_turf = get_turf(ai_eye) + if(!eye_turf || eye_turf.z != turf_source.z) continue - listening_mob.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, is_global, channel, S, sound_reciever = listening_mob) + listeners += ai_eye - for(var/mob/M AS in GLOB.aiEyes) - if(ambient_sound && !(M.client?.prefs?.toggles_sound & SOUND_AMBIENCE)) + for(var/mob/listener AS in listeners|SSmobs.dead_players_by_zlevel[turf_source.z]) + if(get_dist(listener, turf_source) > sound_range) continue - var/turf/T = get_turf(M) - if(!T || T.z != turf_source.z || get_dist(M, turf_source) > sound_range) + if(ambient_sound && !(listener.client?.prefs?.toggles_sound & SOUND_AMBIENCE)) continue - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, is_global, channel, S, sound_reciever = M) + listener.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, is_global, channel, S) + + //We do tanks separately, since they are not actually on the source z, and we need some other stuff to get accurate directional sound for(var/obj/vehicle/sealed/armored/armor AS in GLOB.tank_list) - if(!armor.interior || armor.z != turf_source.z || get_dist(armor, turf_source) > sound_range) + if(!armor.interior || armor.z != turf_source.z || get_dist(armor.loc, turf_source) > sound_range) + continue + if(!length(armor.interior.occupants)) continue + var/turf/middle_turf = armor.interior.loaded_turfs[floor(length(armor.interior.loaded_turfs) * 0.5)] + var/turf/origin_point = locate(clamp(middle_turf.x - armor.x + turf_source.x, 1, world.maxx), clamp(middle_turf.y - armor.y + turf_source.y, 1, world.maxy), middle_turf.z) + //origin point is regardless of vehicle orientation for player QOL and simple sanity + for(var/mob/crew AS in armor.interior.occupants) if(!crew.client) continue - //turf source is null on purpose because it will not work properly since crew is on a different z - crew.playsound_local(null, soundin, vol*0.5, vary, frequency, falloff, is_global, channel, S, sound_reciever = crew) - + if(ambient_sound && !(crew.client.prefs.toggles_sound & SOUND_AMBIENCE)) + continue + crew.playsound_local(origin_point, soundin, vol*0.5, vary, frequency, falloff, is_global, channel, S) //todo rename S to sound_to_use /mob/proc/playsound_local(turf/turf_source, soundin, vol, vary, frequency, falloff, is_global, channel = 0, sound/S, distance_multiplier = 1, mob/sound_reciever) diff --git a/code/modules/lighting/emissive_blocker.dm b/code/modules/lighting/emissive_blocker.dm index ca9b5c7ff90..d217df06ffb 100644 --- a/code/modules/lighting/emissive_blocker.dm +++ b/code/modules/lighting/emissive_blocker.dm @@ -28,7 +28,8 @@ /atom/movable/emissive_blocker/ex_act(severity) return FALSE -/atom/movable/emissive_blocker/onTransitZ() +/atom/movable/emissive_blocker/on_changed_z_level(turf/old_turf, turf/new_turf, notify_contents = TRUE) + SHOULD_CALL_PARENT(FALSE) return //Prevents people from moving these after creation, because they shouldn't be. diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 91aa8dc2f56..1450ab81d81 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -7,7 +7,6 @@ INITIALIZE_IMMEDIATE(/mob/dead) move_resist = INFINITY resistance_flags = RESIST_ALL - /mob/dead/dust() //ghosts can't be vaporised. return @@ -18,7 +17,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) var/turf/old_turf = get_turf(src) var/turf/new_turf = get_turf(destination) if (old_turf?.z != new_turf?.z) - onTransitZ(old_turf?.z, new_turf?.z) + on_changed_z_level(old_turf, new_turf) var/oldloc = loc loc = destination Moved(oldloc, NONE, TRUE) @@ -26,7 +25,6 @@ INITIALIZE_IMMEDIATE(/mob/dead) /mob/dead/abstract_move(atom/destination) var/turf/old_turf = get_turf(src) var/turf/new_turf = get_turf(destination) - if (old_turf?.z != new_turf?.z) - onTransitZ(old_turf?.z, new_turf?.z) + if(old_turf?.z != new_turf?.z) + on_changed_z_level(old_turf, new_turf) return ..() - diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 71302b18906..1ff71b195a7 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -10,7 +10,8 @@ GLOB.human_mob_list += src GLOB.alive_human_list += src - LAZYADD(GLOB.humans_by_zlevel["[z]"], src) + if(z) + LAZYADD(GLOB.humans_by_zlevel["[z]"], src) var/datum/action/skill/toggle_orders/toggle_orders_action = new toggle_orders_action.give_action(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e804b57cdd7..fe0aebcd4cf 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -10,6 +10,21 @@ updatehealth() + if(client) + var/turf/T = get_turf(src) + if(!T) + return + if(registered_z != T.z) +#ifdef TESTING + message_admins("[ADMIN_LOOKUPFLW(src)] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z]. If you could ask them how that happened and notify coderbus, it would be appreciated.") +#endif + log_game("Z-TRACKING: [src] has somehow ended up in Z-level [T.z] despite being registered in Z-level [registered_z].") + update_z(T.z) + return + if(registered_z) + log_game("Z-TRACKING: [src] of type [src.type] has a Z-registration despite not having a client.") + update_z(null) + //this updates all special effects: knockdown, druggy, etc.., DELETE ME!! /mob/living/proc/handle_status_effects() @@ -200,6 +215,7 @@ if(client) reset_perspective() +///Updates the mob's registered_z /mob/living/proc/update_z(new_z) // 1+ to register, null to unregister if(registered_z == new_z) return @@ -761,9 +777,10 @@ below 100 is not dizzy /mob/living/can_interact_with(datum/D) return D == src || D.Adjacent(src) -/mob/living/onTransitZ(old_z, new_z) - . = ..() +/mob/living/on_changed_z_level(turf/old_turf, turf/new_turf, notify_contents = TRUE) set_jump_component() + . = ..() + update_z(new_turf?.z) /** * Changes the inclination angle of a mob, used by humans and others to differentiate between standing up and prone positions. diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 74f20355716..f0b6497f001 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -151,3 +151,5 @@ var/time_entered_stasis = 0 ///The world.time of when this mob entered a cryo tube var/time_entered_cryo = 0 + ///The z level this mob is currently registered in + var/registered_z = null diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm index e8ec00f70a6..6d1cace159c 100644 --- a/code/modules/mob/living/login.dm +++ b/code/modules/mob/living/login.dm @@ -7,9 +7,9 @@ INVOKE_ASYNC(SSdiscord, TYPE_PROC_REF(/datum/controller/subsystem/discord, get_boosty_tier), ckey) - var/turf/T = get_turf(src) - if (isturf(T)) - update_z(T.z) + var/turf/mob_turf = get_turf(src) + if(isturf(mob_turf)) + update_z(mob_turf.z) if(length(pipes_shown)) //ventcrawling, need to reapply pipe vision var/obj/machinery/atmospherics/A = loc diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm index 8ba87817b32..a953fe7d4d3 100644 --- a/code/modules/mob/living/logout.dm +++ b/code/modules/mob/living/logout.dm @@ -1,7 +1,7 @@ /mob/living/Logout() update_z(null) - ..() - if (mind) + . = ..() + if(mind) if(!key) //key and mind have become seperated. mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body. if(!immune_to_ssd && mind.active) diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 0b00d4b2703..0891d79024d 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -89,7 +89,7 @@ var/turf/old_turf = get_turf(src) var/turf/new_turf = get_turf(new_loc) if(old_turf?.z != new_turf?.z) - onTransitZ(old_turf?.z, new_turf?.z) + on_changed_z_level(old_turf, new_turf) return ..() diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index bd487a9c331..306f9288d33 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -254,10 +254,10 @@ else stack_trace("Something attempted to set simple animals AI to an invalid state: [togglestatus]") -/mob/living/simple_animal/onTransitZ(old_z, new_z) +/mob/living/simple_animal/on_changed_z_level(turf/old_turf, turf/new_turf, notify_contents = TRUE) . = ..() if(AIStatus == AI_Z_OFF) - SSidlenpcpool.idle_mobs_by_zlevel[old_z] -= src + SSidlenpcpool.idle_mobs_by_zlevel[old_turf.z] -= src toggle_ai(initial(AIStatus)) /mob/living/simple_animal/proc/handle_automated_action() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 87af1763fd5..d911392db80 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -827,16 +827,13 @@ clear_important_client_contents() canon_client = null -/mob/onTransitZ(old_z, new_z) +/mob/on_changed_z_level(turf/old_turf, turf/new_turf, notify_contents = TRUE) . = ..() if(!client || !hud_used) return - if(old_z == new_z) + if(old_turf?.z == new_turf?.z) return - if(isliving(src)) - var/mob/living/living = src - living.update_z(new_z) - if(is_ground_level(new_z)) + if(is_ground_level(new_turf.z)) hud_used.remove_parallax(src) return hud_used.create_parallax(src) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 9f34f4b4d70..8375968150d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -149,6 +149,3 @@ var/list/pain_stored = list() var/last_pain_message = "" var/next_pain_time = 0 - - ///The z level this mob is currently registered in - var/registered_z = null //for sound optimization diff --git a/code/modules/projectiles/guns/flamer.dm b/code/modules/projectiles/guns/flamer.dm index af254be8c93..86d2f9717fc 100644 --- a/code/modules/projectiles/guns/flamer.dm +++ b/code/modules/projectiles/guns/flamer.dm @@ -59,9 +59,9 @@ ///Max range of the flamer in tiles. var/flame_max_range = 6 ///Max resin wall penetration in tiles. - var/flame_max_wall_pen = 2 + var/flame_max_wall_pen = 3 ///After how many total resin walls the flame wont proceed further - var/flame_max_wall_pen_wide = 9 + var/flame_max_wall_pen_wide = 7 ///Travel speed of the flames in seconds. var/flame_spread_time = 0.1 SECONDS ///Gun based modifier for burn level. Percentage based. diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm index 9213e43ed24..e2e48ad8d80 100644 --- a/code/modules/shuttle/on_move.dm +++ b/code/modules/shuttle/on_move.dm @@ -110,7 +110,7 @@ All ShuttleMove procs go here var/turf/newT = get_turf(src) if (newT.z != oldT.z) - onTransitZ(oldT.z, newT.z) + on_changed_z_level(oldT, newT) if(light) update_light() diff --git a/html/changelogs/AutoChangeLog-pr-598.yml b/html/changelogs/AutoChangeLog-pr-598.yml new file mode 100644 index 00000000000..f6cd961f9cf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-598.yml @@ -0,0 +1,6 @@ +author: "Tatarla" +delete-after: True +changes: + - balance: "Спрей-насадка возвращена в вендор оружия" + - balance: "Спрей насадка прожигает до 7 стенок вместо 9" + - balance: "Обычная насадка прожигает до 3 стенок вместо 2" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-601.yml b/html/changelogs/AutoChangeLog-pr-601.yml new file mode 100644 index 00000000000..e241162f25c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-601.yml @@ -0,0 +1,4 @@ +author: "Helg2" +delete-after: True +changes: + - bugfix: "Исправил баг с неправильным звучанием различных звуков в танке." \ No newline at end of file diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml index 135cbcf235c..8078a7002cd 100644 --- a/html/changelogs/archive/2024-10.yml +++ b/html/changelogs/archive/2024-10.yml @@ -568,6 +568,8 @@ \u0430 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\u043B\u044C\u0437\u044F\ \ \u043F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u043A \u0434\ \u0440\u0443\u0433\u0438\u043C \u0448\u0430\u0442\u0442\u043B\u0430\u043C." + - code_imp: "\u041F\u043E\u0447\u0438\u0441\u0442\u0438\u043B \u043A\u043E\u0434\ + \ change_view()" - rscdel: "\u0423\u0434\u0430\u043B\u0438\u043B \u0425\u0415 \u043F\u0430\u0442\u0440\ \u043E\u043D\u044B \u043D\u0430 tx54." - balance: "\u041C\u043E\u0434\u0443\u043B\u044C \u0412\u0430\u043B\u044C\u043A\u0438\ @@ -617,17 +619,33 @@ \u0432\u043D\u0438\u0442\u044C \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\ \u0435 \u043A\u0443\u043A\u043B\u044B \u0441 \u0442\u0440\u0430\u0432\u043C\u0430\ \u043C\u0438." + - bugfix: "\u0422\u0435\u043F\u0435\u0440\u044C \u043D\u0435\u043B\u044C\u0437\u044F\ + \u0442 \u0442\u0438\u0440\u043E\u0432 \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\ + \u044E \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0430/\u043A\u0430\u0441\u0442\ + \ \u0441\u0432\u0430\u043F\u0430." - admin: "Jump-To \u043F\u0440\u043E\u043A\u0438, \u0441\u043C\u0430\u0439\u0442\ \u044B, \u0441\u043A\u0430\u0447\u0438\u0432\u0430\u043D\u0438\u0435 \u043B\u043E\ - \u0433\u043E\u0432 \u0438 \u0430\u043F\u0438\u043A\u0435\u0440 \u0442\u0435\u043F\ \u0435\u0440\u044C \u0442\u0433\u0443\u0438." - admin: "Dsay \u0442\u0435\u043F\u0435\u0440\u044C html." - code_imp: "\u0413\u0438\u0431\u044B \u0442\u0435\u043F\u0435\u0440\u044C \u043D\ \u0435 \u0432\u043B\u0438\u044F\u044E\u0442 \u043D\u0430 \u0441\u043A\u043E\u0440\ \u043E\u0441\u0442\u044C \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438." Tatarla: + - image: "\u041F\u0430\u0440\u0442\u0438\u044F \u0432\u044B\u0434\u0435\u043B\u0438\ + \u043B\u0430 \u0434\u0435\u043D\u044C\u0433\u0438 \u043D\u0430 \u043D\u043E\u0432\ + \u043E\u0435 \u043C\u044B\u043B\u043E \u0438 \u0448\u043F\u0440\u0438\u0446\u044B" - balance: "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u043B\u044F\u0440\ \u0432\u0430\u043F\u043E\u0438\u043D\u0442\u043E\u0432 \u0441 \u043D\u0435\u0431\ \u043E\u0435\u0432\u044B\u0445 \u0448\u0438\u043F\u0441\u0430\u0439\u0434 \u0440\ \u043E\u043B\u0435\u0439 \u0441\u043D\u0438\u0436\u0435\u043D\u0430 \u0441 1\ \ \u0434\u043E 0.5" +2024-10-27: + Helg2: + - rscadd: "\u0414\u043E\u0431\u0430\u0432\u0438\u043B \u043D\u043E\u0432\u044B\u0435\ + \ \u044D\u043C\u043E\u0434\u0437\u0438: blundir, rosecat, nerdcat, boomcat,\ + \ catge, diplocat" +2024-10-28: + Helg2: + - bugfix: "\u0418\u0441\u043F\u0440\u0430\u0432\u0438\u043B \u043A\u0440\u0438\u0432\ + \u044B\u0435 \u0441\u043A\u0440\u0438\u043D \u043E\u0432\u0435\u0440\u043B\u0435\ + \u0438." diff --git a/icons/misc/emoji.dmi b/icons/misc/emoji.dmi index ef7796417c2..3fd4dea16ef 100644 Binary files a/icons/misc/emoji.dmi and b/icons/misc/emoji.dmi differ diff --git a/icons/obj/items/syringe.dmi b/icons/obj/items/syringe.dmi index 00b64c5fed7..6c9d3f40a91 100644 Binary files a/icons/obj/items/syringe.dmi and b/icons/obj/items/syringe.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 02e9def59ad..e81afba755d 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ