From aa2094cf31f0e2435751f4eece55d87aad13b95d Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:38:22 +0300 Subject: [PATCH 01/23] [MIRROR] New non lethal gun - P207 + Fixes to the pepperball gun logistics (#5246) * New non lethal gun - P207 + Fixes to the pepperball gun logistics (#4658) * Initial Commit * Fixes the Light and Manufacturer, and adds Trelus as coauthor Co-Authored-By: Trelus <140990718+trelus@users.noreply.github.com> * Fixed typos and review errors! * adds the base icon to the dmi's to stop some issues with CI * New sprites by the spriter, should fix the ongoing issues * doing a workaround because git can be funny with filename case * minor adjustments, review and unified name to type207 so future generations dont hate me. * Changed name due to creator request and fixed a typo before extramrdo notes it * fatfingered ctrl z before ctrl s * adjust decay on bounce to 10% per bounce * Update modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/magazine.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * Update modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/magazine.dm Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * lower case modular ammo boxes * Revert "lower case modular ammo boxes" This reverts commit b4fce35efdebdbec6ec25a493930df3c21c1d447. --------- Co-authored-by: Trelus <140990718+trelus@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> * [MIRROR] New non lethal gun - P207 + Fixes to the pepperball gun logistics --------- Co-authored-by: OrbisAnima Co-authored-by: Trelus <140990718+trelus@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: StealsThePRs --- code/__DEFINES/~nova_defines/projectiles.dm | 6 ++- .../code/armament_datums/sol_defense.dm | 7 +++ .../code/armament_datums/vitezstvi_ammo.dm | 3 ++ .../modules/modular_vending/code/security.dm | 8 +++ .../modular_weapons/code/autolathe_design.dm | 6 +++ .../bolt_fabrications/ammo.dm | 49 ++++++++++++++++++ .../bolt_fabrications/magazine.dm | 41 +++++++++++++++ .../bolt_fabrications/pistol.dm | 27 ++++++++++ .../modular_weapons/code/pepperball_gun.dm | 10 ++-- .../bolt_fabrications/guns_lefthand.dmi | Bin 0 -> 363 bytes .../bolt_fabrications/guns_righthand.dmi | Bin 0 -> 363 bytes .../bolt_fabrications/riotrubberbullet.dmi | Bin 0 -> 363 bytes .../bolt_fabrications/stingstopbox.dmi | Bin 0 -> 460 bytes .../bolt_fabrications/stingtop.dmi | Bin 0 -> 488 bytes .../bolt_fabrications/type207.dmi | Bin 0 -> 503 bytes .../bolt_fabrications/type207magazine.dmi | Bin 0 -> 385 bytes tgstation.dme | 4 ++ 17 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 modular_nova/modules/modular_weapons/code/autolathe_design.dm create mode 100644 modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm create mode 100644 modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/magazine.dm create mode 100644 modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/pistol.dm create mode 100644 modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_lefthand.dmi create mode 100644 modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_righthand.dmi create mode 100644 modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/riotrubberbullet.dmi create mode 100644 modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/stingstopbox.dmi create mode 100644 modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/stingtop.dmi create mode 100644 modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/type207.dmi create mode 100644 modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/type207magazine.dmi diff --git a/code/__DEFINES/~nova_defines/projectiles.dm b/code/__DEFINES/~nova_defines/projectiles.dm index d3341e2a58e..bf93eb26ee7 100644 --- a/code/__DEFINES/~nova_defines/projectiles.dm +++ b/code/__DEFINES/~nova_defines/projectiles.dm @@ -16,4 +16,8 @@ #define CALIBER_585TRAPPISTE ".585 Trappiste" /// Caliber used by the pepperball gun -#define CALIBER_PEPPERBALL "pepperball" +#define CALIBER_PEPPERBALL "Pepper Ball" + +/// Caliber used by the kinetic gun +#define CALIBER_KINETICBALL "Kinetic Ball" + diff --git a/modular_nova/modules/company_imports/code/armament_datums/sol_defense.dm b/modular_nova/modules/company_imports/code/armament_datums/sol_defense.dm index d9c18d4f95d..5b2a47993c8 100644 --- a/modular_nova/modules/company_imports/code/armament_datums/sol_defense.dm +++ b/modular_nova/modules/company_imports/code/armament_datums/sol_defense.dm @@ -96,6 +96,10 @@ item_type = /obj/item/gun/ballistic/automatic/pistol/sol cost = PAYCHECK_COMMAND * 4 +/datum/armament_entry/company_import/sol_defense/sidearm/type207 + item_type = /obj/item/gun/ballistic/automatic/pistol/type207 + cost = PAYCHECK_COMMAND * 4 + /datum/armament_entry/company_import/sol_defense/sidearm/skild item_type = /obj/item/gun/ballistic/automatic/pistol/trappiste cost = PAYCHECK_COMMAND * 6 @@ -158,6 +162,9 @@ /datum/armament_entry/company_import/sol_defense/magazines/sol_rifle_short item_type = /obj/item/ammo_box/magazine/c40sol_rifle/starts_empty +/datum/armament_entry/company_import/sol_defense/magazines/kineticballs + item_type = /obj/item/ammo_box/magazine/kineticballs/starts_empty + /datum/armament_entry/company_import/sol_defense/magazines/sol_rifle_standard item_type = /obj/item/ammo_box/magazine/c40sol_rifle/standard/starts_empty cost = PAYCHECK_COMMAND diff --git a/modular_nova/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm b/modular_nova/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm index 43755100cad..5e75cb70fbe 100644 --- a/modular_nova/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm +++ b/modular_nova/modules/company_imports/code/armament_datums/vitezstvi_ammo.dm @@ -117,6 +117,9 @@ /datum/armament_entry/company_import/vitezstvi/ammo_boxes/trappiste585_hollowpoint item_type = /obj/item/ammo_box/c585trappiste/hollowpoint +/datum/armament_entry/company_import/vitezstvi/ammo_boxes/kineticballs + item_type = /obj/item/ammo_box/advanced/kineticballs + // Revolver speedloaders /datum/armament_entry/company_import/vitezstvi/speedloader diff --git a/modular_nova/modules/modular_vending/code/security.dm b/modular_nova/modules/modular_vending/code/security.dm index 02dbca5e4ce..fa79ef5f60f 100644 --- a/modular_nova/modules/modular_vending/code/security.dm +++ b/modular_nova/modules/modular_vending/code/security.dm @@ -2,4 +2,12 @@ products_nova = list( /obj/item/storage/pouch/ammo = 2, /obj/item/storage/barricade = 4, + /obj/item/ammo_box/magazine/kineticballs = 10, + /obj/item/ammo_box/advanced/kineticballs = 5, + /obj/item/ammo_box/magazine/pepperball = 4, + /obj/item/ammo_box/advanced/pepperballs = 2, + ) + premium_nova = list( + /obj/item/gun/ballistic/automatic/pistol/type207 = 5, + /obj/item/gun/ballistic/automatic/pistol/pepperball = 2, ) diff --git a/modular_nova/modules/modular_weapons/code/autolathe_design.dm b/modular_nova/modules/modular_weapons/code/autolathe_design.dm new file mode 100644 index 00000000000..dacc19508f6 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/autolathe_design.dm @@ -0,0 +1,6 @@ +/datum/techweb_node/basic_arms/New() + design_ids += list( + "kineticballs", + "pepperballs", + ) + return ..() diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm new file mode 100644 index 00000000000..8f32e353253 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/ammo.dm @@ -0,0 +1,49 @@ +/obj/projectile/bullet/kineticball + name = "kinetic orb" + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/riotrubberbullet.dmi' + icon_state = "riotrubberbullet" + // Used the hive shot stats, with 0 colateral damage, the advantage is that its not weak against armor, and its supposed to bounce a lot. + damage = 0 + stamina = 30 + shrapnel_type = null + sharpness = NONE + embed_data = null + impact_effect_type = /obj/effect/temp_visual/impact_effect + ricochet_incidence_leeway = 0 + ricochets_max = 5 + ricochet_chance = 200 + ricochet_auto_aim_angle = 60 + ricochet_auto_aim_range = 8 + ricochet_decay_damage = 0.9 + ricochet_decay_chance = 1 + wound_bonus = -30 + bare_wound_bonus = -10 + +/obj/item/ammo_casing/kineticball + name = "kinetic ball casing" + desc = "A kinetic ball casing." + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/stingtop.dmi' + icon_state = "stingstop" + ammo_stack_type = /obj/item/ammo_box/magazine/ammo_stack/kineticball + caliber = CALIBER_KINETICBALL + projectile_type = /obj/projectile/bullet/kineticball + harmful = FALSE + +/obj/item/ammo_box/magazine/ammo_stack/kineticball + name = "kinetic ball casings" + desc = "A stack of kinetic ball cartridges." + caliber = CALIBER_KINETICBALL + ammo_type = /obj/item/ammo_casing/kineticball + max_ammo = 9 + casing_x_positions = list( + -7, + -5, + -3, + -1, + 0, + 1, + 3, + 5, + 7, + ) + casing_y_padding = 6 diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/magazine.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/magazine.dm new file mode 100644 index 00000000000..0537adea4c4 --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/magazine.dm @@ -0,0 +1,41 @@ +/obj/item/ammo_box/magazine/kineticballs + name = "kinetic balls pistol magazine" + desc = "A gun magazine filled with balls. The kind that makes makes people stop, holds eight rounds." + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/type207magazine.dmi' + icon_state = "type207mag" + ammo_type = /obj/item/ammo_casing/kineticball + caliber = CALIBER_KINETICBALL + max_ammo = 8 + custom_price = PAYCHECK_CREW * 2 + multiple_sprites = AMMO_BOX_FULL_EMPTY + +/obj/item/ammo_box/magazine/kineticballs/starts_empty + start_empty = TRUE + +/datum/design/kineticballs + name = "Ammo Box (Kinetic Balls)" + id = "kineticballs" + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 3, + ) + build_path = /obj/item/ammo_box/advanced/kineticballs + category = list( + RND_CATEGORY_INITIAL, + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_AMMO, + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/obj/item/ammo_box/advanced/kineticballs + name = "ammo box (kinetic balls)" + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/stingstopbox.dmi' + icon_state = "stingstopbox" + desc = "A box of kinetic balls rounds, holds twenty seven rounds." + custom_price = PAYCHECK_CREW * 2 + ammo_type = /obj/item/ammo_casing/kineticball + custom_materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, + /datum/material/plastic = SHEET_MATERIAL_AMOUNT * 2, + ) + max_ammo = 27 diff --git a/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/pistol.dm b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/pistol.dm new file mode 100644 index 00000000000..808c243f71a --- /dev/null +++ b/modular_nova/modules/modular_weapons/code/company_and_or_faction_based/bolt_fabrications/pistol.dm @@ -0,0 +1,27 @@ +/obj/item/gun/ballistic/automatic/pistol/type207 + name = "\improper Type 207 Kinetic Pistol" + desc = "A completly non lethal sidearm used by Sol Fed Peacekeeping forces. It uses kinetic rounds to temporarily disable adversaries, it's also a popular weapon for trick shot competitions." + icon = 'modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/type207.dmi' + icon_state = "type207" + lefthand_file = 'modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_lefthand.dmi' + righthand_file = 'modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_righthand.dmi' + inhand_icon_state = "type207" + w_class = WEIGHT_CLASS_SMALL + accepted_magazine_type = /obj/item/ammo_box/magazine/kineticballs + can_suppress = FALSE + fire_delay = 0.3 SECONDS + fire_sound = 'sound/effects/pop_expl.ogg' + rack_sound = 'sound/items/weapons/gun/pistol/rack.ogg' + lock_back_sound = 'sound/items/weapons/gun/pistol/slide_lock.ogg' + bolt_drop_sound = 'sound/items/weapons/gun/pistol/slide_drop.ogg' + fire_sound_volume = 70 + custom_premium_price = PAYCHECK_COMMAND * 5 + +/obj/item/gun/ballistic/automatic/pistol/type207/give_manufacturer_examine() + AddElement(/datum/element/manufacturer_examine, COMPANY_BOLT) + +/obj/item/gun/ballistic/automatic/pistol/type207/add_seclight_point() + AddComponent(/datum/component/seclite_attachable, \ + starting_light = new /obj/item/flashlight/seclite(src), \ + is_light_removable = FALSE, \ + ) diff --git a/modular_nova/modules/modular_weapons/code/pepperball_gun.dm b/modular_nova/modules/modular_weapons/code/pepperball_gun.dm index 0e7dbcb1516..0a4f2c3c9b2 100644 --- a/modular_nova/modules/modular_weapons/code/pepperball_gun.dm +++ b/modular_nova/modules/modular_weapons/code/pepperball_gun.dm @@ -4,6 +4,7 @@ icon = 'modular_nova/modules/modular_weapons/icons/obj/pepperball/pepperball.dmi' icon_state = "peppergun" w_class = WEIGHT_CLASS_SMALL + custom_premium_price = PAYCHECK_COMMAND * 4 accepted_magazine_type = /obj/item/ammo_box/magazine/pepperball can_suppress = FALSE fire_sound = 'sound/effects/pop_expl.ogg' @@ -20,11 +21,12 @@ /obj/item/ammo_box/magazine/pepperball name = "pistol magazine (pepperball)" - desc = "A gun magazine filled with balls." + desc = "A gun magazine filled with balls, the kind that make your face itch. Holds eight rounds." icon = 'modular_nova/modules/modular_weapons/icons/obj/pepperball/pepperball.dmi' icon_state = "pepperball" ammo_type = /obj/item/ammo_casing/pepperball caliber = CALIBER_PEPPERBALL + custom_price = PAYCHECK_CREW * 2 max_ammo = 8 multiple_sprites = AMMO_BOX_FULL_EMPTY @@ -59,7 +61,7 @@ /datum/design/pepperballs name = "Pepperball Ammo Box" id = "pepperballs" - build_type = AUTOLATHE | PROTOLATHE + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, ) @@ -74,8 +76,10 @@ name = "pepperball ammo box" icon = 'modular_nova/modules/modular_weapons/icons/obj/pepperball/ammoboxes.dmi' icon_state = "box10x24" + desc = "A box of pepper ball rounds, holds eighteen rounds." + custom_price = PAYCHECK_CREW * 2 ammo_type = /obj/item/ammo_casing/pepperball custom_materials = list( /datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, ) - max_ammo = 15 + max_ammo = 18 diff --git a/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_lefthand.dmi b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_lefthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e1650c906ed8c1088aeaf1277f4c3b20b9192b68 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|el>na**8>L*xY*lO)ifz8DT{lG zYwGA(7#RrZ2zY9UTUuF5%gEX)@mrj@E(%o7SQ6wH%;50sMjDWlQxy_X;*wgNT$EW* zl9`{!z)&$KIIN(k^!u0Kf{$OHXnE^uojY?rctfbcMdJsLbk6%|o@6NM>D^&r9Atdi z*h^u~qe(|5g(w8CT(U{w>WKp}o!!Q&n^#CI>FqXNt6^v^dc^EWP*}m&Vn%5mhO`E$ z%*}IcKLPEn^>lFz@#suWkYHWh;G@8?a0W|(rhyn!upZ+M5rcLM22ZoXIb0Tpjy615 z6KZkyz|pN)OcPQJ5^gj&w=#;;9!_U~cly}A_kDc?2uQst(#Bj54&yeI;A;Fr#!0>>HuWMVO^iiNg7(8A5T-G@y GGywn&{(boX literal 0 HcmV?d00001 diff --git a/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_righthand.dmi b/modular_nova/modules/modular_weapons/icons/mob/company_and_or_faction_based/bolt_fabrications/guns_righthand.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a578c62f923aaeae59cd26dc0c3204abe79d6742 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|el>na**8>L*xY*lO)ifz8DQoKJ ziF=9*=?GXD8F*@lOUuYwT3OpF@n@D69R;dqED7=pW^j0RBMr#OsS1fGaY-#sF3Kz@ z$;{7VV5pcA99B?N`u$6A!N;#pw7hk-&Yd|Qydl)!qVa=AI_G^fPcjts^zN`Q4l=%M z?4>a0(WE1jLKK2mF4?4T^~8ag&TeDX%_}69^mZGs)i5*{J!1AGD6HUXF{3mOLt2AW z=H|J!pMdt(db&7^uQwJFei zFlQ%&$GSNuJ7cSun;9e8CNoYKb~~sc!Fq+YX@-+VYRe+SWlU+#tQNCPS)%hyIa`gn zgQYfTWO(W{Y}%3LH>1JzV9U(S4}8+td_*Hy-5EI<81!odBK4a8T?RUY!PC{xWt~$( F697nbeTx79 literal 0 HcmV?d00001 diff --git a/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/riotrubberbullet.dmi b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/riotrubberbullet.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c7a8fd02ec94f3aa88dda449700b349aa73ff8fc GIT binary patch literal 363 zcmV-x0hIoUP)V=-0C=1w$1x6rFboCIIX=Y~?5NPLS*jqE0q#JA+gO4kIi_5nf$hB-?|z6A z!Wik#T4evheSXZ`++#*`w(USYI=Vet7qY z;m%`eiY#YfpdbX^_dKkHS^mD~VJ*4lkR1a585qvOEdI~HaF$$i20R;*9Rdst4EJ!b zNdiMU1Q-}7@Hq?&cnFZ~fI~vvH?gtl<^XDeQ3o)N_6L*c=~&)XsE=c#;Wjb zW47cm3%n!lCQwkFuM#3Vb@60VOH-hl9Y?G*fLa(!g8YIR9G=}s19BRxLLy3BQj3#| zG7CyF^Ya)OD&_=-6%>_z{}NpA@#_;UZ(Xf(XU+$22sOB9{NRz!c^}P_3`IS?J1mTY zj4vB|Da?5^>ByuIh2WJtRE+ia?oipUpt;}4+;sbbB|)9t#;TiFNN8l9I65-OVlDw4bIjAlF~p6w2#GbCMef==wq{3b2uvsK<9&FqTD z#5mVeE;puU_gb@V2;lwYdNV8M(u4r{0L|W5k)CzCEmT7OUOe8r(eXz3-p*uCi}*(^ zM=$w&)>yMHcTTjxt<1LL-0ytb4&HmqX?tzglunHY4YwaC@0!Btu6~HwZqA96fBYBO zWiGNiJ*ZV+xd&w(`1vc+Ri2~q`@!?-M#djmBATZ!+_RIt5a=TYPgg&ebxsLQ0GRx} Ae*gdg literal 0 HcmV?d00001 diff --git a/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/stingtop.dmi b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/stingtop.dmi new file mode 100644 index 0000000000000000000000000000000000000000..316b8a17ee34c8564f43e333c82aa1dff4968daa GIT binary patch literal 488 zcmVP)whQ%>;@K##rjJ%l>c~E$bHpkCrDWD*52Cegk3vWiB+sgQ2M#oTfHR#{?w7hB&H<5 eHsE$(U9T@G+e;*9@NBUF0000`k0004WQchCV=-0C=2JR&a84 z_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5sid+X z)yTkHiHkEOv#1y-V#vjrR+N~V3SpzGi%-hWDIrO5d`^CHc4`XIdU6xfaj8{SaP@Nm z`w{>;BtzEAiV`sZ007rXL_t(oh3%Eg4uc>NMUlZr5dmBO|64nQrV%wFvS`}OSr|2* zJA<1m1jGCo)ydN#5@ckkYN4+2qRtbVw(H;lk*}223g4@~*K~g#(6nu|L4^iEF&Ka( z&maNJDnR4f!CQ{7^Cb=pfEflelbW#`X|2Vvw73DxgQODUtoPm-L4$LLe|$e0vSs@7 zJ>%jV{1110T)^6}z)eDcyYJ5@C=Mt%0R=c$5+I&|f&hkLm_T;-Z~d(9Kk`HOW20Q^ t{sTX|`!@l}?q?Wg#S59HZ*TFJyaAE32*6j2!@~do002ovPDHLkV1m1F&RPHf literal 0 HcmV?d00001 diff --git a/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/type207magazine.dmi b/modular_nova/modules/modular_weapons/icons/obj/company_and_or_faction_based/bolt_fabrications/type207magazine.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7a32aab72f8f177e52295779a1faac2b4671abbc GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e^#Gp`*8>L*$jQkFMhFU<7P;8l ziHeHY+PN4Q7zoSpir9*Xdy4Z3@&VPX3T^NJYGEu1@(X5gcy=QV$Z4nwi70VNElw`V zEGWs$&tqVym=hdUP*nQ;OK`!*uTQkRb+yi&IUl?s)Zn7=gGV~&eKb!p6!rA(urLlX zzHIEJFz3;vBa=cDf>$otq;U1b0UL9}So5_e>h7K0#;TiFNN6OVI65BA?ak(u6{1-oD!MD literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 05f6328a235..c6f74322e8b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8248,6 +8248,7 @@ #include "modular_nova\modules\modular_vending\code\tool.dm" #include "modular_nova\modules\modular_vending\code\vending.dm" #include "modular_nova\modules\modular_vending\code\wardrobes.dm" +#include "modular_nova\modules\modular_weapons\code\autolathe_design.dm" #include "modular_nova\modules\modular_weapons\code\conversion_kits.dm" #include "modular_nova\modules\modular_weapons\code\gun_launches_little_guys_element.dm" #include "modular_nova\modules\modular_weapons\code\gun_racks.dm" @@ -8257,6 +8258,9 @@ #include "modular_nova\modules\modular_weapons\code\pepperball_gun.dm" #include "modular_nova\modules\modular_weapons\code\cargo_crates\armory_guns.dm" #include "modular_nova\modules\modular_weapons\code\cargo_crates\surplus_crates.dm" +#include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\bolt_fabrications\ammo.dm" +#include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\bolt_fabrications\magazine.dm" +#include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\bolt_fabrications\pistol.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\advert.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\grenade_launcher.dm" #include "modular_nova\modules\modular_weapons\code\company_and_or_faction_based\carwo_defense_systems\gunsets.dm" From d64ef78595c3345068307a7427d53b7fd40492e6 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 18 Dec 2024 11:38:49 +0300 Subject: [PATCH 02/23] Automatic changelog for PR #5246 [ci skip] --- html/changelogs/AutoChangeLog-pr-5246.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5246.yml diff --git a/html/changelogs/AutoChangeLog-pr-5246.yml b/html/changelogs/AutoChangeLog-pr-5246.yml new file mode 100644 index 00000000000..69eb1c7c88f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5246.yml @@ -0,0 +1,6 @@ +author: "OrbisAnima" +delete-after: True +changes: + - rscadd: "Added the new P207 to both cargo sol imports and security vendors, its a completly non lethal pistol that shoots bouncy balls that are more effective against armor than the usual rubber ammunition, comparable to regular ammo. It's ammo its easy enough to produce that autolathes and sec lathes can print it out from start." + - qol: "Added two pepperball guns to security vendors along with its ammo, increased how much the ammo box holds to 18 and fixed the issue that prevented it from being printable on the sec lathe." + - bugfix: "Lower cases the text of ammo boxes to be consistent." \ No newline at end of file From eabee93b43a978a913563d98508fec6741a82a25 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 18 Dec 2024 14:41:26 +0300 Subject: [PATCH 03/23] [MIRROR] Unprotects Akula Lore (#5248) * Unprotects Akula Lore (#4687) Unprotects Akulas * [MIRROR] Unprotects Akula Lore --------- Co-authored-by: OrbisAnima Co-authored-by: StealsThePRs --- .../modules/mob/living/carbon/human/species/akula.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/modular_nova/modules/customization/modules/mob/living/carbon/human/species/akula.dm b/modular_nova/modules/customization/modules/mob/living/carbon/human/species/akula.dm index 26eb79fed58..7ed4bbfb863 100644 --- a/modular_nova/modules/customization/modules/mob/living/carbon/human/species/akula.dm +++ b/modular_nova/modules/customization/modules/mob/living/carbon/human/species/akula.dm @@ -9,7 +9,6 @@ name = "Akula" plural_form = "Akulae" id = SPECIES_AKULA - lore_protected = TRUE offset_features = list( OFFSET_GLASSES = list(0, 1), OFFSET_EARS = list(0, 2), From 0947264853bdacc943914fdc3819b936a9532bf1 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 18 Dec 2024 14:41:54 +0300 Subject: [PATCH 04/23] Automatic changelog for PR #5248 [ci skip] --- html/changelogs/AutoChangeLog-pr-5248.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5248.yml diff --git a/html/changelogs/AutoChangeLog-pr-5248.yml b/html/changelogs/AutoChangeLog-pr-5248.yml new file mode 100644 index 00000000000..2d752c8f1f2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5248.yml @@ -0,0 +1,4 @@ +author: "OrbisAnima" +delete-after: True +changes: + - bugfix: "Removed the variable that made Akula not being able to use subspecies or custom lore." \ No newline at end of file From 1df5d3999d4aafa089663ec8b765ba702e498de4 Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:38:16 +0000 Subject: [PATCH 05/23] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5246.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5248.yml | 4 ---- html/changelogs/archive/2024-12.yml | 11 +++++++++++ 3 files changed, 11 insertions(+), 10 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5246.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5248.yml diff --git a/html/changelogs/AutoChangeLog-pr-5246.yml b/html/changelogs/AutoChangeLog-pr-5246.yml deleted file mode 100644 index 69eb1c7c88f..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5246.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "OrbisAnima" -delete-after: True -changes: - - rscadd: "Added the new P207 to both cargo sol imports and security vendors, its a completly non lethal pistol that shoots bouncy balls that are more effective against armor than the usual rubber ammunition, comparable to regular ammo. It's ammo its easy enough to produce that autolathes and sec lathes can print it out from start." - - qol: "Added two pepperball guns to security vendors along with its ammo, increased how much the ammo box holds to 18 and fixed the issue that prevented it from being printable on the sec lathe." - - bugfix: "Lower cases the text of ammo boxes to be consistent." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5248.yml b/html/changelogs/AutoChangeLog-pr-5248.yml deleted file mode 100644 index 2d752c8f1f2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5248.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "OrbisAnima" -delete-after: True -changes: - - bugfix: "Removed the variable that made Akula not being able to use subspecies or custom lore." \ No newline at end of file diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml index 71b9232e7ce..06f16b74c2f 100644 --- a/html/changelogs/archive/2024-12.yml +++ b/html/changelogs/archive/2024-12.yml @@ -790,6 +790,17 @@ OrbisAnima: - balance: Bitrunning - Reverted Domain points to 1x from 2x, and reduced BitRunner points to 1.5x from 2x + - bugfix: Removed the variable that made Akula not being able to use subspecies + or custom lore. + - rscadd: Added the new P207 to both cargo sol imports and security vendors, its + a completly non lethal pistol that shoots bouncy balls that are more effective + against armor than the usual rubber ammunition, comparable to regular ammo. It's + ammo its easy enough to produce that autolathes and sec lathes can print it + out from start. + - qol: Added two pepperball guns to security vendors along with its ammo, increased + how much the ammo box holds to 18 and fixed the issue that prevented it from + being printable on the sec lathe. + - bugfix: Lower cases the text of ammo boxes to be consistent. Stalkeros: - rscadd: Syndicate Assault SNPCs, now 'assumedly' Counter-Bitrunners, have been provided with appropriate MODsuits and Cybersun-manufactured weaponry. From 53c98d249be839ce7cf74fa3853cd3a9d2d85ecb Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:46:49 +0300 Subject: [PATCH 06/23] [MIRROR] Allows Felinids to shower (#5249) * Allows Felinids to shower (#4686) sets to 0 stamina damage of water haters when in water instead of being damaged (compared to being recovered for regular people) * [MIRROR] Allows Felinids to shower * Fix conflict * Fix conflict 2 --------- Co-authored-by: OrbisAnima Co-authored-by: StealsThePRs Co-authored-by: Feenie <62373791+FeenieRU@users.noreply.github.com> --- code/datums/status_effects/neutral.dm | 47 ++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index f8814c56f14..90f9a3c3097 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -610,11 +610,56 @@ SIGNAL_HANDLER qdel(src) -/atom/movable/screen/alert/status_effect/shower_regen +/datum/status_effect/washing_regen + id = "shower_regen" + duration = STATUS_EFFECT_PERMANENT + status_type = STATUS_EFFECT_UNIQUE + alert_type = /atom/movable/screen/alert/status_effect/washing_regen + ///The screen alert shown if you hate water + var/hater_alert = /atom/movable/screen/alert/status_effect/washing_regen/hater + /// How much stamina we regain from washing + var/stamina_heal_per_tick = -4 + /// How much brute, tox and fie damage we heal from this + var/heal_per_tick = 0 + +/datum/status_effect/washing_regen/on_apply() + . = ..() + if(HAS_TRAIT(owner, TRAIT_WATER_HATER) && !HAS_TRAIT(owner, TRAIT_WATER_ADAPTATION)) + alert_type = hater_alert + +/datum/status_effect/washing_regen/tick(seconds_between_ticks) + . = ..() + var/water_adaptation = HAS_TRAIT(owner, TRAIT_WATER_ADAPTATION) + var/water_hater = HAS_TRAIT(owner, TRAIT_WATER_HATER) + var/stam_recovery = (water_hater && !water_adaptation ? -stamina_heal_per_tick : stamina_heal_per_tick) * seconds_between_ticks + var/recovery = heal_per_tick + if(water_adaptation) + recovery -= 1 + stam_recovery *= 1.5 + else if(water_hater) + recovery *= 0 + stam_recovery = 0 // NOVA EDIT ADDITIION - null the stamina damage. + recovery *= seconds_between_ticks + + var/healed = 0 + if(recovery) //very mild healing for those with the water adaptation trait (fish infusion) + healed += owner.adjustOxyLoss(recovery * (water_adaptation ? 1.5 : 1), updating_health = FALSE, required_biotype = MOB_ORGANIC) + healed += owner.adjustFireLoss(recovery, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + healed += owner.adjustToxLoss(recovery, updating_health = FALSE, required_biotype = MOB_ORGANIC) + healed += owner.adjustBruteLoss(recovery, updating_health = FALSE, required_bodytype = BODYTYPE_ORGANIC) + healed += owner.adjustStaminaLoss(stam_recovery, updating_stamina = FALSE) + if(healed) + owner.updatehealth() + +/atom/movable/screen/alert/status_effect/washing_regen name = "Washing" desc = "A good wash fills me with energy!" icon_state = "shower_regen" +/atom/movable/screen/alert/status_effect/washing_regen/hater + desc = "Waaater... Fuck this WATER!!" + icon_state = "shower_regen_catgirl" + /atom/movable/screen/alert/status_effect/shower_regen/hater name = "Washing" desc = "Waaater... Fuck this WATER!!" From 28cd3acb1a90eab90eaff53e039a9421db9c6afb Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:47:17 +0300 Subject: [PATCH 07/23] Automatic changelog for PR #5249 [ci skip] --- html/changelogs/AutoChangeLog-pr-5249.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5249.yml diff --git a/html/changelogs/AutoChangeLog-pr-5249.yml b/html/changelogs/AutoChangeLog-pr-5249.yml new file mode 100644 index 00000000000..9a16a38c5e7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5249.yml @@ -0,0 +1,4 @@ +author: "OrbisAnima" +delete-after: True +changes: + - qol: "Allows those with the Water Hater Quirk (Felinids, Tajarans, etc) to bathe or shower without getting stamina damage. They still get a negative Moodlet and dont heal as others do." \ No newline at end of file From 3e1349b2e1b98b188adaa9c87c2e2f8c91ef9e81 Mon Sep 17 00:00:00 2001 From: Feenie <62373791+FeenieRU@users.noreply.github.com> Date: Wed, 18 Dec 2024 22:08:05 +0300 Subject: [PATCH 08/23] Streletz collection (#5245) --- tff_modular/modules/redsec/code/vending.dm | 2 + tff_modular/modules/streletz/code/clothing.dm | 46 ++++++++++++++++++ .../modules/streletz/icons/mob/hat.dmi | Bin 0 -> 1947 bytes .../modules/streletz/icons/mob/suit.dmi | Bin 0 -> 3989 bytes .../modules/streletz/icons/obj/hat.dmi | Bin 0 -> 1089 bytes .../modules/streletz/icons/obj/suit.dmi | Bin 0 -> 2174 bytes tgstation.dme | 1 + 7 files changed, 49 insertions(+) create mode 100644 tff_modular/modules/streletz/code/clothing.dm create mode 100644 tff_modular/modules/streletz/icons/mob/hat.dmi create mode 100644 tff_modular/modules/streletz/icons/mob/suit.dmi create mode 100644 tff_modular/modules/streletz/icons/obj/hat.dmi create mode 100644 tff_modular/modules/streletz/icons/obj/suit.dmi diff --git a/tff_modular/modules/redsec/code/vending.dm b/tff_modular/modules/redsec/code/vending.dm index 18679a0c432..c1a22c6ca06 100644 --- a/tff_modular/modules/redsec/code/vending.dm +++ b/tff_modular/modules/redsec/code/vending.dm @@ -26,6 +26,8 @@ /obj/item/clothing/suit/toggle/jacket/sec/old = 5, /obj/item/clothing/suit/armor/vest/alt/sec/redsec = 2, /obj/item/storage/backpack/waistbag/redsec = 3, + /obj/item/clothing/suit/armor/vest/alt/caftan = 3, + /obj/item/clothing/head/berendeyka = 3, ), ), list( diff --git a/tff_modular/modules/streletz/code/clothing.dm b/tff_modular/modules/streletz/code/clothing.dm new file mode 100644 index 00000000000..82acd9ef563 --- /dev/null +++ b/tff_modular/modules/streletz/code/clothing.dm @@ -0,0 +1,46 @@ +/obj/item/clothing/suit/armor/vest/alt/caftan + name = "security caftan" + desc = "This is a long and quite comfortable outfit, sitting tightly on the shoulders. Looks like it's from times of troubles." + icon = 'tff_modular/modules/streletz/icons/obj/suit.dmi' + worn_icon = 'tff_modular/modules/streletz/icons/mob/suit.dmi' + icon_state = "caftan_red" + uses_advanced_reskins = TRUE + unique_reskin = list( + "Red Variant" = list( + RESKIN_ICON_STATE = "caftan_red", + RESKIN_WORN_ICON_STATE = "caftan_red" + ), + "Blue Variant" = list( + RESKIN_ICON_STATE = "caftan_blue", + RESKIN_WORN_ICON_STATE = "caftan_blue" + ), + "White Variant" = list( + RESKIN_ICON_STATE = "caftan_white", + RESKIN_WORN_ICON_STATE = "caftan_white" + ), + ) + +/obj/item/clothing/head/berendeyka + name = "security beanie with band" + desc = "Soft and armored beanie that toggles its order." + icon = 'tff_modular/modules/streletz/icons/obj/hat.dmi' + worn_icon = 'tff_modular/modules/streletz/icons/mob/hat.dmi' + icon_state = "berendeyka_red" + uses_advanced_reskins = TRUE + armor_type = /datum/armor/head_helmet + strip_delay = 60 + //supports_variations_flags = CLOTHING_SNOUTED_VARIATION_NO_NEW_ICON + unique_reskin = list( + "Red Variant" = list( + RESKIN_ICON_STATE = "berendeyka_red", + RESKIN_WORN_ICON_STATE = "berendeyka_red" + ), + "Blue Variant" = list( + RESKIN_ICON_STATE = "berendeyka_blue", + RESKIN_WORN_ICON_STATE = "berendeyka_blue" + ), + "White Variant" = list( + RESKIN_ICON_STATE = "berendeyka_white", + RESKIN_WORN_ICON_STATE = "berendeyka_white" + ), + ) diff --git a/tff_modular/modules/streletz/icons/mob/hat.dmi b/tff_modular/modules/streletz/icons/mob/hat.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0391e33b067cb339158063feef5b1651581afb3e GIT binary patch literal 1947 zcma*odpr~BAHeZvY-Z`;6xE^Hlnv$Dh%V+fg~L*#_T!WZHFr&>_cNKTV3vcZuMakmUV&7(x>l=&~`S)dmC4q==K1plMb~N z3{)WjPNUc)ffpyR0RtbFaneA{%qMi_4>%^Qtn` zFr%+xCY9_0ZYuH$QeJWxIVorH(0-b8E+nDDZaln7$1+7k7e+UwWKqJyb$K;r84dc; z*MpXdpG!Hs=Qhh&4m^`w;cnnSTbPgK#6KL;`MbF?9AKjh5oRxJi&g{=I#S5T4f#0968MC(-l!ld4&J>fU5Gg zYl0D_do;OqkMN)e-SdPB3fUpW7A0!mgwkp9HMb9NZu^MTGTcLDnx=2<^$0py#Tf>(hMlBPyG zl>}~es?=`ZLjP0?Os~Pn2mX7d*GqGR38uD$$apm`g&g=Om!0Piu?$l_G+I;{>{=sx1pwn8~Vy6!N?nH<>iKm<}g2U);!aK`QbpGpQyM>3Z@5N1#&$=6C{g11p^NX!ekxWT?>>kdgM zL+fuT-F-5keYK6CdC7(c&rk~4iEO8atrJj>tz&=*ll& zzGTeIgg%O*P$&X@lRdM!`Rz{@Ug5fANtS|j503AG?KI6PEiH{dJx!TemZ!Sb+mgYbew8>W<#e5WZKE#cI5R*?s<+_dXo$ zk03!O_XvkE+6k{`#1UE0mBy&rRwh#`#qjH93gOw)!lF_Pr}a!gx=gpL?N^d<~!h~!DSvE zKE1RMeH~R(F%0*-j-7<0PgVt-@sr-X#+ZI+j{;C9J!{vKfj_5hp>kt~HwY9Zm|AAg9H!ltE(vDv^ zuL9k&OTC&EN1RaAf%!_)bCe(|CR7U*ww^E!GBSV-A1yXtNlV#S|34G)k9ychd}2N@ z2vbELr9koOo?eqKs8Ca8W}gMXeJw`+C8Og%xd~p!0frX&R*wdl=0}nql$x+GQ148; daq?%eL$l`Wueaj*Wy;?cxVsYYHO}PJKLNwzr7{2j literal 0 HcmV?d00001 diff --git a/tff_modular/modules/streletz/icons/mob/suit.dmi b/tff_modular/modules/streletz/icons/mob/suit.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a28c149e44eb5fbeb0475711cc3f9dfe041cfee8 GIT binary patch literal 3989 zcmZ{nc{J1u8^?cR##qOQWUjGi%aW0OH^@?129;~6=_(=Xpkl-{mh6P0j4df5q-+Ue zDSNotX~;H~tdnIJyzV{kd(L~_^WHzc&-3^5ob!Cn=ZUelG=;GXumb=9GdDA~Iqrnx zU|FHZbuc*C{J1>`wzCf~zUA+NbN3B!_wfdR`y|^dzPP}hU$(v*TeGqk6=c75_u7_U zM)fOCP0ROQI@1B*;uC5#lx>v1DPIsJO{cV`*ooSn(NuaXp`_R#qk29jPFeDOA>w6f zobp>4C3U`5wN~rrX|~TVl#Ff0ck_^9pYS;yIFS>fK<9v3%@l`|I{kZ}{$ycgk+p={^C&`s zNt4+Lvy0YUR}~UYd^o^d;Tg+Ni@f|h__A6GGqGYk63hPZ8dbBd_b0yhYnHb14yjH~ z+3H*^EhwA%iK@GXpYN`}=V8Yts25T*AXc2Ai@*CtKbq0&gviIwp-S9*S6g9jUdAh zU-Qc=GNuX?RQ*1uF?D9z*1Q^flw@m*4<5*dm!1@2Sv%e0aWGRwXG0(oq2b^{Wdmvm zoh&z`*%Dw4))qaRov3gBitS+iT-j3U*(hd^z!7%Fu%nF7B_KU)#0e4Z+@k1BX`;B22`lL&gdNo@nn-uaVwvp^OLkdcwH|p@6z|Yt?1E{1PZ)G zEkWSz{9sa_1PX$$lW6lJJ)-q82(s)O`i_K&LS{8W z=Q~*+G-!Rxci_FOlyTJlEbe1^@A8b;-mq!0(f8p4n%71qR!Cb1**BFGa7Ix!U?0;Y zsWF6>_I$JErRRn|s8sl458J^CC>rXaC6n%diSXNC<3VKfW4D}nf2nPE(R`f`vNVO5 zYg(C0r5k^n4kw=!qr0R+4LnRof&0J!(#b7(QeR8n&pF?XygAUOHHb{wG11i0ue8oA z(&WrL15m1}y)%Lp?!|f3kCgf&KZ)d?wuT_ts6RrSuDU0&PQMN}@7n+}8B(Z2I<2*C zunL*Z5+6ypm1*KI$I)EclBxpFhX9c0xDaG#+mI#K{TYbr#H+ zTR559LUGIDVa?j-BY|~)l&BtxlJvg+C_DX2ZD^k1_3Hw^yD1T4=>b>|OKc^m{xL`P z*!X#GFf4I$X05T9zBZ-|+8z*vJm`|NtVsjc1#KNPbWyG+>T|uk;$eJYF|@2rQDodK z91ys*{HAy*`}NW9F4sh&3MW~ogU0zo3fC8ZOIUiXkH79S^K@jObwx%%d=lE(uOWb6 zeshT5xRoijMZLYIk*fQ#Z|$Om(~*w)Ze^+%$=nRpD?3JAA{Z!1ZQM z)cf;+s;WJ+-qWR-?kT?Eb ziZIx>>8`_i0_H$BwB_X@bI`@Tl{W9duSXlbhmNlWD0hvFlB){M7%J=JQirg|1}eUw zt8*sIw%kB|W&#|gSl8-UHtC$^u>c8(s7b}X6U^<%i1@*pX4nVTKzx9uIVK37;&Yw3 zibUL}S(fl9JQg$v4nuImlG9N(79}!(44mQmLFtEwz{o6uo$Q_b5EBYyowP*XZpIxMU5BHkrKeK|%nW5rIPnSzFqT5WCB6FiOQ>R^?RP;lLsK z3>Jq)$w<#!aF=`3{`6adEGyA9zxzN&QC?2gci{4Bw# z?aCojO`Dcf4gDn)e869vzQrG zK#t5l>FTzbBm(zoQk%v>iMqIN@|#Iy$`K z3{Wo;B@~3WRITh@lHA~IqMYsU6Fk2CU(Gi!%lGtF)KW%NG=24l{IX!7M6QCBa<{ij z-q#AhS~XlB{y#Ka22fI*FclS*UFa)bYu4=<4Fc_!PYGnUac@$1(63~WD#ky2yga{b zi%{OFkG?;M^LZ`(YzRIlqKnW-4x^9B;)A&$r!PRqhtBeHlNL1!65_0q$>exwb=Ycg zFmit`sAlza^@IaPv2|-!-6(`RL)>$Nx56~fbIR%Z^L$z!I{Uu2M|Y9_n=b0n3xA{z?4Nn(UK?yTC^D&ym4}1`jcOH# zphs#OFVj#Hw)`q+$K+B}1Q*k@Z$#Yq8|I$Fy;tdprVVGgx^Yw3XdOZTQ=-)Zq-r;O zeOo*0P|L9Fc4!!~{!f2{WfD(3?z2EzPU6fTWOZV*Aq&fui^9(f96noZxmql3T_WhJ z%BHM?10V#LPq;qoKt$SR(w(*aITxfmw?RI`V_DhbkU_UxW4cmekI7KJofy2?w!fw3 z9b;jEs}uY;*pN>oxl@co&$fC+)G!3Od2o$#p+L~J7-24>;Vhkb?OT;LfHu;1)Xme@ zMN=a96oHjc-pf3GPP!KQMK~v8zr1n%>@5_*%$RyFkSZotd-LR_SYxif&?0mas0OR8 zkg@sfb7)e|Avu=#X)Aa;<`Ie3oAvlxe|mLGANNZISss0uQ}vwc{{>mGm+twZC`$v= zXl=GrU7*>UaPkS6$Xu3o#!X(CY5`q&*_2BkM<7tjC*ES?ixMo!6cMN~cvdprj#rKy z=maH#8+T*)^Xb6knHTN;;@LOhrtEv0R&^wOE-4mhIPP3&S`{u@5Y%0} zn>#Aw-)LbLs=MQ@qNQ3hy_V_NR}>8=7K+9EkYj!!4vh%V`~66RCK}_))MEYi8QJFR z0#3@>LsY-k*+TCLQ9 zY~ZJcY>q0rrSq_*L3n;CJtWn?0kv*1{Q=MONM4&Sp8hk4HqS>1nQ`kcwnukX+Z#oM z;I|*-Fwz|AgDWfB@{#J^^4%m&TOm!H@ekUlh?o4IOcd$Hx-tDkt4s!jlk?hukU>^K zR66{V%@fn+0koN}U!d`!AuEj2G`XF+j}(FRLd{}xS!A-oOIA-|3Q{AxH|8K>U*B^N zS!s#p+vrUqVRv!c~?_{)EJW& z_$_AT+7JlKki7VGp&2dSO_%THEym`TnP7oHs5nduiCXJ zPjm~>5?u0mC3$tqo~1vU5n%lO!3)t}N1)_8223+8HM%)cM039!(x|2V`{o5;d;b*J4%+GTb%&sB~Z3*4#QW_|5w>9!_<2#;6$?C>Y_H&T*NEO24@ zb|v!a_qr^a&-ag)|I4HP{0>8^K~_zVJ?bwvy25@54J3F|?wwY|y8y4Xj>o;C!kT7D z0Nu#>(thky;y``k)c@#|xs+hL0JTd)R0V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DJiumH7_N#GCMK8C^bcii!&v&s2C_=$ijUMe9Ft?{){;MlEWS!MU>jGs*iM_52;v z0w5UtsO!%*9~Z%H#-?YL(Q$u;cTTBC1k+PMFL(rfcduMmbZ)T}eDeOo$F}!h6vTJv zjOqS`G62&aQyXnDNOqf^2vfaX0DBMOAZ*Ko_1stZ3~IoY^m~T^iXtq(dm`MwkN^t{ z3ox;7T*2TmNFMyn^&iZ-2i$7IK7hjC4OqN7uVg=bv~-gd+_PKB3?5-Y^5B0zy~C_; ztdCi5@n?B;115`YlV83Gi6AruUcFpY4*2&&dU!|4cdN4p(1*bf4SAUlE&h)F>7!GY zO$Q7(fKq4yo3U z=)Pg1XD91R8x;5HArd@NbD^?gWAncmU?+8LglgfWFGIrn0L18NIVor@@<4>N_a;CJ zKs^9zqyW?dphgNnJpgLjUVw(2;Tb`_5o`MlkOEK-fEp8oc3fzF;yYbiXzlqACO9=%Fg6xW@bwD0V0Q}%|cy^AO;@}hs%7iSWMv} zI0@4N=mn3UFA|B^`fA(`gcd=b(rDA^G(K(Jc7Z?ug|NLy!b+-U0M-O(!55^_Xp{%Z ze8E#EnJv`^fcn<>dGZ;n53pmvR%5C@;O(2&CEtbf=NeWYU?=A51GZ>%eSlq5eKm$t zARdpi&)WKc*^8H$@6p2t!u0`0P@f11WdP1+UJFoM0JT90*9SB!4XF<>!Vwu@mX_NI zwsL(yO#!rlIWV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DLFB%Brz|(C^bcii!&v&s2C_{$iN_XE?{E86r~B#s*RFVQ zsHGShj<&RE~b^DLGX&BlEdB49}Ze+df8r)f4Gv8g+2#+ILg{lP``&L^^USB1nR)6;|?)0Z<3mOq9Un zbJvxM^o?t`1xb*#!b%=80P5hKy48`9cX4q43BEVNO6A z#E}NpFUT{d!U(-oU??SID8zVA+i;h1#ZdvBe?IUU4Gj%ZZ`N94g6k3aLJ8Lfsc(3c zFee}l;z$EShHS2JFDP8guZrHj@u#$XtqX+47E;0TyW;t)C-cOeM;QQVPNSS<7=>Bc z?iot}@;NyLCiXb$x zd7KJFgZa$I5ZU7>P0rDtc>jE9)u~x?M0p8~&AgT+trtz*%#Q#PNFqWOG zb%C3q%Q1NzAK-nm_O;t#RsvhVTYK)%A_o`vp>e7Vz7K#r=ebn^x6eu#x^DqhyUVC+ zRP6%w$J@*_d>;ULRr{_dC2L6hLggZ<3;fnFVWzu`N%PaDTF=B)u!h6|V;+#XK(KRa z0vx#9PQNr9(YEh74nTN&wjpAWJti*;Ij_6+Evi?=AiNEB_E7MHFQjFm-X2fwD-~cB z{G_5rjQ(Uia90rh_WG18_6v5vRZ!1r1%Ou<0A8tlUyMG-10ec)@F%kz`vp7TDyV0* z0$Ka6z6aO=@_CEX%!`$Q(D&`{-ViPlY+e@6t6c%)mm3ozU#tv-zKvggC|u|CIOYXu;%5fPzF1a^(PmUROJHoCapirw4Rxsr>^ z1!Q2$*!KC$v+e>iux0%CS+yq@@VpABc6V$Y-@kKASWCYV4%;WdL_lQ)oWI9d9bheE z!vkcW0A=u`0N&ilc6VmkEW&ALr`z?Z;7S1)Ni1oY@frP!EiUILa`Z8hSkf@#Gcdw3 zaK4+-2R!{5f)a4If8VoyHC7Q%#GfH30eAcNJ?mFv74bxUqJM-34GEv6y&}=S&%7dG zalm}VL$3f=yFojWaXuhfm^bGGW(%HNz)Jq{m8+&*fZtyzzSxKdpS+VcS*QC?my(tJJuWUa80=Rd`$gDcgQ;5Z4Q^G!`n z)X~vFMNbz~_upM2pOv6G9{^dPs;Y`#6+M6c{G10}GH6!;kS{4I5zl{JyhK}G+&t}k z00ZSfMMZ^~S6W(1EiEkx>u{psY8iwQ_y=ujd1j1?~BOmJ`iXzH^sIgV3f;o9NuRb5ePf@sbBw)CK(h_|69;1KL2y z?=Lio02qA`-LYc_?cKXqTzE#F)iO{A3Pk->hU@bIFykV_9ds_x*w`487w`FiWWn|M z01j>j1_m5mAUAjF%Pj{^PUi#Wde^A5082-?^JYj4qOw(B-@bijeFQ)89E?adJjVf+ z@K#z@UtjN7f38Q|4p;vL4jecjMj!D2M}gLG7yAVUE8ytSqrx2y9Xcf1P+7oSDF8NDU1QDQog}cvgTezTdxpKUG#%#@(T0!}T1%Q5}cHI>5B8D?+Lw zVV}j>G7cX;Jg;29^D3a)-En>(5D?aaizmQTh9?C$?d(#0*QbIj1z;qx6c$-_hAP6G zKOaUPaBTss1U%cn@8R3wd?U`7^Ulu8K AEdT%j literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index c6f74322e8b..ea343b72702 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8900,6 +8900,7 @@ #include "tff_modular\modules\silicon_laws_tweaks\code\upload.dm" #include "tff_modular\modules\smites\femboyfication.dm" #include "tff_modular\modules\snowfall\snowfall.dm" +#include "tff_modular\modules\streletz\code\clothing.dm" #include "tff_modular\modules\timed_citations\crime.dm" #include "tff_modular\modules\toys\code\loadout_datum_toys.dm" #include "tff_modular\modules\toys\code\plushes.dm" From da3d1f0f69c5c43872684a7be4690a004b05d87c Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Wed, 18 Dec 2024 22:08:33 +0300 Subject: [PATCH 09/23] Automatic changelog for PR #5245 [ci skip] --- html/changelogs/AutoChangeLog-pr-5245.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5245.yml diff --git a/html/changelogs/AutoChangeLog-pr-5245.yml b/html/changelogs/AutoChangeLog-pr-5245.yml new file mode 100644 index 00000000000..13e48b32b45 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5245.yml @@ -0,0 +1,4 @@ +author: "FeenieRU" +delete-after: True +changes: + - rscadd: "Streletz suit in security vends." \ No newline at end of file From 5558fdf3121a655db48b01fdef57e910b058d69a Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 01:26:47 +0000 Subject: [PATCH 10/23] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5245.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5249.yml | 4 ---- html/changelogs/archive/2024-12.yml | 7 +++++++ 3 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5245.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5249.yml diff --git a/html/changelogs/AutoChangeLog-pr-5245.yml b/html/changelogs/AutoChangeLog-pr-5245.yml deleted file mode 100644 index 13e48b32b45..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5245.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FeenieRU" -delete-after: True -changes: - - rscadd: "Streletz suit in security vends." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5249.yml b/html/changelogs/AutoChangeLog-pr-5249.yml deleted file mode 100644 index 9a16a38c5e7..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5249.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "OrbisAnima" -delete-after: True -changes: - - qol: "Allows those with the Water Hater Quirk (Felinids, Tajarans, etc) to bathe or shower without getting stamina damage. They still get a negative Moodlet and dont heal as others do." \ No newline at end of file diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml index 06f16b74c2f..3582022d51c 100644 --- a/html/changelogs/archive/2024-12.yml +++ b/html/changelogs/archive/2024-12.yml @@ -810,3 +810,10 @@ klushy225: - rscadd: Added the Half Bob hairstyle - image: Added the hair_bob_half state to hair.dmi +2024-12-19: + FeenieRU: + - rscadd: Streletz suit in security vends. + OrbisAnima: + - qol: Allows those with the Water Hater Quirk (Felinids, Tajarans, etc) to bathe + or shower without getting stamina damage. They still get a negative Moodlet + and dont heal as others do. From eda651230b829a9fe22213b1adf47a3589ca2376 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Thu, 19 Dec 2024 09:00:15 +0300 Subject: [PATCH 11/23] [MIRROR] Tinypaks, backpacks, but tiny [SLIGHTLY LESS MODULAR] (#5251) * Tinypaks, backpacks, but tiny [SLIGHTLY LESS MODULAR] (#4651) * Add files via upload * Create tinypacks * Update flavor_misc.dm * Update tgstation.dme * Rename tinypacks to tinypacks.dm * Update clothing.dm * Update _job.dm * Update tinypacks.dm * Update tinypacks.dm * Update _job.dm * Apply suggestions from code review Co-authored-by: FlufflesTheDog * Update modular_nova/modules/clothing_improvements/code/tinypacks.dm Co-authored-by: FlufflesTheDog --------- Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: FlufflesTheDog * [MIRROR] Tinypaks, backpacks, but tiny [SLIGHTLY LESS MODULAR] --------- Co-authored-by: RatFromTheJungle <62520989+RatFromTheJungle@users.noreply.github.com> Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com> Co-authored-by: FlufflesTheDog Co-authored-by: StealsThePRs --- code/_globalvars/lists/flavor_misc.dm | 10 ++++++ code/modules/client/preferences/clothing.dm | 14 ++++++++- code/modules/jobs/job_types/_job.dm | 8 +++++ .../clothing_improvements/code/clothing.dmi | Bin 0 -> 590 bytes .../code/clothing_worn.dmi | Bin 0 -> 507 bytes .../clothing_improvements/code/tinypacks.dm | 29 ++++++++++++++++++ tgstation.dme | 1 + 7 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 modular_nova/modules/clothing_improvements/code/clothing.dmi create mode 100644 modular_nova/modules/clothing_improvements/code/clothing_worn.dmi create mode 100644 modular_nova/modules/clothing_improvements/code/tinypacks.dm diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 00b26e7703d..bb799e0c0cb 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -106,6 +106,11 @@ GLOBAL_LIST_INIT(security_depts_prefs, sort_list(list( #define GSATCHEL "Grey Satchel" #define GMESSENGER "Grey Messenger Bag" #define LSATCHEL "Leather Satchel" +/// NOVA EDIT ADDITION START - Adds tpacks, tiny backpacks +#define TPACKB "Beltpack" +#define TPACKA "Waistpack" +#define TPACKC "Chest pack" +// NOVA EDIT ADDITION END GLOBAL_LIST_INIT(backpacklist, list( DBACKPACK, DDUFFELBAG, @@ -116,6 +121,11 @@ GLOBAL_LIST_INIT(backpacklist, list( GSATCHEL, GMESSENGER, LSATCHEL, + // NOVA EDIT ADDITION START + TPACKB, + TPACKA, + TPACKC, + // NOVA EDIT ADDITION END )) //Suit/Skirt diff --git a/code/modules/client/preferences/clothing.dm b/code/modules/client/preferences/clothing.dm index a595af615e8..8ac6951a390 100644 --- a/code/modules/client/preferences/clothing.dm +++ b/code/modules/client/preferences/clothing.dm @@ -31,8 +31,12 @@ DSATCHEL, DDUFFELBAG, DMESSENGER, + // NOVA EDIT ADDITION START + TPACKB, + TPACKA, + TPACKC, + // NOVA EDIT ADDITION END ) - /datum/preference/choiced/backpack/create_default_value() return DBACKPACK @@ -48,6 +52,14 @@ return /obj/item/storage/backpack/duffelbag if (GMESSENGER) return /obj/item/storage/backpack/messenger + // NOVA EDIT ADDITION START + if (TPACKB) + return /obj/item/storage/backpack/tinypakb + if (TPACKA) + return /obj/item/storage/backpack/tinypaka + if (TPACKC) + return /obj/item/storage/backpack/tinypakc + // NOVA EDIT ADDITION END // In a perfect world, these would be your department's backpack. // However, this doesn't factor in assistants, or no high slot, and would diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 8731a1397b1..c95102d9b0e 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -398,6 +398,14 @@ back = duffelbag //Department duffel bag if(DMESSENGER) back = messenger //Department messenger bag + // NOVA EDIT ADDITION START - Tinypaks + if(TPACKB) + back = /obj/item/storage/backpack/tinypakb + if(TPACKA) + back = /obj/item/storage/backpack/tinypaka + if(TPACKC) + back = /obj/item/storage/backpack/tinypakc + // NOVA EDIT ADDITION START else back = backpack //Department backpack diff --git a/modular_nova/modules/clothing_improvements/code/clothing.dmi b/modular_nova/modules/clothing_improvements/code/clothing.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b347b9cd0356d6f5dc3b97a9be1c0e7f10345304 GIT binary patch literal 590 zcmV-U0%zgw!otaki=9YGTT+WmZvX%Q0d!JMQvg8b*k%9#0Cjp) zSad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1Z!WQw0?I(kQ#Pw070tN z6Qi66R&!HRsNy6!3*%a{?!ay&^9h)liQEa07xTM}XN9U^7?Dg<_%P0wy>lYxf@QIt znChN^+xMBkLrv#f2UIvdete)J*SIiO3I9vKye+DW8B+xbcXj1OujpwNrf30JR1uf8x&ibTcbvZF@3 cH2!+L1Bak9Hz3H=^#A|>07*qoM6N<$g6Ks3^Z)<= literal 0 HcmV?d00001 diff --git a/modular_nova/modules/clothing_improvements/code/clothing_worn.dmi b/modular_nova/modules/clothing_improvements/code/clothing_worn.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b39cc1e40dcb1d094e1134ae408650857405397a GIT binary patch literal 507 zcmVV_YZUq3m z95Z%fC8ZJo009$8L_t(oh3%J7YQr!LhGli_bCUT0cH9GGVS8_B4^Vc3vHKsQNg1_d zD;cHiVeo$th-Cl2WxvQK0sw$N#Ra0MG8^Bh3CBSTeB)aY`>ySzVj4@zup4j5EJ!i! zg&@WAF$J;SB+)fac5;Q(6AJ+`k0Xn4Bm*V*`7(WwkqV>;00000Ca$xxt(CO#Z^3YV zS9g-8o{@>Yk>r?Nd7;DKE3hsQEGpoJS1WL)y}T6dPiuMr001SM=j7bWx9qSuZ;|vF zeyhgi-?~ZghkS<;9g6W;vAxUOMf=Usw{A`^g~43XE*pGNxlMjm1=Oc7$o@6=xnh^D xY_G14wLx(V^{K2j(~5FEJM|!sl>oqh=L)tW4ope;AeI0C002ovPDHLkV1l_E)M@|# literal 0 HcmV?d00001 diff --git a/modular_nova/modules/clothing_improvements/code/tinypacks.dm b/modular_nova/modules/clothing_improvements/code/tinypacks.dm new file mode 100644 index 00000000000..0cf29707ba5 --- /dev/null +++ b/modular_nova/modules/clothing_improvements/code/tinypacks.dm @@ -0,0 +1,29 @@ +/obj/item/storage/backpack/tinypakb + name = "storage belt" + desc = "A small belt coated from front to back in pouches." + icon_state = "tinypakb" + inhand_icon_state = "messenger" + icon = 'modular_nova/modules/clothing_improvements/code/clothing.dmi' + worn_icon = 'modular_nova/modules/clothing_improvements/code/clothing_worn.dmi' + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + +/obj/item/storage/backpack/tinypaka + name = "waistpack" + desc = "A small, waist-mounted pack for... well, storing stuff!" + icon_state = "tinypaka" + inhand_icon_state = "messenger" + icon = 'modular_nova/modules/clothing_improvements/code/clothing.dmi' + worn_icon = 'modular_nova/modules/clothing_improvements/code/clothing_worn.dmi' + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' + +/obj/item/storage/backpack/tinypakc + name = "chest pouch" + desc = "Like a fannypack, but for your chest! ...Seems to hold alot more, though." + icon_state = "tinypakc" + inhand_icon_state = "messenger" + icon = 'modular_nova/modules/clothing_improvements/code/clothing.dmi' + worn_icon = 'modular_nova/modules/clothing_improvements/code/clothing_worn.dmi' + lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' diff --git a/tgstation.dme b/tgstation.dme index ea343b72702..3a7331b8b9b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7347,6 +7347,7 @@ #include "modular_nova\modules\clothing_improvements\code\chaplain.dm" #include "modular_nova\modules\clothing_improvements\code\functional_toggle.dm" #include "modular_nova\modules\clothing_improvements\code\holsters.dm" +#include "modular_nova\modules\clothing_improvements\code\tinypacks.dm" #include "modular_nova\modules\colony_fabricator\code\cargo_packs.dm" #include "modular_nova\modules\colony_fabricator\code\colony_fabricator.dm" #include "modular_nova\modules\colony_fabricator\code\looping_sounds.dm" From cfa48fe9ac1b67c7b0591a7e659fa4ec19647d82 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Thu, 19 Dec 2024 09:00:41 +0300 Subject: [PATCH 12/23] Automatic changelog for PR #5251 [ci skip] --- html/changelogs/AutoChangeLog-pr-5251.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5251.yml diff --git a/html/changelogs/AutoChangeLog-pr-5251.yml b/html/changelogs/AutoChangeLog-pr-5251.yml new file mode 100644 index 00000000000..33784ebb4cd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5251.yml @@ -0,0 +1,4 @@ +author: "RatFromTheJungle" +delete-after: True +changes: + - rscadd: "Adds tinypaks, smaller backpacks to the loadout that are less 'visually disruptive.'" \ No newline at end of file From ea60e1c838ffca7f681a5b077c5e22deb92a7895 Mon Sep 17 00:00:00 2001 From: Iajret Creature <122297233+Steals-The-PRs@users.noreply.github.com> Date: Thu, 19 Dec 2024 09:01:04 +0300 Subject: [PATCH 13/23] [MIRROR] civil defense symptom kitis now available for purchase (#5250) * civil defense symptom kitis now available for purchase (#4692) ok... * [MIRROR] civil defense symptom kitis now available for purchase --------- Co-authored-by: Kocma-san <112967882+Kocma-san@users.noreply.github.com> Co-authored-by: StealsThePRs --- .../company_imports/code/armament_datums/deforest_medical.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm b/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm index 9373b32c2bb..e165fd476cd 100644 --- a/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm +++ b/modular_nova/modules/company_imports/code/armament_datums/deforest_medical.dm @@ -7,7 +7,7 @@ /datum/armament_entry/company_import/deforest/first_aid_kit subcategory = "First-Aid Kits" -/datum/armament_entry/deforest/first_aid_kit/civil_defense/comfort +/datum/armament_entry/company_import/deforest/first_aid_kit/comfort item_type = /obj/item/storage/medkit/civil_defense/comfort/stocked cost = PAYCHECK_COMMAND * 2 From d4b5bca9628b09e9963332f9050fb3f9e15557c4 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Thu, 19 Dec 2024 09:01:37 +0300 Subject: [PATCH 14/23] Automatic changelog for PR #5250 [ci skip] --- html/changelogs/AutoChangeLog-pr-5250.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5250.yml diff --git a/html/changelogs/AutoChangeLog-pr-5250.yml b/html/changelogs/AutoChangeLog-pr-5250.yml new file mode 100644 index 00000000000..e29090f29a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5250.yml @@ -0,0 +1,4 @@ +author: "Kocma-san" +delete-after: True +changes: + - bugfix: "civil defense symptom kitis now available for purchase" \ No newline at end of file From d7a41162d426ad935525e2fbe0cb959f998c762c Mon Sep 17 00:00:00 2001 From: "tgstation-ci[bot]" <179393467+tgstation-ci[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 12:37:40 +0000 Subject: [PATCH 15/23] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5250.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5251.yml | 4 ---- html/changelogs/archive/2024-12.yml | 5 +++++ 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5250.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5251.yml diff --git a/html/changelogs/AutoChangeLog-pr-5250.yml b/html/changelogs/AutoChangeLog-pr-5250.yml deleted file mode 100644 index e29090f29a5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5250.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Kocma-san" -delete-after: True -changes: - - bugfix: "civil defense symptom kitis now available for purchase" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5251.yml b/html/changelogs/AutoChangeLog-pr-5251.yml deleted file mode 100644 index 33784ebb4cd..00000000000 --- a/html/changelogs/AutoChangeLog-pr-5251.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "RatFromTheJungle" -delete-after: True -changes: - - rscadd: "Adds tinypaks, smaller backpacks to the loadout that are less 'visually disruptive.'" \ No newline at end of file diff --git a/html/changelogs/archive/2024-12.yml b/html/changelogs/archive/2024-12.yml index 3582022d51c..d3a8ea2f477 100644 --- a/html/changelogs/archive/2024-12.yml +++ b/html/changelogs/archive/2024-12.yml @@ -813,7 +813,12 @@ 2024-12-19: FeenieRU: - rscadd: Streletz suit in security vends. + Kocma-san: + - bugfix: civil defense symptom kitis now available for purchase OrbisAnima: - qol: Allows those with the Water Hater Quirk (Felinids, Tajarans, etc) to bathe or shower without getting stamina damage. They still get a negative Moodlet and dont heal as others do. + RatFromTheJungle: + - rscadd: Adds tinypaks, smaller backpacks to the loadout that are less 'visually + disruptive.' From d80d064e7bb7eb8f542d43616f51274f1f9e54e6 Mon Sep 17 00:00:00 2001 From: Oxotnak <107066254+Oxotnak@users.noreply.github.com> Date: Thu, 19 Dec 2024 18:46:23 +0300 Subject: [PATCH 16/23] GAS carry build late game (#4957) * agro-grab * noslip + tackle resist * movespeed raise * eyes slot + offset * agrograb's qol spans * faster scythes + remove comment * no glasses actually + exceptions * exceptions + icon name fix * [Drish] fix huds nabber * scythes_stop_standing * aaa * aaa2 * lategaming * aaa2.1 * aaa1.1 * stash valid * tabulation missed * Update tff_modular/modules/nabbers/code/_nabbers.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/_nabbers.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/_nabbers.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/_nabbers.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/_nabbers.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/_nabbers.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/nabber_bolaimmunity.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/nabber_language.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * Update tff_modular/modules/nabbers/code/nabber_language.dm Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> * eyes fix * qol, fix, blacklist update * language fix --------- Co-authored-by: SuperDrish <59139863+Microvolnovka19@users.noreply.github.com> --- code/modules/clothing/glasses/hud.dm | 14 ++ code/modules/mob/living/living_say.dm | 12 ++ .../research/techweb/nodes/cyborg_nodes.dm | 1 + .../modules/huds/code/glasses/HUD_Glasses.dm | 4 + .../meson_scouter/code/meson_scouter.dm | 10 +- tff_modular/modules/nabbers/code/_nabbers.dm | 178 +++++++++++++++++- .../modules/nabbers/code/abilites/agrograb.dm | 25 +++ .../code/abilites/nabber_combat_effect.dm | 2 +- .../code/abilites/nabber_welding_eyes.dm | 2 +- .../nabbers/code/abilites/toggle_arms.dm | 55 ++++-- .../modules/nabbers/code/nabber_bodyparts.dm | 6 + .../nabbers/code/nabber_bolaimmunity.dm | 57 ++++++ .../modules/nabbers/code/nabber_huds.dm | 90 +++++++++ .../modules/nabbers/code/nabber_language.dm | 122 ++++++++++++ .../modules/nabbers/code/nabber_organs.dm | 21 ++- tgstation.dme | 4 + 16 files changed, 571 insertions(+), 32 deletions(-) create mode 100644 tff_modular/modules/nabbers/code/abilites/agrograb.dm create mode 100644 tff_modular/modules/nabbers/code/nabber_bolaimmunity.dm create mode 100644 tff_modular/modules/nabbers/code/nabber_huds.dm create mode 100644 tff_modular/modules/nabbers/code/nabber_language.dm diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 332aba8a719..97ed81c630e 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -38,6 +38,7 @@ icon_state = "healthhud" clothing_traits = list(TRAIT_MEDICAL_HUD) glass_colour_type = /datum/client_colour/glass_colour/lightblue + species_exception = list(/datum/species/nabber) // FF ADDITION /obj/item/clothing/glasses/hud/medsechud name = "health scanner security HUD" @@ -57,6 +58,7 @@ glass_colour_type = /datum/client_colour/glass_colour/lightgreen actions_types = list(/datum/action/item_action/toggle_nv) forced_glass_color = TRUE + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/health/night/update_icon_state() . = ..() @@ -82,6 +84,7 @@ flags_cover = GLASSESCOVERSEYES tint = 1 glass_colour_type = /datum/client_colour/glass_colour/blue + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/health/sunglasses/Initialize(mapload) . = ..() @@ -98,6 +101,7 @@ icon_state = "diagnostichud" clothing_traits = list(TRAIT_DIAGNOSTIC_HUD) glass_colour_type = /datum/client_colour/glass_colour/lightorange + species_exception = list(/datum/species/nabber) // FF ADDITION /obj/item/clothing/glasses/hud/diagnostic/night name = "night vision diagnostic HUD" @@ -111,6 +115,7 @@ glass_colour_type = /datum/client_colour/glass_colour/lightyellow actions_types = list(/datum/action/item_action/toggle_nv) forced_glass_color = TRUE + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/diagnostic/night/update_icon_state() . = ..() @@ -124,6 +129,7 @@ flash_protect = FLASH_PROTECTION_FLASH flags_cover = GLASSESCOVERSEYES tint = 1 + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/diagnostic/sunglasses/Initialize(mapload) . = ..() @@ -140,12 +146,14 @@ icon_state = "securityhud" clothing_traits = list(TRAIT_SECURITY_HUD) glass_colour_type = /datum/client_colour/glass_colour/red + species_exception = list(/datum/species/nabber) // FF ADDITION /obj/item/clothing/glasses/hud/security/chameleon name = "chameleon security HUD" desc = "A stolen security HUD integrated with Syndicate chameleon technology. Provides flash protection." flash_protect = FLASH_PROTECTION_FLASH actions_types = list(/datum/action/item_action/chameleon/change/glasses/no_preset) + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch name = "eyepatch HUD" @@ -153,6 +161,7 @@ icon_state = "hudpatch" base_icon_state = "hudpatch" actions_types = list(/datum/action/item_action/flip) + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/security/sunglasses/eyepatch/attack_self(mob/user, modifiers) . = ..() @@ -167,6 +176,7 @@ flags_cover = GLASSESCOVERSEYES tint = 1 glass_colour_type = /datum/client_colour/glass_colour/darkred + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/security/sunglasses/Initialize(mapload) . = ..() @@ -188,6 +198,7 @@ glass_colour_type = /datum/client_colour/glass_colour/lightred actions_types = list(/datum/action/item_action/toggle_nv) forced_glass_color = TRUE + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/security/night/update_icon_state() . = ..() @@ -206,6 +217,7 @@ attack_verb_simple = list("slice") hitsound = 'sound/items/weapons/bladeslice.ogg' sharpness = SHARP_EDGED + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/security/sunglasses/gars/giga name = "giga HUD gar glasses" @@ -213,6 +225,7 @@ icon_state = "gigagar_sec" force = 12 throwforce = 12 + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/toggle name = "Toggle HUD" @@ -251,6 +264,7 @@ color_cutoffs = list(25, 8, 5) glass_colour_type = /datum/client_colour/glass_colour/red clothing_traits = list(TRAIT_SECURITY_HUD) + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/toggle/thermal/attack_self(mob/user) ..() diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index c935989a580..e72899d482d 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -278,6 +278,18 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( if((SEND_SIGNAL(src, COMSIG_MOVABLE_PRE_HEAR, args) & COMSIG_MOVABLE_CANCEL_HEARING) || !GET_CLIENT(src)) return FALSE +// FLUFFY EDIT START Converts scrambled nabber's msg into emote for people + if(ispath(message_language, /datum/language/nabber) && speaker != src) + var/gbs_translation_check = translate_language(speaker, message_language, raw_message, spans, message_mods) + if(raw_message != gbs_translation_check) + message_mods[MODE_CUSTOM_SAY_EMOTE] = gbs_translation_check + message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] = TRUE + + if(ispath(message_language, /datum/language/nabber) && isnabber(src)) + message_mods[MODE_CUSTOM_SAY_EMOTE] = null + message_mods[MODE_CUSTOM_SAY_ERASE_INPUT] = FALSE + // FLUFFY EDIT END + var/deaf_message var/deaf_type diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index fad15b6f019..bc5b7efc0be 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -149,6 +149,7 @@ "implanter", "locator", "c38_trac", + "implant_gasspeech", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) announce_channels = list(RADIO_CHANNEL_SECURITY, RADIO_CHANNEL_MEDICAL) diff --git a/modular_nova/modules/huds/code/glasses/HUD_Glasses.dm b/modular_nova/modules/huds/code/glasses/HUD_Glasses.dm index 13d25055eb8..3945298af98 100644 --- a/modular_nova/modules/huds/code/glasses/HUD_Glasses.dm +++ b/modular_nova/modules/huds/code/glasses/HUD_Glasses.dm @@ -4,6 +4,7 @@ icon = 'modular_nova/modules/huds/icons/huds.dmi' icon_state = "glasses_healthhud" worn_icon = 'modular_nova/modules/huds/icons/hudeyes.dmi' + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/health/prescription/Initialize(mapload) clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) @@ -15,6 +16,7 @@ icon = 'modular_nova/modules/huds/icons/huds.dmi' icon_state = "glasses_diagnostichud" worn_icon = 'modular_nova/modules/huds/icons/hudeyes.dmi' + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/diagnostic/prescription/Initialize(mapload) clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) @@ -26,6 +28,7 @@ icon = 'modular_nova/modules/huds/icons/huds.dmi' icon_state = "glasses_securityhud" worn_icon = 'modular_nova/modules/huds/icons/hudeyes.dmi' + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/hud/security/prescription/Initialize(mapload) clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) @@ -51,6 +54,7 @@ /obj/item/clothing/glasses/meson/prescription name = "prescription optical meson scanner" desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions. This one has prescription lens fitted in." + species_exception = list() // FF ADDITION /obj/item/clothing/glasses/meson/prescription/Initialize(mapload) clothing_traits += list(TRAIT_NEARSIGHTED_CORRECTED) diff --git a/modular_nova/modules/meson_scouter/code/meson_scouter.dm b/modular_nova/modules/meson_scouter/code/meson_scouter.dm index 08931499aa3..3c6fd5792eb 100644 --- a/modular_nova/modules/meson_scouter/code/meson_scouter.dm +++ b/modular_nova/modules/meson_scouter/code/meson_scouter.dm @@ -1,4 +1,5 @@ /obj/item/clothing/glasses/meson + species_exception = list(/datum/species/nabber) // FF ADDITION uses_advanced_reskins = TRUE unique_reskin = list( "Meson Glasses" = list( @@ -11,12 +12,12 @@ RESKIN_ICON = 'modular_nova/modules/meson_scouter/icons/meson_scouter.dmi', RESKIN_ICON_STATE = "meson_scouter", RESKIN_WORN_ICON = 'modular_nova/modules/meson_scouter/icons/meson-scouter_mob.dmi', - RESKIN_WORN_ICON_STATE = "meson_scouter" ), ) /obj/item/clothing/glasses/meson/night/Initialize(mapload) . = ..() + species_exception = list() // FF ADDITION unique_reskin -= list( "Meson Glasses" = list( RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', @@ -34,6 +35,7 @@ /obj/item/clothing/glasses/meson/gar/Initialize(mapload) . = ..() + species_exception = list() // FF ADDITION unique_reskin -= list( "Meson Glasses" = list( RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', @@ -51,6 +53,7 @@ /obj/item/clothing/glasses/meson/prescription/Initialize(mapload) . = ..() + species_exception = list() // FF ADDITION unique_reskin -= list( "Meson Glasses" = list( RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', @@ -67,6 +70,7 @@ ) /obj/item/clothing/glasses/meson/engine + species_exception = list(/datum/species/nabber) // FF ADDITION uses_advanced_reskins = TRUE unique_reskin = list( "Engine Glasses" = list( @@ -83,6 +87,7 @@ /obj/item/clothing/glasses/meson/engine/tray/Initialize(mapload) . = ..() + species_exception = list() // FF ADDITION unique_reskin -= list( "Engine Glasses" = list( RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', @@ -98,6 +103,7 @@ /obj/item/clothing/glasses/meson/engine/shuttle/Initialize(mapload) . = ..() + species_exception = list() // FF ADDITION unique_reskin -= list( "Engine Glasses" = list( RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', @@ -113,6 +119,7 @@ /obj/item/clothing/glasses/meson/engine/atmos_imaging/Initialize(mapload) . = ..() + species_exception = list() // FF ADDITION unique_reskin -= list( "Engine Glasses" = list( RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', @@ -128,6 +135,7 @@ /obj/item/clothing/glasses/meson/engine/prescription/Initialize(mapload) . = ..() + species_exception = list() // FF ADDITION unique_reskin -= list( "Engine Glasses" = list( RESKIN_ICON = 'icons/obj/clothing/glasses.dmi', diff --git a/tff_modular/modules/nabbers/code/_nabbers.dm b/tff_modular/modules/nabbers/code/_nabbers.dm index cd906b2be98..a41e631eaac 100644 --- a/tff_modular/modules/nabbers/code/_nabbers.dm +++ b/tff_modular/modules/nabbers/code/_nabbers.dm @@ -16,21 +16,25 @@ TRAIT_MUTANT_COLORS, TRAIT_NO_UNDERWEAR, TRAIT_HARD_SOLES, - TRAIT_NO_BLOOD_OVERLAY + TRAIT_NO_BLOOD_OVERLAY, + TRAIT_NO_SLIP_WATER, + TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, + TRAIT_PERSONALSPACE, // Нет жопы :с ) body_size_restricted = TRUE digitigrade_customization = DIGITIGRADE_NEVER - no_equip_flags = ITEM_SLOT_FEET | ITEM_SLOT_OCLOTHING | ITEM_SLOT_SUITSTORE | ITEM_SLOT_EYES + no_equip_flags = ITEM_SLOT_FEET | ITEM_SLOT_OCLOTHING | ITEM_SLOT_SUITSTORE | ITEM_SLOT_EYES | ITEM_SLOT_LEGCUFFED inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID mutanttongue = /obj/item/organ/internal/tongue/nabber - always_customizable = FALSE + always_customizable = TRUE hair_alpha = 0 facial_hair_alpha = 0 payday_modifier = 0.75 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + species_cookie = /obj/item/food/grown/cabbage bodytemp_heat_damage_limit = (BODYTEMP_HEAT_DAMAGE_LIMIT - 10) mutantbrain = /obj/item/organ/internal/brain/nabber - mutanteyes = /obj/item/organ/internal/eyes/robotic/nabber + mutanteyes = /obj/item/organ/internal/eyes/nabber mutantlungs = /obj/item/organ/internal/lungs/nabber mutantheart = /obj/item/organ/internal/heart/nabber mutantliver = /obj/item/organ/internal/liver/nabber @@ -56,6 +60,11 @@ var/datum/action/cooldown/toggle_arms/arms var/datum/action/cooldown/optical_camouflage/camouflage var/datum/action/cooldown/nabber_threat/threat_mod + placeholder_description = "Giant armoured serpentids (GAS), also known as Nabbers, or snake-bugs, are a massive predatory species who are trained by a company to work with humans. Physically, although they look intimidating, they're unlikely to harm a human except in times of great stress. If you see them getting their large attack arms ready, it's telling you to back off." + placeholder_lore = "https://fluffy-frontier.ru/osobye-rasy" + + species_language_holder = /datum/language_holder/nabber + language_prefs_whitelist = list(/datum/language/nabber) /datum/species/nabber/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load) . = ..() @@ -66,9 +75,16 @@ threat_mod = new(C) threat_mod.Grant(C) - // Предохраняемся от получения проклятого квирка. Ломающего ГБС - if(C.has_quirk(/datum/quirk/oversized)) - C.remove_quirk(/datum/quirk/oversized) + var/is_dummy = istype(C, /mob/living/carbon/human/dummy) + + if(!is_dummy) + C.uncuff() + if(!C.legcuffed) + var/obj/item/restraints/legcuffs/gas_placeholder/anti_cuffs = new() + C.equip_to_slot(anti_cuffs, ITEM_SLOT_LEGCUFFED, initial = TRUE) + + var/obj/item/implant/gas_sol_speaker/imp_in = new() + imp_in.implant(C) /datum/species/nabber/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) . = ..() @@ -77,6 +93,10 @@ threat_mod.Destroy() /datum/species/nabber/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired) + // Вызываем это перед проверкой на смерть, чтобы даже у мёртвых ГБСов была заглушка + if(H.num_legs >= 2 && !H.legcuffed && !QDELETED(H)) + var/obj/item/restraints/legcuffs/gas_placeholder/anti_cuffs = new() + H.equip_to_slot(anti_cuffs, ITEM_SLOT_LEGCUFFED, initial = TRUE) . = ..() if(isdead(H)) return @@ -125,7 +145,7 @@ )) perk_descriptions += list(list( - SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "dna", SPECIES_PERK_NAME = "Robust chitin", SPECIES_PERK_DESC = "GAS possess durable chitinous exoskeletons and can withstand a lot of brute damage." @@ -169,3 +189,145 @@ /mob/living/carbon/human/species/nabber race = /datum/species/nabber + +/mob/living/carbon/human/Destroy() + if(isnabber(src) && !QDELETED(legcuffed)) + QDEL_NULL(legcuffed) + . = ..() + +// Отображение для других наличия повреждений у голосового импланта +/mob/living/carbon/human/examine(mob/user) + . = ..() + + if(isnabber(src)) + var/is_really_borked = FALSE + for(var/obj/item/implant/gas_sol_speaker/imp in implants) + var/is_borked = imp.emp_damage + if (is_borked > 0) + is_really_borked = TRUE + if(is_really_borked) + . += span_notice("[user.p_Their()] speech synthesizer emits constant silent white noise.") + "\n" + +// Не заковывается при наличии кос +/mob/living/carbon/human/canBeHandcuffed() + if(isnabber(src)) + var/obj/item/held = get_active_held_item() + var/obj/item/inactive = get_inactive_held_item() + if(istype((inactive || held), /obj/item/melee/nabber_blade)) + return FALSE + . = ..() + +// В режиме кос агро грабы не будут замедлять +/mob/living/carbon/human/add_movespeed_modifier(datum/movespeed_modifier/type_or_datum, update = TRUE) + if(isnabber(src) && type_or_datum == /datum/movespeed_modifier/grab_slowdown/aggressive) + var/datum/species/nabber/our_nabber = src.dna.species + var/datum/action/cooldown/toggle_arms/arms = our_nabber.arms + if(arms.button_icon_state == "arms_on") + return FALSE + return ..() + +// ЧС квирков +/mob/living/carbon/human/add_quirk(datum/quirk/quirktype, client/override_client) + var/bad_nabber_quirks = list( + // негативные + /datum/quirk/oversized, + /datum/quirk/prosthetic_limb, + /datum/quirk/quadruple_amputee, + /datum/quirk/item_quirk/addict/junkie, + /datum/quirk/item_quirk/addict/smoker, + /datum/quirk/item_quirk/addict/alcoholic, + /datum/quirk/all_nighter, + /datum/quirk/item_quirk/allergic, // До введения системы дыхания + /datum/quirk/badback, + /datum/quirk/bighands, + /datum/quirk/item_quirk/blindness, + /datum/quirk/blooddeficiency, + /datum/quirk/body_purist, + /datum/quirk/item_quirk/brainproblems, + /datum/quirk/item_quirk/chronic_illness, + /datum/quirk/clumsy, + /datum/quirk/item_quirk/deafness, + /datum/quirk/item_quirk/family_heirloom, + /datum/quirk/item_quirk/food_allergic, + /datum/quirk/frail, + /datum/quirk/glass_jaw, + /datum/quirk/hemiplegic, + /datum/quirk/indebted, + /datum/quirk/insanity, + /datum/quirk/light_drinker, + /datum/quirk/mute, + /datum/quirk/item_quirk/nearsighted, + /datum/quirk/nonviolent, + /datum/quirk/numb, + /datum/quirk/nyctophobia, + /datum/quirk/paraplegic, + /datum/quirk/photophobia, + /datum/quirk/prosopagnosia, + /datum/quirk/pushover, + /datum/quirk/social_anxiety, + /datum/quirk/softspoken, + /datum/quirk/tin_man, + /datum/quirk/touchy, + /datum/quirk/narcolepsy, + /datum/quirk/fragile, + /datum/quirk/alexithymia, + // Нейтральные + /datum/quirk/item_quirk/bald, + /datum/quirk/item_quirk/borg_ready, + /datum/quirk/deviant_tastes, + /datum/quirk/foreigner, + /datum/quirk/gamer, + /datum/quirk/no_taste, + /datum/quirk/item_quirk/photographer, + /datum/quirk/pineapple_hater, + /datum/quirk/pineapple_liker, + /datum/quirk/snob, + /datum/quirk/transhumanist, + /datum/quirk/vegetarian, + /datum/quirk/canine_aspect, + /datum/quirk/feline_aspect, + /datum/quirk/avian_aspect, + /datum/quirk/water_aspect, + /datum/quirk/webbing_aspect, + /datum/quirk/floral_aspect, + /datum/quirk/ash_aspect, + /datum/quirk/sparkle_aspect, + /datum/quirk/excitable, + /datum/quirk/personalspace, // Встроен + /datum/quirk/item_quirk/joker, + /datum/quirk/overweight, + /datum/quirk/echolocation, + /datum/quirk/equipping/entombed, + /datum/quirk/hydra, + /datum/quirk/possessive, + /datum/quirk/kleptomaniac, + /datum/quirk/masochism, + /datum/quirk/sadism, + /datum/quirk/ropebunny, + /datum/quirk/rigger, + /datum/quirk/telepathic, + /datum/quirk/burr, + /datum/quirk/item_quirk/underworld_connections, + /datum/quirk/unsteady, + // Позитивные + /datum/quirk/alcohol_tolerance, + /datum/quirk/bilingual, + /datum/quirk/drunkhealing, + /datum/quirk/light_step, // Встроен + /datum/quirk/item_quirk/musician, + /datum/quirk/item_quirk/settler, + /datum/quirk/item_quirk/signer, + /datum/quirk/item_quirk/pet_owner, + /datum/quirk/skittish, + /datum/quirk/spacer_born, + /datum/quirk/item_quirk/spiritual, + /datum/quirk/hard_soles, // Встроен + /datum/quirk/linguist, + /datum/quirk/sharpclaws, + /datum/quirk/water_breathing, + /datum/quirk/no_appendix, // Нет аппендикса + /datum/quirk/shapeshifter, + ) + if(isnabber(src) && (quirktype in bad_nabber_quirks)) + return FALSE + . = ..() diff --git a/tff_modular/modules/nabbers/code/abilites/agrograb.dm b/tff_modular/modules/nabbers/code/abilites/agrograb.dm new file mode 100644 index 00000000000..8f043043e17 --- /dev/null +++ b/tff_modular/modules/nabbers/code/abilites/agrograb.dm @@ -0,0 +1,25 @@ +#define MARTIALART_NABBER "scythes grab" + +/datum/martial_art/nabber_grab + name = "scythes grab" + id = MARTIALART_NABBER + +/datum/martial_art/nabber_grab/grab_act(mob/living/attacker, mob/living/defender) + if(attacker == defender) + return MARTIAL_ATTACK_INVALID + + var/old_grab_state = attacker.grab_state + defender.grabbedby(attacker, TRUE) + if(old_grab_state == GRAB_PASSIVE) + defender.drop_all_held_items() + attacker.setGrabState(GRAB_AGGRESSIVE) //Instant aggressive grab if on grab intent + log_combat(attacker, defender, "grabbed", addition="aggressively") + defender.visible_message( + span_warning("[attacker] grabs [defender] in his scythes!"), + span_userdanger("You're grabbed in scythes by [attacker]!"), + span_hear("You hear sounds of aggressive fondling!"), + COMBAT_MESSAGE_RANGE, + attacker, + ) + to_chat(attacker, span_danger("You grab [defender] in your scythes!")) + return MARTIAL_ATTACK_SUCCESS diff --git a/tff_modular/modules/nabbers/code/abilites/nabber_combat_effect.dm b/tff_modular/modules/nabbers/code/abilites/nabber_combat_effect.dm index 8b64d239d3d..92f116940f6 100644 --- a/tff_modular/modules/nabbers/code/abilites/nabber_combat_effect.dm +++ b/tff_modular/modules/nabbers/code/abilites/nabber_combat_effect.dm @@ -51,7 +51,7 @@ /datum/movespeed_modifier/nabber_combat blacklisted_movetypes = FLYING - multiplicative_slowdown = -0.25 + multiplicative_slowdown = -0.40 #undef NABBER_THREAT_ICON #undef NABBER_THREAT_ICON_STATE diff --git a/tff_modular/modules/nabbers/code/abilites/nabber_welding_eyes.dm b/tff_modular/modules/nabbers/code/abilites/nabber_welding_eyes.dm index 1f6253a79e1..60a8dd241d3 100644 --- a/tff_modular/modules/nabbers/code/abilites/nabber_welding_eyes.dm +++ b/tff_modular/modules/nabbers/code/abilites/nabber_welding_eyes.dm @@ -2,7 +2,7 @@ name = "Toggle welding shield" desc = "Toggle your eyes welding shield" - var/obj/item/organ/internal/eyes/robotic/nabber/eyes + var/obj/item/organ/internal/eyes/nabber/eyes /datum/action/toggle_welding/Trigger(trigger_flags) . = ..() diff --git a/tff_modular/modules/nabbers/code/abilites/toggle_arms.dm b/tff_modular/modules/nabbers/code/abilites/toggle_arms.dm index f83866ad337..9d28e0bf5b1 100644 --- a/tff_modular/modules/nabbers/code/abilites/toggle_arms.dm +++ b/tff_modular/modules/nabbers/code/abilites/toggle_arms.dm @@ -1,3 +1,5 @@ +var/datum/martial_art/martial_to_learn = new /datum/martial_art/nabber_grab() + /obj/item/melee/nabber_blade name = "Mantis arm" desc = "A grotesque matn made out of bone and flesh that cleaves through people as a hot knife through butter." @@ -46,12 +48,18 @@ desc = "Pump blood from manipulating arms into mantis arms, becoming a menace in close combat but loosing ability to interact." cooldown_time = 5 SECONDS + var/obj/item/restraints/handcuffs/stored_handcuffs = null //Переменная для сохранения наручников + button_icon = 'tff_modular/modules/nabbers/icons/actions.dmi' /datum/action/cooldown/toggle_arms/New(Target, original) . = ..() button_icon_state = "arms_off" +/datum/action/cooldown/toggle_arms/Destroy() + stored_handcuffs = null + . = ..() + /datum/action/cooldown/toggle_arms/Activate(atom/target) var/mob/living/carbon/human/nabber = owner @@ -59,8 +67,9 @@ return FALSE if(isdead(nabber) || nabber.incapacitated) - nabber.balloon_alert(nabber, "Incapacitated!") - return FALSE + if(!nabber.handcuffed) + nabber.balloon_alert(nabber, "Incapacitated!") + return FALSE if(nabber.num_hands < 2) nabber.balloon_alert(nabber, "Need both hands!") @@ -89,11 +98,19 @@ nabber.visible_message(span_warning("[nabber] starts to pump blood into their mantis arms!"), span_warning("You start pumping blood into your mantis arms and emmitting defensive screech! Stay still!"), span_hear("You hear ramping up screech!")) playsound(nabber, 'tff_modular/modules/nabbers/sounds/nabberscream.ogg', 70) - if(!do_after(nabber, 5 SECONDS, nabber)) + if(!do_after(nabber, 2 SECONDS, nabber, IGNORE_USER_LOC_CHANGE)) StartCooldown() - nabber.balloon_alert(nabber, "Stand still!") return FALSE + //"Сохраняет" наручники надетые на ГБСа в ЕГО ТЕЛО и позволяет пользоваться косами + открепляет его от стула и подобного + if(nabber.handcuffed) + stored_handcuffs = nabber.handcuffed + nabber.handcuffed.forceMove(nabber) + nabber.set_handcuffed(null) + if(nabber.buckled?.buckle_requires_restraints) + nabber.buckled.unbuckle_mob(nabber) + nabber.update_handcuffed() + nabber.balloon_alert(nabber, "Arms rised!") nabber.visible_message(span_warning("[nabber] raised their mantis arms ready for combat!"), span_warning("You raise your mantis arms, ready for combat."), span_hear("You hear terrible a screech!")) playsound(nabber, 'tff_modular/modules/nabbers/sounds/nabberscream.ogg', 70) @@ -107,8 +124,9 @@ nabber.put_in_active_hand(active_hand) nabber.put_in_inactive_hand(inactive_hand) + martial_to_learn.teach(nabber) - RegisterSignal(owner, COMSIG_CARBON_REMOVE_LIMB, PROC_REF(on_lose_hand)) + RegisterSignal(owner, COMSIG_CARBON_POST_REMOVE_LIMB, PROC_REF(on_lose_hand)) button_icon_state = "arms_on" nabber.update_action_buttons() @@ -117,7 +135,10 @@ nabber.visible_message(span_notice("[nabber] starts to pump blood out their mantis arms!"), span_notice("You start pumping blood out your mantis arms. Stay still!"), span_hear("You hear ramping up screech!")) - if(force) + if(force) //Типикал бьонд код + if(stored_handcuffs) + stored_handcuffs.forceMove(stored_handcuffs.drop_location()) + stored_handcuffs = null nabber.Stun(5 SECONDS) for(var/obj/item/held in nabber.held_items) if(istype(held, /obj/item/melee/nabber_blade)) @@ -128,8 +149,7 @@ nabber.balloon_alert(nabber, "Starting pumping blood out!") - if(!do_after(nabber, 5 SECONDS, nabber)) - nabber.balloon_alert(nabber, "Stand still!") + if(!do_after(nabber, 2 SECONDS, nabber, IGNORE_USER_LOC_CHANGE)) return FALSE playsound(nabber, 'tff_modular/modules/nabbers/sounds/nabberscream.ogg', 70) @@ -137,17 +157,23 @@ if(istype(held, /obj/item/melee/nabber_blade)) qdel(held) - UnregisterSignal(owner, COMSIG_CARBON_REMOVE_LIMB) + UnregisterSignal(owner, COMSIG_CARBON_POST_REMOVE_LIMB) + martial_to_learn.remove(nabber) nabber.balloon_alert(nabber, "Arms down!") button_icon_state = "arms_off" nabber.update_action_buttons() + // Надевает наручники обратно если они были до перехода в косы + if(stored_handcuffs) + nabber.equip_to_slot(stored_handcuffs, ITEM_SLOT_HANDCUFFED) + stored_handcuffs = null + /datum/action/cooldown/toggle_arms/proc/on_lose_hand() SIGNAL_HANDLER var/mob/living/carbon/human/nabber = owner - if(!(nabber.num_hands < 2)) - return FALSE + if(nabber.num_hands >= 2) + return FALSE nabber.visible_message(span_notice("[nabber] starts to pump blood out their mantis arms!"), span_notice("You start pumping blood out your mantis arms. Stay still!"), span_hear("You hear ramping up screech!")) playsound(nabber, 'tff_modular/modules/nabbers/sounds/nabberscream.ogg', 70) @@ -157,5 +183,12 @@ if(istype(held, /obj/item/melee/nabber_blade)) qdel(held) + martial_to_learn.remove(nabber) button_icon_state = "arms_off" nabber.update_action_buttons() + + if(stored_handcuffs) + stored_handcuffs.forceMove(stored_handcuffs.drop_location()) + stored_handcuffs = null + + UnregisterSignal(owner, COMSIG_CARBON_POST_REMOVE_LIMB) diff --git a/tff_modular/modules/nabbers/code/nabber_bodyparts.dm b/tff_modular/modules/nabbers/code/nabber_bodyparts.dm index 04587b7ae9b..65c059e9f10 100644 --- a/tff_modular/modules/nabbers/code/nabber_bodyparts.dm +++ b/tff_modular/modules/nabbers/code/nabber_bodyparts.dm @@ -30,6 +30,12 @@ feature_key = OFFSET_FACEMASK, offset_y = list("north" = 7, "south" = 7, "east" = 7, "west" = 7), ) + worn_glasses_offset = new( + attached_part = src, + feature_key = OFFSET_GLASSES, + offset_y = list("north" = 10, "south" = 10, "east" = 10, "west" = 10), + offset_x = list("north" = 1, "south" = 1, "east" = 1, "west" = -1) + ) return ..() diff --git a/tff_modular/modules/nabbers/code/nabber_bolaimmunity.dm b/tff_modular/modules/nabbers/code/nabber_bolaimmunity.dm new file mode 100644 index 00000000000..ec6f41597b8 --- /dev/null +++ b/tff_modular/modules/nabbers/code/nabber_bolaimmunity.dm @@ -0,0 +1,57 @@ +/// Special type of legcuffs that do not affect movement or doesnt show up, but block other legcuffs +/obj/item/restraints/legcuffs/gas_placeholder + name = "serpentid thick tail" + desc = "You should not see this." + gender = PLURAL + icon_state = NONE + inhand_icon_state = "nabber_r_leg" + lefthand_file = 'tff_modular/modules/nabbers/icons/bodyparts/nabber_parts_greyscale.dmi' + righthand_file = 'tff_modular/modules/nabbers/icons/bodyparts/nabber_parts_greyscale.dmi' + w_class = WEIGHT_CLASS_TINY + slowdown = 0 + item_flags = DROPDEL | ABSTRACT + +/obj/item/restraints/legcuffs/gas_placeholder/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) + +/obj/item/restraints/legcuffs/gas_placeholder/update_icon_state() + icon_state = NONE + return ..() + +/mob/living/carbon/human/cuff_resist(obj/item/cuffs, breakouttime = 1 MINUTES, cuff_break = 0) + if(isnabber(src)) + if(istype(cuffs, /obj/item/restraints/legcuffs/gas_placeholder)) + return FALSE + return ..() + +/mob/living/carbon/human/doUnEquip(obj/item/unequip_item, force, newloc, no_move, invdrop, silent) + if(isnabber(src)) + if(istype(unequip_item, /obj/item/restraints/legcuffs/gas_placeholder)) + return FALSE + return ..() + +/// У ГБСов этот слот всегда должен быть занять заглушкой, которую нельзя снять +/mob/living/carbon/human/update_worn_legcuffs(update_obscured = TRUE) + if(isnabber(src)) + return FALSE + else + return ..() + +/datum/species/nabber/can_equip(obj/item/I, slot, disable_warning, mob/living/carbon/human/H, bypass_equip_delay_self, ignore_equipped, indirect_action) + if(slot == ITEM_SLOT_LEGCUFFED) + return FALSE + . = ..() + +// Это ужас +/obj/item/restraints/legcuffs/gas_placeholder/canStrip(mob/stripper, mob/owner) + INVOKE_ASYNC(src, PROC_REF(touch_ze_bug), stripper, owner) + return ..() + +/obj/item/restraints/legcuffs/gas_placeholder/proc/touch_ze_bug(mob/stripper, mob/owner) + owner.visible_message( + span_purple("[stripper] лапает хвост ГБСа. Кажется зря."), + span_purple("[stripper] лапает мой хвост! Кажется зря."), + blind_message = span_hear("You hear lewd bug noises."), + ) + playsound(get_turf(owner), 'modular_nova/modules/modular_items/lewd_items/sounds/vax2.ogg', 50, TRUE) diff --git a/tff_modular/modules/nabbers/code/nabber_huds.dm b/tff_modular/modules/nabbers/code/nabber_huds.dm new file mode 100644 index 00000000000..af7e5a9bd2c --- /dev/null +++ b/tff_modular/modules/nabbers/code/nabber_huds.dm @@ -0,0 +1,90 @@ +#define NABBER_HUD_Y_SHIFT 12 + +/mob/living/carbon/human/species/nabber/med_hud_set_status() + . = ..() + var/image/holder = hud_list?[STATUS_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/species/nabber/med_hud_set_health() + . = ..() + var/image/holder = hud_list?[HEALTH_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/species/nabber/sec_hud_set_ID() + . = ..() + var/image/holder = hud_list[ID_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + var/image/permit_holder = hud_list[PERMIT_HUD] + if (isnull(permit_holder)) + return + permit_holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/species/nabber/sec_hud_set_security_status() + . = ..() + var/image/holder = hud_list[WANTED_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/species/nabber/sec_hud_set_implants() + . = ..() + var/image/holder + for(var/i in (list(IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD) & hud_list)) + holder = hud_list[i] + if(isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/med_hud_set_status() + . = ..() + if(isnabber(src)) + var/image/holder = hud_list?[STATUS_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/med_hud_set_health() + . = ..() + if(isnabber(src)) + var/image/holder = hud_list?[HEALTH_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/sec_hud_set_ID() + . = ..() + if(isnabber(src)) + var/image/holder = hud_list[ID_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + var/image/permit_holder = hud_list[PERMIT_HUD] + if (isnull(permit_holder)) + return + permit_holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/sec_hud_set_security_status() + . = ..() + if(isnabber(src)) + var/image/holder = hud_list[WANTED_HUD] + if (isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +/mob/living/carbon/human/sec_hud_set_implants() + . = ..() + if(isnabber(src)) + var/image/holder + for(var/i in (list(IMPSEC_FIRST_HUD, IMPLOYAL_HUD, IMPSEC_SECOND_HUD) & hud_list)) + holder = hud_list[i] + if(isnull(holder)) + return + holder.pixel_y += NABBER_HUD_Y_SHIFT + +#undef NABBER_HUD_Y_SHIFT diff --git a/tff_modular/modules/nabbers/code/nabber_language.dm b/tff_modular/modules/nabbers/code/nabber_language.dm new file mode 100644 index 00000000000..4f1dc00564c --- /dev/null +++ b/tff_modular/modules/nabbers/code/nabber_language.dm @@ -0,0 +1,122 @@ +/datum/language/nabber + name = "Giant Armored Serpentid" + desc = "A complex language that contains various sounds and movements, spoken only by Serpentids." + key = "N" + syllables = null + special_characters = null + default_priority = 70 + + flags = NO_STUTTER | TONGUELESS_SPEECH + always_use_default_namelist = TRUE + icon_state = "animal" + secret = TRUE + +/datum/language/nabber/scramble(input) + + var/scrambled_text = "[pick("ритмично", "коротко", "быстро", "громко", "мелодично", "монотонно", "резко", "характерно")] \ + [pick("жужжит", "щёлкает", "верещит", "стрекочет")] \ + [pick("пару раз" , "несколько раз", "три раза")]." + + add_to_cache(input, scrambled_text) + + return scrambled_text + +/datum/language_holder/nabber + understood_languages = list( + /datum/language/common = list(LANGUAGE_MIND), + /datum/language/nabber = list(LANGUAGE_MIND), + ) + spoken_languages = list( + /datum/language/common = list(LANGUAGE_ATOM), + /datum/language/nabber = list(LANGUAGE_SPECIES), + ) + selected_language = /datum/language/common + +/obj/item/implant/gas_sol_speaker + name = "sol speech synthesizer implant" + actions_types = null + // Implant gets damaged evevy emp_act(). If 0 - its fine. 1 - it stops working. Any more damage will give burn damage + // TODO: add more stages + var/emp_damage = 0 + +/obj/item/implant/gas_sol_speaker/get_data() + return "Implant Specifications:
\ + Name: Sol Government Giant Armored Serpentid Speech Synthesizer Beta v0.3
\ + Life: Activates upon speech attempt.
\ + Important Notes: Does not work on other species.
\ +
\ + Implant Details:
\ + Function: Contains a small electonic speech syntesizer, similar to the borg ones and AI-processing unit, which detects GASs attempt to speak and, \ + if enabled, will translate its neuron signals into comprehensible human language.
\ + Changelog: No longer causes infinite scream loop once GAS is angered.
\ + Known bugs: EMP tends to damage the implant power source. Will isolate it later.
" + +/obj/item/implant/gas_sol_speaker/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE) + . = ..() + if(isnabber(target) && !QDELING(target)) + var/mob/living/carbon/human/species/nabber/our_gas = target + our_gas.grant_language(/datum/language/common, language_flags = SPOKEN_LANGUAGE, source = LANGUAGE_ATOM) + +/obj/item/implant/gas_sol_speaker/removed(mob/target, silent = FALSE, special = FALSE) + . = ..() + if(isnabber(target) && !QDELING(target)) + var/mob/living/carbon/human/species/nabber/our_gas = target + our_gas.remove_language(/datum/language/common, language_flags = SPOKEN_LANGUAGE) + if(our_gas.has_status_effect(/datum/status_effect/speech/stutter/nabber)) + our_gas.remove_status_effect(/datum/status_effect/speech/stutter/nabber) + +/obj/item/implant/gas_sol_speaker/emp_act(severity) + . = ..() + switch(emp_damage) + if(0) + emp_damage += 1 + if(imp_in && isnabber(imp_in)) + var/mob/living/carbon/human/species/nabber/our_gas = imp_in + our_gas.apply_status_effect(/datum/status_effect/speech/stutter/nabber, -1) + to_chat(imp_in, span_hear("You hear something inside of you zap silently.")) + if (1) + emp_damage += 1 + if(imp_in && isnabber(imp_in)) + var/mob/living/carbon/human/species/nabber/our_gas = imp_in + our_gas.remove_language(/datum/language/common, language_flags = SPOKEN_LANGUAGE) + if(our_gas.has_status_effect(/datum/status_effect/speech/stutter/nabber)) + our_gas.remove_status_effect(/datum/status_effect/speech/stutter/nabber) + to_chat(imp_in, span_hear("You hear something inside of you zap silently.")) + if (2) + if (imp_in) + imp_in.apply_damage(5, BURN) + to_chat(imp_in, span_warning("You feel something burning inside you!")) + +/// Special type of stutter, only affecting non nabber languages +/datum/status_effect/speech/stutter/nabber + id = "gas_stutter" + alert_type = null + duration = -1 + +/datum/status_effect/speech/stutter/nabber/handle_message(datum/source, list/message_args) + if(isnabber(owner) && ispath(owner.get_selected_language(), /datum/language/nabber)) + stutter_prob = 0 + else + stutter_prob = 80 + return ..() + +/obj/item/implanter/gas_sol_speaker + name = "implanter (GAS Sol speaker)" + imp_type = /obj/item/implant/gas_sol_speaker + +/obj/item/implantcase/gas_sol_speaker + name = "implant case - 'GAS Sol speaker'" + desc = "A glass case containing a sol speaker, designed for GAS." + imp_type = /obj/item/implant/gas_sol_speaker + +/datum/design/implant_gassolspeaker + name = "GAS Sol speaker Implant Case" + desc = "Makes GAS able to speak normally." + id = "implant_gasspeech" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/glass =SMALL_MATERIAL_AMOUNT*5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5) + build_path = /obj/item/implantcase/gas_sol_speaker + category = list( + RND_CATEGORY_CYBERNETICS + RND_SUBCATEGORY_CYBERNETICS_IMPLANTS_HEALTH + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE diff --git a/tff_modular/modules/nabbers/code/nabber_organs.dm b/tff_modular/modules/nabbers/code/nabber_organs.dm index 7bb98527030..083f1c56439 100644 --- a/tff_modular/modules/nabbers/code/nabber_organs.dm +++ b/tff_modular/modules/nabbers/code/nabber_organs.dm @@ -13,6 +13,14 @@ liked_foodtypes = RAW | GORE | GRAIN disliked_foodtypes = CLOTH | FRIED | TOXIC toxic_foodtypes = DAIRY + var/static/list/languages_possible_gas = typecacheof(list( + /datum/language/common, + /datum/language/nabber, + )) + +/obj/item/organ/internal/tongue/nabber/get_possible_languages() + RETURN_TYPE(/list) + return languages_possible_gas /obj/item/organ/internal/ears/nabber name = "nabber ears" @@ -30,13 +38,6 @@ icon_state = "brain" /obj/item/organ/internal/eyes/nabber - name = "nabber eyes" - desc = "Small orange orbs." - icon = ORGGAN_ICON_NABBER - icon_state = "eyes" - flash_protect = FLASH_PROTECTION_SENSITIVE - -/obj/item/organ/internal/eyes/robotic/nabber name = "nabber eyes" desc = "Small orange orbs. With pair welding shield linses." icon = ORGGAN_ICON_NABBER @@ -45,7 +46,7 @@ var/datum/action/toggle_welding/shield var/active = FALSE -/obj/item/organ/internal/eyes/robotic/nabber/Insert(mob/living/carbon/eye_recipient, special, movement_flags) +/obj/item/organ/internal/eyes/nabber/Insert(mob/living/carbon/eye_recipient, special, movement_flags) . = ..() shield = new(eye_recipient) shield.button_icon = ORGGAN_ICON_NABBER @@ -53,7 +54,7 @@ shield.Grant(eye_recipient) shield.eyes = src -/obj/item/organ/internal/eyes/robotic/nabber/proc/toggle_shielding() +/obj/item/organ/internal/eyes/nabber/proc/toggle_shielding() if(!owner) return @@ -72,7 +73,7 @@ owner.update_tint() owner.balloon_alert(owner, "Welder eyelids open!") -/obj/item/organ/internal/eyes/robotic/nabber/Remove(mob/living/carbon/eye_owner, special) +/obj/item/organ/internal/eyes/nabber/Remove(mob/living/carbon/eye_owner, special) . = ..() shield.Destroy() active = FALSE diff --git a/tgstation.dme b/tgstation.dme index 3a7331b8b9b..8841314acef 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8871,8 +8871,12 @@ #include "tff_modular\modules\modular_automapper\replacer.dm" #include "tff_modular\modules\nabbers\code\_nabbers.dm" #include "tff_modular\modules\nabbers\code\nabber_bodyparts.dm" +#include "tff_modular\modules\nabbers\code\nabber_bolaimmunity.dm" #include "tff_modular\modules\nabbers\code\nabber_emotes.dm" +#include "tff_modular\modules\nabbers\code\nabber_huds.dm" +#include "tff_modular\modules\nabbers\code\nabber_language.dm" #include "tff_modular\modules\nabbers\code\nabber_organs.dm" +#include "tff_modular\modules\nabbers\code\abilites\agrograb.dm" #include "tff_modular\modules\nabbers\code\abilites\camouflage.dm" #include "tff_modular\modules\nabbers\code\abilites\nabber_combat_effect.dm" #include "tff_modular\modules\nabbers\code\abilites\nabber_threat.dm" From 82294c076a97ca435f5933dc4848168854281aa5 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Thu, 19 Dec 2024 18:46:51 +0300 Subject: [PATCH 17/23] Automatic changelog for PR #4957 [ci skip] --- html/changelogs/AutoChangeLog-pr-4957.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4957.yml diff --git a/html/changelogs/AutoChangeLog-pr-4957.yml b/html/changelogs/AutoChangeLog-pr-4957.yml new file mode 100644 index 00000000000..900b7d4e96e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4957.yml @@ -0,0 +1,17 @@ +author: "Oxotnak" +delete-after: True +changes: + - rscadd: "GAS now have basic noslip" + - rscadd: "GAS now able to grab in scythes" + - rscadd: "GAS now faster in threat form" + - rscadd: "GAS now raises scythes faster and can move at same time" + - rscadd: "GAS now able to wear scouter-huds" + - rscadd: "GAS now more resistant to tackle" + - rscadd: "GAS now have own language" + - rscadd: "GAS now have sol implant. Damages by emp. Fixable via replacing implant" + - rscadd: "GAS now immune to bolas and beartrap" + - rscadd: "GAS now can raise scythes in cuffs. Can't be cuffed with raised scythes" + - rscadd: "GAS now moves fast while grabbing in scythes" + - rscadd: "GAS now have special cookie" + - bugfix: "GAS now can't pick languages" + - qol: "GAS now have quirks blacklist" \ No newline at end of file From 2a63441a1d3dea52a91772d516bc40173774bb1e Mon Sep 17 00:00:00 2001 From: Axidy <76065506+Axidyuwu@users.noreply.github.com> Date: Thu, 19 Dec 2024 18:09:46 +0200 Subject: [PATCH 18/23] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BD=D0=B8=D0=BC?= =?UTF-8?q?=D0=B0=D0=B5=D0=BC=20=D1=83=D1=80=D0=BE=D0=BD=20=D0=A2=D0=93=20?= =?UTF-8?q?=D0=B0=D0=BD=D1=82=D0=B0=D0=B3=D0=BE=D0=B2=20(=D0=B2=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=D1=85=20=D0=B8=D0=B4=D0=B5=D0=B0?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B2=20=D0=B1=D0=B0=D0=BB=D0=B0=D0=B4=D0=B5=20?= =?UTF-8?q?=D0=BE=20=D0=BA=D1=80=D1=8B=D1=81=D0=BE=D0=BF=D1=83=D1=88=D0=BA?= =?UTF-8?q?=D0=B0=D1=85)=20(#5159)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * sir buffs a lot * funny descriptions * 30 to 85 --- code/modules/antagonists/heretic/items/heretic_blades.dm | 4 ++-- code/modules/antagonists/heretic/knowledge/lock_lore.dm | 2 +- code/modules/antagonists/heretic/magic/blood_cleave.dm | 2 +- code/modules/antagonists/heretic/magic/blood_siphon.dm | 4 ++-- code/modules/antagonists/heretic/magic/furious_steel.dm | 2 +- code/modules/antagonists/heretic/magic/mind_gate.dm | 2 +- code/modules/antagonists/heretic/magic/void_phase.dm | 2 +- code/modules/antagonists/heretic/magic/void_pull.dm | 2 +- .../antagonists/heretic/status_effects/mark_effects.dm | 2 +- code/modules/antagonists/nightmare/nightmare_equipment.dm | 2 +- code/modules/antagonists/voidwalker/voidwalker_void_eater.dm | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 6e0d3d7d186..be8b59a23e7 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -13,7 +13,7 @@ slot_flags = ITEM_SLOT_BELT sharpness = SHARP_EDGED w_class = WEIGHT_CLASS_NORMAL - force = 20 + force = 28 // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 20 throwforce = 10 wound_bonus = 5 bare_wound_bonus = 15 @@ -219,7 +219,7 @@ name = "\improper cursed blade" desc = "A dark blade, cursed to bleed forever. In constant struggle between the eldritch and the dark, it is forced to accept any wielder as its master. \ Its eye's cornea drips blood endlessly into the ground, yet its piercing gaze remains on you." - force = 25 + force = 32 // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 25 throwforce = 15 block_chance = 35 wound_bonus = 25 diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 28e02112fd7..a618a0fcba1 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -146,7 +146,7 @@ wound_type = /datum/wound/slash/flesh/critical research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' research_tree_icon_state = "blade_upgrade_lock" - var/chance = 35 + var/chance = 55 // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 35 /datum/heretic_knowledge/blade_upgrade/flesh/lock/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(prob(chance)) diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index d5317f23e34..431a08fa7b2 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -47,7 +47,7 @@ var/obj/item/bodypart/bodypart = pick(victim.bodyparts) var/datum/wound/slash/flesh/crit_wound = new wound_type() crit_wound.apply_wound(bodypart) - victim.apply_damage(20, BURN, wound_bonus = CANT_WOUND) + victim.apply_damage(30, BURN, wound_bonus = CANT_WOUND) // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 20 new /obj/effect/temp_visual/cleave(get_turf(victim)) diff --git a/code/modules/antagonists/heretic/magic/blood_siphon.dm b/code/modules/antagonists/heretic/magic/blood_siphon.dm index 1801b6d9dbc..98f9a10130c 100644 --- a/code/modules/antagonists/heretic/magic/blood_siphon.dm +++ b/code/modules/antagonists/heretic/magic/blood_siphon.dm @@ -40,8 +40,8 @@ ) var/mob/living/living_owner = owner - cast_on.adjustBruteLoss(20) - living_owner.adjustBruteLoss(-20) + cast_on.adjustBruteLoss(25) // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 20 + living_owner.adjustBruteLoss(-25) // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 20 if(!cast_on.blood_volume || !living_owner.blood_volume) return TRUE diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index 9414ca9d711..d71659b5af4 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -101,7 +101,7 @@ icon = 'icons/effects/eldritch.dmi' icon_state = "dio_knife" speed = 2 - damage = 25 + damage = 35 // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 25 armour_penetration = 100 sharpness = SHARP_EDGED wound_bonus = 15 diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm index 7963c4d6c02..7c95a4878c5 100644 --- a/code/modules/antagonists/heretic/magic/mind_gate.dm +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -32,7 +32,7 @@ return FALSE cast_on.adjust_confusion(10 SECONDS) - cast_on.adjustOxyLoss(30) + cast_on.adjustOxyLoss(40) // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 30 cast_on.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/body), "Mind gate, cast by [owner]") cast_on.cause_hallucination(/datum/hallucination/delusion/preset/heretic/gate, "Caused by mindgate") cast_on.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30) diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index 473fa057cf5..17188ba86ac 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -56,7 +56,7 @@ continue if(living_mob.can_block_magic(antimagic_flags)) continue - living_mob.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) + living_mob.apply_damage(60, BRUTE, wound_bonus = CANT_WOUND) // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 40 living_mob.apply_status_effect(/datum/status_effect/void_chill, 1) /obj/effect/temp_visual/voidin diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index 4e73ff6f49b..5473990f51c 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -31,7 +31,7 @@ // Before we cast the actual effects, deal AOE damage to anyone adjacent to us for(var/mob/living/nearby_living as anything in get_things_to_cast_on(cast_on, damage_radius)) - nearby_living.apply_damage(30, BRUTE, wound_bonus = CANT_WOUND) + nearby_living.apply_damage(40, BRUTE, wound_bonus = CANT_WOUND) // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 30 nearby_living.apply_status_effect(/datum/status_effect/void_chill, 1) /datum/action/cooldown/spell/aoe/void_pull/get_things_to_cast_on(atom/center, radius_override = 1) diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index de895d33caa..c4ef6e4ee49 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -79,7 +79,7 @@ /datum/status_effect/eldritch/ash/on_effect() if(iscarbon(owner)) var/mob/living/carbon/carbon_owner = owner - carbon_owner.adjustStaminaLoss(6 * repetitions) // first one = 30 stam + carbon_owner.adjustStaminaLoss(17 * repetitions) // first one = 85 stam; FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 6 carbon_owner.adjustFireLoss(3 * repetitions) // first one = 15 burn for(var/mob/living/carbon/victim in shuffle(range(1, carbon_owner))) if(IS_HERETIC(victim) || victim == carbon_owner) diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm index 52a687f9ac7..d22595c0808 100644 --- a/code/modules/antagonists/nightmare/nightmare_equipment.dm +++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/weapons/changeling_items.dmi' icon_state = "arm_blade" inhand_icon_state = "arm_blade" - force = 25 + force = 30 // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 25 armour_penetration = 35 lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' diff --git a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm index 9bf5b3c2664..7bc369f8993 100644 --- a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm +++ b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/weapons/voidwalker_items.dmi' icon_state = "tentacle" inhand_icon_state = "tentacle" - force = 25 + force = 35 // FLUFFY FRONTIER EDIT: ANTAG BUFF #5159; original: 25 armour_penetration = 35 lefthand_file = 'icons/mob/inhands/antag/voidwalker_lefthand.dmi' righthand_file = 'icons/mob/inhands/antag/voidwalker_righthand.dmi' From 7a456b6104aab72ac895c8383d1037d7928c3a19 Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:10:12 +0300 Subject: [PATCH 19/23] Automatic changelog for PR #5159 [ci skip] --- html/changelogs/AutoChangeLog-pr-5159.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5159.yml diff --git a/html/changelogs/AutoChangeLog-pr-5159.yml b/html/changelogs/AutoChangeLog-pr-5159.yml new file mode 100644 index 00000000000..dd718c2744d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5159.yml @@ -0,0 +1,4 @@ +author: "Axidyuwu" +delete-after: True +changes: + - balance: "Damage buffs for herethic, void walker and nightmare items or spells" \ No newline at end of file From e3d6e73b51493806ecffb1b5400950f6f5481e0f Mon Sep 17 00:00:00 2001 From: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> Date: Thu, 19 Dec 2024 20:37:54 +0300 Subject: [PATCH 20/23] =?UTF-8?q?=D0=90=D0=BF=D0=B3=D1=80=D0=B5=D0=B9?= =?UTF-8?q?=D0=B4=20=D0=B8=D0=B2=D0=B5=D0=BD=D1=82=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20(#4973)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * base * todos * forgeted * is_eventmaker fix * client in client method * another fix with eventmaker check * refactor * hehe * dme * Apply suggestions from code review * add verbs to eventers --------- Co-authored-by: Iajret Co-authored-by: Iajret <8430839+Iajret@users.noreply.github.com> --- SQL/optimisations_2017-02-19.sql | 2 +- SQL/tgstation_schema.sql | 2 +- SQL/tgstation_schema_prefixed.sql | 2 +- code/__DEFINES/speech_channels.dm | 1 + .../_globalvars/lists/hidden_verbs.dm | 15 +++++ .../~ff_defines/_globalvars/logging.dm | 1 + code/__DEFINES/~ff_defines/span.dm | 1 + code/__HELPERS/hearted.dm | 2 +- code/controllers/subsystem/admin_verbs.dm | 1 - code/controllers/subsystem/stickyban.dm | 2 +- code/datums/brain_damage/imaginary_friend.dm | 7 +- code/modules/admin/admin.dm | 11 +++- code/modules/admin/known_alts.dm | 4 +- code/modules/admin/sql_ban_system.dm | 8 +-- code/modules/admin/sql_message_system.dm | 65 ++++++++++++++----- code/modules/admin/stickyban.dm | 18 ++--- code/modules/admin/topic.dm | 7 ++ code/modules/admin/verbs/admingame.dm | 39 +++++------ code/modules/admin/verbs/adminsay.dm | 9 ++- code/modules/admin/verbs/maprotation.dm | 2 +- code/modules/admin/verbs/secrets.dm | 4 ++ code/modules/admin/verbs/server.dm | 6 +- code/modules/admin/view_variables/topic.dm | 2 +- code/modules/client/client_procs.dm | 28 ++++---- .../modules/mob/dead/observer/observer_say.dm | 7 +- code/modules/mob/living/living_say.dm | 7 +- code/modules/tgui_input/say_modal/modal.dm | 2 +- code/modules/tgui_input/say_modal/speech.dm | 5 ++ config/nova/config_nova.txt | 1 + config/nova/eventmakers.txt | 0 .../logging/categories/log_category_game.dm | 5 ++ .../code/subsystem/player_ranks.dm | 1 - tff_modular/modules/eventers/eventmaker.dm | 34 ++++++++++ .../modules/eventers/eventmaker_verbs.dm | 13 ++++ .../modules/eventers/random_stuff_ban.dm | 14 ++++ tgstation.dme | 6 ++ tgui/packages/tgui-panel/chat/constants.ts | 9 +++ .../tgui-panel/styles/tgchat/chat-dark.scss | 8 +++ .../tgui-panel/styles/tgchat/chat-light.scss | 8 +++ tgui/packages/tgui-say/ChannelIterator.ts | 8 ++- tgui/packages/tgui-say/constants/index.tsx | 1 + tgui/packages/tgui-say/styles/colors.scss | 2 + tgui/packages/tgui/interfaces/Secrets.jsx | 32 ++++----- 43 files changed, 302 insertions(+), 100 deletions(-) create mode 100644 code/__DEFINES/~ff_defines/_globalvars/lists/hidden_verbs.dm create mode 100644 code/__DEFINES/~ff_defines/_globalvars/logging.dm create mode 100644 code/__DEFINES/~ff_defines/span.dm create mode 100644 config/nova/eventmakers.txt create mode 100644 tff_modular/modules/eventers/eventmaker.dm create mode 100644 tff_modular/modules/eventers/eventmaker_verbs.dm create mode 100644 tff_modular/modules/eventers/random_stuff_ban.dm diff --git a/SQL/optimisations_2017-02-19.sql b/SQL/optimisations_2017-02-19.sql index 1bb19cc6677..a98386186f2 100644 --- a/SQL/optimisations_2017-02-19.sql +++ b/SQL/optimisations_2017-02-19.sql @@ -124,7 +124,7 @@ ALTER TABLE `library` , CHANGE COLUMN `deleted` `deleted` TINYINT(1) UNSIGNED NULL DEFAULT NULL; ALTER TABLE `messages` - CHANGE COLUMN `type` `type` ENUM('memo', 'message', 'message sent', 'note', 'watchlist entry') NOT NULL + CHANGE COLUMN `type` `type` ENUM('memo', 'message', 'message sent', 'note', 'watchlist entry', 'eventmaker note') NOT NULL , CHANGE COLUMN `text` `text` VARCHAR(2048) NOT NULL , CHANGE COLUMN `secret` `secret` TINYINT(1) UNSIGNED NOT NULL; diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index 01d04af965f..877ce168b11 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -307,7 +307,7 @@ DROP TABLE IF EXISTS `messages`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `messages` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL, + `type` enum('memo','message','message sent','note','watchlist entry', 'eventmaker note') NOT NULL, `targetckey` varchar(32) NOT NULL, `adminckey` varchar(32) NOT NULL, `text` varchar(2048) NOT NULL, diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index 99a4191172c..7c918b144db 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -305,7 +305,7 @@ DROP TABLE IF EXISTS `SS13_messages`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `SS13_messages` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `type` enum('memo','message','message sent','note','watchlist entry') NOT NULL, + `type` enum('memo','message','message sent','note','watchlist entry', 'eventmaker note') NOT NULL, `targetckey` varchar(32) NOT NULL, `adminckey` varchar(32) NOT NULL, `text` varchar(2048) NOT NULL, diff --git a/code/__DEFINES/speech_channels.dm b/code/__DEFINES/speech_channels.dm index 9f1526ebd56..4e628dad0d5 100644 --- a/code/__DEFINES/speech_channels.dm +++ b/code/__DEFINES/speech_channels.dm @@ -4,3 +4,4 @@ #define ME_CHANNEL "Me" #define OOC_CHANNEL "OOC" #define ADMIN_CHANNEL "Admin" +#define EVENT_CHANNEL "Event" // TFF ADDITION - Eventmaker diff --git a/code/__DEFINES/~ff_defines/_globalvars/lists/hidden_verbs.dm b/code/__DEFINES/~ff_defines/_globalvars/lists/hidden_verbs.dm new file mode 100644 index 00000000000..9e4b6fa181d --- /dev/null +++ b/code/__DEFINES/~ff_defines/_globalvars/lists/hidden_verbs.dm @@ -0,0 +1,15 @@ +GLOBAL_LIST_INIT(eventmakers_blacklist_verbs, list( + //Admin + "Add PB Bypass" = TRUE, "ASay" = TRUE, "Cross-server Help Request" = TRUE, + "Get Current Logs" = TRUE, "Get Server Logs" = TRUE, "Known Alts Panel" = TRUE, + "loudAsay" = TRUE, "Paintings manager" = TRUE, "Player Playtime" = TRUE, "Player Ticket History" = TRUE, + "Reload Admins" = TRUE, "Revoke PB Bypass" = TRUE, "Trophy Manager" = TRUE, "View Round Logs" = TRUE, + "Load Away Mission" = TRUE, "Mass Zombie Cure" = TRUE, "Mass Zombie Infection" = TRUE, + "Polymorph All" = TRUE, "Title Screen: Change" = TRUE, "Title Screen: Set HTML" = TRUE, "Title Screen: Set Notice" = TRUE, + "Show Lag Switches" = TRUE, + //Server + "Reestablish DB Connection" = TRUE, "Reset Player OOC Color" = TRUE, "Set Player OOC Color" = TRUE, + "Toggle Antag OOC" = TRUE, "Toggle CDN" = TRUE, "Toggle OOC" = TRUE, "Toggle Security OOC" = TRUE, + //Debug + "Debug Stat Panel" = TRUE, "Migrate Player Ranks" = TRUE, "Open LUA Editor" = TRUE, "Re-establish Connection To TTS" = TRUE, "Reload Configuration" = TRUE, "Run Empty Query" = TRUE, "View Runtime" = TRUE +)) diff --git a/code/__DEFINES/~ff_defines/_globalvars/logging.dm b/code/__DEFINES/~ff_defines/_globalvars/logging.dm new file mode 100644 index 00000000000..3dddcc20c13 --- /dev/null +++ b/code/__DEFINES/~ff_defines/_globalvars/logging.dm @@ -0,0 +1 @@ +#define LOG_CATEGORY_GAME_EVENTMAKER "game-eventmaker" diff --git a/code/__DEFINES/~ff_defines/span.dm b/code/__DEFINES/~ff_defines/span.dm new file mode 100644 index 00000000000..170453b8d49 --- /dev/null +++ b/code/__DEFINES/~ff_defines/span.dm @@ -0,0 +1 @@ +#define span_eventmaker(str) ("" + str + "") diff --git a/code/__HELPERS/hearted.dm b/code/__HELPERS/hearted.dm index d8f7832cbc0..5594a0f63f8 100644 --- a/code/__HELPERS/hearted.dm +++ b/code/__HELPERS/hearted.dm @@ -33,7 +33,7 @@ continue hearted_mob.client.adjust_heart() message += "[hearted_ckey][i == hearts.len ? "" : ", "]" - message_admins(message.Join()) + message_admins(message.Join(), TRUE) /// Ask someone if they'd like to award a commendation for the round, 3 tries to get the name they want before we give up /mob/proc/query_heart(attempt=1) diff --git a/code/controllers/subsystem/admin_verbs.dm b/code/controllers/subsystem/admin_verbs.dm index 9496b95d998..f977c17dd6e 100644 --- a/code/controllers/subsystem/admin_verbs.dm +++ b/code/controllers/subsystem/admin_verbs.dm @@ -109,7 +109,6 @@ SUBSYSTEM_DEF(admin_verbs) if(!admin.holder.check_for_rights(verb_singleton.permissions)) to_chat(admin, span_adminnotice("You lack the permissions to do this.")) return - var/old_usr = usr usr = admin.mob // THE MACRO ENSURES THIS EXISTS. IF IT EVER DOESNT EXIST SOMEONE DIDNT USE THE DAMN MACRO! diff --git a/code/controllers/subsystem/stickyban.dm b/code/controllers/subsystem/stickyban.dm index 757df6a2266..aecf0ca7c13 100644 --- a/code/controllers/subsystem/stickyban.dm +++ b/code/controllers/subsystem/stickyban.dm @@ -46,7 +46,7 @@ SUBSYSTEM_DEF(stickyban) //get_stickyban_from_ckey returned null, aka something broke. Notify admins about it if (!ban) - message_admins("Failed to apply stickyban for [bannedkey]. Check the DB for corrupt stickyban entries.") + message_admins("Failed to apply stickyban for [bannedkey]. Check the DB for corrupt stickyban entries.", TRUE) log_admin_private ("Failed to apply stickyban for [bannedkey]. Check the DB for corrupt stickyban entries.") continue diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index 6945648a734..750362f5880 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -227,7 +227,12 @@ message = capitalize(message) if(message_mods[RADIO_EXTENSION] == MODE_ADMIN) - SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, message) + // TFF ADDITION START - Eventmaker + if(client.is_eventmaker()) + SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_eventmaker_say, message) + else + // TFF ADDITION END + SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, message) return if(message_mods[RADIO_EXTENSION] == MODE_DEADMIN) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 5f40de037f4..963e85f1450 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1,7 +1,14 @@ //////////////////////////////// -/proc/message_admins(msg) +/proc/message_admins(msg, not_to_eventmaker) // TFF EDIT. ORIGINAL /proc/message_admins(msg) msg = "ADMIN LOG: [msg]" - to_chat(GLOB.admins, +// TFF CHANGE START - EVENTMAKERS + var/list/addressee = GLOB.admins.Copy() + if(not_to_eventmaker) + for(var/client/admin in GLOB.admins) + if(admin.is_eventmaker()) + addressee -= admin +// TFF CHANGE END + to_chat(addressee, // TFF EDIT. ORIGINAL GLOB.admins, type = MESSAGE_TYPE_ADMINLOG, html = msg, confidential = TRUE) diff --git a/code/modules/admin/known_alts.dm b/code/modules/admin/known_alts.dm index 4105c7f4edc..268e72f727b 100644 --- a/code/modules/admin/known_alts.dm +++ b/code/modules/admin/known_alts.dm @@ -65,7 +65,7 @@ GLOBAL_DATUM_INIT(known_alts, /datum/known_alts, new) if (query_add_known_alt.warn_execute()) var/message = "[key_name(usr)] has added a new known alt connection between [ckey1] and [ckey2]." - message_admins(message) + message_admins(message, TRUE) log_admin_private(message) cached_known_alts = null @@ -115,7 +115,7 @@ GLOBAL_DATUM_INIT(known_alts, /datum/known_alts, new) if (query_delete_known_alt.warn_execute()) var/message = "[key_name(usr)] has deleted the known alt connection between [result[1]] and [result[2]]." - message_admins(message) + message_admins(message, TRUE) log_admin_private(message) cached_known_alts = null diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm index 270907cb1ab..ef446f7c817 100644 --- a/code/modules/admin/sql_ban_system.dm +++ b/code/modules/admin/sql_ban_system.dm @@ -685,7 +685,7 @@ var/target = ban_target_string(player_key, player_ip, player_cid) var/msg = "has created a [global_ban ? "global" : "local"] [isnull(duration) ? "permanent" : "temporary [time_message]"] [applies_to_admins ? "admin " : ""][is_server_ban ? "server ban" : "role ban from [roles_to_ban.len] roles"] for [target]." // NOVA EDIT CHANGE - MULTISERVER log_admin_private("[kn] [msg][is_server_ban ? "" : " Roles: [roles_to_ban.Join(", ")]"] Reason: [reason]") - message_admins("[kna] [msg][is_server_ban ? "" : " Roles: [roles_to_ban.Join("\n")]"]\nReason: [reason]") + message_admins("[kna] [msg][is_server_ban ? "" : " Roles: [roles_to_ban.Join("\n")]"]\nReason: [reason]", TRUE) if(applies_to_admins) send2adminchat("BAN ALERT","[kn] [msg]") if(player_ckey) @@ -885,7 +885,7 @@ return qdel(query_unban) log_admin_private("[kn] has unbanned [target] from [role].") - message_admins("[kna] has unbanned [target] from [role].") + message_admins("[kna] has unbanned [target] from [role].", TRUE) var/client/C = GLOB.directory[player_key] if(C) build_ban_cache(C) @@ -930,7 +930,7 @@ return qdel(query_reban) log_admin_private("[kn] has rebanned [target] from [role].") - message_admins("[kna] has rebanned [target] from [role].") + message_admins("[kna] has rebanned [target] from [role].", TRUE) var/banned_player_message = span_boldannounce("[usr.client.key] has re-activated a removed ban from [role] for your key.") var/banned_other_message = span_boldannounce("[usr.client.key] has re-activated a removed ban from [role] for your IP or CID.") @@ -1041,7 +1041,7 @@ var/kn = key_name(usr) var/kna = key_name_admin(usr) log_admin_private("[kn] has edited the [changes_keys_text] of a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"].") //if a ban doesn't have a key it must have an ip and/or a cid to have reached this point normally - message_admins("[kna] has edited the [changes_keys_text] of a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"].") + message_admins("[kna] has edited the [changes_keys_text] of a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"].", TRUE) if(changes["Applies to admins"]) send2adminchat("BAN ALERT","[kn] has edited a ban for [old_key ? "[old_key]" : "[old_ip]-[old_cid]"] to [applies_to_admins ? "" : "not"]affect admins") diff --git a/code/modules/admin/sql_message_system.dm b/code/modules/admin/sql_message_system.dm index c44853646e3..52bebfd72d7 100644 --- a/code/modules/admin/sql_message_system.dm +++ b/code/modules/admin/sql_message_system.dm @@ -5,7 +5,7 @@ if(!type) return var/target_ckey = ckey(target_key) - if(!target_key && (type == "note" || type == "message" || type == "watchlist entry")) + if(!target_key && (type == "note" || type == "message" || type == "watchlist entry" || type == "eventmaker note")) // TFF EDIT - Eventmaker var/new_key = input(usr,"Who would you like to create a [type] for?","Enter a key or ckey",null) as null|text if(!new_key) return @@ -102,7 +102,7 @@ qdel(query_create_message) if(logged) log_admin_private(pm) - message_admins("[header]:
[text]") + message_admins("[header]:
[text]", TRUE) admin_ticket_log(target_ckey, "[header]
[text]") if(browse) browse_messages("[type]") @@ -146,7 +146,7 @@ var/m1 = "[user_key_name] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_key]: [text]" var/m2 = "[user_name_admin] has deleted a [type][(type == "note" || type == "message" || type == "watchlist entry") ? " for" : " made by"] [target_key]:
[text]" log_admin_private(m1) - message_admins(m2) + message_admins(m2, TRUE) if(browse) browse_messages("[type]") else @@ -195,7 +195,7 @@ return qdel(query_edit_message) log_admin_private("[kn] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from [old_text] to [new_text]") - message_admins("[kna] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from
[old_text]
to
[new_text]") + message_admins("[kna] has edited a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from
[old_text]
to
[new_text]", TRUE) if(browse) browse_messages("[type]") else @@ -266,7 +266,7 @@ return qdel(query_edit_message_expiry) log_admin_private("[kn] has edited the expiration time of a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from [(old_expiry ? old_expiry : "no expiration date")] to [new_expiry]") - message_admins("[kna] has edited the expiration time of a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from [(old_expiry ? old_expiry : "no expiration date")] to [new_expiry]") + message_admins("[kna] has edited the expiration time of a [type] [(type == "note" || type == "message" || type == "watchlist entry") ? " for [target_key]" : ""] made by [admin_key] from [(old_expiry ? old_expiry : "no expiration date")] to [new_expiry]", TRUE) if(browse) browse_messages("[type]") else @@ -320,7 +320,7 @@ return qdel(query_edit_note_severity) log_admin_private("[kn] has edited the severity of a [type] for [target_key] made by [admin_key] from [old_severity] to [new_severity]") - message_admins("[kna] has edited the severity time of a [type] for [target_key] made by [admin_key] from [old_severity] to [new_severity]") + message_admins("[kna] has edited the severity time of a [type] for [target_key] made by [admin_key] from [old_severity] to [new_severity]", TRUE) browse_messages(target_ckey = ckey(target_key), agegate = TRUE) qdel(query_find_edit_note_severity) @@ -364,7 +364,7 @@ return qdel(query_message_secret) log_admin_private("[kn] has toggled [target_key]'s [type] made by [admin_key] to [secret ? "not secret" : "secret"]") - message_admins("[kna] has toggled [target_key]'s [type] made by [admin_key] to [secret ? "not secret" : "secret"]") + message_admins("[kna] has toggled [target_key]'s [type] made by [admin_key] to [secret ? "not secret" : "secret"]", TRUE) browse_messages(target_ckey = ckey(target_key), agegate = TRUE) qdel(query_find_message_secret) @@ -381,7 +381,8 @@ var/list/navbar = list("All#") for(var/letter in GLOB.alphabet) navbar += "[letter]" - navbar += "MemosWatchlist" + if(!usr?.client.is_eventmaker()) // TFF ADDITION - Eventmaker + navbar += "MemosWatchlist" navbar += "
\ \ [HrefTokenFormField()]\ @@ -438,6 +439,10 @@ var/playtime = query_get_type_messages.item[11] var/round_id = query_get_type_messages.item[12] // NOVA EDIT CHANGE END - MULTISERVER output += "" + // TFF ADDITION START - Eventmaker + if(type != "eventmaker note" && usr?.client.is_eventmaker()) + continue + // TFF ADDITION END if(type == "watchlist entry") output += "[t_key] | " output += "[timestamp] | [server] | Round [round_id] | [admin_key]" @@ -482,6 +487,10 @@ var/list/messagedata = list() var/list/watchdata = list() var/list/notedata = list() + // TFF ADDITION START - Eventmaker + var/list/rating = 5 // Изначальный рейтинг пользователя, далее его.. понижают нотесы с тяжестью. + var/list/eventnotedata = list() // Храним в себе нотесы ивентеров + // TFF ADDITION END var/skipped = 0 while(query_get_messages.NextRow()) if(QDELETED(usr)) @@ -519,6 +528,15 @@ alphatext = "filter: alpha(opacity=[alpha]); opacity: [alpha/100];" var/list/data = list("

