From f1a77fe90ac5c199833a2c611b00568e6256d721 Mon Sep 17 00:00:00 2001 From: Danielance Date: Wed, 11 Mar 2026 03:37:57 -0400 Subject: [PATCH 1/7] adds missing bulletproof vest sprites for digitigrade legs and teshari (#5325) ## About The Pull Request Very similar to the [ablative trenchcoat PR](https://github.com/Bubberstation/Bubberstation/pull/5285), but for another armory item, the bulletproof vest. Has the same missing sprite issues (missing textures for digitigrade legs, fallback sprite for teshari), both fixed by the PR. ## Why It's Good For The Game Less missing sprites good! ## Proof Of Testing Works on my machine.
Screenshots/Videos after PR: Screenshot_285 before PR, for comparison: Screenshot_284 teshari sprites all views: Screenshot_286 Screenshot_288 Screenshot_289
## Changelog :cl: fix: bulletproof vest sprites for digitigrade legs and teshari /:cl: --- .../code/modules/clothing/suits/misc.dm | 7 +++++++ .../icons/mob/clothing/suits/armor_digi.dmi | Bin 15967 -> 17042 bytes .../mob/clothing/suits/armor_teshari.dmi | Bin 2831 -> 3003 bytes 3 files changed, 7 insertions(+) diff --git a/modular_zubbers/code/modules/clothing/suits/misc.dm b/modular_zubbers/code/modules/clothing/suits/misc.dm index 16fd0469f80..96e0f31bbc6 100644 --- a/modular_zubbers/code/modules/clothing/suits/misc.dm +++ b/modular_zubbers/code/modules/clothing/suits/misc.dm @@ -64,3 +64,10 @@ worn_icon_digi = 'modular_skyrat/master_files/icons/mob/clothing/suits/armor_digi.dmi' // new teshari sprites worn_icon_teshari = 'modular_zubbers/icons/mob/clothing/suits/armor_teshari.dmi' + +// bulletproof armor +/obj/item/clothing/suit/armor/bulletproof + // "new" digi sprites, purple missing coat otherwise + worn_icon_digi = 'modular_zubbers/icons/mob/clothing/suits/armor_digi.dmi' + // new teshari sprites + worn_icon_teshari = 'modular_zubbers/icons/mob/clothing/suits/armor_teshari.dmi' diff --git a/modular_zubbers/icons/mob/clothing/suits/armor_digi.dmi b/modular_zubbers/icons/mob/clothing/suits/armor_digi.dmi index 7e13766d0415abf5a0079340671744be25b177b8..07aec396af4524bcf3dfa248db5702378b73cabb 100644 GIT binary patch literal 17042 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 literal 15967 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 diff --git a/modular_zubbers/icons/mob/clothing/suits/armor_teshari.dmi b/modular_zubbers/icons/mob/clothing/suits/armor_teshari.dmi index b604a474c0be03de3c9b688523022f7c8b01920e..320ac2e06c2586dcc8f7969e870c6485cfe0cf39 100644 GIT binary patch delta 2723 zcmX|Dc{tQ-8=e_UnaCa?Lz^X`&7PUDJHlj7m}x^D`>rv5#v!sVS+ga(GU^jq$F34$ zDrK5Owz0%m%3!u{`mXPs`=9rE?(2Eq`+lG2`Qu4H(k_*85-j!Nlq481LYg?(qudJr zg8_j+;1D|-dk|vrizhdzyYJuJ2hdVjz5?}CxpGuRo%gcMeOCMx@JDRn0wgV9me_dhpxyx=a|5h} zTZ+crkd2g=ZjXrBwOX}4;o*n(%>G8(2?aa0e8R3u&B5r-%B!zwSSIM zQpg4Ls_o(r*at-l!vS_{3WvG3U8KPSu6)Nn)Z!G3{^2|iEn>-Rzry7kfBH($!)l1K zg2rms^&PvXzP0eKVyK8gQhIQS%)4E{LG{zUwSi>USFV|=%8vIE63opL5-urdo4xn@C^DHP!D<)?ksuduutTW`)xQ5)!G3^9I4Ve(3l1F}aIz zYUJ%L`9)x%gPJqkk+*5o#3T`H(4FPQ(~u~2&_>+O3)*K7BR=+U;VP_U;r7=p;MsX+ z1%~iUD}&!hx?0InagJebj_Vd@&P9{y`e$2XJz73(vcfnn9*QMJ>5!EzMHBcU z6yy=&TFx1{_B3$E8r^hTQUU0~Ew*|2>W-b5PbJgnuEn`-AaPa~!_08d+wcCb>h#-% z6T-eL*kt2tBKWPw z#y@Y6KLb6a1i`)=8NNU+b&D6Svh>}y2T`lA?UW;_^Cc6G!^A!MhC#HWM$;3^p}c*f zqnZc%&W-xZJ-{2m!e6A8BJKqvcGsT= zCFXpMc_fP!tP{SJq1$&TP9{-M zsVC+uQd2-fd)k8ybfH;vg7kmA8nrBS3fPjLdo#l!ko_(JigMV zg#S3c#r$hHdH7k%1he2fKMJ|X+Op?uW!XHtGkF1UF+iL8j%x7S=5~^}ppvvBrItY+zqa?gGBM%BL zTvqe;j&Dl!!iZh*oO{;8I}-b24<>_%u1#8 z>7yNEkGfYoLY7^-DoyzR1?-S0azJX0Hbh*T&j&PehX>@gO&N^Mv4fd8QM@scYl(jcTR&h&+l-|Ki5dje}C)KLWLzoSsaz70tEs zaTUp0uoFd-rzca!gci34E>#hvg5%GenEmOI$bi#m)J@ts93jp2wbev?x#>#_aktyP z0Qy37Sgd1`?@=wk2}whIGm&rOzWOTYN#&hFS7qjJM%xgr;x9fRgIu);s(+oevd?JSG=0C=zT%hs##F3Fd}*Hn zaG4NU4gZf)STCFki{bFZY*p4s%?U36T0LhGH;V8TD46Zo0>aU1!6gQ8>!gDj$Xn?T9 z8tqR2DC0iHVetGrr2PEAttcOW^VFEmV)-@Sc;Dv!Ycf##UElH#*-Hclo9(G(Z@RPv zlSEa%E-)-37G&VPUqMFbbQMmn89L|KVh+>$3Fl7(L0|`7h*>r*@XqEhGr{wC|Yt?PLQRkjY)$MCicJj CIbvl1 delta 2549 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 V39l8tZ~fyyF2~&94NgI6{{u$E7Rdkr From cc7d318c41c010fc6870f81005842919513518a0 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed, 11 Mar 2026 08:38:21 +0100 Subject: [PATCH 2/7] Automatic changelog for PR #5325 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-5325.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-5325.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-5325.yml b/html/changelogs/AutoChangeLog-bubber-pr-5325.yml new file mode 100644 index 00000000000..f228a30c08e --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-5325.yml @@ -0,0 +1,4 @@ +author: "Danielance" +delete-after: True +changes: + - bugfix: "bulletproof vest sprites for digitigrade legs and teshari" \ No newline at end of file From 98b6a2ff1a4558b41fe9721aff08a11067468198 Mon Sep 17 00:00:00 2001 From: Alexis Date: Wed, 11 Mar 2026 18:20:18 -0400 Subject: [PATCH 3/7] Privacy Policy Fixes Part 2 (#5310) ## About The Pull Request - Fixes the privacy policy still showing up after accepted. - Makes it so closing out of the window kicks you. - Converts the whole thing from preference based to SQL based. ## Why It's Good For The Game Fixes and polish for a previously accepted PR are good for the game, yes. ## Proof Of Testing I can't take a screenshot of a privacy policy that didn't show up the second time around after I accepted it, but it properly filled out the database and worked during testing. ## Changelog :cl: add: Closing out of the Privacy Policy window instead of accepting it now kicks you. fix: Fixed the Privacy Policy window showing up after you've already accepted it once, for real this time. /:cl: --- SQL/bubber_schema.sql | 9 ++++ SQL/database_changelog.md | 6 +-- .../~~bubber_defines/privacy_policy.dm | 1 + .../master_files/code/modules/mob/login.dm | 10 +++- .../controllers/subsystem/privacy_policy.dm | 51 +++++++++++++++++++ .../modules/client/preferences/preferences.dm | 2 - .../modules/client/preferences_savefile.dm | 7 --- .../modules/privacy_policy/privacy_policy.dm | 21 +++++--- tgstation.dme | 4 +- .../tgui/interfaces/PrivacyPolicy.tsx | 16 ++---- 10 files changed, 92 insertions(+), 35 deletions(-) create mode 100644 code/__DEFINES/~~bubber_defines/privacy_policy.dm create mode 100644 modular_zubbers/code/controllers/subsystem/privacy_policy.dm delete mode 100644 modular_zubbers/code/modules/client/preferences/preferences.dm delete mode 100644 modular_zubbers/code/modules/client/preferences_savefile.dm diff --git a/SQL/bubber_schema.sql b/SQL/bubber_schema.sql index 324bd19e6f6..1691b77fc15 100644 --- a/SQL/bubber_schema.sql +++ b/SQL/bubber_schema.sql @@ -45,3 +45,12 @@ CREATE TABLE `stored_faxes` ( COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ; + +DROP TABLE IF EXISTS `privacy_policy_acceptances`; +CREATE TABLE `privacy_policy_acceptances` ( + `id` INT NOT NULL AUTO_INCREMENT, + `ckey` VARCHAR(32) NOT NULL, + `policy_key` VARCHAR(64) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `ckey_policy_unique` (`ckey`, `policy_key`) +); diff --git a/SQL/database_changelog.md b/SQL/database_changelog.md index 12b2e47340a..69c1d1eb57a 100644 --- a/SQL/database_changelog.md +++ b/SQL/database_changelog.md @@ -2,16 +2,16 @@ Any time you make a change to the schema files, remember to increment the databa Make sure to also update `DB_MAJOR_VERSION` and `DB_MINOR_VERSION`, which can be found in `code/__DEFINES/subsystem.dm`. -The latest database version is 5.35 (for bubberstation) (5.33 for /tg/); The query to update the schema revision table is: +The latest database version is 5.36 (for bubberstation) (5.33 for /tg/); The query to update the schema revision table is: ```sql -INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 35); +INSERT INTO `schema_revision` (`major`, `minor`) VALUES (5, 36); ``` or ```sql -INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 35); +INSERT INTO `SS13_schema_revision` (`major`, `minor`) VALUES (5, 36); ``` In any query remember to add a prefix to the table names if you use one. diff --git a/code/__DEFINES/~~bubber_defines/privacy_policy.dm b/code/__DEFINES/~~bubber_defines/privacy_policy.dm new file mode 100644 index 00000000000..35abc57c96b --- /dev/null +++ b/code/__DEFINES/~~bubber_defines/privacy_policy.dm @@ -0,0 +1 @@ +#define CURRENT_PRIVACY_KEY "privacy_v1" diff --git a/modular_skyrat/master_files/code/modules/mob/login.dm b/modular_skyrat/master_files/code/modules/mob/login.dm index d6b7292841b..44c84bc6b55 100644 --- a/modular_skyrat/master_files/code/modules/mob/login.dm +++ b/modular_skyrat/master_files/code/modules/mob/login.dm @@ -7,6 +7,12 @@ if(SSplayer_ranks.initialized) SSplayer_ranks.update_prefs_donator_status(client?.prefs) - if(!client.prefs.privacy_policy_acknowledged) - client.show_privacy_policy() + if(!SSprivacy.has_accepted(client?.ckey, CURRENT_PRIVACY_KEY)) + if(!Master.init_stage_completed) + spawn(600) + if(client) + client.show_privacy_policy() + else if(Master.init_stage_completed) + if(client) + client.show_privacy_policy() return TRUE diff --git a/modular_zubbers/code/controllers/subsystem/privacy_policy.dm b/modular_zubbers/code/controllers/subsystem/privacy_policy.dm new file mode 100644 index 00000000000..46fafa8a9c0 --- /dev/null +++ b/modular_zubbers/code/controllers/subsystem/privacy_policy.dm @@ -0,0 +1,51 @@ +SUBSYSTEM_DEF(privacy) + name = "Privacy Policy" + flags = SS_NO_FIRE + + VAR_PRIVATE/list/completed_by_ckey = list() + +/datum/controller/subsystem/privacy/Initialize() + if(!CONFIG_GET(flag/sql_enabled)) + return + load_initial_acceptances() + return SS_INIT_SUCCESS + +/datum/controller/subsystem/privacy/proc/load_initial_acceptances() + if(!SSdbcore.IsConnected()) + return + + var/datum/db_query/query = SSdbcore.NewQuery("SELECT ckey, policy_key FROM [format_table_name("privacy_policy_acceptances")]") + + if(!query.Execute()) + qdel(query) + return + + while(query.NextRow()) + var/ckey = query.item[1] + var/policy_key = query.item[2] + + completed_by_ckey[ckey] ||= list() + completed_by_ckey[ckey] += policy_key + + qdel(query) + +/datum/controller/subsystem/privacy/proc/has_accepted(ckey, policy_key) + return completed_by_ckey[ckey] && (policy_key in completed_by_ckey[ckey]) + +/datum/controller/subsystem/privacy/proc/mark_accepted(ckey, policy_key) + if(has_accepted(ckey, policy_key)) + return + + completed_by_ckey[ckey] ||= list() + completed_by_ckey[ckey] += policy_key + + var/datum/db_query/query = SSdbcore.NewQuery( + "INSERT IGNORE INTO [format_table_name("privacy_policy_acceptances")] (ckey, policy_key) VALUES (:ckey, :policy_key)", + list( + "ckey" = ckey, + "policy_key" = policy_key + ) + ) + + query.Execute() + qdel(query) diff --git a/modular_zubbers/code/modules/client/preferences/preferences.dm b/modular_zubbers/code/modules/client/preferences/preferences.dm deleted file mode 100644 index ba8a3c18c97..00000000000 --- a/modular_zubbers/code/modules/client/preferences/preferences.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/preferences - var/privacy_policy_acknowledged diff --git a/modular_zubbers/code/modules/client/preferences_savefile.dm b/modular_zubbers/code/modules/client/preferences_savefile.dm deleted file mode 100644 index 2e5a129fe82..00000000000 --- a/modular_zubbers/code/modules/client/preferences_savefile.dm +++ /dev/null @@ -1,7 +0,0 @@ -/datum/preferences/load_preferences() - . = ..() - savefile.get_entry("privacy_policy_acknowledged", privacy_policy_acknowledged) - -/datum/preferences/save_preferences() - . = ..() - savefile.set_entry("privacy_policy_acknowledged", privacy_policy_acknowledged) diff --git a/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm b/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm index e801043c711..5955e35d716 100644 --- a/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm +++ b/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm @@ -1,5 +1,3 @@ -#define CURRENT_PRIVACY_VERSION 1 - /datum/privacy_policy_ui var/client/owner @@ -11,6 +9,10 @@ return GLOB.always_state /datum/privacy_policy_ui/ui_close(mob/user) + if(!SSprivacy.has_accepted(owner.ckey, CURRENT_PRIVACY_KEY)) + if(owner) + to_chat(owner, span_danger("You must accept the Privacy Policy to continue playing.")) + qdel(owner) qdel(src) /datum/privacy_policy_ui/ui_data(mob/user) @@ -22,9 +24,8 @@ . = ..() switch(action) if("accept") - if(owner?.prefs) - owner.prefs.privacy_policy_acknowledged = TRUE - owner.prefs.save_preferences() + if(owner?.ckey) + SSprivacy.mark_accepted(owner.ckey, CURRENT_PRIVACY_KEY) ui.close() return TRUE @@ -39,10 +40,16 @@ ui.open() /client/proc/show_privacy_policy() + if(!CONFIG_GET(flag/sql_enabled)) + return + if(!mob) return + if(SSprivacy.has_accepted(mob?.ckey, CURRENT_PRIVACY_KEY)) + return + + SStgui.close_user_uis(mob) + var/datum/privacy_policy_ui/ui = new(src) ui.ui_interact(mob) - -#undef CURRENT_PRIVACY_VERSION diff --git a/tgstation.dme b/tgstation.dme index 3e32aa469c2..7c6c533ec24 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -541,6 +541,7 @@ #include "code\__DEFINES\~~bubber_defines\mobs.dm" #include "code\__DEFINES\~~bubber_defines\mood.dm" #include "code\__DEFINES\~~bubber_defines\nanites.dm" +#include "code\__DEFINES\~~bubber_defines\privacy_policy.dm" #include "code\__DEFINES\~~bubber_defines\research_categories.dm" #include "code\__DEFINES\~~bubber_defines\robot_defines.dm" #include "code\__DEFINES\~~bubber_defines\role_preferences.dm" @@ -8879,6 +8880,7 @@ #include "modular_zubbers\code\controllers\subsystem\job.dm" #include "modular_zubbers\code\controllers\subsystem\map_vote.dm" #include "modular_zubbers\code\controllers\subsystem\mapping.dm" +#include "modular_zubbers\code\controllers\subsystem\privacy_policy.dm" #include "modular_zubbers\code\controllers\subsystem\research.dm" #include "modular_zubbers\code\controllers\subsystem\security_level.dm" #include "modular_zubbers\code\controllers\subsystem\ticker.dm" @@ -9297,7 +9299,6 @@ #include "modular_zubbers\code\modules\client\client_color.dm" #include "modular_zubbers\code\modules\client\client_procs.dm" #include "modular_zubbers\code\modules\client\preferences.dm" -#include "modular_zubbers\code\modules\client\preferences_savefile.dm" #include "modular_zubbers\code\modules\client\ssd.dm" #include "modular_zubbers\code\modules\client\autopunctuation\preferences.dm" #include "modular_zubbers\code\modules\client\flavor_text\flavor_text.dm" @@ -9305,7 +9306,6 @@ #include "modular_zubbers\code\modules\client\preferences\footstep_sound.dm" #include "modular_zubbers\code\modules\client\preferences\permanent_limp.dm" #include "modular_zubbers\code\modules\client\preferences\player_panel.dm" -#include "modular_zubbers\code\modules\client\preferences\preferences.dm" #include "modular_zubbers\code\modules\client\preferences\screen.dm" #include "modular_zubbers\code\modules\client\preferences\sounds.dm" #include "modular_zubbers\code\modules\client\preferences\unique_blood_color.dm" diff --git a/tgui/packages/tgui/interfaces/PrivacyPolicy.tsx b/tgui/packages/tgui/interfaces/PrivacyPolicy.tsx index 7feb174e365..6016360c333 100644 --- a/tgui/packages/tgui/interfaces/PrivacyPolicy.tsx +++ b/tgui/packages/tgui/interfaces/PrivacyPolicy.tsx @@ -1,5 +1,5 @@ -import { useBackend } from '../backend'; import { Button, Section } from 'tgui-core/components'; +import { useBackend } from '../backend'; import { Window } from '../layouts'; interface PrivacyPolicyData { @@ -11,21 +11,13 @@ export const PrivacyPolicy = () => { const { policy_text } = data; return ( - +
-
- {policy_text} -
+
{policy_text}
-
From e7133436e57390f32777ea63905f6989d18d1aeb Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed, 11 Mar 2026 23:20:42 +0100 Subject: [PATCH 4/7] Automatic changelog for PR #5310 [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-5310.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-bubber-pr-5310.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-5310.yml b/html/changelogs/AutoChangeLog-bubber-pr-5310.yml new file mode 100644 index 00000000000..e426758964a --- /dev/null +++ b/html/changelogs/AutoChangeLog-bubber-pr-5310.yml @@ -0,0 +1,5 @@ +author: "xPokee" +delete-after: True +changes: + - rscadd: "Closing out of the Privacy Policy window instead of accepting it now kicks you." + - bugfix: "Fixed the Privacy Policy window showing up after you've already accepted it once, for real this time." \ No newline at end of file From f50b92abc7cdd9adc3cb48e3cb1b8cbdf8e21ade Mon Sep 17 00:00:00 2001 From: nevimer Date: Wed, 11 Mar 2026 19:19:05 -0400 Subject: [PATCH 5/7] hotfix for privacy policy --- .../master_files/code/modules/mob/login.dm | 12 +++--------- .../code/modules/privacy_policy/privacy_policy.dm | 2 -- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/modular_skyrat/master_files/code/modules/mob/login.dm b/modular_skyrat/master_files/code/modules/mob/login.dm index 44c84bc6b55..ec8c73791c1 100644 --- a/modular_skyrat/master_files/code/modules/mob/login.dm +++ b/modular_skyrat/master_files/code/modules/mob/login.dm @@ -7,12 +7,6 @@ if(SSplayer_ranks.initialized) SSplayer_ranks.update_prefs_donator_status(client?.prefs) - if(!SSprivacy.has_accepted(client?.ckey, CURRENT_PRIVACY_KEY)) - if(!Master.init_stage_completed) - spawn(600) - if(client) - client.show_privacy_policy() - else if(Master.init_stage_completed) - if(client) - client.show_privacy_policy() - return TRUE + ASYNC + client.show_privacy_policy() + return . diff --git a/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm b/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm index 5955e35d716..07ac499b35c 100644 --- a/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm +++ b/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm @@ -49,7 +49,5 @@ if(SSprivacy.has_accepted(mob?.ckey, CURRENT_PRIVACY_KEY)) return - SStgui.close_user_uis(mob) - var/datum/privacy_policy_ui/ui = new(src) ui.ui_interact(mob) From bbabb785826b6372ab36147a85a008cdc61981ad Mon Sep 17 00:00:00 2001 From: nevimer Date: Wed, 11 Mar 2026 19:23:54 -0400 Subject: [PATCH 6/7] ffffff --- modular_zubbers/code/modules/privacy_policy/privacy_policy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm b/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm index 07ac499b35c..e495a785c83 100644 --- a/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm +++ b/modular_zubbers/code/modules/privacy_policy/privacy_policy.dm @@ -12,7 +12,7 @@ if(!SSprivacy.has_accepted(owner.ckey, CURRENT_PRIVACY_KEY)) if(owner) to_chat(owner, span_danger("You must accept the Privacy Policy to continue playing.")) - qdel(owner) + New(owner) qdel(src) /datum/privacy_policy_ui/ui_data(mob/user) From 37305dd285b8a18a4e4ade34d2c6be90fd9578e0 Mon Sep 17 00:00:00 2001 From: Bubberbot <151680451+Bubberbot@users.noreply.github.com> Date: Wed, 11 Mar 2026 23:34:50 +0000 Subject: [PATCH 7/7] Bubberstation automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-bubber-pr-4766.yml | 4 ---- html/changelogs/AutoChangeLog-bubber-pr-5127.yml | 4 ---- html/changelogs/AutoChangeLog-bubber-pr-5310.yml | 5 ----- html/changelogs/AutoChangeLog-bubber-pr-5325.yml | 4 ---- html/changelogs/bubber_archive/2026-03.yml | 12 ++++++++++++ 5 files changed, 12 insertions(+), 17 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-4766.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-5127.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-5310.yml delete mode 100644 html/changelogs/AutoChangeLog-bubber-pr-5325.yml diff --git a/html/changelogs/AutoChangeLog-bubber-pr-4766.yml b/html/changelogs/AutoChangeLog-bubber-pr-4766.yml deleted file mode 100644 index ab2f3d09a56..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-4766.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Phoenix4O4" -delete-after: True -changes: - - admin: "Enhanced Player Panel with more stuff" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-5127.yml b/html/changelogs/AutoChangeLog-bubber-pr-5127.yml deleted file mode 100644 index a53234f1ba3..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-5127.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ArrisFairburne" -delete-after: True -changes: - - map: "various changes to Biodome" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-5310.yml b/html/changelogs/AutoChangeLog-bubber-pr-5310.yml deleted file mode 100644 index e426758964a..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-5310.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "xPokee" -delete-after: True -changes: - - rscadd: "Closing out of the Privacy Policy window instead of accepting it now kicks you." - - bugfix: "Fixed the Privacy Policy window showing up after you've already accepted it once, for real this time." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-bubber-pr-5325.yml b/html/changelogs/AutoChangeLog-bubber-pr-5325.yml deleted file mode 100644 index f228a30c08e..00000000000 --- a/html/changelogs/AutoChangeLog-bubber-pr-5325.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Danielance" -delete-after: True -changes: - - bugfix: "bulletproof vest sprites for digitigrade legs and teshari" \ No newline at end of file diff --git a/html/changelogs/bubber_archive/2026-03.yml b/html/changelogs/bubber_archive/2026-03.yml index fff9cf0879b..7d9a3b48064 100644 --- a/html/changelogs/bubber_archive/2026-03.yml +++ b/html/changelogs/bubber_archive/2026-03.yml @@ -66,3 +66,15 @@ - code_imp: '''Vox Primalis'' now considered a collective noun' - code_imp: dangerous_organ_removal has a new variable to toggle between organ qdel or having its damage set to max health. +2026-03-11: + ArrisFairburne: + - map: various changes to Biodome + Danielance: + - bugfix: bulletproof vest sprites for digitigrade legs and teshari + Phoenix4O4: + - admin: Enhanced Player Panel with more stuff + xPokee: + - rscadd: Closing out of the Privacy Policy window instead of accepting it now kicks + you. + - bugfix: Fixed the Privacy Policy window showing up after you've already accepted + it once, for real this time.