2022-05-12 05:05:16 -07:00
using System.Linq ;
2022-03-30 22:21:58 -07:00
using System.Text ;
using Content.Server.Administration.Logs ;
using Content.Server.Administration.Managers ;
using Content.Server.Chat.Managers ;
2022-06-20 16:59:04 -04:00
using Content.Server.GameTicking ;
2023-11-05 18:19:59 -08:00
using Content.Server.Speech.Components ;
using Content.Server.Speech.EntitySystems ;
2022-06-03 21:37:35 +10:00
using Content.Server.Station.Components ;
using Content.Server.Station.Systems ;
2024-01-28 18:18:54 +07:00
using Content.Server._White.AspectsSystem.Aspects.Components ;
using Content.Server._White.Other.Speech ;
using Content.Server._White.PandaSocket.Main ;
2022-03-30 22:21:58 -07:00
using Content.Shared.ActionBlocker ;
2023-04-28 04:44:00 +06:00
using Content.Shared.Administration ;
2022-03-30 22:21:58 -07:00
using Content.Shared.CCVar ;
2024-01-31 14:01:35 +00:00
using Content.Shared.Changeling ;
2022-03-30 22:21:58 -07:00
using Content.Shared.Chat ;
using Content.Shared.Database ;
2023-08-25 18:50:46 +10:00
using Content.Shared.Ghost ;
2022-07-13 22:23:55 -07:00
using Content.Shared.IdentityManagement ;
2023-08-01 14:43:02 +00:00
using Content.Shared.Interaction ;
2023-01-13 16:57:10 -08:00
using Content.Shared.Mobs.Systems ;
2023-10-28 09:59:53 +11:00
using Content.Shared.Players ;
2022-11-23 00:52:19 +13:00
using Content.Shared.Radio ;
2024-01-28 18:37:24 +07:00
using Content.Shared._White ;
2024-08-03 15:23:46 +00:00
using Content.Shared._White.Cult.Components ;
2024-01-23 17:12:18 -05:00
using Content.Shared.Speech ;
2024-02-19 13:52:35 +09:00
using Content.Shared._White.Cult.Systems ;
2022-03-30 22:21:58 -07:00
using Robust.Server.Player ;
2022-06-03 21:37:35 +10:00
using Robust.Shared.Audio ;
2023-11-27 22:12:34 +11:00
using Robust.Shared.Audio.Systems ;
2022-03-30 22:21:58 -07:00
using Robust.Shared.Configuration ;
using Robust.Shared.Console ;
using Robust.Shared.Network ;
using Robust.Shared.Player ;
2022-06-23 20:11:03 +10:00
using Robust.Shared.Prototypes ;
2022-03-30 22:21:58 -07:00
using Robust.Shared.Random ;
2022-11-23 00:52:19 +13:00
using Robust.Shared.Replays ;
2022-03-30 22:21:58 -07:00
using Robust.Shared.Utility ;
2024-01-29 01:02:37 +07:00
using CultistComponent = Content . Shared . _White . Cult . Components . CultistComponent ;
2022-03-30 22:21:58 -07:00
2022-06-23 20:11:03 +10:00
namespace Content.Server.Chat.Systems ;
2022-03-30 22:21:58 -07:00
2023-10-14 02:02:56 -07:00
// TODO refactor whatever active warzone this class and chatmanager have become
2022-03-30 22:21:58 -07:00
/// <summary>
/// ChatSystem is responsible for in-simulation chat handling, such as whispering, speaking, emoting, etc.
/// ChatSystem depends on ChatManager to actually send the messages.
/// </summary>
2022-06-23 20:11:03 +10:00
public sealed partial class ChatSystem : SharedChatSystem
2022-03-30 22:21:58 -07:00
{
2022-11-23 00:52:19 +13:00
[Dependency] private readonly IReplayRecordingManager _replay = default ! ;
2022-03-30 22:21:58 -07:00
[Dependency] private readonly IConfigurationManager _configurationManager = default ! ;
[Dependency] private readonly IChatManager _chatManager = default ! ;
[Dependency] private readonly IChatSanitizationManager _sanitizer = default ! ;
[Dependency] private readonly IAdminManager _adminManager = default ! ;
[Dependency] private readonly IPlayerManager _playerManager = default ! ;
2022-06-23 20:11:03 +10:00
[Dependency] private readonly IPrototypeManager _prototypeManager = default ! ;
2022-03-30 22:21:58 -07:00
[Dependency] private readonly IRobustRandom _random = default ! ;
2022-05-28 23:41:17 -07:00
[Dependency] private readonly IAdminLogManager _adminLogger = default ! ;
2022-03-30 22:21:58 -07:00
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default ! ;
2022-06-03 21:37:35 +10:00
[Dependency] private readonly StationSystem _stationSystem = default ! ;
2022-07-26 09:58:19 -04:00
[Dependency] private readonly MobStateSystem _mobStateSystem = default ! ;
2023-01-25 17:29:41 +01:00
[Dependency] private readonly SharedAudioSystem _audio = default ! ;
2023-08-01 14:43:02 +00:00
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default ! ;
2023-10-21 15:43:11 -04:00
[Dependency] private readonly ReplacementAccentSystem _wordreplacement = default ! ;
2023-07-16 11:32:42 +03:00
[Dependency] private readonly INetConfigurationManager _netConfigurationManager = default ! ; // WD
2024-01-28 16:31:58 +07:00
[Dependency] private readonly GameTicker _gameTicker = default ! ; // WD
2024-02-19 13:52:35 +09:00
[Dependency] private readonly CultistWordGeneratorManager _wordGenerator = default ! ; // WD
2022-03-30 22:21:58 -07:00
2023-04-27 06:01:05 +06:00
//WD-EDIT
2024-01-09 15:54:16 +03:00
[Dependency] private readonly PandaWebManager _pandaWeb = default ! ;
2023-04-27 06:01:05 +06:00
//WD-EDIT
2024-01-28 16:31:58 +07:00
public const int VoiceRange = 10 ; // how far voice goes in world units
public const int WhisperClearRange = 2 ; // how far whisper goes while still being understandable, in world units
2023-08-01 14:43:02 +00:00
public const int WhisperMuffledRange = 5 ; // how far whisper goes at all, in world units
2022-11-15 17:09:27 +13:00
public const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg" ;
2022-03-30 22:21:58 -07:00
private bool _loocEnabled = true ;
2023-07-26 02:02:48 -04:00
private bool _deadLoocEnabled ;
private bool _critLoocEnabled ;
2022-03-30 22:21:58 -07:00
private readonly bool _adminLoocEnabled = true ;
public override void Initialize ( )
{
2023-01-25 17:29:41 +01:00
base . Initialize ( ) ;
2023-12-22 09:13:45 -05:00
CacheEmotes ( ) ;
[Upstream] Upstream (#109)
* Automatic changelog update
* atlas update (#25071)
* atlas update
* untroll
---------
Co-authored-by: deltanedas <@deltanedas:kde.org>
* box update (#25074)
* fland update (#25075)
* marathon update (#25076)
* meta update (#25077)
* Syndicate key grammar fix (#25085)
* Syndicate encryption key grammar fix
An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip?
* Syndicate key grammar fix
An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip?
* Fix hybridization seedless probability (#25084)
Fix comparison
Hybrids (different plants being crossed) are supposed to have a high
chance of becoming seedless to balance overpowered plants.
However, a logic error in the comparison gave seedless to plants when
they were from the same seed (not hybrids) rather than the other way
around.
Reported by: @genderGeometries
* Added Tourniquets to stop bleeds (#23198)
* Fixed Error with RobustToolbox Edits. Removed the addition of secbelt tag from assault belt.
* Resprite of the monstrosity
* Resprite of the tourniquet NO LONGER PHALLUS SHAPED
* too bright, now darker and edgier
* Tourniquet resprite
* metajson yay
* Update Skelly Vs The Rev lobby art (#25088)
Someone said the original was a bit low res
and I agreed.
This is a 1440p (from an 8k base image) rendition
of the same scene, with a new dramatic forced
perspective look, and generally cleaner art throughout.
Also now there's two mothroaches.
* Automatic changelog update
* Minor airlock assembly clean up (#25073)
1
* Update README.md (#25067)
* Update README.md
* emo review
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
---------
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
* prevent opening debug menus without perms (#25091)
prevent people without permissions from opening the tile, entityspawn, or decal menus
* Remove battery from crew observation kit, fix description (#25000)
-Remove battery from crew observation kit, fix description
* Laughin' Peas (#25089)
* laughter
* make clownmobs bleed laughter
* laughin syrup and laughter recipe
* add laughin peas
* Automatic changelog update
* QM drip DLC (#24477)
* New Drip for the QM
QM beret and QM formal uniform
* Asd
Asd
* Adds the new clothing to the uniform printer
what it says on the tin
* I always forget to update the copyright RAAAAAH
yup
* EMT Belt Part 2 (#24289)
* add
* fix
* aaaa
* Flipped caps real (#24961)
* Flipped caps real
* oops
* whoops
* flip not fold
* fix formatting
* cargosoft formatting
* Automatic changelog update
* Nerf Beanbags (#24653)
Lowers beanbag damage from 55 stam to 30 stam
* Automatic changelog update
* Fix screenspace popups (#24987)
* Fix screenspace popups
Never got around to it earlier but need to draw it above UI controls.
* Minor null change
* Automatic changelog update
* Fix crew manifest department bugs (#24975)
* Automatic changelog update
* Changed door remote to trigger based on vision occlusion(#25093)
Changed door remote to trigger based on vision occlusion rather than opaque collision targeting check. Ian's butt will no longer absorb your 5G signals.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* GPS In Paramed Locker (#25096)
GPS in paramed locker
* Remove 'travis scott day' from the game (#25106)
* remove travis scott from the game
* KILL TRAVIS EVEN MORE
* Automatic changelog update
* Remove erroneous changelog (#25107)
* fixed fland cargo shuttle not having tiny fans (sorry) (#25095)
* Glass box for antique laser pistol (#25104)
* glassbox
* fix
* Gibbing refactor (Per-part gibbing and giblet throwing!) (#24989)
* Moving Gibbing rework out from medrefactor into it's own PR
* Re-enabled warning for missing gibbable on TryGibEntity
* Implemented better logic for gibbing failover and better logging
* Allowing audio params and drop scattering customization per component. Created UnGibbable organ base types and made brains ungibbable.
Removed delete brain from gibBody function. Artifact crusher does not destroy brains anymore. It only destroyed brains before not other organs which was wierd.
* Update Content.Shared/Body/Systems/SharedBodySystem.Body.cs
Fixing space for multiplication
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Added event raised when attempting to gib contained entities to allow modification of allowed and excluded container ids
* removing audioParams var from component (sound specifier includes it)
* Fixing signature
---------
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Automatic changelog update
* Gibbing contents hotfix (#25114)
Fixing gibbing contents not respecting Include/Exclude container lists. This is currently unused
* Predict two-way levers (#25043)
* Predict two-way levers
Annoys me the rare occasions I touch cargo. Doesn't predict the signal but at least the lever responds immediately.
* space
* a
* Replace Romerol with Ambuzol in chemist guidebook (#25108)
replace romerol with ambuzol
* Fix borgs being able to emag themselves (#24748)
* Fix self emagging borgs
* Add popup on self emag failure.
* Ectoplasm is grindable into Necrosol (#25053)
add
* Automatic changelog update
* Automatic changelog update
* Roundstart Food Service research (#25046)
add
* Automatic changelog update
* Add option for character name colors in chat & move coloration to clientside (#24625)
* Adds option to disable character names in chat/speechbubbles
* Moved the coloring of names to clientside
* Move string functions to SharedChatSystem to avoid duplicate code in SpeechBubble.cs
* Changed to be put under Accessibility section
* Cache CVar
* Automatic changelog update
* Update Credits (#25115)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Replace fixed drink glasses with metamorphic versions (#25134)
* Replaced fixed drink glasses with metamorphic versions
* Fine, no milkshake then
* ambuzol beef (#25119)
* Automatic changelog update
* Shuttle floor resprite (#25127)
* resprites shuttle tiles
* resprites shuttle floor tiles & adds grey/black shuttle tiles
* attributions.yml update
* Adding a period to an object description (#25138)
Added a period to an object description.
Adds a period to silk's description. This is my first and last pull request.
* Door Remote Changelog Entry (#25144)
I'm so dumb.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* Lowered Ion Storm Reoccurence Delay to 20 (#25135)
* Lowered reoccurencedelay to 45
* Lowered Further down to 20
* Re-added shivs to crafting menus (#25094)
Added a recipe for crafting menu
* Automatic changelog update
* Color Tipped Ammo (#25103)
* Tipped .35 ammo
* used layers instead of new sprites
* remove the useless old sprites
* changed the green slightly
* Automatic changelog update
* Add overlay decals for mini tiles and bricks (#24949)
Add minitile and brick decals overlay
* Update Core (#24862)
* add
* Update Resources/Textures/Parallaxes/attributions.yml
* sprite change
* address review
---------
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Buyable Jani Trolley (#25139)
Trolley
* Added display for amount of hits left in stun batons/stun prods. (#25141)
Added display for amount of hits left in stun batons/stunprods.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* autolatheable air tanks (#25130)
* gastankening
* fix price
* Automatic changelog update
* Fix pointing arrow trajectory (#25061)
Initial commit
* make linking logic gates 1000% better (#25041)
* make door status use SendSignal
* LastSignals and logic, add ClearSignal api too
* make everything outputting a logic signal default to false
* refactor ops
* :trollface:
* :trollface:
* protoid for LastSignals
* oop
---------
Co-authored-by: deltanedas <@deltanedas:kde.org>
* Buff emergency toolbox fill (#24225)
Resolves issue #23059, for which the submitter wrote:
Emergency toolboxes contain a crowbar, two flashlights (sometimes one), two breath masks, and two chocolate. With the addition of water bottles to survival boxes and emergency nitrogen tanks, I think emergency toolboxes should be updated to include said water bottles and emergency tanks. Would make these just a little bit more useful. It feels weird they don't have oxygen tanks when they have two breath masks, and since water bottles are now commonplace it would be a good idea to put them in a place where emergency food is stored as well.
* Void jetpack resprite (#25150)
add
* Automatic changelog update
* Allow configuring gen_build_info.py through environment variables (#25162)
This makes the life of forks slightly easier by letting you pass an
environment variable instead of having to maintain this file yourself.
* Significantly nerf Deathnettles (#25068)
* Balancing my beloved
Significantly nerfs deathnettles so botanists can't just take down jug's like it's no issue, we have guns, we should be using them
* Additional Balancing Changes.
* Losing my mind
* Automatic changelog update
* Fix spelling errors in mechs.yml (#25168)
* fix showhealthbars perms (#25157)
* Allow inspecting ID's and Health of people behind glass (#25163)
Hops will love me
* Automatic changelog update
* Fix decal error spam (#25172)
* Restore MonoOverlay (#25170)
https://github.com/space-wizards/space-station-14/pull/24949 nuked it.
* Automatic changelog update
* Added "wink" and "tearfully smiles" emotes + more cry emote variations (#25129)
Added wink and tearfully smiles emote + more cries variations
* Automatic changelog update
* Update submodule to 210.0.0 (#25175)
* Update submodule to 210.0.0
* 210.0.1 instead, the previous one was broken
* 210.0.3 instead, the previous one was ALSO broken
---------
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
* The medical beret is real (#25176)
* 1
* 2
* button is real.
* Automatic changelog update
* Fixed Tipped ammo not being Spent (#25167)
Fix Tipped Ammo not being Spent
* Automatic changelog update
* Hoods and some chaplain's hats now hides hair (#25142)
* Hoods now hide hair
* additional
plague hat and witch hat now hide hair
* fixing some tags in hats
* hoods tag fix
* Glassbox shatter resprite (#25136)
* Automatic changelog update
* Random spontaneous cleanup PR (#25131)
* Use new Subs.CVar helper
Removes manual config OnValueChanged calls, removes need to remember to manually unsubscribe.
This both reduces boilerplate and fixes many issues where subscriptions weren't removed on entity system shutdown.
* Fix a bunch of warnings
* More warning fixes
* Use new DateTime serializer to get rid of ISerializationHooks in changelog code.
* Get rid of some more ISerializationHooks for enums
* And a little more
* Apply suggestions from code review
Co-authored-by: 0x6273 <0x40@keemail.me>
---------
Co-authored-by: 0x6273 <0x40@keemail.me>
* Decrease the chemical cost of regen mesh and sutures and move them to their own file (#24948)
* WHYWEREMEDSINMEALRECIPES
* 20chem
* didiforgettosavethis
* Split slime marking leg gradient (#24928)
* Split slime marking leg gradient
* up markings to 4
* Automatic changelog update
* Require plants to be harvestable before sampling (#24851)
* Add verbs to Open/Close Openable containers, and add optional seals (#24780)
* Implement closing; add open/close verbs
* Add breakable seals
* Allow custom verb names; make condiment bottles closeable
* Remove pointless VV annotations and false defaults
* Split Sealable off into a new component
* Should have a Closed event too
* Oh hey, there are icons I could use
* Ternary operator
* Add support for seal visualizers
* Moved Sealable to Shared, added networking
* Replaced bottle_close1.ogg
* Automatic changelog update
* Shadow anomaly returns (#24629)
* content
* add cat
* ambient
* I FORGOT HEARTS!
* fix ambient
* some fixes
* canCollide: false
* connect to damageable
* pi
* remove fx
* some fixes
* *sad bruh*
* hazed
* Update base_shadow.yml
* Automatic changelog update
* Microwave UX enhancements (#24547)
* Facelift Microwave UI
Includes new background light in UI, Uses predictive input, UI now properly disables buttons when microwave is active
* Microwave now shows Elapsed time
* Fixed bad formatting
* Added new term for "BottomMargin"
* Change yellow color
* Update StyleNano.cs
just spacing fixed
* Cook time countdown now detached from server
Instead of the server constantly sending out messages for the cook countdown, it is now predicted client side using TimeSpan
* Update MicrowaveMenu.xaml
forgot to re-add item space
* Automatic changelog update
* Additional damage visualisers (#24618)
* brute
* add
* Anomaly Synchronizer + Signallers tweaks (#24461)
* content
* nerf
* fix rsi
* Automatic changelog update
* saltern update (#25182)
Co-authored-by: deltanedas <@deltanedas:kde.org>
* Allow players to run saveconfig command. (#25200)
Benign client-side command.
* Revert "Allow configuring gen_build_info.py through environment variables" (#25201)
Revert "Allow configuring gen_build_info.py through environment variables (#2…"
This reverts commit 163e6d2f896ccf9a37be2e17bbbad8b6514ccf4b.
* Fax machines can print from text file (#23262)
* added
* checks tweaking
* fixed what sloth wanted
* fixed?
* dialog diposing fix
* checks tweaking
* more changes
* dispose streamreader
* Update Content.Client/Fax/UI/FaxBoundUi.cs
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Update Content.Server/Fax/FaxSystem.cs
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* fix minor typo
---------
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Automatic changelog update
* Vox names, species prototype cleanup, some cosmetic changes (#24994)
* voxnames
* New generator parameters, names are more readable
* bunch of missing vox stuff
* more names
* sad
* Balanced ChemVend Stock (#25207)
* Balanced ChemVend Stock
ChemVend needs more balanced stock for what actually gets used
* +1 Sugar
* Ranged Holosigns (#25120)
* Changed holo signs to be ranged and used on click rather than Z.
* Updated comments
* Failed attempt at ignoring walls
* Getting rid of unused libraries
---------
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* Minor test fixes (#25174)
Stuff that probably shoulda been wrapped ig but our test runner stinky.
* Add pun to diagnostic hud description (#25209)
Seaborgium is element number 106 and is presumably what lets these glasses "see" "borgs".
* Add events for TemperatureProtection and PressureProtection (#25165)
* Update criminal-records.ftl (#25229)
* Adds always powered variants of colored lights (#25185)
Co-authored-by: Jeff <velcroboy333@hotmail.com>
* Fixes silver bars being whole stacks (#25239)
Co-authored-by: Jeff <velcroboy333@hotmail.com>
* Makes clumsy not delete guns (#25243)
clumsy no longer deletes guns
Co-authored-by: Jessica M <jessica@maybe.sh>
* Predict Injector (syringes), cleanup (#25235)
At least the mode/transfer amount logic. Actual transfer logic needs Bloodstream which I didn't wanna move into shared.
* Updated disabler to have suitStorage tag under slots. (#25238)
* Automatic changelog update
* Updates to Origin (#24908)
Replaced medical's HM console with a CM console, added janitor equipment closet
* Fix spawn priority persistence on reconnect and restart (#25246)
Because of course I would forget one line
* Add French accent beret (#21430)
* Allow thermomachines to exchange with air instead of inlet (#25247)
Add purely atmospheric heat exchange to the gas thermomachine component (in preparation for space heaters).
* Fix: Holosigns can be stored again (#25249)
* Holosigns can be stored again
* TryComp to HasComp
---------
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Death acidifier fix (#25251)
* Automatic changelog update
* Clarify stripping logs (#25190)
* Indicate whether pickpocketing is stealthy in logs, change :user to :actor, and clean up messages.
* Remove ugly whitespace
* Do the thing I should have done but didn't because I didn't want to think
* Fix spacing
* Fix disposals bins not automatically flushing after an object is inserted (#25233)
Fix disposals bins not automatically flushing after an object is inserted.
Because of Spaghetti Code:tm:, AfterInsert() in DisposalUnitSystem still handles insertion itself. Except in all cases except drag/drop insert, the object is already inserted so this check fails and the remaining logic doesn't happen anymore. Fixed now.
* Sec & greysec jumpskirt fix (#25269)
* "resprites" sec & greysec jumpskirts
* adjustments
* Automatic changelog update
* Reduce eshield hp (#25258)
reduce eshield hp
* Automatic changelog update
* Artifact hemoglobin trigger now accepts all sentient blood types (#25240)
* Artifact blood trigger now accepts all sentient blood types
* Update artifact-hints.ftl
* Update engine to v210.1.0 (#25288)
* Made ghost.role_time a server modifiable only cvar (#25292)
Fix
* Nuke fancification (#25297)
Actually use more icon states for deployed/armed/about to explode
Also unlit layer.
Also examine text
* Automatic changelog update
* Change copper blood from ferrous to metallic (#25217)
changed copper blood from ferrous to metallic
* Thindow glass dupe fix (#25304)
smite glass dupe off the face of the planet
eww nasty dupe exploits blehh
* Automatic changelog update
* Kill Seperated Mindshield Icons (#25303)
* Unghettoify mindshield icons
Adds support for layers in status icons, through the StatusIconLayer enum and the new "layer" datafield. Defaults to the Base layer where functionally remains unchanged.
* TG icon for shield
probably better than the shitty one I made in paint
* forgor meta.json
I forgor
* Emo review
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
---------
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
* Automatic changelog update
* MORE SUFFIXES (#25314)
Co-authored-by: Jeff <velcroboy333@hotmail.com>
* Fix spawning glass shard for each glass sheet in stack (#25308)
* fix: SpawnEntitiesBehavior now works with stacks
Fixed the issue of SpawnEntitiesBehavior not executing multiple times on
entities with stack conponent.
Fixes #25287
* fix: reduced dictionary iterations
* Automatic changelog update
* Adds atmospherics access to the fire fighting door remote. Feels like… (#25097)
Adds atmospherics access to the fire fighting door remote. Feels like an oversight for the atmos door remote to not have atmos access.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* Re-organise main menu screen (#25173)
- The dummy control of 2px size has annoyed me for almost 5 years.
- Why is it in the top-right.
- Why is the server address not labelled.
* Allow t-ray to penetrate carpets and puddles (#25276)
* Allow t-ray to penetrate carpets and puddles
* handle edge cases
* Automatic changelog update
* Add sfx for writing on paper (#25257)
* Initial commit
* Moved params to sound
* Removed type tag
* Removed null check
* Forced default
* Automatic changelog update
* New sprites for guidebooks (#25232)
* added books to roles
* First pass
* removed yaml to split pull requests into resprite first, then giving the books to assistants
* new science
* Automatic changelog update
* LockVisualizer (#25224)
* LockVisualizer
* Fix state
* Clean some code
* Make it component, fix tests fail
* Fix for StateUnlocked
Now it is possible to manually set the unlocked state and it will work!
* Optimize LockVisualizer, add check for unlocked state
* No todo I guess
* Solution precision fixes (#25199)
* Add test for two chemistry issues
1. rounding issue with reaction processing when making chloral hydrate
2. reliable assert trip due to the ValidateSolution() heat capacity issue.
* Fix FixedPoint2 arithmetic
Fix internal floating point arithmetic in places where it could be avoided.
Fix incorrect rounding mode used in other places (it should always floor, like regular int arithmetic).
I had to add an explicit epsilon value for float -> FixedPoint2 because something like 1.05 is actually like 1.04999 and that'd cause it to be rounded down to 1.04.
This fixes reaction reagent processing in cases where the reagent inputs can't cleanly divide. Previously, when making 30u chloral hydrate by adding the chlorine in 10u increments you'd end up with 0.04 chlorine left over. This was caused by division in the reaction code rounding up in some cases. Changing division here to always round down fixes it.
* Attempt to fix heat capacity precision assert issues.
Fixes #22126
First, we just increase the tolerance of the assert. It was way too low.
Second, actually put a cap on float drift from one-off _heatCapacity changes.
* Fix float -> FixedPoint2 epsilon for negative number, fix tests.
* Fix DamageableTest
* Oh yeah I need to call CleanReturnAsync
* Automatic changelog update
* WebP lobby images (#25184)
* Allow webp in lobby background files
* Make lobby art webp images
Reduces folder from 10 MB to 2.5 MB without only slight quality loss.
* Update PutLobbyScreensHere.txt
* New lobby art : Blueprint (#25179)
* add
* replace image with webp version
waiting on #25184
* Automatic changelog update
* Diona Nymphs & Splitting (#24630)
* Porting & implementation
* Fix two stupid errors
* Human not humans
* fix audio path
* Fix test fails & update cooldown
* Work on reviews & test fail
* Rework nymph organ system.
* Make the nymph organs nospawn.
* IsDeadIC
* Automatic changelog update
* reform cooldown 10 minutes (#25328)
* Change plant clipping mechanics (#25326)
Make seeds from clipped plants inherit the decreased health from parents.
Also require one growth stage before clipping.
* Automatic changelog update
* Fix nymphs being deleted immediatly after spawning (#25344)
* nymphs now don't get deleted together with the body of the diona
* moved nymph system to server
* Automatic changelog update
* Fix: Grenades don't make trigger sound (#25321)
* Fix: Grenades don't make trigger sound
* transform instead of trycomp transform
---------
Co-authored-by: Plykiya <plykiya@protonmail.com>
* fixed the specific if statement called when plant age is under 0 (#25346)
* Save round information into replay_final.yml (#23013)
* Save round information into the replay
* Add round end text too
* This is way better
* Get actual job
* oop
* OK THERE
* Fake line endings to make life easier
* I was told this yaml is legal
* I just realised this will make my life easier
* REVIEWS BABY IM A PROGRAMMER MOMMY
* Live pjb reaction
* Live pjb reaction 2
* Reviews 2
* Dont need this
* Please no more have mercy on my soul
* Oh frick
* Adds a massban flag to the admin flags (#25327)
Adds a massban flag to the admin flags used on ss14 to ban large amounts of players rom a .tsv file
Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com>
* Automatic changelog update
* Fix missing line in nuke exploding sprite (#25351)
I could've sworn I corrected this before committing but guess not ???
* Added Evidence Markers for the Detective! (#25255)
* added evidence markers
* box tweak
* fixed a spelling mistake
* new sprites, tweaked yml too
* Add "tailed" hair (#25216)
* add
* yes
* Clean up scars.yml and add a new chest scar (#25215)
add
* Automatic changelog update
* Add new "OptionsVisualizer" (#25128)
This is a visualizer somewhat similar to the Generic. It allows configuring appearance info based on specific CVars the user has set. This allows YAML to easily configure alternatives for accessibility CVars like reduced motion.
* Suffix spelling mistake on seed vendor (#25352)
spelling error
* Update engine to v210.1.1 (#25354)
Important fixes from the UI PR
* Stop wagging tails on crit (#25323)
* Add Flammable Touch Reaction for liquid tritium
* Stop tail wagging action on crit
* Revert "Add Flammable Touch Reaction for liquid tritium"
This reverts commit 41be57b058a0cdee0cecfc51eb1c4a25631e62f3.
* Automatic changelog update
* EVA suit helmets now have (un)equip sounds (#25349)
add (un)equip sounds to EVA helms
* Automatic changelog update
* Newton Cradle Fix + Addition to Bureaucracy Crate (#25357)
fixes
makes the newton cradle not able to decimate ears while also adding it to the bureaucracy crate and lowering its volume and range a little bit
* Automatic changelog update
* Shadow anomaly respects "reduced motion" (#25355)
Enabling "reduced motion" now makes the smoke effects not animate. This helps some people with vision issues.
* Fixed directional window durability (#25259)
shit
* Very little cleanup (#25364)
* Origin Station Update 18.02.2024 (medbay update) (#25369)
* Update Credits (#25360)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Add bio reactions (#25366)
* added more foodstuff breakdowns
* Calcium doesn't exist; moved phosphorus to protein
* tested reactions- some should be centrifuged
* more testing tweaks
* Automatic changelog update
* Increase printing price for neck clothes (#25375)
* Increase printing price
* Update clothing.yml
* Update Core (#25383)
add
* add icons for drinks in Solar's (#25301)
* add icons for drinks in Solar's
fixed colors of tea
* consistently use capitals for color codes
* don't add extra whitespace
* Automatic changelog update
* Small Nymph Changes (#25363)
* Emote sounds, accent & doorbump
* Oops
* Only non-brains can't talk
* Automatic changelog update
* Bump nixpkgs rev (#25361)
* Bump nixpkgs revision
* Update nix-direnv
* Remove extra nix functionalities
Both nix-direnv and legacy command nix-shell fail. Reverting to
flakes-only commands.
* Pin nixpkgs per suggestion
See https://github.com/space-wizards/space-station-14/pull/25361#discussion_r1494196038
* Revert nix-direnv removal
* Add python3 to shell.nix
* Adds guidebooks to the 4 learner roles (#25388)
added the books
* Automatic changelog update
* Add support for metamorphic fill levels (#25022)
* Added support for fill levels to metamorphic glasses
* Fix warnings and cleanup
* Don't break non-metamorphic fills!
* Vending UI facelift (#25377)
* Convert to fancy window + added footer + add list spacing
* margin add
* Automatic changelog update
* Make metamorphic glasses use last solution's empty sprite (#25322)
Make metamorphic glasses use empty sprite for the last solution they contained.
* Moths can eat plushies (#25382)
* Update toys.yml
* fix
* New sound of eating
* Increased eating time
* New sounds+sorting
* Automatic changelog update
* Make pills colorful and labeled (#25284)
* Make pills colorful and labeled
* Inherit pill sprites from parent
* Add Flammable Touch Reaction for liquid tritium (#25281)
* randomized sexless species now have epicene gender by default (#25282)
Fikss
* Automatic changelog update
* Mechanized treatment improvements (#25356)
Medical module merge
* Hotfix: Set round end information for replays back to null on round start instead of round end (#25394)
* Hotfix
* I dont think i need this now
* Fix action state handling bug (#25395)
* Rejig action state handling
* Fix entity arg
* Fix deserialization
* Automatic changelog update
* Fix admin notes and database time nonsense. (#25280)
God bloody christ. There's like three layers of shit here.
So firstly, apparently we were still using Npgsql.EnableLegacyTimestampBehavior. This means that time values (which are stored UTC in the database) were converted to local time when read out. This meant they were passed around as kind Local to clients (instead of UTC in the case of SQLite). That's easy enough to fix just turn off the flag and fix the couple spots we're passing a local DateTime ez.
Oh but it turns out there's a DIFFERENT problem with SQLite: See SQLite we definitely store the DateTimes as UTC, but when Microsoft.Data.Sqlite reads them it reads them as Kind Unspecified instead of Utc.
Why are these so bad? Because the admin notes system passes DateTime instances from EF Core straight to the rest of the game code. And that means it's a PAIN IN THE ASS to run the necessary conversions to fix the DateTime instances. GOD DAMNIT now I have to make a whole new set of "Record" entities so we avoid leaking the EF Core model entities. WAAAAAAA.
Fixes #19897
* PlayerListControl fixes. (#25248)
* PlayerListControl fixes.
Fix a button being selected by default always, which then can't be selected properly for real. This affected multiple admin UIs.
This broke due to upstream RT changes but ButtonGroup was always kinda busted so whatever. Uses the new IsNoneSetAllowed to implement everything properly.
Also make sure the selected player STAYS selected when filtering the list and stuff.
Also this PlayerInfo record has been changed to only do equality on the User ID because otherwise it'd need to compare each field individually which would be weird.
* Revert changes to ListContainer
This change was made default in the engine, no longer necessary here.
* Automatic changelog update
* Ore crab structural weakness (#25390)
* Attempt to change structural dmg of ore crab
* Made ore crabs susceptible to structural damage
* Automatic changelog update
* Set nav map icon textures to use bilinear filtering (#25411)
This just makes them look slightly better when zoomed.
* Fix PlayerListControl re-raising selection changed when repopulated. (#25412)
Now we just skip duplicate "item pressed" events from the ListContainer.
This caused the ahelp window to unfocus the message box after sending something. Flow is something like this: you send ahelp -> bwoink window refreshes player list due to new bwoink -> repopulated player list -> sent selection change -> repopulates right pane -> line edit gets unfocused.
* Train station (#24927)
* some content
* some next content
* fixes
* remove stained window
* return bot message?
* woah! Full map added!
* map update
* big update
* camera server
* Corvax playtest feedback
* add mail system and 30$ meteor shield
* update
* updatik
* hardwork
* pipip
* update
* remove from mappool
* fixes
* sentipode
* e
* Mindshield outline flashes, (#25409)
* Add animation support to status icons
Animated like any other entity. Change the png to have all frames, add delays in meta.json, and you're good to go.
* Dirty "fix" for the crashing.
Still have no idea why files cannot be read without changing their path in the yaml.
* Sloth review ig
I still have no idea why it wont work with /Textures/ missing as a prefix.
* Automatic changelog update
* Small Artifact Fixes (#25416)
* 20kw artifact fix
* Change that hopefully doesn't completely break storage artifacts without me realising
* Add roundid to replay_final.yml (#25398)
oopsy i forgor
* Resprite & hand position correction of Nettle & Death Nettle (#25421)
Resprite of Nettle & Death Nettle. Corrected R & L hand locations for all orientations of both plants.
* Automatic changelog update
* balance Explosive Technology (#25397)
* update arsenal yml
balance ExplosiveTechnology
* small changes in arsenal research
small changes in arsenal research
* Update arsenal.yml
* Automatic changelog update
* Tiny shove fix. (#25353)
* Remove second shove check.
* Change when popups and sounds are created.
Reduces phantom shoves that feel bad.
* why didn't i think of this i saw it earlier...
* Replaced Is fields with prefix
* remove some dependencies to fix tests???
* Automatic changelog update
* fix: пара фиксов апстрима
* Revert "Nuke fancification (#25297)"
This reverts commit 3a45d519dcc3679375b5239b6f1881cdd1a07344.
# Conflicts:
# Resources/Textures/Objects/Devices/nuke.rsi/meta.json
# Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_deployed.png
# Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_exploding.png
# Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_timing.png
* Revert "Shuttle floor resprite (#25127)"
This reverts commit a93466ac24c7256d4b584ba830c4fa1cda253d5a.
# Conflicts:
# Resources/Textures/Tiles/shuttleblue.png
# Resources/Textures/Tiles/shuttleorange.png
# Resources/Textures/Tiles/shuttlepurple.png
# Resources/Textures/Tiles/shuttlered.png
# Resources/Textures/Tiles/shuttlewhite.png
* Revert "New lobby art : Blueprint (#25179)"
This reverts commit 90d02a590117b54a16b3af848f3b2fe0195724c9.
# Conflicts:
# Resources/Prototypes/lobbyscreens.yml
* Revert "Added Monitor Computer Boards to Observation Kit (#24979)"
This reverts commit c5027b51ecc7387a678e194fd7733a03349be536.
* Revert "Small t-ray scanner resprite (#25047)"
This reverts commit 601da0c3a33279beff818f82913ed2583e48c642.
# Conflicts:
# Resources/Textures/Objects/Tools/t-ray.rsi/tray-off.png
# Resources/Textures/Objects/Tools/t-ray.rsi/tray-on.png
* add: переводы
* fix: фиксы под тесты
---------
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>
Co-authored-by: Armok <155400926+ARMOKS@users.noreply.github.com>
Co-authored-by: Kevin Zheng <kevinz5000@gmail.com>
Co-authored-by: PoorMansDreams <150595537+PoorMansDreams@users.noreply.github.com>
Co-authored-by: Hannah Giovanna Dawson <karakkaraz@gmail.com>
Co-authored-by: lapatison <100279397+lapatison@users.noreply.github.com>
Co-authored-by: router <messagebus@vk.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: Varen <ychwack@hotmail.it>
Co-authored-by: potato1234_x <79580518+potato1234x@users.noreply.github.com>
Co-authored-by: Hanz <41141796+Hanzdegloker@users.noreply.github.com>
Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com>
Co-authored-by: themias <89101928+themias@users.noreply.github.com>
Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com>
Co-authored-by: Plykiya <plykiya@protonmail.com>
Co-authored-by: YuNii <benjamin@bhenrich.de>
Co-authored-by: Kara <lunarautomaton6@gmail.com>
Co-authored-by: Mangohydra <156087924+Mangohydra@users.noreply.github.com>
Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com>
Co-authored-by: Jezithyr <jezithyr@gmail.com>
Co-authored-by: Fluffiest Floofers <thebluewulf@gmail.com>
Co-authored-by: Jajsha <101492056+Zap527@users.noreply.github.com>
Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com>
Co-authored-by: forgotmyotheraccount <133569389+forgotmyotheraccount@users.noreply.github.com>
Co-authored-by: FungiFellow <151778459+FungiFellow@users.noreply.github.com>
Co-authored-by: Ko4ergaPunk <62609550+Ko4ergaPunk@users.noreply.github.com>
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com>
Co-authored-by: Alex Nordlund <deep.alexander@gmail.com>
Co-authored-by: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com>
Co-authored-by: deepdarkdepths <155149356+deepdarkdepths@users.noreply.github.com>
Co-authored-by: Genkail <50331122+Genkail@users.noreply.github.com>
Co-authored-by: Vasilis <vasilis@pikachu.systems>
Co-authored-by: James Simonson <jamessimo89@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com>
Co-authored-by: Agoichi <92464780+Agoichi@users.noreply.github.com>
Co-authored-by: KREKS <132602258+xKREKSx@users.noreply.github.com>
Co-authored-by: 0x6273 <0x40@keemail.me>
Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com>
Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Guilherme Ornel <86210200+joshepvodka@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
Co-authored-by: wafehling <wafehling@users.noreply.github.com>
Co-authored-by: Interrobang01 <113810873+Interrobang01@users.noreply.github.com>
Co-authored-by: k3yw <grenadiumdota@gmail.com>
Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Co-authored-by: Jeff <velcroboy333@hotmail.com>
Co-authored-by: Jessica M <jessica@jessicamaybe.com>
Co-authored-by: Jessica M <jessica@maybe.sh>
Co-authored-by: Zadeon <loldude9000@gmail.com>
Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com>
Co-authored-by: Menshin <Menshin@users.noreply.github.com>
Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com>
Co-authored-by: liltenhead <104418166+liltenhead@users.noreply.github.com>
Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: Daxxi3 <158596935+Daxxi3@users.noreply.github.com>
Co-authored-by: MACMAN2003 <macman2003c@gmail.com>
Co-authored-by: Golinth <amh2023@gmail.com>
Co-authored-by: Łukasz Mędrek <lukasz@lukaszm.xyz>
Co-authored-by: PotentiallyTom <67602105+PotentiallyTom@users.noreply.github.com>
Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com>
Co-authored-by: LankLTE <135308300+LankLTE@users.noreply.github.com>
Co-authored-by: Flesh <62557990+PolterTzi@users.noreply.github.com>
Co-authored-by: Arendian <137322659+Arendian@users.noreply.github.com>
Co-authored-by: Geekyhobo <66805063+Geekyhobo@users.noreply.github.com>
Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com>
Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com>
Co-authored-by: Peptide90 <78795277+Peptide90@users.noreply.github.com>
Co-authored-by: ArchPigeon <bookmaster3@gmail.com>
Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com>
Co-authored-by: Firewatch <54725557+musicmanvr@users.noreply.github.com>
Co-authored-by: Vigers Ray <60344369+VigersRay@users.noreply.github.com>
Co-authored-by: genderGeometries <159584039+genderGeometries@users.noreply.github.com>
Co-authored-by: hiucko <86206040+Hiucko@users.noreply.github.com>
Co-authored-by: Sybil <azurerosegarden@gmail.com>
Co-authored-by: Ioannis Eleftheriou <me@yath.xyz>
Co-authored-by: marboww <152051971+marboww@users.noreply.github.com>
Co-authored-by: veprolet <68151557+veprolet@users.noreply.github.com>
Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com>
Co-authored-by: Tonydatguy <154929293+Tonydatguy@users.noreply.github.com>
Co-authored-by: Gotimanga <127038462+Gotimanga@users.noreply.github.com>
Co-authored-by: MjrLandWhale <brandonemitch@gmail.com>
Co-authored-by: takemysoult <143123247+takemysoult@users.noreply.github.com>
Co-authored-by: Callmore <22885888+Callmore@users.noreply.github.com>
2024-02-23 23:05:48 +07:00
Subs . CVar ( _configurationManager , CCVars . LoocEnabled , OnLoocEnabledChanged , true ) ;
Subs . CVar ( _configurationManager , CCVars . DeadLoocEnabled , OnDeadLoocEnabledChanged , true ) ;
Subs . CVar ( _configurationManager , CCVars . CritLoocEnabled , OnCritLoocEnabledChanged , true ) ;
2022-06-20 16:59:04 -04:00
SubscribeLocalEvent < GameRunLevelChangedEvent > ( OnGameChange ) ;
2022-03-30 22:21:58 -07:00
}
private void OnLoocEnabledChanged ( bool val )
{
2024-01-28 16:31:58 +07:00
if ( _loocEnabled = = val )
return ;
2022-03-30 22:21:58 -07:00
_loocEnabled = val ;
_chatManager . DispatchServerAnnouncement (
Loc . GetString ( val ? "chat-manager-looc-chat-enabled-message" : "chat-manager-looc-chat-disabled-message" ) ) ;
}
2022-07-26 09:58:19 -04:00
private void OnDeadLoocEnabledChanged ( bool val )
{
2024-01-28 16:31:58 +07:00
if ( _deadLoocEnabled = = val )
return ;
2022-07-26 09:58:19 -04:00
_deadLoocEnabled = val ;
_chatManager . DispatchServerAnnouncement (
2024-01-28 16:31:58 +07:00
Loc . GetString ( val
? "chat-manager-dead-looc-chat-enabled-message"
: "chat-manager-dead-looc-chat-disabled-message" ) ) ;
2022-07-26 09:58:19 -04:00
}
2023-07-26 02:02:48 -04:00
private void OnCritLoocEnabledChanged ( bool val )
{
if ( _critLoocEnabled = = val )
return ;
_critLoocEnabled = val ;
_chatManager . DispatchServerAnnouncement (
2024-01-28 16:31:58 +07:00
Loc . GetString ( val
? "chat-manager-crit-looc-chat-enabled-message"
: "chat-manager-crit-looc-chat-disabled-message" ) ) ;
2023-07-26 02:02:48 -04:00
}
2022-06-20 16:59:04 -04:00
private void OnGameChange ( GameRunLevelChangedEvent ev )
{
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
switch ( ev . New )
2023-02-28 08:15:48 -08:00
{
case GameRunLevel . InRound :
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
if ( ! _configurationManager . GetCVar ( CCVars . OocEnableDuringRound ) )
2023-02-28 08:15:48 -08:00
_configurationManager . SetCVar ( CCVars . OocEnabled , false ) ;
2024-01-28 16:31:58 +07:00
2023-02-28 08:15:48 -08:00
break ;
case GameRunLevel . PostRound :
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
if ( ! _configurationManager . GetCVar ( CCVars . OocEnableDuringRound ) )
2023-02-28 08:15:48 -08:00
_configurationManager . SetCVar ( CCVars . OocEnabled , true ) ;
2024-01-28 16:31:58 +07:00
2023-02-28 08:15:48 -08:00
break ;
}
2022-06-20 16:59:04 -04:00
}
2022-11-15 17:09:27 +13:00
/// <summary>
/// Sends an in-character chat message to relevant clients.
/// </summary>
/// <param name="source">The entity that is speaking</param>
/// <param name="message">The message being spoken or emoted</param>
/// <param name="desiredType">The chat type</param>
/// <param name="hideChat">Whether or not this message should appear in the chat window</param>
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
/// <param name="hideLog">Whether or not this message should appear in the adminlog window</param>
2022-11-15 17:09:27 +13:00
/// <param name="shell"></param>
/// <param name="player">The player doing the speaking</param>
/// <param name="nameOverride">The name to use for the speaking entity. Usually this should just be modified via <see cref="TransformSpeakerNameEvent"/>. If this is set, the event will not get raised.</param>
2023-08-11 22:56:34 -07:00
public void TrySendInGameICMessage (
EntityUid source ,
string message ,
InGameICChatType desiredType ,
2024-01-28 16:31:58 +07:00
bool hideChat ,
bool hideLog = false ,
2023-08-11 22:56:34 -07:00
IConsoleShell ? shell = null ,
2024-01-28 16:31:58 +07:00
ICommonSession ? player = null ,
string? nameOverride = null ,
2023-08-11 22:56:34 -07:00
bool checkRadioPrefix = true ,
2024-01-23 08:43:11 +03:00
bool ignoreActionBlocker = false )
2023-05-04 20:08:08 +01:00
{
2024-01-28 16:31:58 +07:00
TrySendInGameICMessage ( source , message , desiredType ,
hideChat ? ChatTransmitRange . HideChat : ChatTransmitRange . Normal , hideLog , shell , player , nameOverride ,
checkRadioPrefix , ignoreActionBlocker ) ;
2023-05-04 20:08:08 +01:00
}
/// <summary>
/// Sends an in-character chat message to relevant clients.
/// </summary>
/// <param name="source">The entity that is speaking</param>
/// <param name="message">The message being spoken or emoted</param>
/// <param name="desiredType">The chat type</param>
/// <param name="range">Conceptual range of transmission, if it shows in the chat window, if it shows to far-away ghosts or ghosts at all...</param>
/// <param name="shell"></param>
/// <param name="player">The player doing the speaking</param>
/// <param name="nameOverride">The name to use for the speaking entity. Usually this should just be modified via <see cref="TransformSpeakerNameEvent"/>. If this is set, the event will not get raised.</param>
2023-08-11 22:56:34 -07:00
/// <param name="ignoreActionBlocker">If set to true, action blocker will not be considered for whether an entity can send this message.</param>
public void TrySendInGameICMessage (
EntityUid source ,
string message ,
InGameICChatType desiredType ,
ChatTransmitRange range ,
bool hideLog = false ,
IConsoleShell ? shell = null ,
2023-10-28 09:59:53 +11:00
ICommonSession ? player = null ,
2023-08-11 22:56:34 -07:00
string? nameOverride = null ,
bool checkRadioPrefix = true ,
2024-01-23 08:43:11 +03:00
bool ignoreActionBlocker = false
2024-01-28 16:31:58 +07:00
)
2022-03-30 22:21:58 -07:00
{
if ( HasComp < GhostComponent > ( source ) )
{
2024-01-28 16:31:58 +07:00
if ( desiredType = = InGameICChatType . Emote )
2023-04-28 05:08:05 +06:00
return ;
2022-03-30 22:21:58 -07:00
// Ghosts can only send dead chat messages, so we'll forward it to InGame OOC.
2024-01-28 16:31:58 +07:00
TrySendInGameOOCMessage ( source , message , InGameOOCChatType . Dead , range = = ChatTransmitRange . HideChat , shell ,
player ) ;
2022-03-30 22:21:58 -07:00
return ;
}
2023-11-27 04:08:30 +01:00
if ( player ! = null & & ! _chatManager . HandleRateLimit ( player ) )
return ;
2022-04-01 00:08:26 -07:00
// Sus
if ( player ? . AttachedEntity is { Valid : true } entity & & source ! = entity )
{
return ;
}
2024-01-23 08:43:11 +03:00
if ( ! CanSendInGame ( message , shell , player ) )
2022-03-30 22:21:58 -07:00
return ;
2023-12-01 19:25:20 -05:00
ignoreActionBlocker = CheckIgnoreSpeechBlocker ( source , ignoreActionBlocker ) ;
2023-11-05 18:19:59 -08:00
// this method is a disaster
// every second i have to spend working with this code is fucking agony
// scientists have to wonder how any of this was merged
// coding any game admin feature that involves chat code is pure torture
// changing even 10 lines of code feels like waterboarding myself
// and i dont feel like vibe checking 50 code paths
// so we set this here
// todo free me from chat code
2023-10-14 02:02:56 -07:00
if ( player ! = null )
2023-11-05 18:19:59 -08:00
{
_chatManager . EnsurePlayer ( player . UserId ) . AddEntity ( GetNetEntity ( source ) ) ;
}
2023-10-14 02:02:56 -07:00
2023-02-19 06:27:56 +13:00
if ( desiredType = = InGameICChatType . Speak & & message . StartsWith ( LocalPrefix ) )
{
// prevent radios and remove prefix.
checkRadioPrefix = false ;
message = message [ 1. . ] ;
}
2023-04-25 02:17:40 +06:00
var shouldCapitalize = ( desiredType ! = InGameICChatType . Emote ) ;
var shouldPunctuate = _configurationManager . GetCVar ( CCVars . ChatPunctuation ) ;
var sanitizeSlang = _configurationManager . GetCVar ( WhiteCVars . ChatSlangFilter ) ;
2022-04-24 20:15:40 -04:00
2024-01-28 16:31:58 +07:00
message = SanitizeInGameICMessage ( source , message , out var emoteStr , shouldCapitalize , shouldPunctuate ,
sanitizeSlang ) ;
2022-03-30 22:21:58 -07:00
2022-04-01 00:08:26 -07:00
// Was there an emote in the message? If so, send it.
2023-05-01 15:05:43 +06:00
if ( emoteStr ! = message & & emoteStr ! = null )
2022-03-30 22:21:58 -07:00
{
2023-08-29 05:59:14 +06:00
SendEntityEmote ( source , emoteStr , range , nameOverride , ignoreActionBlocker ) ;
2022-03-30 22:21:58 -07:00
}
2022-04-01 20:09:54 -07:00
// This can happen if the entire string is sanitized out.
if ( string . IsNullOrEmpty ( message ) )
return ;
2023-07-31 09:33:04 +03:00
if ( desiredType ! = InGameICChatType . Emote & & player is not null & &
2023-09-04 12:03:28 +03:00
! _chatManager . TrySendNewMessage ( player , message , true ) ) // WD
2023-07-31 09:33:04 +03:00
return ;
2022-12-14 12:24:49 +11:00
// This message may have a radio prefix, and should then be whispered to the resolved radio channel
if ( checkRadioPrefix )
{
2023-02-19 06:27:56 +13:00
if ( TryProccessRadioMessage ( source , message , out var modMessage , out var channel ) )
2022-12-14 12:24:49 +11:00
{
2023-12-01 19:25:20 -05:00
SendEntityWhisper ( source , modMessage , range , channel , nameOverride , hideLog , ignoreActionBlocker ) ;
2022-12-14 12:24:49 +11:00
return ;
}
}
2023-10-19 02:32:18 +09:00
if ( desiredType = = InGameICChatType . Speak & &
_gameTicker . GetActiveGameRules ( ) . Where ( HasComp < WhisperAspectComponent > ) . Any ( ) ) // WD
{
desiredType = InGameICChatType . Whisper ;
}
2022-03-30 22:21:58 -07:00
// Otherwise, send whatever type.
switch ( desiredType )
{
case InGameICChatType . Speak :
2023-08-11 22:56:34 -07:00
SendEntitySpeak ( source , message , range , nameOverride , hideLog , ignoreActionBlocker ) ;
2022-03-30 22:21:58 -07:00
break ;
case InGameICChatType . Whisper :
2023-08-11 22:56:34 -07:00
SendEntityWhisper ( source , message , range , null , nameOverride , hideLog , ignoreActionBlocker ) ;
2022-03-30 22:21:58 -07:00
break ;
case InGameICChatType . Emote :
2024-01-28 16:31:58 +07:00
SendEntityEmote ( source , message , range , nameOverride , hideLog : hideLog ,
ignoreActionBlocker : ignoreActionBlocker ) ;
2022-03-30 22:21:58 -07:00
break ;
}
}
2023-08-11 22:56:34 -07:00
public void TrySendInGameOOCMessage (
EntityUid source ,
string message ,
InGameOOCChatType type ,
bool hideChat ,
IConsoleShell ? shell = null ,
2023-10-28 09:59:53 +11:00
ICommonSession ? player = null
2024-01-28 16:31:58 +07:00
)
2022-03-30 22:21:58 -07:00
{
if ( ! CanSendInGame ( message , shell , player ) )
return ;
2023-11-27 04:08:30 +01:00
if ( player ! = null & & ! _chatManager . HandleRateLimit ( player ) )
return ;
2022-03-30 22:21:58 -07:00
// It doesn't make any sense for a non-player to send in-game OOC messages, whereas non-players may be sending
// in-game IC messages.
if ( player ? . AttachedEntity is not { Valid : true } entity | | source ! = entity )
return ;
message = SanitizeInGameOOCMessage ( message ) ;
2022-07-26 09:58:19 -04:00
var sendType = type ;
// If dead player LOOC is disabled, unless you are an aghost, send dead messages to dead chat
if ( ! _adminManager . IsAdmin ( player ) & & ! _deadLoocEnabled & &
( HasComp < GhostComponent > ( source ) | | _mobStateSystem . IsDead ( source ) ) )
sendType = InGameOOCChatType . Dead ;
2023-07-26 02:02:48 -04:00
// If crit player LOOC is disabled, don't send the message at all.
if ( ! _critLoocEnabled & & _mobStateSystem . IsCritical ( source ) )
return ;
2023-07-31 09:33:04 +03:00
if ( ! _chatManager . TrySendNewMessage ( player , message ) ) // WD
return ;
2022-07-26 09:58:19 -04:00
switch ( sendType )
2022-03-30 22:21:58 -07:00
{
case InGameOOCChatType . Dead :
SendDeadChat ( source , player , message , hideChat ) ;
break ;
case InGameOOCChatType . Looc :
SendLOOC ( source , player , message , hideChat ) ;
break ;
2024-01-31 14:01:35 +00:00
case InGameOOCChatType . Changeling :
SendChangelingChat ( source , player , message , hideChat ) ;
break ;
2024-01-27 15:19:52 +03:00
case InGameOOCChatType . Cult :
SendCultChat ( source , player , message , hideChat ) ;
break ;
2022-03-30 22:21:58 -07:00
}
}
2023-04-28 10:10:25 +06:00
public string AfterSpeechTransformed ( EntityUid sender , string message )
{
var ev = new SpeechTransformedEvent ( sender , message ) ;
RaiseLocalEvent ( ev ) ;
return ev . Message ;
}
2024-01-28 16:31:58 +07:00
#region Announcements
2022-06-03 21:37:35 +10:00
/// <summary>
2022-07-04 16:00:51 +10:00
/// Dispatches an announcement to all.
2022-06-03 21:37:35 +10:00
/// </summary>
/// <param name="message">The contents of the message</param>
/// <param name="sender">The sender (Communications Console in Communications Console Announcement)</param>
2022-07-15 12:16:41 +03:00
/// <param name="playSound">Play the announcement sound</param>
2022-06-03 21:37:35 +10:00
/// <param name="colorOverride">Optional color for the announcement message</param>
2023-08-11 22:56:34 -07:00
public void DispatchGlobalAnnouncement (
string message ,
string sender = "Central Command" ,
bool playSound = true ,
SoundSpecifier ? announcementSound = null ,
Color ? colorOverride = null
2024-01-28 16:31:58 +07:00
)
2022-06-03 21:37:35 +10:00
{
2024-01-28 16:31:58 +07:00
var wrappedMessage = Loc . GetString ( "chat-manager-sender-announcement-wrap-message" , ( "sender" , sender ) ,
( "message" , FormattedMessage . EscapeText ( message ) ) ) ;
2022-11-23 00:52:19 +13:00
_chatManager . ChatMessageToAll ( ChatChannel . Radio , message , wrappedMessage , default , false , true , colorOverride ) ;
2022-07-15 12:16:41 +03:00
if ( playSound )
2022-06-03 21:37:35 +10:00
{
2024-01-28 16:31:58 +07:00
_audio . PlayGlobal (
announcementSound is not null ? _audio . GetSound ( announcementSound ) : DefaultAnnouncementSound ,
Filter . Broadcast ( ) ,
true ,
AudioParams . Default . WithVolume ( - 2f ) ) ;
2022-06-03 21:37:35 +10:00
}
2024-01-28 16:31:58 +07:00
2022-06-03 21:37:35 +10:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"Global station announcement from {sender}: {message}" ) ;
}
/// <summary>
/// Dispatches an announcement on a specific station
/// </summary>
/// <param name="source">The entity making the announcement (used to determine the station)</param>
/// <param name="message">The contents of the message</param>
/// <param name="sender">The sender (Communications Console in Communications Console Announcement)</param>
/// <param name="playDefaultSound">Play the announcement sound</param>
/// <param name="colorOverride">Optional color for the announcement message</param>
2023-08-11 22:56:34 -07:00
public void DispatchStationAnnouncement (
EntityUid source ,
string message ,
string sender = "Central Command" ,
bool playDefaultSound = true ,
SoundSpecifier ? announcementSound = null ,
Color ? colorOverride = null )
2022-06-03 21:37:35 +10:00
{
2024-01-28 16:31:58 +07:00
var wrappedMessage = Loc . GetString ( "chat-manager-sender-announcement-wrap-message" , ( "sender" , sender ) ,
( "message" , FormattedMessage . EscapeText ( message ) ) ) ;
2022-06-03 21:37:35 +10:00
var station = _stationSystem . GetOwningStation ( source ) ;
2022-06-04 19:09:04 +10:00
if ( station = = null )
2022-06-03 21:37:35 +10:00
{
2022-06-04 19:09:04 +10:00
// you can't make a station announcement without a station
return ;
2022-06-03 21:37:35 +10:00
}
2022-06-04 19:09:04 +10:00
2024-01-28 16:31:58 +07:00
if ( ! EntityManager . TryGetComponent < StationDataComponent > ( station , out var stationDataComp ) )
return ;
2022-06-04 19:09:04 +10:00
2022-07-04 16:00:51 +10:00
var filter = _stationSystem . GetInStation ( stationDataComp ) ;
2022-06-03 21:37:35 +10:00
2024-01-28 16:31:58 +07:00
_chatManager . ChatMessageToManyFiltered ( filter , ChatChannel . Radio , message , wrappedMessage , source , false , true ,
colorOverride ) ;
2022-06-03 21:37:35 +10:00
if ( playDefaultSound )
{
2024-01-28 16:31:58 +07:00
_audio . PlayGlobal (
announcementSound is not null ? _audio . GetSound ( announcementSound ) : DefaultAnnouncementSound ,
filter ,
true ,
AudioParams . Default . WithVolume ( - 2f ) ) ;
2022-06-03 21:37:35 +10:00
}
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"Station Announcement on {station} from {sender}: {message}" ) ;
}
2024-01-28 16:31:58 +07:00
#endregion
2022-06-03 21:37:35 +10:00
2024-01-28 16:31:58 +07:00
#region Private API
2022-03-30 22:21:58 -07:00
2023-08-11 22:56:34 -07:00
private void SendEntitySpeak (
EntityUid source ,
string originalMessage ,
ChatTransmitRange range ,
string? nameOverride ,
bool hideLog = false ,
bool ignoreActionBlocker = false
2024-01-28 16:31:58 +07:00
)
2022-03-30 22:21:58 -07:00
{
2023-08-11 22:56:34 -07:00
if ( ! _actionBlocker . CanSpeak ( source ) & & ! ignoreActionBlocker )
2022-07-26 16:49:23 -07:00
return ;
2022-03-30 22:21:58 -07:00
2023-12-30 00:38:11 +00:00
var message = TransformSpeech ( source , FormattedMessage . RemoveMarkup ( originalMessage ) ) ;
2022-08-02 15:46:10 +02:00
if ( message . Length = = 0 )
return ;
2023-04-28 10:10:25 +06:00
message = AfterSpeechTransformed ( source , message ) ;
2024-01-23 17:12:18 -05:00
var speech = GetSpeechVerb ( source , message ) ;
2023-04-28 10:10:25 +06:00
2022-11-15 17:09:27 +13:00
// get the entity's apparent name (if no override provided).
string name ;
if ( nameOverride ! = null )
{
name = nameOverride ;
}
else
{
var nameEv = new TransformSpeakerNameEvent ( source , Name ( source ) ) ;
RaiseLocalEvent ( source , nameEv ) ;
name = nameEv . Name ;
2024-01-23 17:12:18 -05:00
// Check for a speech verb override
2024-01-28 16:31:58 +07:00
if ( nameEv . SpeechVerb ! = null & &
_prototypeManager . TryIndex < SpeechVerbPrototype > ( nameEv . SpeechVerb , out var proto ) )
2024-01-23 17:12:18 -05:00
speech = proto ;
2022-11-15 17:09:27 +13:00
}
name = FormattedMessage . EscapeText ( name ) ;
2023-04-26 01:21:26 +06:00
[Upstream] Upstream (#109)
* Automatic changelog update
* atlas update (#25071)
* atlas update
* untroll
---------
Co-authored-by: deltanedas <@deltanedas:kde.org>
* box update (#25074)
* fland update (#25075)
* marathon update (#25076)
* meta update (#25077)
* Syndicate key grammar fix (#25085)
* Syndicate encryption key grammar fix
An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip?
* Syndicate key grammar fix
An encryption key used by... wait... Who is owner of this chip? > An encryption key used by... wait... Who is the owner of this chip?
* Fix hybridization seedless probability (#25084)
Fix comparison
Hybrids (different plants being crossed) are supposed to have a high
chance of becoming seedless to balance overpowered plants.
However, a logic error in the comparison gave seedless to plants when
they were from the same seed (not hybrids) rather than the other way
around.
Reported by: @genderGeometries
* Added Tourniquets to stop bleeds (#23198)
* Fixed Error with RobustToolbox Edits. Removed the addition of secbelt tag from assault belt.
* Resprite of the monstrosity
* Resprite of the tourniquet NO LONGER PHALLUS SHAPED
* too bright, now darker and edgier
* Tourniquet resprite
* metajson yay
* Update Skelly Vs The Rev lobby art (#25088)
Someone said the original was a bit low res
and I agreed.
This is a 1440p (from an 8k base image) rendition
of the same scene, with a new dramatic forced
perspective look, and generally cleaner art throughout.
Also now there's two mothroaches.
* Automatic changelog update
* Minor airlock assembly clean up (#25073)
1
* Update README.md (#25067)
* Update README.md
* emo review
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
---------
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
* prevent opening debug menus without perms (#25091)
prevent people without permissions from opening the tile, entityspawn, or decal menus
* Remove battery from crew observation kit, fix description (#25000)
-Remove battery from crew observation kit, fix description
* Laughin' Peas (#25089)
* laughter
* make clownmobs bleed laughter
* laughin syrup and laughter recipe
* add laughin peas
* Automatic changelog update
* QM drip DLC (#24477)
* New Drip for the QM
QM beret and QM formal uniform
* Asd
Asd
* Adds the new clothing to the uniform printer
what it says on the tin
* I always forget to update the copyright RAAAAAH
yup
* EMT Belt Part 2 (#24289)
* add
* fix
* aaaa
* Flipped caps real (#24961)
* Flipped caps real
* oops
* whoops
* flip not fold
* fix formatting
* cargosoft formatting
* Automatic changelog update
* Nerf Beanbags (#24653)
Lowers beanbag damage from 55 stam to 30 stam
* Automatic changelog update
* Fix screenspace popups (#24987)
* Fix screenspace popups
Never got around to it earlier but need to draw it above UI controls.
* Minor null change
* Automatic changelog update
* Fix crew manifest department bugs (#24975)
* Automatic changelog update
* Changed door remote to trigger based on vision occlusion(#25093)
Changed door remote to trigger based on vision occlusion rather than opaque collision targeting check. Ian's butt will no longer absorb your 5G signals.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* GPS In Paramed Locker (#25096)
GPS in paramed locker
* Remove 'travis scott day' from the game (#25106)
* remove travis scott from the game
* KILL TRAVIS EVEN MORE
* Automatic changelog update
* Remove erroneous changelog (#25107)
* fixed fland cargo shuttle not having tiny fans (sorry) (#25095)
* Glass box for antique laser pistol (#25104)
* glassbox
* fix
* Gibbing refactor (Per-part gibbing and giblet throwing!) (#24989)
* Moving Gibbing rework out from medrefactor into it's own PR
* Re-enabled warning for missing gibbable on TryGibEntity
* Implemented better logic for gibbing failover and better logging
* Allowing audio params and drop scattering customization per component. Created UnGibbable organ base types and made brains ungibbable.
Removed delete brain from gibBody function. Artifact crusher does not destroy brains anymore. It only destroyed brains before not other organs which was wierd.
* Update Content.Shared/Body/Systems/SharedBodySystem.Body.cs
Fixing space for multiplication
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Added event raised when attempting to gib contained entities to allow modification of allowed and excluded container ids
* removing audioParams var from component (sound specifier includes it)
* Fixing signature
---------
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Automatic changelog update
* Gibbing contents hotfix (#25114)
Fixing gibbing contents not respecting Include/Exclude container lists. This is currently unused
* Predict two-way levers (#25043)
* Predict two-way levers
Annoys me the rare occasions I touch cargo. Doesn't predict the signal but at least the lever responds immediately.
* space
* a
* Replace Romerol with Ambuzol in chemist guidebook (#25108)
replace romerol with ambuzol
* Fix borgs being able to emag themselves (#24748)
* Fix self emagging borgs
* Add popup on self emag failure.
* Ectoplasm is grindable into Necrosol (#25053)
add
* Automatic changelog update
* Automatic changelog update
* Roundstart Food Service research (#25046)
add
* Automatic changelog update
* Add option for character name colors in chat & move coloration to clientside (#24625)
* Adds option to disable character names in chat/speechbubbles
* Moved the coloring of names to clientside
* Move string functions to SharedChatSystem to avoid duplicate code in SpeechBubble.cs
* Changed to be put under Accessibility section
* Cache CVar
* Automatic changelog update
* Update Credits (#25115)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Replace fixed drink glasses with metamorphic versions (#25134)
* Replaced fixed drink glasses with metamorphic versions
* Fine, no milkshake then
* ambuzol beef (#25119)
* Automatic changelog update
* Shuttle floor resprite (#25127)
* resprites shuttle tiles
* resprites shuttle floor tiles & adds grey/black shuttle tiles
* attributions.yml update
* Adding a period to an object description (#25138)
Added a period to an object description.
Adds a period to silk's description. This is my first and last pull request.
* Door Remote Changelog Entry (#25144)
I'm so dumb.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* Lowered Ion Storm Reoccurence Delay to 20 (#25135)
* Lowered reoccurencedelay to 45
* Lowered Further down to 20
* Re-added shivs to crafting menus (#25094)
Added a recipe for crafting menu
* Automatic changelog update
* Color Tipped Ammo (#25103)
* Tipped .35 ammo
* used layers instead of new sprites
* remove the useless old sprites
* changed the green slightly
* Automatic changelog update
* Add overlay decals for mini tiles and bricks (#24949)
Add minitile and brick decals overlay
* Update Core (#24862)
* add
* Update Resources/Textures/Parallaxes/attributions.yml
* sprite change
* address review
---------
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Buyable Jani Trolley (#25139)
Trolley
* Added display for amount of hits left in stun batons/stun prods. (#25141)
Added display for amount of hits left in stun batons/stunprods.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* autolatheable air tanks (#25130)
* gastankening
* fix price
* Automatic changelog update
* Fix pointing arrow trajectory (#25061)
Initial commit
* make linking logic gates 1000% better (#25041)
* make door status use SendSignal
* LastSignals and logic, add ClearSignal api too
* make everything outputting a logic signal default to false
* refactor ops
* :trollface:
* :trollface:
* protoid for LastSignals
* oop
---------
Co-authored-by: deltanedas <@deltanedas:kde.org>
* Buff emergency toolbox fill (#24225)
Resolves issue #23059, for which the submitter wrote:
Emergency toolboxes contain a crowbar, two flashlights (sometimes one), two breath masks, and two chocolate. With the addition of water bottles to survival boxes and emergency nitrogen tanks, I think emergency toolboxes should be updated to include said water bottles and emergency tanks. Would make these just a little bit more useful. It feels weird they don't have oxygen tanks when they have two breath masks, and since water bottles are now commonplace it would be a good idea to put them in a place where emergency food is stored as well.
* Void jetpack resprite (#25150)
add
* Automatic changelog update
* Allow configuring gen_build_info.py through environment variables (#25162)
This makes the life of forks slightly easier by letting you pass an
environment variable instead of having to maintain this file yourself.
* Significantly nerf Deathnettles (#25068)
* Balancing my beloved
Significantly nerfs deathnettles so botanists can't just take down jug's like it's no issue, we have guns, we should be using them
* Additional Balancing Changes.
* Losing my mind
* Automatic changelog update
* Fix spelling errors in mechs.yml (#25168)
* fix showhealthbars perms (#25157)
* Allow inspecting ID's and Health of people behind glass (#25163)
Hops will love me
* Automatic changelog update
* Fix decal error spam (#25172)
* Restore MonoOverlay (#25170)
https://github.com/space-wizards/space-station-14/pull/24949 nuked it.
* Automatic changelog update
* Added "wink" and "tearfully smiles" emotes + more cry emote variations (#25129)
Added wink and tearfully smiles emote + more cries variations
* Automatic changelog update
* Update submodule to 210.0.0 (#25175)
* Update submodule to 210.0.0
* 210.0.1 instead, the previous one was broken
* 210.0.3 instead, the previous one was ALSO broken
---------
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
* The medical beret is real (#25176)
* 1
* 2
* button is real.
* Automatic changelog update
* Fixed Tipped ammo not being Spent (#25167)
Fix Tipped Ammo not being Spent
* Automatic changelog update
* Hoods and some chaplain's hats now hides hair (#25142)
* Hoods now hide hair
* additional
plague hat and witch hat now hide hair
* fixing some tags in hats
* hoods tag fix
* Glassbox shatter resprite (#25136)
* Automatic changelog update
* Random spontaneous cleanup PR (#25131)
* Use new Subs.CVar helper
Removes manual config OnValueChanged calls, removes need to remember to manually unsubscribe.
This both reduces boilerplate and fixes many issues where subscriptions weren't removed on entity system shutdown.
* Fix a bunch of warnings
* More warning fixes
* Use new DateTime serializer to get rid of ISerializationHooks in changelog code.
* Get rid of some more ISerializationHooks for enums
* And a little more
* Apply suggestions from code review
Co-authored-by: 0x6273 <0x40@keemail.me>
---------
Co-authored-by: 0x6273 <0x40@keemail.me>
* Decrease the chemical cost of regen mesh and sutures and move them to their own file (#24948)
* WHYWEREMEDSINMEALRECIPES
* 20chem
* didiforgettosavethis
* Split slime marking leg gradient (#24928)
* Split slime marking leg gradient
* up markings to 4
* Automatic changelog update
* Require plants to be harvestable before sampling (#24851)
* Add verbs to Open/Close Openable containers, and add optional seals (#24780)
* Implement closing; add open/close verbs
* Add breakable seals
* Allow custom verb names; make condiment bottles closeable
* Remove pointless VV annotations and false defaults
* Split Sealable off into a new component
* Should have a Closed event too
* Oh hey, there are icons I could use
* Ternary operator
* Add support for seal visualizers
* Moved Sealable to Shared, added networking
* Replaced bottle_close1.ogg
* Automatic changelog update
* Shadow anomaly returns (#24629)
* content
* add cat
* ambient
* I FORGOT HEARTS!
* fix ambient
* some fixes
* canCollide: false
* connect to damageable
* pi
* remove fx
* some fixes
* *sad bruh*
* hazed
* Update base_shadow.yml
* Automatic changelog update
* Microwave UX enhancements (#24547)
* Facelift Microwave UI
Includes new background light in UI, Uses predictive input, UI now properly disables buttons when microwave is active
* Microwave now shows Elapsed time
* Fixed bad formatting
* Added new term for "BottomMargin"
* Change yellow color
* Update StyleNano.cs
just spacing fixed
* Cook time countdown now detached from server
Instead of the server constantly sending out messages for the cook countdown, it is now predicted client side using TimeSpan
* Update MicrowaveMenu.xaml
forgot to re-add item space
* Automatic changelog update
* Additional damage visualisers (#24618)
* brute
* add
* Anomaly Synchronizer + Signallers tweaks (#24461)
* content
* nerf
* fix rsi
* Automatic changelog update
* saltern update (#25182)
Co-authored-by: deltanedas <@deltanedas:kde.org>
* Allow players to run saveconfig command. (#25200)
Benign client-side command.
* Revert "Allow configuring gen_build_info.py through environment variables" (#25201)
Revert "Allow configuring gen_build_info.py through environment variables (#2…"
This reverts commit 163e6d2f896ccf9a37be2e17bbbad8b6514ccf4b.
* Fax machines can print from text file (#23262)
* added
* checks tweaking
* fixed what sloth wanted
* fixed?
* dialog diposing fix
* checks tweaking
* more changes
* dispose streamreader
* Update Content.Client/Fax/UI/FaxBoundUi.cs
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Update Content.Server/Fax/FaxSystem.cs
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* fix minor typo
---------
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
* Automatic changelog update
* Vox names, species prototype cleanup, some cosmetic changes (#24994)
* voxnames
* New generator parameters, names are more readable
* bunch of missing vox stuff
* more names
* sad
* Balanced ChemVend Stock (#25207)
* Balanced ChemVend Stock
ChemVend needs more balanced stock for what actually gets used
* +1 Sugar
* Ranged Holosigns (#25120)
* Changed holo signs to be ranged and used on click rather than Z.
* Updated comments
* Failed attempt at ignoring walls
* Getting rid of unused libraries
---------
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* Minor test fixes (#25174)
Stuff that probably shoulda been wrapped ig but our test runner stinky.
* Add pun to diagnostic hud description (#25209)
Seaborgium is element number 106 and is presumably what lets these glasses "see" "borgs".
* Add events for TemperatureProtection and PressureProtection (#25165)
* Update criminal-records.ftl (#25229)
* Adds always powered variants of colored lights (#25185)
Co-authored-by: Jeff <velcroboy333@hotmail.com>
* Fixes silver bars being whole stacks (#25239)
Co-authored-by: Jeff <velcroboy333@hotmail.com>
* Makes clumsy not delete guns (#25243)
clumsy no longer deletes guns
Co-authored-by: Jessica M <jessica@maybe.sh>
* Predict Injector (syringes), cleanup (#25235)
At least the mode/transfer amount logic. Actual transfer logic needs Bloodstream which I didn't wanna move into shared.
* Updated disabler to have suitStorage tag under slots. (#25238)
* Automatic changelog update
* Updates to Origin (#24908)
Replaced medical's HM console with a CM console, added janitor equipment closet
* Fix spawn priority persistence on reconnect and restart (#25246)
Because of course I would forget one line
* Add French accent beret (#21430)
* Allow thermomachines to exchange with air instead of inlet (#25247)
Add purely atmospheric heat exchange to the gas thermomachine component (in preparation for space heaters).
* Fix: Holosigns can be stored again (#25249)
* Holosigns can be stored again
* TryComp to HasComp
---------
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Death acidifier fix (#25251)
* Automatic changelog update
* Clarify stripping logs (#25190)
* Indicate whether pickpocketing is stealthy in logs, change :user to :actor, and clean up messages.
* Remove ugly whitespace
* Do the thing I should have done but didn't because I didn't want to think
* Fix spacing
* Fix disposals bins not automatically flushing after an object is inserted (#25233)
Fix disposals bins not automatically flushing after an object is inserted.
Because of Spaghetti Code:tm:, AfterInsert() in DisposalUnitSystem still handles insertion itself. Except in all cases except drag/drop insert, the object is already inserted so this check fails and the remaining logic doesn't happen anymore. Fixed now.
* Sec & greysec jumpskirt fix (#25269)
* "resprites" sec & greysec jumpskirts
* adjustments
* Automatic changelog update
* Reduce eshield hp (#25258)
reduce eshield hp
* Automatic changelog update
* Artifact hemoglobin trigger now accepts all sentient blood types (#25240)
* Artifact blood trigger now accepts all sentient blood types
* Update artifact-hints.ftl
* Update engine to v210.1.0 (#25288)
* Made ghost.role_time a server modifiable only cvar (#25292)
Fix
* Nuke fancification (#25297)
Actually use more icon states for deployed/armed/about to explode
Also unlit layer.
Also examine text
* Automatic changelog update
* Change copper blood from ferrous to metallic (#25217)
changed copper blood from ferrous to metallic
* Thindow glass dupe fix (#25304)
smite glass dupe off the face of the planet
eww nasty dupe exploits blehh
* Automatic changelog update
* Kill Seperated Mindshield Icons (#25303)
* Unghettoify mindshield icons
Adds support for layers in status icons, through the StatusIconLayer enum and the new "layer" datafield. Defaults to the Base layer where functionally remains unchanged.
* TG icon for shield
probably better than the shitty one I made in paint
* forgor meta.json
I forgor
* Emo review
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
---------
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
* Automatic changelog update
* MORE SUFFIXES (#25314)
Co-authored-by: Jeff <velcroboy333@hotmail.com>
* Fix spawning glass shard for each glass sheet in stack (#25308)
* fix: SpawnEntitiesBehavior now works with stacks
Fixed the issue of SpawnEntitiesBehavior not executing multiple times on
entities with stack conponent.
Fixes #25287
* fix: reduced dictionary iterations
* Automatic changelog update
* Adds atmospherics access to the fire fighting door remote. Feels like… (#25097)
Adds atmospherics access to the fire fighting door remote. Feels like an oversight for the atmos door remote to not have atmos access.
Co-authored-by: Plykiya <plykiya@protonmail.com>
* Automatic changelog update
* Re-organise main menu screen (#25173)
- The dummy control of 2px size has annoyed me for almost 5 years.
- Why is it in the top-right.
- Why is the server address not labelled.
* Allow t-ray to penetrate carpets and puddles (#25276)
* Allow t-ray to penetrate carpets and puddles
* handle edge cases
* Automatic changelog update
* Add sfx for writing on paper (#25257)
* Initial commit
* Moved params to sound
* Removed type tag
* Removed null check
* Forced default
* Automatic changelog update
* New sprites for guidebooks (#25232)
* added books to roles
* First pass
* removed yaml to split pull requests into resprite first, then giving the books to assistants
* new science
* Automatic changelog update
* LockVisualizer (#25224)
* LockVisualizer
* Fix state
* Clean some code
* Make it component, fix tests fail
* Fix for StateUnlocked
Now it is possible to manually set the unlocked state and it will work!
* Optimize LockVisualizer, add check for unlocked state
* No todo I guess
* Solution precision fixes (#25199)
* Add test for two chemistry issues
1. rounding issue with reaction processing when making chloral hydrate
2. reliable assert trip due to the ValidateSolution() heat capacity issue.
* Fix FixedPoint2 arithmetic
Fix internal floating point arithmetic in places where it could be avoided.
Fix incorrect rounding mode used in other places (it should always floor, like regular int arithmetic).
I had to add an explicit epsilon value for float -> FixedPoint2 because something like 1.05 is actually like 1.04999 and that'd cause it to be rounded down to 1.04.
This fixes reaction reagent processing in cases where the reagent inputs can't cleanly divide. Previously, when making 30u chloral hydrate by adding the chlorine in 10u increments you'd end up with 0.04 chlorine left over. This was caused by division in the reaction code rounding up in some cases. Changing division here to always round down fixes it.
* Attempt to fix heat capacity precision assert issues.
Fixes #22126
First, we just increase the tolerance of the assert. It was way too low.
Second, actually put a cap on float drift from one-off _heatCapacity changes.
* Fix float -> FixedPoint2 epsilon for negative number, fix tests.
* Fix DamageableTest
* Oh yeah I need to call CleanReturnAsync
* Automatic changelog update
* WebP lobby images (#25184)
* Allow webp in lobby background files
* Make lobby art webp images
Reduces folder from 10 MB to 2.5 MB without only slight quality loss.
* Update PutLobbyScreensHere.txt
* New lobby art : Blueprint (#25179)
* add
* replace image with webp version
waiting on #25184
* Automatic changelog update
* Diona Nymphs & Splitting (#24630)
* Porting & implementation
* Fix two stupid errors
* Human not humans
* fix audio path
* Fix test fails & update cooldown
* Work on reviews & test fail
* Rework nymph organ system.
* Make the nymph organs nospawn.
* IsDeadIC
* Automatic changelog update
* reform cooldown 10 minutes (#25328)
* Change plant clipping mechanics (#25326)
Make seeds from clipped plants inherit the decreased health from parents.
Also require one growth stage before clipping.
* Automatic changelog update
* Fix nymphs being deleted immediatly after spawning (#25344)
* nymphs now don't get deleted together with the body of the diona
* moved nymph system to server
* Automatic changelog update
* Fix: Grenades don't make trigger sound (#25321)
* Fix: Grenades don't make trigger sound
* transform instead of trycomp transform
---------
Co-authored-by: Plykiya <plykiya@protonmail.com>
* fixed the specific if statement called when plant age is under 0 (#25346)
* Save round information into replay_final.yml (#23013)
* Save round information into the replay
* Add round end text too
* This is way better
* Get actual job
* oop
* OK THERE
* Fake line endings to make life easier
* I was told this yaml is legal
* I just realised this will make my life easier
* REVIEWS BABY IM A PROGRAMMER MOMMY
* Live pjb reaction
* Live pjb reaction 2
* Reviews 2
* Dont need this
* Please no more have mercy on my soul
* Oh frick
* Adds a massban flag to the admin flags (#25327)
Adds a massban flag to the admin flags used on ss14 to ban large amounts of players rom a .tsv file
Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com>
* Automatic changelog update
* Fix missing line in nuke exploding sprite (#25351)
I could've sworn I corrected this before committing but guess not ???
* Added Evidence Markers for the Detective! (#25255)
* added evidence markers
* box tweak
* fixed a spelling mistake
* new sprites, tweaked yml too
* Add "tailed" hair (#25216)
* add
* yes
* Clean up scars.yml and add a new chest scar (#25215)
add
* Automatic changelog update
* Add new "OptionsVisualizer" (#25128)
This is a visualizer somewhat similar to the Generic. It allows configuring appearance info based on specific CVars the user has set. This allows YAML to easily configure alternatives for accessibility CVars like reduced motion.
* Suffix spelling mistake on seed vendor (#25352)
spelling error
* Update engine to v210.1.1 (#25354)
Important fixes from the UI PR
* Stop wagging tails on crit (#25323)
* Add Flammable Touch Reaction for liquid tritium
* Stop tail wagging action on crit
* Revert "Add Flammable Touch Reaction for liquid tritium"
This reverts commit 41be57b058a0cdee0cecfc51eb1c4a25631e62f3.
* Automatic changelog update
* EVA suit helmets now have (un)equip sounds (#25349)
add (un)equip sounds to EVA helms
* Automatic changelog update
* Newton Cradle Fix + Addition to Bureaucracy Crate (#25357)
fixes
makes the newton cradle not able to decimate ears while also adding it to the bureaucracy crate and lowering its volume and range a little bit
* Automatic changelog update
* Shadow anomaly respects "reduced motion" (#25355)
Enabling "reduced motion" now makes the smoke effects not animate. This helps some people with vision issues.
* Fixed directional window durability (#25259)
shit
* Very little cleanup (#25364)
* Origin Station Update 18.02.2024 (medbay update) (#25369)
* Update Credits (#25360)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Add bio reactions (#25366)
* added more foodstuff breakdowns
* Calcium doesn't exist; moved phosphorus to protein
* tested reactions- some should be centrifuged
* more testing tweaks
* Automatic changelog update
* Increase printing price for neck clothes (#25375)
* Increase printing price
* Update clothing.yml
* Update Core (#25383)
add
* add icons for drinks in Solar's (#25301)
* add icons for drinks in Solar's
fixed colors of tea
* consistently use capitals for color codes
* don't add extra whitespace
* Automatic changelog update
* Small Nymph Changes (#25363)
* Emote sounds, accent & doorbump
* Oops
* Only non-brains can't talk
* Automatic changelog update
* Bump nixpkgs rev (#25361)
* Bump nixpkgs revision
* Update nix-direnv
* Remove extra nix functionalities
Both nix-direnv and legacy command nix-shell fail. Reverting to
flakes-only commands.
* Pin nixpkgs per suggestion
See https://github.com/space-wizards/space-station-14/pull/25361#discussion_r1494196038
* Revert nix-direnv removal
* Add python3 to shell.nix
* Adds guidebooks to the 4 learner roles (#25388)
added the books
* Automatic changelog update
* Add support for metamorphic fill levels (#25022)
* Added support for fill levels to metamorphic glasses
* Fix warnings and cleanup
* Don't break non-metamorphic fills!
* Vending UI facelift (#25377)
* Convert to fancy window + added footer + add list spacing
* margin add
* Automatic changelog update
* Make metamorphic glasses use last solution's empty sprite (#25322)
Make metamorphic glasses use empty sprite for the last solution they contained.
* Moths can eat plushies (#25382)
* Update toys.yml
* fix
* New sound of eating
* Increased eating time
* New sounds+sorting
* Automatic changelog update
* Make pills colorful and labeled (#25284)
* Make pills colorful and labeled
* Inherit pill sprites from parent
* Add Flammable Touch Reaction for liquid tritium (#25281)
* randomized sexless species now have epicene gender by default (#25282)
Fikss
* Automatic changelog update
* Mechanized treatment improvements (#25356)
Medical module merge
* Hotfix: Set round end information for replays back to null on round start instead of round end (#25394)
* Hotfix
* I dont think i need this now
* Fix action state handling bug (#25395)
* Rejig action state handling
* Fix entity arg
* Fix deserialization
* Automatic changelog update
* Fix admin notes and database time nonsense. (#25280)
God bloody christ. There's like three layers of shit here.
So firstly, apparently we were still using Npgsql.EnableLegacyTimestampBehavior. This means that time values (which are stored UTC in the database) were converted to local time when read out. This meant they were passed around as kind Local to clients (instead of UTC in the case of SQLite). That's easy enough to fix just turn off the flag and fix the couple spots we're passing a local DateTime ez.
Oh but it turns out there's a DIFFERENT problem with SQLite: See SQLite we definitely store the DateTimes as UTC, but when Microsoft.Data.Sqlite reads them it reads them as Kind Unspecified instead of Utc.
Why are these so bad? Because the admin notes system passes DateTime instances from EF Core straight to the rest of the game code. And that means it's a PAIN IN THE ASS to run the necessary conversions to fix the DateTime instances. GOD DAMNIT now I have to make a whole new set of "Record" entities so we avoid leaking the EF Core model entities. WAAAAAAA.
Fixes #19897
* PlayerListControl fixes. (#25248)
* PlayerListControl fixes.
Fix a button being selected by default always, which then can't be selected properly for real. This affected multiple admin UIs.
This broke due to upstream RT changes but ButtonGroup was always kinda busted so whatever. Uses the new IsNoneSetAllowed to implement everything properly.
Also make sure the selected player STAYS selected when filtering the list and stuff.
Also this PlayerInfo record has been changed to only do equality on the User ID because otherwise it'd need to compare each field individually which would be weird.
* Revert changes to ListContainer
This change was made default in the engine, no longer necessary here.
* Automatic changelog update
* Ore crab structural weakness (#25390)
* Attempt to change structural dmg of ore crab
* Made ore crabs susceptible to structural damage
* Automatic changelog update
* Set nav map icon textures to use bilinear filtering (#25411)
This just makes them look slightly better when zoomed.
* Fix PlayerListControl re-raising selection changed when repopulated. (#25412)
Now we just skip duplicate "item pressed" events from the ListContainer.
This caused the ahelp window to unfocus the message box after sending something. Flow is something like this: you send ahelp -> bwoink window refreshes player list due to new bwoink -> repopulated player list -> sent selection change -> repopulates right pane -> line edit gets unfocused.
* Train station (#24927)
* some content
* some next content
* fixes
* remove stained window
* return bot message?
* woah! Full map added!
* map update
* big update
* camera server
* Corvax playtest feedback
* add mail system and 30$ meteor shield
* update
* updatik
* hardwork
* pipip
* update
* remove from mappool
* fixes
* sentipode
* e
* Mindshield outline flashes, (#25409)
* Add animation support to status icons
Animated like any other entity. Change the png to have all frames, add delays in meta.json, and you're good to go.
* Dirty "fix" for the crashing.
Still have no idea why files cannot be read without changing their path in the yaml.
* Sloth review ig
I still have no idea why it wont work with /Textures/ missing as a prefix.
* Automatic changelog update
* Small Artifact Fixes (#25416)
* 20kw artifact fix
* Change that hopefully doesn't completely break storage artifacts without me realising
* Add roundid to replay_final.yml (#25398)
oopsy i forgor
* Resprite & hand position correction of Nettle & Death Nettle (#25421)
Resprite of Nettle & Death Nettle. Corrected R & L hand locations for all orientations of both plants.
* Automatic changelog update
* balance Explosive Technology (#25397)
* update arsenal yml
balance ExplosiveTechnology
* small changes in arsenal research
small changes in arsenal research
* Update arsenal.yml
* Automatic changelog update
* Tiny shove fix. (#25353)
* Remove second shove check.
* Change when popups and sounds are created.
Reduces phantom shoves that feel bad.
* why didn't i think of this i saw it earlier...
* Replaced Is fields with prefix
* remove some dependencies to fix tests???
* Automatic changelog update
* fix: пара фиксов апстрима
* Revert "Nuke fancification (#25297)"
This reverts commit 3a45d519dcc3679375b5239b6f1881cdd1a07344.
# Conflicts:
# Resources/Textures/Objects/Devices/nuke.rsi/meta.json
# Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_deployed.png
# Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_exploding.png
# Resources/Textures/Objects/Devices/nuke.rsi/nuclearbomb_timing.png
* Revert "Shuttle floor resprite (#25127)"
This reverts commit a93466ac24c7256d4b584ba830c4fa1cda253d5a.
# Conflicts:
# Resources/Textures/Tiles/shuttleblue.png
# Resources/Textures/Tiles/shuttleorange.png
# Resources/Textures/Tiles/shuttlepurple.png
# Resources/Textures/Tiles/shuttlered.png
# Resources/Textures/Tiles/shuttlewhite.png
* Revert "New lobby art : Blueprint (#25179)"
This reverts commit 90d02a590117b54a16b3af848f3b2fe0195724c9.
# Conflicts:
# Resources/Prototypes/lobbyscreens.yml
* Revert "Added Monitor Computer Boards to Observation Kit (#24979)"
This reverts commit c5027b51ecc7387a678e194fd7733a03349be536.
* Revert "Small t-ray scanner resprite (#25047)"
This reverts commit 601da0c3a33279beff818f82913ed2583e48c642.
# Conflicts:
# Resources/Textures/Objects/Tools/t-ray.rsi/tray-off.png
# Resources/Textures/Objects/Tools/t-ray.rsi/tray-on.png
* add: переводы
* fix: фиксы под тесты
---------
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: Emisse <99158783+Emisse@users.noreply.github.com>
Co-authored-by: Armok <155400926+ARMOKS@users.noreply.github.com>
Co-authored-by: Kevin Zheng <kevinz5000@gmail.com>
Co-authored-by: PoorMansDreams <150595537+PoorMansDreams@users.noreply.github.com>
Co-authored-by: Hannah Giovanna Dawson <karakkaraz@gmail.com>
Co-authored-by: lapatison <100279397+lapatison@users.noreply.github.com>
Co-authored-by: router <messagebus@vk.com>
Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
Co-authored-by: Varen <ychwack@hotmail.it>
Co-authored-by: potato1234_x <79580518+potato1234x@users.noreply.github.com>
Co-authored-by: Hanz <41141796+Hanzdegloker@users.noreply.github.com>
Co-authored-by: Ubaser <134914314+UbaserB@users.noreply.github.com>
Co-authored-by: themias <89101928+themias@users.noreply.github.com>
Co-authored-by: Alzore <140123969+Blackern5000@users.noreply.github.com>
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com>
Co-authored-by: Plykiya <plykiya@protonmail.com>
Co-authored-by: YuNii <benjamin@bhenrich.de>
Co-authored-by: Kara <lunarautomaton6@gmail.com>
Co-authored-by: Mangohydra <156087924+Mangohydra@users.noreply.github.com>
Co-authored-by: Nim <128169402+Nimfar11@users.noreply.github.com>
Co-authored-by: Jezithyr <jezithyr@gmail.com>
Co-authored-by: Fluffiest Floofers <thebluewulf@gmail.com>
Co-authored-by: Jajsha <101492056+Zap527@users.noreply.github.com>
Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Tayrtahn <tayrtahn@gmail.com>
Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com>
Co-authored-by: forgotmyotheraccount <133569389+forgotmyotheraccount@users.noreply.github.com>
Co-authored-by: FungiFellow <151778459+FungiFellow@users.noreply.github.com>
Co-authored-by: Ko4ergaPunk <62609550+Ko4ergaPunk@users.noreply.github.com>
Co-authored-by: Ilya246 <57039557+Ilya246@users.noreply.github.com>
Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com>
Co-authored-by: Alex Nordlund <deep.alexander@gmail.com>
Co-authored-by: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com>
Co-authored-by: deepdarkdepths <155149356+deepdarkdepths@users.noreply.github.com>
Co-authored-by: Genkail <50331122+Genkail@users.noreply.github.com>
Co-authored-by: Vasilis <vasilis@pikachu.systems>
Co-authored-by: James Simonson <jamessimo89@gmail.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: icekot8 <93311212+icekot8@users.noreply.github.com>
Co-authored-by: Agoichi <92464780+Agoichi@users.noreply.github.com>
Co-authored-by: KREKS <132602258+xKREKSx@users.noreply.github.com>
Co-authored-by: 0x6273 <0x40@keemail.me>
Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com>
Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Guilherme Ornel <86210200+joshepvodka@users.noreply.github.com>
Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com>
Co-authored-by: wafehling <wafehling@users.noreply.github.com>
Co-authored-by: Interrobang01 <113810873+Interrobang01@users.noreply.github.com>
Co-authored-by: k3yw <grenadiumdota@gmail.com>
Co-authored-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Co-authored-by: Jeff <velcroboy333@hotmail.com>
Co-authored-by: Jessica M <jessica@jessicamaybe.com>
Co-authored-by: Jessica M <jessica@maybe.sh>
Co-authored-by: Zadeon <loldude9000@gmail.com>
Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com>
Co-authored-by: Menshin <Menshin@users.noreply.github.com>
Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com>
Co-authored-by: liltenhead <104418166+liltenhead@users.noreply.github.com>
Co-authored-by: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Co-authored-by: Daxxi3 <158596935+Daxxi3@users.noreply.github.com>
Co-authored-by: MACMAN2003 <macman2003c@gmail.com>
Co-authored-by: Golinth <amh2023@gmail.com>
Co-authored-by: Łukasz Mędrek <lukasz@lukaszm.xyz>
Co-authored-by: PotentiallyTom <67602105+PotentiallyTom@users.noreply.github.com>
Co-authored-by: MilenVolf <63782763+MilenVolf@users.noreply.github.com>
Co-authored-by: LankLTE <135308300+LankLTE@users.noreply.github.com>
Co-authored-by: Flesh <62557990+PolterTzi@users.noreply.github.com>
Co-authored-by: Arendian <137322659+Arendian@users.noreply.github.com>
Co-authored-by: Geekyhobo <66805063+Geekyhobo@users.noreply.github.com>
Co-authored-by: Geekyhobo <66805063+Ahlytlex@users.noreply.github.com>
Co-authored-by: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com>
Co-authored-by: Peptide90 <78795277+Peptide90@users.noreply.github.com>
Co-authored-by: ArchPigeon <bookmaster3@gmail.com>
Co-authored-by: Killerqu00 <47712032+Killerqu00@users.noreply.github.com>
Co-authored-by: Firewatch <54725557+musicmanvr@users.noreply.github.com>
Co-authored-by: Vigers Ray <60344369+VigersRay@users.noreply.github.com>
Co-authored-by: genderGeometries <159584039+genderGeometries@users.noreply.github.com>
Co-authored-by: hiucko <86206040+Hiucko@users.noreply.github.com>
Co-authored-by: Sybil <azurerosegarden@gmail.com>
Co-authored-by: Ioannis Eleftheriou <me@yath.xyz>
Co-authored-by: marboww <152051971+marboww@users.noreply.github.com>
Co-authored-by: veprolet <68151557+veprolet@users.noreply.github.com>
Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com>
Co-authored-by: Tonydatguy <154929293+Tonydatguy@users.noreply.github.com>
Co-authored-by: Gotimanga <127038462+Gotimanga@users.noreply.github.com>
Co-authored-by: MjrLandWhale <brandonemitch@gmail.com>
Co-authored-by: takemysoult <143123247+takemysoult@users.noreply.github.com>
Co-authored-by: Callmore <22885888+Callmore@users.noreply.github.com>
2024-02-23 23:05:48 +07:00
var wrappedMessage = Loc . GetString ( speech . Bold ? "chat-manager-entity-say-bold-wrap-message" : "chat-manager-entity-say-wrap-message" ,
( "entityName" , name ) ,
2024-01-17 18:17:35 +07:00
( "verb" , Loc . GetString ( _random . Pick ( speech . SpeechVerbStrings ) ) ) ,
( "fontType" , speech . FontId ) ,
( "fontSize" , speech . FontSize ) ,
2024-02-02 14:01:41 +09:00
( "message" , message ) ) ;
2022-03-30 22:21:58 -07:00
2023-05-24 17:41:22 +06:00
//WD-EDIT
if ( TryComp < VoiceOfGodComponent > ( source , out var comp ) )
{
wrappedMessage = Loc . GetString ( comp . ChatLoc ,
( "entityName" , name ) ,
2024-02-02 14:01:41 +09:00
( "message" , message ) ,
2023-05-24 17:41:22 +06:00
( "color" , comp . ChatColor )
) ;
}
//WD-EDIT
2023-05-04 20:08:08 +01:00
SendInVoiceRange ( ChatChannel . Local , message , wrappedMessage , source , range ) ;
2022-03-30 22:21:58 -07:00
2023-04-27 08:03:44 +06:00
var ev = new EntitySpokeEvent ( source , message , originalMessage , null , null ) ;
2022-11-15 17:09:27 +13:00
RaiseLocalEvent ( source , ev , true ) ;
2022-06-27 15:56:38 +12:00
2022-08-07 20:21:56 -03:00
// To avoid logging any messages sent by entities that are not players, like vendors, cloning, etc.
2023-12-30 00:38:11 +00:00
// Also doesn't log if hideLog is true.
2023-04-25 02:17:40 +06:00
if ( ! HasComp < ActorComponent > ( source ) | | hideLog )
2022-08-07 20:21:56 -03:00
return ;
2022-06-27 15:56:38 +12:00
if ( originalMessage = = message )
2023-02-11 13:26:44 -06:00
{
if ( name ! = Name ( source ) )
2024-01-28 16:31:58 +07:00
{
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Say from {ToPrettyString(source):user} as {name}: {originalMessage}." ) ;
}
2023-02-11 13:26:44 -06:00
else
2024-01-28 16:31:58 +07:00
{
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Say from {ToPrettyString(source):user}: {originalMessage}." ) ;
}
2023-02-11 13:26:44 -06:00
}
2022-06-27 15:56:38 +12:00
else
2023-02-11 13:26:44 -06:00
{
if ( name ! = Name ( source ) )
2023-04-25 02:17:40 +06:00
{
2023-02-11 13:26:44 -06:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Say from {ToPrettyString(source):user} as {name}, original: {originalMessage}, transformed: {message}." ) ;
2023-04-25 02:17:40 +06:00
}
2023-02-11 13:26:44 -06:00
else
2023-04-25 02:17:40 +06:00
{
2023-02-11 13:26:44 -06:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Say from {ToPrettyString(source):user}, original: {originalMessage}, transformed: {message}." ) ;
2023-04-25 02:17:40 +06:00
}
2023-02-11 13:26:44 -06:00
}
2022-03-30 22:21:58 -07:00
}
2023-08-11 22:56:34 -07:00
private void SendEntityWhisper (
EntityUid source ,
string originalMessage ,
ChatTransmitRange range ,
RadioChannelPrototype ? channel ,
string? nameOverride ,
bool hideLog = false ,
bool ignoreActionBlocker = false
2024-01-28 16:31:58 +07:00
)
2022-03-30 22:21:58 -07:00
{
2023-08-11 22:56:34 -07:00
if ( ! _actionBlocker . CanSpeak ( source ) & & ! ignoreActionBlocker )
2022-07-26 16:49:23 -07:00
return ;
2022-03-30 22:21:58 -07:00
2023-12-30 00:38:11 +00:00
var message = TransformSpeech ( source , FormattedMessage . RemoveMarkup ( originalMessage ) ) ;
2022-06-29 15:13:01 +12:00
if ( message . Length = = 0 )
return ;
2023-04-28 10:10:25 +06:00
message = AfterSpeechTransformed ( source , message ) ;
2022-03-30 22:21:58 -07:00
var obfuscatedMessage = ObfuscateMessageReadability ( message , 0.2f ) ;
2023-08-01 14:43:02 +00:00
// get the entity's name by visual identity (if no override provided).
2023-04-25 02:17:40 +06:00
var nameIdentity = FormattedMessage . EscapeText ( nameOverride ? ? Identity . Name ( source , EntityManager ) ) ;
2023-08-01 14:43:02 +00:00
// get the entity's name by voice (if no override provided).
2022-11-15 17:09:27 +13:00
string name ;
if ( nameOverride ! = null )
{
name = nameOverride ;
}
else
{
var nameEv = new TransformSpeakerNameEvent ( source , Name ( source ) ) ;
RaiseLocalEvent ( source , nameEv ) ;
name = nameEv . Name ;
}
2024-01-28 16:31:58 +07:00
2022-11-15 17:09:27 +13:00
name = FormattedMessage . EscapeText ( name ) ;
2022-03-30 22:21:58 -07:00
2022-11-23 00:52:19 +13:00
var wrappedMessage = Loc . GetString ( "chat-manager-entity-whisper-wrap-message" ,
2023-04-28 10:10:25 +06:00
( "entityName" , name ) , ( "message" , message ) ) ;
2022-11-23 00:52:19 +13:00
var wrappedobfuscatedMessage = Loc . GetString ( "chat-manager-entity-whisper-wrap-message" ,
2023-04-28 10:10:25 +06:00
( "entityName" , nameIdentity ) , ( "message" , obfuscatedMessage ) ) ;
2022-11-23 00:52:19 +13:00
2023-08-01 14:43:02 +00:00
var wrappedUnknownMessage = Loc . GetString ( "chat-manager-entity-whisper-unknown-wrap-message" ,
2023-04-28 10:10:25 +06:00
( "message" , obfuscatedMessage ) ) ;
2022-11-23 00:52:19 +13:00
2023-08-01 14:43:02 +00:00
foreach ( var ( session , data ) in GetRecipients ( source , WhisperMuffledRange ) )
2022-03-30 22:21:58 -07:00
{
2023-04-25 02:17:40 +06:00
if ( session . AttachedEntity is not { Valid : true } )
2022-03-30 22:21:58 -07:00
continue ;
2024-01-28 16:31:58 +07:00
2023-04-25 02:17:40 +06:00
var listener = session . AttachedEntity . Value ;
2022-03-30 22:21:58 -07:00
2023-05-04 20:08:08 +01:00
if ( MessageRangeCheck ( session , data , range ) ! = MessageRangeCheckResult . Full )
2022-11-15 17:09:27 +13:00
continue ; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them.
2022-03-30 22:21:58 -07:00
2023-08-01 14:43:02 +00:00
if ( data . Range < = WhisperClearRange )
2024-01-28 16:31:58 +07:00
{
_chatManager . ChatMessageToOne ( ChatChannel . Whisper , message , wrappedMessage , source , false ,
session . Channel ) ;
}
2023-08-01 14:43:02 +00:00
//If listener is too far, they only hear fragments of the message
//Collisiongroup.Opaque is not ideal for this use. Preferably, there should be a check specifically with "Can Ent1 see Ent2" in mind
2024-01-28 16:31:58 +07:00
else if ( _interactionSystem . InRangeUnobstructed ( source , listener , WhisperMuffledRange ,
Shared . Physics . CollisionGroup . Opaque ) ) //Shared.Physics.CollisionGroup.Opaque
{
_chatManager . ChatMessageToOne ( ChatChannel . Whisper , obfuscatedMessage , wrappedobfuscatedMessage , source ,
false , session . Channel ) ;
}
2023-08-01 14:43:02 +00:00
//If listener is too far and has no line of sight, they can't identify the whisperer's identity
else
2024-01-28 16:31:58 +07:00
{
_chatManager . ChatMessageToOne ( ChatChannel . Whisper , obfuscatedMessage , wrappedUnknownMessage , source ,
false , session . Channel ) ;
}
2022-03-30 22:21:58 -07:00
}
2024-01-28 16:31:58 +07:00
_replay . RecordServerMessage ( new ChatMessage ( ChatChannel . Whisper , message , wrappedMessage , GetNetEntity ( source ) ,
null , MessageRangeHideChatForReplay ( range ) ) ) ;
2022-11-23 00:52:19 +13:00
2023-04-27 08:03:44 +06:00
var ev = new EntitySpokeEvent ( source , message , originalMessage , channel , obfuscatedMessage ) ;
2022-11-15 17:09:27 +13:00
RaiseLocalEvent ( source , ev , true ) ;
2023-04-25 02:17:40 +06:00
if ( hideLog )
return ;
if ( originalMessage = = message )
{
if ( name ! = Name ( source ) )
2024-01-28 16:31:58 +07:00
{
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Whisper from {ToPrettyString(source):user} as {name}: {originalMessage}." ) ;
}
2023-04-25 02:17:40 +06:00
else
2024-01-28 16:31:58 +07:00
{
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Whisper from {ToPrettyString(source):user}: {originalMessage}." ) ;
}
2023-04-25 02:17:40 +06:00
}
else
{
if ( name ! = Name ( source ) )
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
{
2023-04-25 02:17:40 +06:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Whisper from {ToPrettyString(source):user} as {name}, original: {originalMessage}, transformed: {message}." ) ;
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
}
2023-02-11 13:26:44 -06:00
else
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
{
2023-04-25 02:17:40 +06:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
2023-02-11 13:26:44 -06:00
$"Whisper from {ToPrettyString(source):user}, original: {originalMessage}, transformed: {message}." ) ;
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
}
2023-04-25 02:17:40 +06:00
}
2022-03-30 22:21:58 -07:00
}
2023-08-11 22:56:34 -07:00
private void SendEntityEmote (
EntityUid source ,
string action ,
ChatTransmitRange range ,
string? nameOverride ,
bool hideLog = false ,
bool checkEmote = true ,
2023-11-05 18:19:59 -08:00
bool ignoreActionBlocker = false ,
2023-08-29 05:59:14 +06:00
NetUserId ? author = null
2024-01-28 16:31:58 +07:00
)
2022-03-30 22:21:58 -07:00
{
2023-08-11 22:56:34 -07:00
if ( ! _actionBlocker . CanEmote ( source ) & & ! ignoreActionBlocker )
return ;
2022-03-30 22:21:58 -07:00
2022-11-15 17:09:27 +13:00
// get the entity's apparent name (if no override provided).
2023-08-11 22:56:34 -07:00
var ent = Identity . Entity ( source , EntityManager ) ;
2023-04-25 02:17:40 +06:00
var name = FormattedMessage . EscapeText ( nameOverride ? ? Name ( ent ) ) ;
2022-10-18 19:59:09 +13:00
2022-07-13 22:23:55 -07:00
// Emotes use Identity.Name, since it doesn't actually involve your voice at all.
2022-10-18 19:59:09 +13:00
var wrappedMessage = Loc . GetString ( "chat-manager-entity-me-wrap-message" ,
( "entityName" , name ) ,
2023-08-11 22:56:34 -07:00
( "entity" , ent ) ,
2023-12-30 00:38:11 +00:00
( "message" , FormattedMessage . RemoveMarkup ( action ) ) ) ;
2022-03-30 22:21:58 -07:00
2023-01-25 17:29:41 +01:00
if ( checkEmote )
TryEmoteChatInput ( source , action ) ;
2024-01-28 16:31:58 +07:00
2023-11-05 18:19:59 -08:00
SendInVoiceRange ( ChatChannel . Emotes , action , wrappedMessage , source , range , author ) ;
2023-04-25 02:17:40 +06:00
if ( hideLog )
return ;
if ( name ! = Name ( source ) )
2024-01-28 16:31:58 +07:00
{
_adminLogger . Add ( LogType . Chat , LogImpact . Low ,
$"Emote from {ToPrettyString(source):user} as {name}: {action}" ) ;
}
2023-04-25 02:17:40 +06:00
else
2024-01-28 16:31:58 +07:00
{
2023-04-25 02:17:40 +06:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"Emote from {ToPrettyString(source):user}: {action}" ) ;
2024-01-28 16:31:58 +07:00
}
2023-04-27 06:01:05 +06:00
//WD-EDIT
2024-01-28 16:31:58 +07:00
var ckey = string . Empty ;
2023-04-27 06:01:05 +06:00
if ( TryComp < ActorComponent > ( source , out var actorComponent ) )
{
ckey = actorComponent . PlayerSession . Name ;
}
2024-01-28 16:31:58 +07:00
if ( string . IsNullOrEmpty ( ckey ) )
return ;
2023-04-27 06:01:05 +06:00
2024-01-28 16:31:58 +07:00
var utkaEmoteEvent = new UtkaChatMeEvent
2023-04-27 06:01:05 +06:00
{
Ckey = ckey ,
Message = action ,
CharacterName = MetaData ( source ) . EntityName
} ;
2024-01-21 14:04:38 +03:00
_pandaWeb . SendBotPostMessage ( utkaEmoteEvent ) ;
2023-04-27 06:01:05 +06:00
//WD-EDIT
2022-03-30 22:21:58 -07:00
}
// ReSharper disable once InconsistentNaming
2023-10-28 09:59:53 +11:00
private void SendLOOC ( EntityUid source , ICommonSession player , string message , bool hideChat )
2022-03-30 22:21:58 -07:00
{
2022-10-18 19:59:09 +13:00
var name = FormattedMessage . EscapeText ( Identity . Name ( source , EntityManager ) ) ;
2023-04-28 04:44:00 +06:00
if ( _adminManager . HasAdminFlag ( player , AdminFlags . Admin ) )
2022-03-30 22:21:58 -07:00
{
2024-03-26 15:52:23 +07:00
if ( ! _adminLoocEnabled )
2023-04-25 02:17:40 +06:00
return ;
}
else if ( ! _loocEnabled )
{
return ;
2022-03-30 22:21:58 -07:00
}
2023-07-26 02:02:48 -04:00
// If crit player LOOC is disabled, don't send the message at all.
if ( ! _critLoocEnabled & & _mobStateSystem . IsCritical ( source ) )
return ;
2022-10-18 19:59:09 +13:00
var wrappedMessage = Loc . GetString ( "chat-manager-entity-looc-wrap-message" ,
( "entityName" , name ) ,
( "message" , FormattedMessage . EscapeText ( message ) ) ) ;
2022-03-30 22:21:58 -07:00
2024-01-28 16:31:58 +07:00
SendInVoiceRange ( ChatChannel . LOOC , message , wrappedMessage , source ,
hideChat ? ChatTransmitRange . HideChat : ChatTransmitRange . Normal , player . UserId ) ;
2022-05-28 23:41:17 -07:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"LOOC from {player:Player}: {message}" ) ;
2022-03-30 22:21:58 -07:00
}
2024-01-31 14:01:35 +00:00
private void SendChangelingChat ( EntityUid source , ICommonSession player , string message , bool hideChat )
{
if ( ! TryComp < ChangelingComponent > ( source , out var changeling ) )
return ;
var clients = GetChangelingChatClients ( ) ;
var playerName = changeling . HiveName ;
message = $"{char.ToUpper(message[0])}{message[1..]}" ;
var wrappedMessage = Loc . GetString ( "chat-manager-send-changeling-chat-wrap-message" ,
( "player" , playerName ) ,
( "message" , FormattedMessage . EscapeText ( message ) ) ) ;
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"Changeling chat from {player:Player}-({playerName}): {message}" ) ;
_chatManager . ChatMessageToMany ( ChatChannel . Changeling , message , wrappedMessage , source ,
hideChat , false , clients . ToList ( ) ) ;
}
private IEnumerable < INetChannel > GetChangelingChatClients ( )
{
return Filter . Empty ( )
. AddWhereAttachedEntity ( HasComp < GhostComponent > )
. AddWhereAttachedEntity ( HasComp < ChangelingComponent > )
. Recipients
. Select ( p = > p . Channel ) ;
}
2024-01-27 15:19:52 +03:00
// WD EDIT
private void SendCultChat ( EntityUid source , ICommonSession player , string message , bool hideChat )
{
var clients = GetCultChatClients ( ) ;
var playerName = Name ( source ) ;
2024-01-28 16:31:58 +07:00
var wrappedMessage = Loc . GetString ( "chat-manager-send-cult-chat-wrap-message" ,
2024-01-27 15:19:52 +03:00
( "channelName" , Loc . GetString ( "chat-manager-cult-channel-name" ) ) ,
( "player" , playerName ) ,
( "message" , FormattedMessage . EscapeText ( message ) ) ) ;
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"Cult chat from {player:Player}: {message}" ) ;
2024-01-28 16:31:58 +07:00
_chatManager . ChatMessageToMany ( ChatChannel . Cult , message , wrappedMessage , source , hideChat , false ,
clients . ToList ( ) ) ;
2024-02-19 13:52:35 +09:00
SendEntityWhisper ( source , _wordGenerator . GenerateText ( message ) , ChatTransmitRange . Normal , null , null ) ;
2024-01-27 15:19:52 +03:00
}
private IEnumerable < INetChannel > GetCultChatClients ( )
{
return Filter . Empty ( )
. AddWhereAttachedEntity ( HasComp < GhostComponent > )
. AddWhereAttachedEntity ( HasComp < CultistComponent > )
2024-08-03 15:23:46 +00:00
. AddWhereAttachedEntity ( HasComp < ConstructComponent > )
2024-01-27 15:19:52 +03:00
. Recipients
. Union ( _adminManager . ActiveAdmins )
2024-01-28 16:31:58 +07:00
. Select ( p = > p . Channel ) ;
2024-01-27 15:19:52 +03:00
}
2023-10-28 09:59:53 +11:00
private void SendDeadChat ( EntityUid source , ICommonSession player , string message , bool hideChat )
2022-03-30 22:21:58 -07:00
{
var clients = GetDeadChatClients ( ) ;
var playerName = Name ( source ) ;
2022-10-18 19:59:09 +13:00
string wrappedMessage ;
2023-07-16 11:32:42 +03:00
if ( _adminManager . IsAdmin ( player ) & &
2024-01-28 16:31:58 +07:00
_netConfigurationManager . GetClientCVar ( player . Channel , WhiteCVars . DeadChatAdmin ) ) // WD
2022-03-30 22:21:58 -07:00
{
2022-10-18 19:59:09 +13:00
wrappedMessage = Loc . GetString ( "chat-manager-send-admin-dead-chat-wrap-message" ,
2022-03-30 22:21:58 -07:00
( "adminChannelName" , Loc . GetString ( "chat-manager-admin-channel-name" ) ) ,
2023-04-25 02:17:40 +06:00
( "userName" , player . Channel . UserName ) ,
2022-10-18 19:59:09 +13:00
( "message" , FormattedMessage . EscapeText ( message ) ) ) ;
2024-01-28 16:31:58 +07:00
2022-08-07 20:21:56 -03:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"Admin dead chat from {player:Player}: {message}" ) ;
2022-03-30 22:21:58 -07:00
}
else
{
2022-10-18 19:59:09 +13:00
wrappedMessage = Loc . GetString ( "chat-manager-send-dead-chat-wrap-message" ,
2022-03-30 22:21:58 -07:00
( "deadChannelName" , Loc . GetString ( "chat-manager-dead-channel-name" ) ) ,
2022-10-18 19:59:09 +13:00
( "playerName" , ( playerName ) ) ,
( "message" , FormattedMessage . EscapeText ( message ) ) ) ;
2024-01-28 16:31:58 +07:00
2022-08-07 20:21:56 -03:00
_adminLogger . Add ( LogType . Chat , LogImpact . Low , $"Dead chat from {player:Player}: {message}" ) ;
2022-03-30 22:21:58 -07:00
}
2024-01-28 16:31:58 +07:00
_chatManager . ChatMessageToMany ( ChatChannel . Dead , message , wrappedMessage , source , hideChat , true ,
clients . ToList ( ) , author : player . UserId ) ;
2022-03-30 22:21:58 -07:00
}
2024-01-28 16:31:58 +07:00
#endregion
#region Utility
2022-03-30 22:21:58 -07:00
2023-12-30 00:38:11 +00:00
private enum MessageRangeCheckResult
{
2023-05-04 20:08:08 +01:00
Disallowed ,
HideChat ,
Full
}
/// <summary>
/// If hideChat should be set as far as replays are concerned.
/// </summary>
private bool MessageRangeHideChatForReplay ( ChatTransmitRange range )
{
return range = = ChatTransmitRange . HideChat ;
}
/// <summary>
/// Checks if a target as returned from GetRecipients should receive the message.
/// Keep in mind data.Range is -1 for out of range observers.
/// </summary>
2024-01-28 16:31:58 +07:00
private MessageRangeCheckResult MessageRangeCheck (
ICommonSession session ,
ICChatRecipientData data ,
ChatTransmitRange range )
2023-05-04 20:08:08 +01:00
{
var initialResult = MessageRangeCheckResult . Full ;
switch ( range )
{
case ChatTransmitRange . Normal :
initialResult = MessageRangeCheckResult . Full ;
break ;
case ChatTransmitRange . GhostRangeLimit :
2024-01-28 16:31:58 +07:00
initialResult = ( data . Observer & & data . Range < 0 & & ! _adminManager . IsAdmin ( session ) )
? MessageRangeCheckResult . HideChat
: MessageRangeCheckResult . Full ;
2023-05-04 20:08:08 +01:00
break ;
case ChatTransmitRange . HideChat :
initialResult = MessageRangeCheckResult . HideChat ;
break ;
case ChatTransmitRange . NoGhosts :
2024-01-28 16:31:58 +07:00
initialResult = ( data . Observer & & ! _adminManager . IsAdmin ( session ) )
? MessageRangeCheckResult . Disallowed
: MessageRangeCheckResult . Full ;
2023-05-04 20:08:08 +01:00
break ;
}
2024-01-28 16:31:58 +07:00
2023-05-04 20:08:08 +01:00
var insistHideChat = data . HideChatOverride ? ? false ;
var insistNoHideChat = ! ( data . HideChatOverride ? ? true ) ;
if ( insistHideChat & & initialResult = = MessageRangeCheckResult . Full )
return MessageRangeCheckResult . HideChat ;
2024-01-28 16:31:58 +07:00
2023-05-04 20:08:08 +01:00
if ( insistNoHideChat & & initialResult = = MessageRangeCheckResult . HideChat )
return MessageRangeCheckResult . Full ;
2024-01-28 16:31:58 +07:00
2023-05-04 20:08:08 +01:00
return initialResult ;
}
2022-03-30 22:21:58 -07:00
/// <summary>
/// Sends a chat message to the given players in range of the source entity.
/// </summary>
2024-01-28 16:31:58 +07:00
public void SendInVoiceRange (
ChatChannel channel ,
string message ,
string wrappedMessage ,
EntityUid source ,
ChatTransmitRange range ,
NetUserId ? author = null )
2022-03-30 22:21:58 -07:00
{
2022-11-15 17:09:27 +13:00
foreach ( var ( session , data ) in GetRecipients ( source , VoiceRange ) )
{
2023-05-04 20:08:08 +01:00
var entRange = MessageRangeCheck ( session , data , range ) ;
if ( entRange = = MessageRangeCheckResult . Disallowed )
continue ;
2024-01-28 16:31:58 +07:00
2023-05-04 20:08:08 +01:00
var entHideChat = entRange = = MessageRangeCheckResult . HideChat ;
2024-01-28 16:31:58 +07:00
_chatManager . ChatMessageToOne ( channel , message , wrappedMessage , source , entHideChat , session . Channel ,
author : author ) ;
2022-11-15 17:09:27 +13:00
}
2022-11-23 00:52:19 +13:00
2024-01-28 16:31:58 +07:00
_replay . RecordServerMessage ( new ChatMessage ( channel , message , wrappedMessage , GetNetEntity ( source ) , null ,
MessageRangeHideChatForReplay ( range ) ) ) ;
2022-03-30 22:21:58 -07:00
}
/// <summary>
/// Returns true if the given player is 'allowed' to send the given message, false otherwise.
/// </summary>
2023-10-28 09:59:53 +11:00
private bool CanSendInGame ( string message , IConsoleShell ? shell = null , ICommonSession ? player = null )
2022-03-30 22:21:58 -07:00
{
// Non-players don't have to worry about these restrictions.
if ( player = = null )
return true ;
2023-06-18 11:33:19 -07:00
var mindContainerComponent = player . ContentData ( ) ? . Mind ;
2022-03-30 22:21:58 -07:00
2023-06-18 11:33:19 -07:00
if ( mindContainerComponent = = null )
2022-03-30 22:21:58 -07:00
{
shell ? . WriteError ( "You don't have a mind!" ) ;
return false ;
}
if ( player . AttachedEntity is not { Valid : true } _ )
{
shell ? . WriteError ( "You don't have an entity!" ) ;
return false ;
}
return ! _chatManager . MessageCharacterLimit ( player , message ) ;
}
// ReSharper disable once InconsistentNaming
2024-01-28 16:31:58 +07:00
private string SanitizeInGameICMessage (
EntityUid source ,
string message ,
out string? emoteStr ,
bool capitalize = true ,
bool punctuate = false ,
bool sanitizeSlang = true )
2022-03-30 22:21:58 -07:00
{
var newMessage = message . Trim ( ) ;
2023-04-28 10:13:54 +06:00
newMessage = _sanitizer . SanitizeTags ( newMessage ) ;
2024-01-28 16:31:58 +07:00
if ( sanitizeSlang )
2023-04-25 02:17:40 +06:00
newMessage = _sanitizer . SanitizeOutSlang ( newMessage ) ;
2024-01-28 16:31:58 +07:00
2022-04-24 20:15:40 -04:00
if ( capitalize )
2022-08-31 13:42:46 +01:00
newMessage = SanitizeMessageCapital ( newMessage ) ;
2024-01-28 16:31:58 +07:00
2022-08-31 13:42:46 +01:00
if ( punctuate )
newMessage = SanitizeMessagePeriod ( newMessage ) ;
2022-03-30 22:21:58 -07:00
_sanitizer . TrySanitizeOutSmilies ( newMessage , source , out newMessage , out emoteStr ) ;
return newMessage ;
}
private string SanitizeInGameOOCMessage ( string message )
{
var newMessage = message . Trim ( ) ;
newMessage = FormattedMessage . EscapeText ( newMessage ) ;
return newMessage ;
}
2022-08-02 15:46:10 +02:00
public string TransformSpeech ( EntityUid sender , string message )
2022-03-30 22:21:58 -07:00
{
var ev = new TransformSpeechEvent ( sender , message ) ;
RaiseLocalEvent ( ev ) ;
return ev . Message ;
}
2023-12-22 09:13:45 -05:00
2023-12-01 19:25:20 -05:00
public bool CheckIgnoreSpeechBlocker ( EntityUid sender , bool ignoreBlocker )
{
if ( ignoreBlocker )
return ignoreBlocker ;
var ev = new CheckIgnoreSpeechBlockerEvent ( sender , ignoreBlocker ) ;
RaiseLocalEvent ( sender , ev , true ) ;
return ev . IgnoreBlocker ;
}
2022-03-30 22:21:58 -07:00
private IEnumerable < INetChannel > GetDeadChatClients ( )
{
return Filter . Empty ( )
2022-07-04 16:00:51 +10:00
. AddWhereAttachedEntity ( HasComp < GhostComponent > )
2022-03-30 22:21:58 -07:00
. Recipients
. Union ( _adminManager . ActiveAdmins )
2024-01-22 23:14:13 +01:00
. Select ( p = > p . Channel ) ;
2022-03-30 22:21:58 -07:00
}
2022-08-31 13:42:46 +01:00
private string SanitizeMessagePeriod ( string message )
{
if ( string . IsNullOrEmpty ( message ) )
return message ;
2024-01-28 16:31:58 +07:00
2022-08-31 13:42:46 +01:00
// Adds a period if the last character is a letter.
if ( char . IsLetter ( message [ ^ 1 ] ) )
message + = "." ;
2024-01-28 16:31:58 +07:00
2022-08-31 13:42:46 +01:00
return message ;
}
2023-10-21 15:43:11 -04:00
[ValidatePrototypeId<ReplacementAccentPrototype>]
2023-04-25 02:17:40 +06:00
public const string ChatSanitizeAccent = "chatsanitize" ;
2023-10-21 15:43:11 -04:00
public string SanitizeMessageReplaceWords ( string message )
{
2023-04-25 02:17:40 +06:00
if ( string . IsNullOrEmpty ( message ) )
return message ;
2023-10-21 15:43:11 -04:00
var msg = message ;
2023-04-25 02:17:40 +06:00
msg = _wordreplacement . ApplyReplacements ( msg , ChatSanitizeAccent ) ;
2023-10-21 15:43:11 -04:00
return msg ;
}
2022-11-15 17:09:27 +13:00
/// <summary>
/// Returns list of players and ranges for all players withing some range. Also returns observers with a range of -1.
/// </summary>
2023-08-01 14:43:02 +00:00
private Dictionary < ICommonSession , ICChatRecipientData > GetRecipients ( EntityUid source , float voiceGetRange )
2022-03-30 22:21:58 -07:00
{
2022-11-15 17:09:27 +13:00
// TODO proper speech occlusion
var recipients = new Dictionary < ICommonSession , ICChatRecipientData > ( ) ;
2023-09-24 13:34:08 -07:00
var ghostHearing = GetEntityQuery < GhostHearingComponent > ( ) ;
2022-03-30 22:21:58 -07:00
var xforms = GetEntityQuery < TransformComponent > ( ) ;
var transformSource = xforms . GetComponent ( source ) ;
var sourceMapId = transformSource . MapID ;
var sourceCoords = transformSource . Coordinates ;
foreach ( var player in _playerManager . Sessions )
{
2023-12-30 00:38:11 +00:00
if ( player . AttachedEntity is not { Valid : true } playerEntity )
2022-03-30 22:21:58 -07:00
continue ;
var transformEntity = xforms . GetComponent ( playerEntity ) ;
2022-11-15 17:09:27 +13:00
if ( transformEntity . MapID ! = sourceMapId )
2022-03-30 22:21:58 -07:00
continue ;
2023-09-24 13:34:08 -07:00
var observer = ghostHearing . HasComponent ( playerEntity ) ;
2022-11-15 17:09:27 +13:00
2023-09-24 13:34:08 -07:00
// even if they are a ghost hearer, in some situations we still need the range
2024-01-28 16:31:58 +07:00
if ( sourceCoords . TryDistance ( EntityManager , transformEntity . Coordinates , out var distance ) & &
distance < voiceGetRange )
2022-11-15 17:09:27 +13:00
{
recipients . Add ( player , new ICChatRecipientData ( distance , observer ) ) ;
continue ;
}
if ( observer )
recipients . Add ( player , new ICChatRecipientData ( - 1 , true ) ) ;
2022-03-30 22:21:58 -07:00
}
2022-11-15 17:09:27 +13:00
2023-08-01 14:43:02 +00:00
RaiseLocalEvent ( new ExpandICChatRecipientstEvent ( source , voiceGetRange , recipients ) ) ;
2022-11-15 17:09:27 +13:00
return recipients ;
}
2023-04-25 02:17:40 +06:00
public readonly record struct ICChatRecipientData ( float Range , bool Observer , bool? HideChatOverride = null ) ;
2022-03-30 22:21:58 -07:00
private string ObfuscateMessageReadability ( string message , float chance )
{
var modifiedMessage = new StringBuilder ( message ) ;
for ( var i = 0 ; i < message . Length ; i + + )
{
if ( char . IsWhiteSpace ( ( modifiedMessage [ i ] ) ) )
{
continue ;
}
if ( _random . Prob ( 1 - chance ) )
{
modifiedMessage [ i ] = '~' ;
}
}
return modifiedMessage . ToString ( ) ;
}
2024-01-14 00:37:28 -05:00
public string BuildGibberishString ( IReadOnlyList < char > charOptions , int length )
{
var sb = new StringBuilder ( ) ;
for ( var i = 0 ; i < length ; i + + )
{
sb . Append ( _random . Pick ( charOptions ) ) ;
}
2024-01-28 16:31:58 +07:00
2024-01-14 00:37:28 -05:00
return sb . ToString ( ) ;
}
2024-01-28 16:31:58 +07:00
#endregion
2022-03-30 22:21:58 -07:00
}
2022-11-15 17:09:27 +13:00
/// <summary>
/// This event is raised before chat messages are sent out to clients. This enables some systems to send the chat
/// messages to otherwise out-of view entities (e.g. for multiple viewports from cameras).
/// </summary>
2024-01-28 16:31:58 +07:00
public record ExpandICChatRecipientstEvent (
EntityUid Source ,
float VoiceRange ,
Dictionary < ICommonSession , ChatSystem . ICChatRecipientData > Recipients ) ;
2022-11-15 17:09:27 +13:00
2024-03-26 15:52:23 +07:00
public sealed class TransformSpeakerNameEvent ( EntityUid sender , string name , string? speechVerb = null )
: EntityEventArgs
2022-09-28 19:22:27 -07:00
{
2024-03-26 15:52:23 +07:00
public EntityUid Sender = sender ;
public string Name = name ;
public string? SpeechVerb = speechVerb ;
2022-09-28 19:22:27 -07:00
}
2022-03-30 22:21:58 -07:00
/// <summary>
Northstar Gloves (#16021)
* Added Gloves of North Star, no sprite or talking yet...
* Added sprites for the gloves of the north star...
* Replaced more placeholder sprites for northstar gloves...
* Added gloves of the north star to uplink...
* Added speech on hit, not yet configureable
* Not functional yet, but a step in the right direction I hope...
* IT WORKS!!
* Licensing and cleanup
* Reduced attack speed, changed from chat to popup, added some admin logging. It was causing too much adminlog spam otherwise
* Reorganized some files, final build??
* Changed the adminlog type from Verb to new type ItemConfigure
* More cleanup, fix sprite reference maybe
* Keronshb's suggestions, fixed some stuff, made hit sound use the meaty punch sfx
* Adds support for hiding speak/whisper/emote from adminlogs, makes northstar speak again!
* Some file shuffling, some of Keronshb's requests. Might appear a bit funky in github because vscode kept duplicating files for some reason and I had to delete them
* Made it work with the latest changes on Master
* Final? cleanup, upped dmg to 8, made ui not activate on activateinhand, instead you need to right click
* Set value to 0 credits, that's all
* Well that was much easier than I made it out to be. Now you can only activate the gloves with right click, no more mispredicts.
* Update MeleeWeaponSystem.cs
Iunno why this got changed in the first place, but I'm changin it back
* emptycommit
* emptycommit
* The tiny fixening
2023-05-23 11:12:30 -07:00
/// Raised broadcast in order to transform speech.transmit
2022-03-30 22:21:58 -07:00
/// </summary>
2024-03-26 15:52:23 +07:00
public sealed class TransformSpeechEvent ( EntityUid sender , string message ) : EntityEventArgs
2022-03-30 22:21:58 -07:00
{
2024-03-26 15:52:23 +07:00
public EntityUid Sender = sender ;
public string Message = message ;
2022-03-30 22:21:58 -07:00
}
2024-03-26 15:52:23 +07:00
public sealed class CheckIgnoreSpeechBlockerEvent ( EntityUid sender , bool ignoreBlocker ) : EntityEventArgs
2023-12-01 19:25:20 -05:00
{
2024-03-26 15:52:23 +07:00
public EntityUid Sender = sender ;
public bool IgnoreBlocker = ignoreBlocker ;
2023-12-01 19:25:20 -05:00
}
2022-03-30 22:21:58 -07:00
/// <summary>
/// Raised on an entity when it speaks, either through 'say' or 'whisper'.
/// </summary>
2024-03-26 15:52:23 +07:00
public sealed class EntitySpokeEvent (
EntityUid source ,
string message ,
string originalMessage ,
RadioChannelPrototype ? channel ,
string? obfuscatedMessage )
: EntityEventArgs
2022-03-30 22:21:58 -07:00
{
2024-03-26 15:52:23 +07:00
public readonly EntityUid Source = source ;
public readonly string Message = message ;
public readonly string OriginalMessage = originalMessage ;
public readonly string? ObfuscatedMessage = obfuscatedMessage ; // not null if this was a whisper
2022-11-15 17:09:27 +13:00
/// <summary>
/// If the entity was trying to speak into a radio, this was the channel they were trying to access. If a radio
/// message gets sent on this channel, this should be set to null to prevent duplicate messages.
/// </summary>
2024-03-26 15:52:23 +07:00
public RadioChannelPrototype ? Channel = channel ;
2022-03-30 22:21:58 -07:00
}
2023-04-26 01:21:26 +06:00
//WD-EDIT
2024-03-26 15:52:23 +07:00
public sealed class SetSpeakerColorEvent ( EntityUid sender , string name )
2023-04-26 01:21:26 +06:00
{
2024-03-26 15:52:23 +07:00
public EntityUid Sender { get ; set ; } = sender ;
2023-04-26 01:21:26 +06:00
2024-03-26 15:52:23 +07:00
public string Name { get ; set ; } = name ;
2023-04-26 01:21:26 +06:00
}
2023-04-28 10:10:25 +06:00
2024-03-26 15:52:23 +07:00
public sealed class SpeechTransformedEvent ( EntityUid sender , string message ) : EntityEventArgs
2023-04-28 10:10:25 +06:00
{
2024-03-26 15:52:23 +07:00
public EntityUid Sender = sender ;
public string Message = message ;
2023-04-28 10:10:25 +06:00
}
2023-04-26 01:21:26 +06:00
//WD-EDIT
2022-03-30 22:21:58 -07:00
/// <summary>
/// InGame IC chat is for chat that is specifically ingame (not lobby) but is also in character, i.e. speaking.
/// </summary>
// ReSharper disable once InconsistentNaming
public enum InGameICChatType : byte
{
Speak ,
Emote ,
Whisper
}
/// <summary>
/// InGame OOC chat is for chat that is specifically ingame (not lobby) but is OOC, like deadchat or LOOC.
/// </summary>
public enum InGameOOCChatType : byte
{
Looc ,
2024-01-27 15:19:52 +03:00
Dead ,
2024-01-31 14:01:35 +00:00
Changeling ,
2024-01-27 15:19:52 +03:00
Cult
2022-03-30 22:21:58 -07:00
}
2023-05-04 20:08:08 +01:00
/// <summary>
/// Controls transmission of chat.
/// </summary>
public enum ChatTransmitRange : byte
{
/// Acts normal, ghosts can hear across the map, etc.
Normal ,
2024-01-28 16:31:58 +07:00
2023-05-04 20:08:08 +01:00
/// Normal but ghosts are still range-limited.
GhostRangeLimit ,
2024-01-28 16:31:58 +07:00
2023-05-04 20:08:08 +01:00
/// Hidden from the chat window.
HideChat ,
2024-01-28 16:31:58 +07:00
2023-05-04 20:08:08 +01:00
/// Ghosts can't hear or see it at all. Regular players can if in-range.
NoGhosts
}