") if(severity) + // TFF ADDITION START - Eventmaker + switch(severity) + if("high") + rating -= 0.4 + if("medium") + rating -= 0.2 + if("minor") + rating -= 0.1 + // TFF ADDITION END data += " " data += "[timestamp] | [server] | Round [round_id] | [admin_key][secret ? " | - Secret" : ""] | [get_exp_format(text2num(playtime))] Living Playtime" if(expire_timestamp) @@ -553,6 +571,10 @@ watchdata += data if("note") notedata += data + // TFF ADDITION START - Eventmaker + if("eventmaker note") + eventnotedata += data + // TFF ADDITION END qdel(query_get_messages) if(!target_key) var/datum/db_query/query_get_message_key = SSdbcore.NewQuery({" @@ -565,21 +587,24 @@ target_key = query_get_message_key.item[1] qdel(query_get_message_key) output += "

[target_key]

" + output += "

Player Rating: [rating > -1 ? rating : 0]

" // TFF ADDITION - Eventmaker if(!linkless) - output += "Add note" - output += " Add message" - output += " Add to watchlist" + if(!usr?.client.is_eventmaker()) // TFF ADDITION - Eventmaker + output += "Add note" + output += " Add message" + output += " Add to watchlist" + output += " Add event note" // TFF ADDITION - Eventmaker output += " Refresh page
" else output += " Refresh page" output += ruler - if(messagedata) + if(messagedata && !usr?.client.is_eventmaker())// TFF ADDITION - Eventmaker output += "

Messages

" output += messagedata - if(watchdata) + if(watchdata && !usr?.client.is_eventmaker())// TFF ADDITION - Eventmaker output += "

Watchlist

" output += watchdata - if(notedata) + if(notedata && !usr?.client.is_eventmaker())// TFF ADDITION - Eventmaker output += "

Notes

" output += notedata if(!linkless) @@ -590,9 +615,15 @@ output += "
Show All
" else output += "
Hide Old
" + // TFF ADDITION START - Eventmaker + if(eventnotedata) + output += "

Event Notes

" + output += eventnotedata + // TFF ADDITION END if(index) var/search - output += "
Add messageAdd watchlist entryAdd note
" + if(!usr?.client.is_eventmaker()) // TFF ADDITION - Eventmaker + output += "
Add messageAdd watchlist entryAdd note
" output += ruler switch(index) if(1) @@ -624,7 +655,7 @@ index_key = index_ckey output += "[index_key]
" qdel(query_list_messages) - else if(!type && !target_ckey && !index) + else if(!type && !target_ckey && !index && !usr?.client.is_eventmaker()) // TFF EDIT - Eventmaker output += "
Add messageAdd watchlist entryAdd note
" output += ruler var/datum/browser/browser = new(usr, "Note panel", "Manage player notes", 1000, 500) @@ -717,7 +748,7 @@ /proc/scream_about_watchlists(client/read_from) for(var/datum/admin_message/message in get_message_output("watchlist entry", read_from.ckey)) - message_admins("Notice: [key_name_admin(read_from.ckey)] has been on the watchlist since [message.timestamp] and has just connected - Reason: [message.text]") + message_admins("Notice: [key_name_admin(read_from.ckey)] has been on the watchlist since [message.timestamp] and has just connected - Reason: [message.text]", TRUE) send2tgs_adminless_only("Watchlist", "[key_name(read_from.ckey)] is on the watchlist and has just connected - Reason: [message.text]") #define NOTESFILE "data/player_notes.sav" diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index fede9724ab1..af6a477e2af 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -50,7 +50,7 @@ SSstickyban.cache[ckey] = ban log_admin_private("[key_name(usr)] has stickybanned [ckey].\nReason: [ban["message"]]") - message_admins(span_adminnotice("[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]")) + message_admins(span_adminnotice("[key_name_admin(usr)] has stickybanned [ckey].\nReason: [ban["message"]]"), TRUE) if ("remove") if (!data["ckey"]) @@ -79,7 +79,7 @@ log_admin_private("[key_name(usr)] removed [ckey]'s stickyban") - message_admins(span_adminnotice("[key_name_admin(usr)] removed [ckey]'s stickyban")) + message_admins(span_adminnotice("[key_name_admin(usr)] removed [ckey]'s stickyban"), TRUE) if ("remove_alt") if (!data["ckey"]) @@ -127,7 +127,7 @@ qdel(query_remove_stickyban_alt) log_admin_private("[key_name(usr)] has disassociated [alt] from [ckey]'s sticky ban") - message_admins(span_adminnotice("[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban")) + message_admins(span_adminnotice("[key_name_admin(usr)] has disassociated [alt] from [ckey]'s sticky ban"), TRUE) if ("edit") if (!data["ckey"]) @@ -161,7 +161,7 @@ qdel(query_edit_stickyban) log_admin_private("[key_name(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]") - message_admins(span_adminnotice("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]")) + message_admins(span_adminnotice("[key_name_admin(usr)] has edited [ckey]'s sticky ban reason from [oldreason] to [reason]"), TRUE) if ("exempt") if (!data["ckey"]) @@ -211,7 +211,7 @@ qdel(query_exempt_stickyban_alt) log_admin_private("[key_name(usr)] has exempted [alt] from [ckey]'s sticky ban") - message_admins(span_adminnotice("[key_name_admin(usr)] has exempted [alt] from [ckey]'s sticky ban")) + message_admins(span_adminnotice("[key_name_admin(usr)] has exempted [alt] from [ckey]'s sticky ban"), TRUE) if ("unexempt") if (!data["ckey"]) @@ -261,7 +261,7 @@ qdel(query_unexempt_stickyban_alt) log_admin_private("[key_name(usr)] has unexempted [alt] from [ckey]'s sticky ban") - message_admins(span_adminnotice("[key_name_admin(usr)] has unexempted [alt] from [ckey]'s sticky ban")) + message_admins(span_adminnotice("[key_name_admin(usr)] has unexempted [alt] from [ckey]'s sticky ban"), TRUE) if ("timeout") if (!data["ckey"]) @@ -288,7 +288,7 @@ cachedban["timeout"] = TRUE log_admin_private("[key_name(usr)] has put [ckey]'s sticky ban on timeout.") - message_admins(span_adminnotice("[key_name_admin(usr)] has put [ckey]'s sticky ban on timeout.")) + message_admins(span_adminnotice("[key_name_admin(usr)] has put [ckey]'s sticky ban on timeout."), TRUE) if ("untimeout") if (!data["ckey"]) @@ -316,7 +316,7 @@ world.SetConfig("ban",ckey,list2stickyban(ban)) log_admin_private("[key_name(usr)] has taken [ckey]'s sticky ban off of timeout.") - message_admins(span_adminnotice("[key_name_admin(usr)] has taken [ckey]'s sticky ban off of timeout.")) + message_admins(span_adminnotice("[key_name_admin(usr)] has taken [ckey]'s sticky ban off of timeout."), TRUE) if ("revert") @@ -335,7 +335,7 @@ world.SetConfig("ban",ckey,null) log_admin_private("[key_name(usr)] has reverted [ckey]'s sticky ban to its state at round start.") - message_admins(span_adminnotice("[key_name_admin(usr)] has reverted [ckey]'s sticky ban to its state at round start.")) + message_admins(span_adminnotice("[key_name_admin(usr)] has reverted [ckey]'s sticky ban to its state at round start."), TRUE) //revert is mostly used when shit goes rouge, so we have to set it to null // and wait a byond tick before assigning it to ensure byond clears its shit. sleep(world.tick_lag) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 4cca6441d9c..fa8e9fead62 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -282,6 +282,13 @@ return var/target_key = href_list["addwatch"] create_message("watchlist entry", target_key, secret = 1) + // TFF ADDITION START - Eventmaker + else if(href_list["addeventnote"]) + if(!check_rights(R_ADMIN)) + return + var/target_key = href_list["addeventnote"] + create_message("eventmaker note", target_key, secret = 1) + // TFF ADDITION END else if(href_list["addmemo"]) if(!check_rights(R_ADMIN)) diff --git a/code/modules/admin/verbs/admingame.dm b/code/modules/admin/verbs/admingame.dm index 76d814e8ee0..97957ec1adc 100644 --- a/code/modules/admin/verbs/admingame.dm +++ b/code/modules/admin/verbs/admingame.dm @@ -24,7 +24,7 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo if(player.ckey) body += "
\[Find Updated Panel\]" - if(player.client) + if(player.client && !user.is_eventmaker()) // TFF EDIT - Eventmaker body += "
\[First Seen: [player.client.player_join_date]\]\[Byond account registered on: [player.client.account_join_date]\]" // NOVA EDIT ADDITION START - Player Ranks var/list/player_ranks = list() @@ -84,30 +84,31 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo else body += "None?!" body += "

" - - body += "Kick | " - if(player.client) - body += "Ban | " - else - body += "Ban | " + if(!user.is_eventmaker()) // TFF ADDITION - Eventmaker + body += "Kick | " + if(player.client) + body += "Ban | " + else + body += "Ban | " body += "Notes | Messages | Watchlist | " if(player.client) body += "| Prison | " body += "\ Send back to Lobby | " var/muted = player.client.prefs.muted - body += "
Mute: " - body += "\[IC | " - body += "OOC | " - body += "PRAY | " - body += "ADMINHELP | " - //Nova Edit Addition Begin - LOOC muting again. - body += "DEADCHAT | " - body += "LOOC\]" - //Nova Edit Addition End - LOOC muting again. - body += "WEBREQ | " - body += "DEADCHAT\]" - body += "(toggle all)" + if(!user.is_eventmaker()) // TFF ADDITION - Eventmaker + body += "
Mute: " + body += "\[IC | " + body += "OOC | " + body += "PRAY | " + body += "ADMINHELP | " + //Nova Edit Addition Begin - LOOC muting again. + body += "DEADCHAT | " + body += "LOOC\]" + //Nova Edit Addition End - LOOC muting again. + body += "WEBREQ | " + body += "DEADCHAT\]" + body += "(toggle all)" body += "

" body += "Jump to | " diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index b988104dd23..60a6fd0f6bc 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -1,6 +1,6 @@ ADMIN_VERB(cmd_admin_say, R_NONE, "ASay", "Send a message to other admins", ADMIN_CATEGORY_MAIN, message as text) message = emoji_parse(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) - if(!message) + if(!message || user.is_eventmaker()) // TFF EDIT - Eventmaker return if(findtext(message, "@") || findtext(message, "#")) @@ -22,7 +22,12 @@ ADMIN_VERB(cmd_admin_say, R_NONE, "ASay", "Send a message to other admins", ADMI var/asay_color = user.prefs.read_preference(/datum/preference/color/asay_color) var/custom_asay_color = (CONFIG_GET(flag/allow_admin_asaycolor) && asay_color) ? "" : "" message = "[span_adminsay("[span_prefix("ADMIN:")] [key_name_admin(user)] [ADMIN_FLW(user.mob)]: [custom_asay_color][message]")][custom_asay_color ? "":null]" - to_chat(GLOB.admins, + var/addressee = GLOB.admins.Copy() + for(var/client/admin in addressee) + if(admin.is_eventmaker()) + addressee -= admin + + to_chat(addressee, type = MESSAGE_TYPE_ADMINCHAT, html = message, confidential = TRUE) diff --git a/code/modules/admin/verbs/maprotation.dm b/code/modules/admin/verbs/maprotation.dm index 38d7535758f..e251c034176 100644 --- a/code/modules/admin/verbs/maprotation.dm +++ b/code/modules/admin/verbs/maprotation.dm @@ -1,4 +1,4 @@ -ADMIN_VERB(admin_change_map, R_SERVER, "Change Map", "Set the next map.", ADMIN_CATEGORY_SERVER) +ADMIN_VERB(admin_change_map, R_DEBUG, "Change Map", "Set the next map.", ADMIN_CATEGORY_SERVER) // TFF EDIT. ORIGINAL - ADMIN_VERB(admin_change_map, R_SERVER, "Change Map", "Set the next map.", ADMIN_CATEGORY_SERVER) var/list/maprotatechoices = list() for (var/map in config.maplist) var/datum/map_config/virtual_map = config.maplist[map] diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm index 368f6f4d6f4..c9779652fd1 100644 --- a/code/modules/admin/verbs/secrets.dm +++ b/code/modules/admin/verbs/secrets.dm @@ -9,6 +9,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w var/client/holder //client of whoever is using this datum var/is_debugger = FALSE var/is_funmin = FALSE + var/is_eventmaker_admin = FALSE // TFF EDIT - Eventmaker /datum/secrets_menu/New(user)//user can either be a client or a mob due to byondcode(tm) if (istype(user, /client)) @@ -20,6 +21,8 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w is_debugger = check_rights(R_DEBUG) is_funmin = check_rights(R_FUN) + is_eventmaker_admin = holder.is_eventmaker() // TFF EDIT - Eventmaker + world.log << is_eventmaker_admin // TFF EDIT - Eventmaker /datum/secrets_menu/ui_state(mob/user) return GLOB.admin_state @@ -37,6 +40,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w var/list/data = list() data["is_debugger"] = is_debugger data["is_funmin"] = is_funmin + data["is_eventmaker"] = is_eventmaker_admin // TFF EDIT - Eventmaker return data #define THUNDERDOME_TEMPLATE_FILE "admin_thunderdome.dmm" diff --git a/code/modules/admin/verbs/server.dm b/code/modules/admin/verbs/server.dm index b5891686119..04cdffd5dea 100644 --- a/code/modules/admin/verbs/server.dm +++ b/code/modules/admin/verbs/server.dm @@ -66,7 +66,7 @@ ADMIN_VERB(restart, R_SERVER, "Reboot World", "Restarts the world immediately.", #undef HARDEST_RESTART #undef TGS_RESTART -ADMIN_VERB(end_round, R_SERVER, "End Round", "Forcibly ends the round and allows the server to restart normally.", ADMIN_CATEGORY_SERVER) +ADMIN_VERB(end_round, R_DEBUG, "End Round", "Forcibly ends the round and allows the server to restart normally.", ADMIN_CATEGORY_SERVER) // TFF CHANGE. OROGINAL - ADMIN_VERB(end_round, R_DEBUG, "End Round", "Forcibly ends the round and allows the server to restart normally.", ADMIN_CATEGORY_SERVER) var/confirm = tgui_alert(user, "End the round and restart the game world?", "End Round", list("Yes", "Cancel")) if(confirm != "Yes") return @@ -88,7 +88,7 @@ ADMIN_VERB(toggle_ooc_dead, R_ADMIN, "Toggle Dead OOC", "Toggle the OOC channel ADMIN_VERB(toggle_vote_dead, R_ADMIN, "Toggle Dead Vote", "Toggle the vote for dead players on or off.", ADMIN_CATEGORY_SERVER) SSvote.toggle_dead_voting(user) -ADMIN_VERB(start_now, R_SERVER, "Start Now", "Start the round RIGHT NOW.", ADMIN_CATEGORY_SERVER) +ADMIN_VERB(start_now, R_DEBUG, "Start Now", "Start the round RIGHT NOW.", ADMIN_CATEGORY_SERVER) // TFF CHANGE. ORGINAL - ADMIN_VERB(start_now, R_SERVER, "Start Now", "Start the round RIGHT NOW.", ADMIN_CATEGORY_SERVER) var/static/list/waiting_states = list(GAME_STATE_PREGAME, GAME_STATE_STARTUP) if(!(SSticker.current_state in waiting_states)) to_chat(user, span_warning(span_red("The game has already started!"))) @@ -192,7 +192,7 @@ ADMIN_VERB(toggle_respawn, R_SERVER, "Toggle Respawn", "Toggle the ability to re world.update_status() SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggle Respawn", "[new_state_text]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! -ADMIN_VERB(delay, R_SERVER, "Delay Pre-Game", "Delay the game start.", ADMIN_CATEGORY_SERVER) +ADMIN_VERB(delay, R_DEBUG, "Delay Pre-Game", "Delay the game start.", ADMIN_CATEGORY_SERVER) // TFF CHANGE. ORIGINAL - ADMIN_VERB(delay, R_SERVER, "Delay Pre-Game", "Delay the game start.", ADMIN_CATEGORY_SERVER) var/newtime = input(user, "Set a new time in seconds. Set -1 for indefinite delay.", "Set Delay", round(SSticker.GetTimeLeft()/10)) as num|null if(!newtime) return diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 4fde1e30d1a..443e08d05d8 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -1,7 +1,7 @@ //DO NOT ADD MORE TO THIS FILE. //Use vv_do_topic() for datums! /client/proc/view_var_Topic(href, href_list, hsrc) - if( (usr.client != src) || !src.holder || !holder.CheckAdminHref(href, href_list)) + if( (usr.client != src) || !src.holder || (!holder.CheckAdminHref(href, href_list) && !is_eventmaker())) // TFF EDIT - Eventmaker return var/target = GET_VV_TARGET vv_do_basic(target, href_list, href) diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 08e98bb2af3..af30bbd2771 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -65,7 +65,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( topiclimiter[ADMINSWARNED_AT] = minute msg += " Administrators have been informed." log_game("[key_name(src)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute") - message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute") + message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute topic limit of [mtl] topic calls in a given game minute", TRUE) to_chat(src, span_danger("[msg]")) return @@ -324,10 +324,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if(matches) if(C) - message_admins(span_danger("[message_type]: Connecting player [key_name_admin(src)] has the same [matches] as [key_name_admin(C)][in_round].")) + message_admins(span_danger("[message_type]: Connecting player [key_name_admin(src)] has the same [matches] as [key_name_admin(C)][in_round]."), TRUE) log_admin_private("[message_type]: Connecting player [key_name(src)] has the same [matches] as [key_name(C)][in_round].") else - message_admins(span_danger("[message_type]: Connecting player [key_name_admin(src)] has the same [matches] as [joined_player_ckey](no longer logged in)[in_round]. ")) + message_admins(span_danger("[message_type]: Connecting player [key_name_admin(src)] has the same [matches] as [joined_player_ckey](no longer logged in)[in_round]. "), TRUE) log_admin_private("[message_type]: Connecting player [key_name(src)] has the same [matches] as [joined_player_ckey](no longer logged in)[in_round].") var/reconnecting = FALSE if(GLOB.player_details[ckey]) @@ -422,7 +422,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/dupe_login_message = "Your ComputerID has already logged in with another key this round, please log out of this one NOW or risk being banned!" if (alert_admin_multikey) dupe_login_message += "\nAdmins have been informed." - message_admins(span_danger("MULTIKEYING: [key_name_admin(src)] has a matching CID+IP with another player and is clearly multikeying. They have been warned to leave the server or risk getting banned.")) + message_admins(span_danger("MULTIKEYING: [key_name_admin(src)] has a matching CID+IP with another player and is clearly multikeying. They have been warned to leave the server or risk getting banned."), TRUE) log_admin_private("MULTIKEYING: [key_name(src)] has a matching CID+IP with another player and is clearly multikeying. They have been warned to leave the server or risk getting banned.") spawn(0.5 SECONDS) //needs to run during world init, do not convert to add timer alert(mob, dupe_login_message) //players get banned if they don't see this message, do not convert to tgui_alert (or even tg_alert) please. @@ -507,7 +507,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( if (isnum(cached_player_age) && cached_player_age == -1) //first connection if (nnpa >= 0) log_admin_private("New login: [key_name(key, FALSE, TRUE)] (IP: [address], ID: [computer_id]) logged onto the servers for the first time.") - message_admins("New user: [key_name_admin(src)] is connecting here for the first time.") + message_admins("New user: [key_name_admin(src)] is connecting here for the first time.", TRUE) if (CONFIG_GET(flag/irc_first_connection_alert)) var/new_player_alert_role = CONFIG_GET(string/new_player_alert_role_id) send2tgs_adminless_only( @@ -515,11 +515,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "[key_name(src)] is connecting for the first time![new_player_alert_role ? " <@&[new_player_alert_role]>" : ""]" ) else if (isnum(cached_player_age) && cached_player_age < nnpa) - message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age == 1?"":"s")]") + message_admins("New user: [key_name_admin(src)] just connected with an age of [cached_player_age] day[(player_age == 1?"":"s")]", TRUE) if(CONFIG_GET(flag/use_account_age_for_jobs) && account_age >= 0) player_age = account_age if(account_age >= 0 && account_age < nnpa) - message_admins("[key_name_admin(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age == 1?"":"s")] old, created on [account_join_date].") + message_admins("[key_name_admin(src)] (IP: [address], ID: [computer_id]) is a new BYOND account [account_age] day[(account_age == 1?"":"s")] old, created on [account_join_date].", TRUE) if (CONFIG_GET(flag/irc_first_connection_alert)) var/new_player_alert_role = CONFIG_GET(string/new_player_alert_role_id) send2tgs_adminless_only( @@ -703,7 +703,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( //NOVA EDIT ADDITION BEGIN - PANICBUNKER if (CONFIG_GET(flag/panic_bunker) && !holder && !GLOB.deadmins[ckey] && !(ckey in GLOB.bunker_passthrough)) log_access("Failed Login: [key] - [address] - New account attempting to connect during panic bunker") - message_admins(span_adminnotice("Failed Login: [key] - [address] - New account attempting to connect during panic bunker")) + message_admins(span_adminnotice("Failed Login: [key] - [address] - New account attempting to connect during panic bunker"), TRUE) to_chat_immediate(src, span_notice("Hi! We have temporarily enabled safety measures that prevents new players from joining currently.
Please try again later, or contact a staff on Discord if you have any questions.

To join our community, check out our Discord! To gain full access to our Discord, read the rules and post a request in the #access-requests channel under the \"Landing Zone\" category in the Discord server linked here: https://discord.gg/novasector")) var/list/connectiontopic_a = params2list(connectiontopic) var/list/panic_addr = CONFIG_GET(string/panic_server_address) @@ -901,10 +901,10 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( msg += " Administrators have been informed." if (ab) log_game("[key_name(src)] is using the middle click aimbot exploit") - message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit
") + message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit", TRUE) add_system_note("aimbot", "Is using the middle click aimbot exploit") log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") - message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") + message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute", TRUE) to_chat(src, span_danger("[msg]")) return @@ -1044,7 +1044,13 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( movement_keys[key] = SOUTH if(ADMIN_CHANNEL) if(holder) - var/asay = tgui_say_create_open_command(ADMIN_CHANNEL) + // TFF EDIT START - Eventmaker + var/asay + if(is_eventmaker()) + asay = tgui_say_create_open_command(EVENT_CHANNEL) + else + asay = tgui_say_create_open_command(ADMIN_CHANNEL) + // TFF EDIT END winset(src, "default-[REF(key)]", "parent=default;name=[key];command=[asay]") else winset(src, "default-[REF(key)]", "parent=default;name=[key];command=") diff --git a/code/modules/mob/dead/observer/observer_say.dm b/code/modules/mob/dead/observer/observer_say.dm index a8fd0094934..fcf288ec783 100644 --- a/code/modules/mob/dead/observer/observer_say.dm +++ b/code/modules/mob/dead/observer/observer_say.dm @@ -44,7 +44,12 @@ message = trim_left(copytext_char(message, length(message_mods[RADIO_KEY]) + 2)) switch(message_mods[RADIO_EXTENSION]) if(MODE_ADMIN) - SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, message) + // TFF ADDITION START - Eventmaker + if(client.is_eventmaker()) + SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_eventmaker_say, message) + else + // TFF ADDITION END + SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, message) if(MODE_DEADMIN) SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/dsay, message) if(MODE_PUPPET) diff --git a/code/modules/mob/living/living_say.dm b/code/modules/mob/living/living_say.dm index e72899d482d..290b4cd807b 100644 --- a/code/modules/mob/living/living_say.dm +++ b/code/modules/mob/living/living_say.dm @@ -130,7 +130,12 @@ GLOBAL_LIST_INIT(message_modes_stat_limits, list( return if(message_mods[RADIO_EXTENSION] == MODE_ADMIN) - SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, message) + // TFF ADDITION START - Eventmaker + if(client.is_eventmaker()) + SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_eventmaker_say, message) + else + // TFF ADDITION END + SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_admin_say, message) return if(message_mods[RADIO_EXTENSION] == MODE_DEADMIN) diff --git a/code/modules/tgui_input/say_modal/modal.dm b/code/modules/tgui_input/say_modal/modal.dm index f700a6cdbea..4401df88f77 100644 --- a/code/modules/tgui_input/say_modal/modal.dm +++ b/code/modules/tgui_input/say_modal/modal.dm @@ -86,7 +86,7 @@ if(!payload?["channel"]) CRASH("No channel provided to an open TGUI-Say") window_open = TRUE - if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != LOOC_CHANNEL) // NOVA EDIT CHANGE (Add LOOC_CHANNEL) + if(payload["channel"] != OOC_CHANNEL && payload["channel"] != ADMIN_CHANNEL && payload["channel"] != LOOC_CHANNEL && payload["channel"] != EVENT_CHANNEL) // NOVA EDIT CHANGE (Add LOOC_CHANNEL) // TFF EDIT - Eventmaker start_thinking() if(!client.typing_indicators) log_speech_indicators("[key_name(client)] started typing at [loc_name(client.mob)], indicators DISABLED.") diff --git a/code/modules/tgui_input/say_modal/speech.dm b/code/modules/tgui_input/say_modal/speech.dm index 9ed87be111a..ac1169e84ec 100644 --- a/code/modules/tgui_input/say_modal/speech.dm +++ b/code/modules/tgui_input/say_modal/speech.dm @@ -57,6 +57,11 @@ if(DO_CHANNEL) client.mob.do_verb(entry) // NOVA EDIT ADDITION END + // TFF ADDITION START - Eventmaker + if(EVENT_CHANNEL) + SSadmin_verbs.dynamic_invoke_verb(client, /datum/admin_verb/cmd_eventmaker_say, entry) + return TRUE + // TFF ADDITION END return FALSE /** diff --git a/config/nova/config_nova.txt b/config/nova/config_nova.txt index af44fea6ed8..f5522769253 100644 --- a/config/nova/config_nova.txt +++ b/config/nova/config_nova.txt @@ -152,6 +152,7 @@ SIZE_COLLAR_MINIMUM 15 DONATOR_LEGACY_SYSTEM MENTOR_LEGACY_SYSTEM VETERAN_LEGACY_SYSTEM +EVENTMAKER_LEGACY_SYSTEM ## How much time arrivals shuttle should stay at station after its engines recharged before returning to interlink. In deciseconds. 150 - 15 seconds. 0 - disables autoreturn. ARRIVALS_WAIT 150 diff --git a/config/nova/eventmakers.txt b/config/nova/eventmakers.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/modular_nova/master_files/code/modules/logging/categories/log_category_game.dm b/modular_nova/master_files/code/modules/logging/categories/log_category_game.dm index f665a603a10..f373634061f 100644 --- a/modular_nova/master_files/code/modules/logging/categories/log_category_game.dm +++ b/modular_nova/master_files/code/modules/logging/categories/log_category_game.dm @@ -2,6 +2,11 @@ category = LOG_CATEGORY_GAME_MENTOR master_category = /datum/log_category/game +//TODO: ПЕРЕНЕСТИ ОТСЮДАВОЙ +/datum/log_category/game_eventmaker + category = LOG_CATEGORY_GAME_EVENTMAKER + master_category = /datum/log_category/game + /datum/log_category/game_subtle category = LOG_CATEGORY_GAME_SUBTLE master_category = /datum/log_category/game diff --git a/modular_nova/modules/player_ranks/code/subsystem/player_ranks.dm b/modular_nova/modules/player_ranks/code/subsystem/player_ranks.dm index 6dd15874973..041e5bc0429 100644 --- a/modular_nova/modules/player_ranks/code/subsystem/player_ranks.dm +++ b/modular_nova/modules/player_ranks/code/subsystem/player_ranks.dm @@ -203,7 +203,6 @@ SUBSYSTEM_DEF(player_ranks) load_player_rank_sql(veteran_controller) - /** * Handles populating the player rank from the database. * diff --git a/tff_modular/modules/eventers/eventmaker.dm b/tff_modular/modules/eventers/eventmaker.dm new file mode 100644 index 00000000000..a985a3126f9 --- /dev/null +++ b/tff_modular/modules/eventers/eventmaker.dm @@ -0,0 +1,34 @@ +/** + * Returns whether or not the user is qualified as a eventmaker. + */ +/client/proc/is_eventmaker() + return holder?.ranks && holder.ranks[1].name == "Eventmaker" + + +/datum/controller/subsystem/admin_verbs/get_valid_verbs_for_admin(client/admin) + if(isnull(admin.holder)) + CRASH("Why are we checking a non-admin for their valid... ahem... admin verbs?") + + var/list/has_permission = list() + for(var/permission_flag in GLOB.bitflags) + if(admin.holder.check_for_rights(permission_flag)) + has_permission["[permission_flag]"] = TRUE + + var/list/valid_verbs = list() + for(var/datum/admin_verb/verb_type as anything in admin_verbs_by_type) + var/datum/admin_verb/verb_singleton = admin_verbs_by_type[verb_type] + if(!verify_visibility(admin, verb_singleton)) + continue + + if(admin.is_eventmaker() && GLOB.eventmakers_blacklist_verbs["[verb_singleton.name]"]) + continue + + var/verb_permissions = verb_singleton.permissions + if(verb_permissions == R_NONE) + valid_verbs |= list(verb_singleton) + else for(var/permission_flag in bitfield_to_list(verb_permissions)) + if(!has_permission["[permission_flag]"]) + continue + valid_verbs |= list(verb_singleton) + + return valid_verbs diff --git a/tff_modular/modules/eventers/eventmaker_verbs.dm b/tff_modular/modules/eventers/eventmaker_verbs.dm new file mode 100644 index 00000000000..ae4aaae36bc --- /dev/null +++ b/tff_modular/modules/eventers/eventmaker_verbs.dm @@ -0,0 +1,13 @@ +ADMIN_VERB(cmd_eventmaker_say, R_NONE, "ESay", "Send a message to eventmakes", ADMIN_CATEGORY_MAIN, message as text) + message = emoji_parse(copytext_char(sanitize(message), 1, MAX_MESSAGE_LEN)) + if(!message) + return + + user.mob.log_talk(message, LOG_ASAY) + message = keywords_lookup(message) + message = "[span_eventmaker("[span_prefix("EVENTCHAT:")] [key_name_admin(user)] [ADMIN_FLW(user.mob)]: [message]")]
" + to_chat(GLOB.admins, + type = MESSAGE_TYPE_ADMINCHAT, + html = message, + confidential = TRUE) + BLACKBOX_LOG_ADMIN_VERB("Esay") diff --git a/tff_modular/modules/eventers/random_stuff_ban.dm b/tff_modular/modules/eventers/random_stuff_ban.dm new file mode 100644 index 00000000000..10e61655ee6 --- /dev/null +++ b/tff_modular/modules/eventers/random_stuff_ban.dm @@ -0,0 +1,14 @@ +/client/CanProcCall(procname) + if(usr.client.is_eventmaker()) + return FALSE + . = ..() + +/client/can_vv_get(var_name) + if(usr?.client.is_eventmaker()) + return FALSE + . = ..() + +/datum/admins/can_vv_get(var_name) + if(usr?.client.is_eventmaker()) + return FALSE + . = ..() diff --git a/tgstation.dme b/tgstation.dme index 8841314acef..def8c55eca7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -400,11 +400,14 @@ #include "code\__DEFINES\~ff_defines\flavor_misc.dm" #include "code\__DEFINES\~ff_defines\nabber_clothes_pathes.dm" #include "code\__DEFINES\~ff_defines\say.dm" +#include "code\__DEFINES\~ff_defines\span.dm" #include "code\__DEFINES\~ff_defines\text.dm" #include "code\__DEFINES\~ff_defines\vv.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\global_lists.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\ishelpers.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\names.dm" +#include "code\__DEFINES\~ff_defines\_globalvars\logging.dm" +#include "code\__DEFINES\~ff_defines\_globalvars\lists\hidden_verbs.dm" #include "code\__DEFINES\~nova_defines\_organ_defines.dm" #include "code\__DEFINES\~nova_defines\access.dm" #include "code\__DEFINES\~nova_defines\actionspeed_modification.dm" @@ -8858,6 +8861,9 @@ #include "tff_modular\modules\drinks\skrelluq\reaction.dm" #include "tff_modular\modules\drinks\skrelluq\reagent.dm" #include "tff_modular\modules\drone\code\droneDispenser.dm" +#include "tff_modular\modules\eventers\eventmaker.dm" +#include "tff_modular\modules\eventers\eventmaker_verbs.dm" +#include "tff_modular\modules\eventers\random_stuff_ban.dm" #include "tff_modular\modules\extra_vv\extra_carbon_vv.dm" #include "tff_modular\modules\holidays_decor\halloween\halloween-craft.dm" #include "tff_modular\modules\holidays_decor\halloween\halloween-decor.dm" diff --git a/tgui/packages/tgui-panel/chat/constants.ts b/tgui/packages/tgui-panel/chat/constants.ts index 0e1a79bc1d6..46a3ab8ffda 100644 --- a/tgui/packages/tgui-panel/chat/constants.ts +++ b/tgui/packages/tgui-panel/chat/constants.ts @@ -38,6 +38,7 @@ export const MESSAGE_TYPE_ADMINLOG = 'adminlog'; export const MESSAGE_TYPE_ATTACKLOG = 'attacklog'; export const MESSAGE_TYPE_DEBUG = 'debug'; export const MESSAGE_TYPE_MENTOR = 'mentor'; // NOVA EDIT ADDITION +export const MESSAGE_TYPE_EVENTMAKER = 'eventmaker'; // TFF EDIT - Eventmaker // Metadata for each message type export const MESSAGE_TYPES = [ @@ -152,4 +153,12 @@ export const MESSAGE_TYPES = [ description: 'Mentor PMs and other mentor things.', selector: '.mentor, .mentornotice', }, + // TFF ADDITION START - Eventmaker + { + type: MESSAGE_TYPE_EVENTMAKER, + name: 'Eventmaker Log', + description: 'Eventmaker PMs and other eventmaker things.', + selector: '.eventmaker', + }, + // TFF ADDITION END ]; diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 09cdd23495a..710f9ba1ae9 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -1438,3 +1438,11 @@ $border-width-px: $border-width * 1px; font-style: italic; } // NOVA EDIT ADDITION END + +/* TFF ADDITION START - Eventmaker */ + +.eventmaker { + color: #009c22; +} + +// TFF EDIT ADDITION END diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 8f606cbdd6f..ec4d83762f8 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -1383,3 +1383,11 @@ $border-width-px: $border-width * 1px; } } // NOVA EDIT ADDITION END + +/* TFF ADDITION START - Eventmaker */ + +.eventmaker { + color: #006616; +} + +// TFF EDIT ADDITION END diff --git a/tgui/packages/tgui-say/ChannelIterator.ts b/tgui/packages/tgui-say/ChannelIterator.ts index 57866808609..cddac3571e1 100644 --- a/tgui/packages/tgui-say/ChannelIterator.ts +++ b/tgui/packages/tgui-say/ChannelIterator.ts @@ -8,7 +8,8 @@ export type Channel = | 'Do' // NOVA EDIT ADDITION END | 'OOC' - | 'Admin'; + | 'Admin' + | 'Event'; // TFF EDIT - Eventmaker /** * ### ChannelIterator @@ -29,9 +30,10 @@ export class ChannelIterator { // NOVA EDIT ADDITION 'OOC', 'Admin', + 'Event', // TFF EDIT - Eventmaker ]; - private readonly blacklist: Channel[] = ['Admin']; - private readonly quiet: Channel[] = ['OOC', 'LOOC', 'Admin']; // NOVA EDIT CHANGE (Add LOOC) + private readonly blacklist: Channel[] = ['Admin', 'Event']; // TFF EDIT - Eventmaker + private readonly quiet: Channel[] = ['OOC', 'LOOC', 'Admin', 'Event']; // NOVA EDIT CHANGE (Add LOOC) // TFF EDIT - Eventmaker public next(): Channel { if (this.blacklist.includes(this.channels[this.index])) { diff --git a/tgui/packages/tgui-say/constants/index.tsx b/tgui/packages/tgui-say/constants/index.tsx index 8095aa98583..c9a11592d90 100644 --- a/tgui/packages/tgui-say/constants/index.tsx +++ b/tgui/packages/tgui-say/constants/index.tsx @@ -8,6 +8,7 @@ export const CHANNELS = [ 'Do', // NOVA EDIT ADDITION - Do roleplay addition 'OOC', 'Admin', + 'Event', // TFF EDIT - Eventmaker ] as const; /** Window sizes in pixels */ diff --git a/tgui/packages/tgui-say/styles/colors.scss b/tgui/packages/tgui-say/styles/colors.scss index 337887e358f..34cfec4e11b 100644 --- a/tgui/packages/tgui-say/styles/colors.scss +++ b/tgui/packages/tgui-say/styles/colors.scss @@ -36,6 +36,8 @@ $_channel_map: ( 'Whis': hsl(238, 55%, 67%), 'Do': hsl(137, 64%, 60%), // NOVA EDIT ADDITION END + // TFF EDIT - Eventmaker + 'Event': hsl(92, 80%, 37%), ); $channel_keys: map.keys($_channel_map) !default; diff --git a/tgui/packages/tgui/interfaces/Secrets.jsx b/tgui/packages/tgui/interfaces/Secrets.jsx index 3e3ccd70cc0..09d3d93e274 100644 --- a/tgui/packages/tgui/interfaces/Secrets.jsx +++ b/tgui/packages/tgui/interfaces/Secrets.jsx @@ -632,7 +632,7 @@ const FunForYouTab = (props) => { export const Secrets = (props) => { const { act, data } = useBackend(); - const { is_debugger, is_funmin } = data; + const { is_debugger, is_funmin, is_eventmaker } = data; const [tabIndex, setTabIndex] = useState(2); const TabComponent = TAB2NAME[tabIndex - 1].component(); @@ -644,20 +644,22 @@ export const Secrets = (props) => {
-