150 Commits

Author SHA1 Message Date
xPokee 5e629dff04 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync 2025-10-03 07:05:54 -04:00
SmArtKar a38b955e2a Fixes delayed viewport fitting on server join/init (#93065)
## About The Pull Request

#91419 removed change_view in mob login for un-inited clients, which
leaves 1 second delayed fit_viewport calls from
attempt_auto_fit_viewport as the only way for new clients to adjust
their viewport from the default square (which is also only ran once all
subsystems finish initializing).
Just calling apply() after applying our prefs to the view_size is enough
to make it work, also we don't need the said second delay in
attempt_auto_fit_viewport anymore either.

## Changelog
🆑
fix: Fixed delayed viewport fitting on server join/init
/🆑
2025-09-24 08:34:18 -07:00
John Willard ac94a14822 Escape menu improvements (#91397)
Removes the blur of the escape menu so players can sorta see what's
going on in their game while going through, so they can react in case
something's happening while they're in menu.
Changes the font of the escape menu so it's no longer the LISA font
Makes the title only show up on the home menu, so being on the suicide
panel wont show you "another day on space station 13".
Moves the 'back' button on the suicide menu to the top left.

![image](https://github.com/user-attachments/assets/4d527059-38ab-4330-9e8c-f373e0942777)

![image](https://github.com/user-attachments/assets/23f0f230-f901-480d-9426-9ca8f33493f9)

This hopes to make the escape menu a little more easy to go through,
removing some obstruction of your game's screen so you can see what's
happening around you, and give a little generic part of submenus in case
we add more (which I do have at least one planned).

🆑
qol: The escape menu no longer blurs the game in the background.
qol: The escape menu now has a more readable font, and the escape menu's
back button is now smaller and in the corner.
/🆑
2025-06-05 19:50:34 -04:00
John Willard c5d84a2b20 Moves info buttons to the Escape menu (#91234)
This is my second contribution to the move towards removing the stat
panel (first one being https://github.com/tgstation/tgstation/pull/90572
)

This moves the info buttons at the top right of the game's screen
(Changelog, Rules, Wiki, etc) to the Escape menu, except for Fullscreen
which is now a pref instead. This means you can set Fullscreen to be on
permanently and every launch will automatically fullscreen you (the
viewport will be a little off because it only fixes it once
initialization is complete). This follows through rounds and auto
updates if you set your game to fullscreen with the OOC button or F11,
so players will learn about the pref after playing a round with
fullscreen enabled.

What the game now looks like

be a newscaster

https://github.com/user-attachments/assets/7871a226-1e0b-410d-a690-88f3616bebb0

This is something I wanted to do since the Esc menu was added but just
never got around to it, but here it is.

These buttons don't warrant being in the player's face 24/7 and since
we've want to remove the stat panel and this has to be somewhere, I
thought it would be a better fit in the Escape menu. It helps make the
Esc menu the tool players use to access their OOC tools and overall I
think improves the appearance of the game's screen to something more
like an actual game would look like, especially when our comparison is
SS14.

🆑
qol: Info buttons previously at the top right of your screen (Changelog,
wiki, forums) is now in the Escape menu.
qol: Fullscreen is now a preferences and will follow you through rounds.
/🆑
2025-06-05 18:49:10 -04:00
John Willard 7d7f284d82 Escape menu improvements (#91397)
## About The Pull Request

Removes the blur of the escape menu so players can sorta see what's
going on in their game while going through, so they can react in case
something's happening while they're in menu.
Changes the font of the escape menu so it's no longer the LISA font
Makes the title only show up on the home menu, so being on the suicide
panel wont show you "another day on space station 13".
Moves the 'back' button on the suicide menu to the top left.


![image](https://github.com/user-attachments/assets/4d527059-38ab-4330-9e8c-f373e0942777)

![image](https://github.com/user-attachments/assets/23f0f230-f901-480d-9426-9ca8f33493f9)

## Why It's Good For The Game

This hopes to make the escape menu a little more easy to go through,
removing some obstruction of your game's screen so you can see what's
happening around you, and give a little generic part of submenus in case
we add more (which I do have at least one planned).

## Changelog

🆑
qol: The escape menu no longer blurs the game in the background.
qol: The escape menu now has a more readable font, and the escape menu's
back button is now smaller and in the corner.
/🆑
2025-05-31 19:12:05 -07:00
John Willard 793853a2d4 Moves info buttons to the Escape menu (#91234)
## About The Pull Request

This is my second contribution to the move towards removing the stat
panel (first one being https://github.com/tgstation/tgstation/pull/90572
)

This moves the info buttons at the top right of the game's screen
(Changelog, Rules, Wiki, etc) to the Escape menu, except for Fullscreen
which is now a pref instead. This means you can set Fullscreen to be on
permanently and every launch will automatically fullscreen you (the
viewport will be a little off because it only fixes it once
initialization is complete). This follows through rounds and auto
updates if you set your game to fullscreen with the OOC button or F11,
so players will learn about the pref after playing a round with
fullscreen enabled.

What the game now looks like

##### Alt ideas for sprites: Changelog can be a newspaper and Forums can
be a newscaster


https://github.com/user-attachments/assets/7871a226-1e0b-410d-a690-88f3616bebb0

This is something I wanted to do since the Esc menu was added but just
never got around to it, but here it is.

## Why It's Good For The Game

These buttons don't warrant being in the player's face 24/7 and since
we've want to remove the stat panel and this has to be somewhere, I
thought it would be a better fit in the Escape menu. It helps make the
Esc menu the tool players use to access their OOC tools and overall I
think improves the appearance of the game's screen to something more
like an actual game would look like, especially when our comparison is
SS14.

## Changelog

🆑
qol: Info buttons previously at the top right of your screen (Changelog,
wiki, forums) is now in the Escape menu.
qol: Fullscreen is now a preferences and will follow you through rounds.
/🆑
2025-05-29 18:25:33 -07:00
Nick 5ee12a8d33 Adds the ability to link forum accounts (#90441) 2025-04-29 17:52:31 -06:00
Nick 1196287662 Adds the ability to link forum accounts (#90441) 2025-04-13 23:57:16 -06:00
SmArtKar e1c7103bab Fixes runtimes in fit_viewport when user has the game minimized (#89802)
## About The Pull Request

Winget returns 0x0 size when the window is minimized, and it can be set
to 0x0 via external tools as well. In this case we should just abort
fit_viewport to prevent runtimes.

## Changelog

Not player facing
2025-03-12 17:11:19 -04:00
itsmeow 9ebcabb077 IconForge: rust-g Spritesheet Generation (#89478)
Replaces the asset subsystem's spritesheet generator with a rust-based
implementation (https://github.com/tgstation/rust-g/pull/160).

This is a rough port of
https://github.com/BeeStation/BeeStation-Hornet/pull/10404, but it
includes fixes for some cases I didn't catch that apply on TG.

(FWIW we've been using this system on prod for over a year and
encountered no major issues.)

![image](https://github.com/user-attachments/assets/53bd2b44-9bb5-42d2-b33f-093651edebc0)

`/datum/asset/spritesheet_batched`: A version of the spritesheet system
that collects a list of `/datum/universal_icon`s and sends them off to
rustg asynchronously, and the generation also runs on another thread, so
the game doesn't block during realize_spritesheet. The rust generation
is about 10x faster when it comes to actual icon generation, but the
biggest perk of the batched spritesheets is the caching system.

This PR notably does not convert a few things to the new spritesheet
generator.

- Species and antagonist icons in the preferences view because they use
getFlatIcon ~~which can't be converted to universal icons~~.
- Yes, this is still a *massive* cost to init, unfortunately. On Bee, I
actually enabled the 'legacy' cache on prod and development, which you
can see in my PR. That's why I added the 'clear cache' verb and the
`unregister()` procs, because it can force a regeneration at runtime. I
decided not to port this, since I think it would be detrimental to the
large amount of contributors here.
- It is *technically* possible to port parts of this to the uni_icon
system by making a uni_icon version of getFlatIcon. However, some
overlays use runtime-generated icons which are ~~completely unparseable
to IconForge, since they're stored in the RSC and don't exist as files
anywhere~~. This is most noticeable with things like hair (which blend
additively with the hair mask on the server, thus making them invisible
to `get_flat_uni_icon`). It also doesn't help that species and antag
icons will still need to generate a bunch of dummies and delete them to
even verify cache validity.
- It is actually possible to write the RSC icons to the filesystem
(using fcopy) and reference them in IconForge. However, I'm going to
wait on doing this until I port my GAGS implementation because it
requires GAGS to exist on the filesystem as well.

IconForge generates a cache based on the set of icons used, all
transform operations applied, and the source DMIs of each icon used
within the spritesheet. It can compare the hashes and invalidate the
cache automatically if any of these change. This means we can enable
caching on development, and have absolutely no downsides, because if
anything changes, the cache invalidates itself.

The caching has a mean cost of ~5ms and saves a lot of time compared to
generating the spritesheet, even with rust's faster generation. The main
downside is that the cache still requires building the list of icons and
their transforms, then json encoding it to send to rustg.

Here's an abbreviated example of a cache JSON. All of these need to
match for the cache to be valid. `input_hash` contains the transform
definitions for all the sprites in the spritesheet, so if the input to
iconforge changes, that hash catches it. The `sizes` and `sprites` are
loaded into DM.

```json
{
	"input_hash": "99f1bc67d590e000",
	"dmi_hashes": {
		"icons/ui/achievements/achievements.dmi": "771200c75da11c62"
	},
	"sizes": [
		"76x76"
	],
	"sprites": {
		"achievement-rustascend": {
			"size_id": "76x76",
			"position": 1
		}
	},
	"rustg_version": "3.6.0",
	"dm_version": 1
}
```

Universal icons are just a collection of DMI, Icon State, and any icon
transformation procs you apply (blends, crops, scales). They can be
convered to DM icons via `to_icon()`. I've included an implementation of
GAGS that produces universal icons, allowing GAGS items to be converted
into them. IconForge can read universal icons and add them to
spritesheets. It's basically just a wrapper that reimplements BYOND icon
procs.

Converts some uses of md5asfile within legacy spritesheets to use
rustg_hash_file instead, improving the performance of their generation.

Fixes lizard body markings not showing in previews, and re-adds eyes to
the ethereal color preview. This is a side effect of IconForge having
*much* better error handling than DM icon procs. Invalid stuff that gets
passed around will error instead of silently doing nothing.

Changes the CSS used in legacy spritesheet generation to split
`background: url(...) no-repeat` into separate props. This is necessary
for WebView2, as IE treats these properties differently - adding
`background-color` to an icon object (as seen in the R&D console) won't
work if you don't split these out.

Deletes unused spritesheets and their associated icons (condiments
spritesheet, old PDA spritesheet)

If you press "Character Setup", the 10-13sec of lag is now approximately
0.5-2 seconds.

Tracy profile showing the time spent on get_asset_datum. I pressed the
preferences button during init on both branches. Do note that this was
ran with a smart cache HIT, so no generation occurred.

![image](https://github.com/user-attachments/assets/3efa71ab-972b-4f5a-acab-0892496ef999)

Much lower worst-case for /datum/asset/New (which includes
`create_spritesheets()` and `register()`)

![image](https://github.com/user-attachments/assets/9ad8ceee-7bd6-4c48-b5f3-006520f527ef)

Here's a look at the internal costs from rustg - as you can see
`generate_spritesheet()` is very fast:

![image](https://github.com/user-attachments/assets/e6892c28-8c31-4af5-96d4-501e966d0ce9)

**Before**

![image](https://github.com/user-attachments/assets/cbd65787-42ba-4278-a45c-bd3d538da986)

**After**

![image](https://github.com/user-attachments/assets/d750899a-bd07-4b57-80fb-420fcc0ae416)

🆑
fix: Fixed lizard body markings and ethereal feature previews in the
preference menu missing some overlays.
refactor: Optimized spritesheet asset generation greatly using rustg
IconForge, greatly reducing post-initialization lag as well as reducing
init times and saving server computation.
config: Added 'smart' asset caching, for batched rustg IconForge
spritesheets. It is persistent and suitable for use on local, with
automatic invalidation.
add: Added admin verbs - Debug -> Clear Smart/Legacy Asset Cache for
spritesheets.
fix: Fixed R&D console icons breaking on WebView2/516
/🆑
2025-03-12 17:10:20 -04:00
SmArtKar 7c536cd4f0 Fixes runtimes in fit_viewport when user has the game minimized (#89802)
## About The Pull Request

Winget returns 0x0 size when the window is minimized, and it can be set
to 0x0 via external tools as well. In this case we should just abort
fit_viewport to prevent runtimes.

## Changelog

Not player facing
2025-03-06 10:31:35 -05:00
itsmeow cc335e7e9e IconForge: rust-g Spritesheet Generation (#89478)
## About The Pull Request

Replaces the asset subsystem's spritesheet generator with a rust-based
implementation (https://github.com/tgstation/rust-g/pull/160).

This is a rough port of
https://github.com/BeeStation/BeeStation-Hornet/pull/10404, but it
includes fixes for some cases I didn't catch that apply on TG.

(FWIW we've been using this system on prod for over a year and
encountered no major issues.)

### TG MAINTAINER NOTE


![image](https://github.com/user-attachments/assets/53bd2b44-9bb5-42d2-b33f-093651edebc0)

### Batched Spritesheets

`/datum/asset/spritesheet_batched`: A version of the spritesheet system
that collects a list of `/datum/universal_icon`s and sends them off to
rustg asynchronously, and the generation also runs on another thread, so
the game doesn't block during realize_spritesheet. The rust generation
is about 10x faster when it comes to actual icon generation, but the
biggest perk of the batched spritesheets is the caching system.

This PR notably does not convert a few things to the new spritesheet
generator.

- Species and antagonist icons in the preferences view because they use
getFlatIcon ~~which can't be converted to universal icons~~.
- Yes, this is still a *massive* cost to init, unfortunately. On Bee, I
actually enabled the 'legacy' cache on prod and development, which you
can see in my PR. That's why I added the 'clear cache' verb and the
`unregister()` procs, because it can force a regeneration at runtime. I
decided not to port this, since I think it would be detrimental to the
large amount of contributors here.
- It is *technically* possible to port parts of this to the uni_icon
system by making a uni_icon version of getFlatIcon. However, some
overlays use runtime-generated icons which are ~~completely unparseable
to IconForge, since they're stored in the RSC and don't exist as files
anywhere~~. This is most noticeable with things like hair (which blend
additively with the hair mask on the server, thus making them invisible
to `get_flat_uni_icon`). It also doesn't help that species and antag
icons will still need to generate a bunch of dummies and delete them to
even verify cache validity.
- It is actually possible to write the RSC icons to the filesystem
(using fcopy) and reference them in IconForge. However, I'm going to
wait on doing this until I port my GAGS implementation because it
requires GAGS to exist on the filesystem as well.

#### Caching

IconForge generates a cache based on the set of icons used, all
transform operations applied, and the source DMIs of each icon used
within the spritesheet. It can compare the hashes and invalidate the
cache automatically if any of these change. This means we can enable
caching on development, and have absolutely no downsides, because if
anything changes, the cache invalidates itself.

The caching has a mean cost of ~5ms and saves a lot of time compared to
generating the spritesheet, even with rust's faster generation. The main
downside is that the cache still requires building the list of icons and
their transforms, then json encoding it to send to rustg.

Here's an abbreviated example of a cache JSON. All of these need to
match for the cache to be valid. `input_hash` contains the transform
definitions for all the sprites in the spritesheet, so if the input to
iconforge changes, that hash catches it. The `sizes` and `sprites` are
loaded into DM.

```json
{
	"input_hash": "99f1bc67d590e000",
	"dmi_hashes": {
		"icons/ui/achievements/achievements.dmi": "771200c75da11c62"
	},
	"sizes": [
		"76x76"
	],
	"sprites": {
		"achievement-rustascend": {
			"size_id": "76x76",
			"position": 1
		}
	},
	"rustg_version": "3.6.0",
	"dm_version": 1
}
```

### Universal Icons

Universal icons are just a collection of DMI, Icon State, and any icon
transformation procs you apply (blends, crops, scales). They can be
convered to DM icons via `to_icon()`. I've included an implementation of
GAGS that produces universal icons, allowing GAGS items to be converted
into them. IconForge can read universal icons and add them to
spritesheets. It's basically just a wrapper that reimplements BYOND icon
procs.

### Other Stuff

Converts some uses of md5asfile within legacy spritesheets to use
rustg_hash_file instead, improving the performance of their generation.

Fixes lizard body markings not showing in previews, and re-adds eyes to
the ethereal color preview. This is a side effect of IconForge having
*much* better error handling than DM icon procs. Invalid stuff that gets
passed around will error instead of silently doing nothing.

Changes the CSS used in legacy spritesheet generation to split
`background: url(...) no-repeat` into separate props. This is necessary
for WebView2, as IE treats these properties differently - adding
`background-color` to an icon object (as seen in the R&D console) won't
work if you don't split these out.

Deletes unused spritesheets and their associated icons (condiments
spritesheet, old PDA spritesheet)

## Why It's Good For The Game

If you press "Character Setup", the 10-13sec of lag is now approximately
0.5-2 seconds.

Tracy profile showing the time spent on get_asset_datum. I pressed the
preferences button during init on both branches. Do note that this was
ran with a smart cache HIT, so no generation occurred.


![image](https://github.com/user-attachments/assets/3efa71ab-972b-4f5a-acab-0892496ef999)

Much lower worst-case for /datum/asset/New (which includes
`create_spritesheets()` and `register()`)


![image](https://github.com/user-attachments/assets/9ad8ceee-7bd6-4c48-b5f3-006520f527ef)

Here's a look at the internal costs from rustg - as you can see
`generate_spritesheet()` is very fast:


![image](https://github.com/user-attachments/assets/e6892c28-8c31-4af5-96d4-501e966d0ce9)

### Comparison for a single spritesheet - chat spritesheet:

**Before**


![image](https://github.com/user-attachments/assets/cbd65787-42ba-4278-a45c-bd3d538da986)

**After**


![image](https://github.com/user-attachments/assets/d750899a-bd07-4b57-80fb-420fcc0ae416)

## Changelog

🆑
fix: Fixed lizard body markings and ethereal feature previews in the
preference menu missing some overlays.
refactor: Optimized spritesheet asset generation greatly using rustg
IconForge, greatly reducing post-initialization lag as well as reducing
init times and saving server computation.
config: Added 'smart' asset caching, for batched rustg IconForge
spritesheets. It is persistent and suitable for use on local, with
automatic invalidation.
add: Added admin verbs - Debug -> Clear Smart/Legacy Asset Cache for
spritesheets.
fix: Fixed R&D console icons breaking on WebView2/516
/🆑
2025-03-03 14:58:27 +01:00
Majkl-J b6b8306fda Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-25-02a 2025-02-20 00:00:19 -08:00
Lex 28ed213197 [PORT] [TGUI] Color picker (#2670)
## About The Pull Request
Port of the color selection TGUI interface from
BeeStation/Artea-Station.
https://github.com/BeeStation/BeeStation-Hornet/pull/9417
https://github.com/Artea-Station/Artea-Station-Server/pull/525

This implementation includes a port and adaptation to React, as TG has
discontinued the use of Inferno.

If the Input: Enable TGUI parameter is disabled in the UI Tab, the old
color selection mechanism will be used instead. The new interface
supports copying the color value in the #343231 format and allows
entering a 6-character hexadecimal color code.
Additionally, a color palette for selection is available.
## Why It's Good For The Game
The TGUI color picker is more adaptable and prettier.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>


![image](https://github.com/user-attachments/assets/55f56807-7c76-41a1-8c75-7ed293d581e9)

![image](https://github.com/user-attachments/assets/7742e741-a16b-4708-8e7b-7891f426de32)

![image](https://github.com/user-attachments/assets/6e22e138-af41-447d-95e6-fb6ca7d067af)


</details>

## Changelog
🆑 itsmeow (original), RimiNosha, Phoenix404 (port)
add: Added TGUI-based color palette and replaced all usages of BYOND
color palettes with it (TGUI input preferences are still respected).
/🆑
2025-01-11 11:38:00 -08:00
Aylong 1795c18aea Fix a bunch of html UI's for 516 (#88917)
## About The Pull Request
Moved broken on 516 UI's to browser datum
They now work and have a dark theme
Most of them are admin ones (All except 1)

I tried to check all the raw HTML UI's by typing `<< browse(` into the
VSC search and going through each element, but I might have missed
something.

What worked as it was, I didn't touch, except for the Dynamic control
UI's

## Why It's Good For The Game
Admin can do their things on 516
Coders/Mappers can debug some stuff on 516


![image](https://github.com/user-attachments/assets/013508d1-18cc-4001-92e4-0bc554960f86)

## Changelog

🆑
fix: Admin/Debug UI's (Especially the Game Panel) now work properly on
Byond 516, instead of showing raw HTML
/🆑
2025-01-06 18:13:48 -08:00
MrMelbert 75696ab873 Fixes random stuff spilling into ooc tab (#88221)
## About The Pull Request

`boldannounce` is NOT for use ICly it's only for OOC stuff. `bolddanger`
is identical it just doesn't carry the same baggage

## Changelog

🆑 Melbert
fix: Stuff like the SM exploding will no longer output to your OOC tab
/🆑
2024-11-27 17:41:52 +01:00
Majkl-J e59d8ba64b Merge commit '179a607a90ad7ec62bdaff4e6fe72af60ee56442' of https://github.com/tgstation/tgstation into upstream-24-10b 2024-10-23 23:27:16 -07:00
Waterpig bb70889f6e TG Upstream Part 1
3591 individual conflicts

Update build.js

Update install_node.sh

Update byond.js

oh my fucking god

hat

slow

huh

holy shit

we all fall down

2 more I missed

2900 individual conflicts

2700 Individual conflicts

replaces yarn file with tg version, bumping us down to 2200-ish

Down to 2000 individual conflicts

140 down

mmm

aaaaaaaaaaaaaaaaaaa

not yt

575

soon

900 individual conflicts

600 individual conflicts, 121 file conflicts

im not okay

160 across 19 files

29 in 4 files

0 conflicts, compiletime fix time

some minor incap stuff

missed ticks

weird dupe definition stuff

missed ticks 2

incap fixes

undefs and pie fix

Radio update and some extra minor stuff

returns a single override

no more dupe definitions, 175 compiletime errors

Unticked file fix

sound and emote stuff

honk and more radio stuff
2024-10-19 08:04:33 -07:00
Zephyr 0ef5c3d049 Persistent Map Vote Tallies (#86788)
## About The Pull Request

Changes map votes to be based on a persistent tally count.
Tallies for maps are cached between rounds and are added to by map
votes.
When a map is chosen, and it wasn't the only valid one, the tallies for
said chosen map will be reset.

Refactors map vote handling and moves it from SSmapping to SSmap_vote.
Rock the Vote has been removed as a result of this refactor.

## Why It's Good For The Game

Makes it more likely that all maps will be played over the course of a
server instead of always being truly random.
Removes some clutter off of SSmapping.

🆑
refactor: Map Votes are now carried over between rounds. When a map vote
is actually a contest, the winning map will have its votes reset.
/🆑
2024-09-30 13:09:08 +13:00
tonty 3f0b4abb8d Replaces world.icon_size (and some magic numbers) with defines (#86819)
## About The Pull Request

All usages of world.icon_size in code have been replaced with new
`ICONSIZE_X`, `ICONSIZE_Y` and `ICONSIZE_ALL` defines depending on
context

Replaces some "32" magic numbers with the defines

A few bits of code have been modified to split up x/y math as well

## Why It's Good For The Game

Magic number bad, code more readable, code more flexible and I'm told
there's an access cost to doing world.icon_size so minor performance
gains

## Changelog

🆑 tonty
code: made some code relating to the world's icon size more readable
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-09-29 13:28:32 +00:00
SmArtKar d4ac95a0e1 Nobody expects the span inquisition: replaces most <span>s with macros (#86798)
## About The Pull Request
123 changed files and multiple crashes after writing broken regex, I
replaced most remains of direct spans with macros. This cleans up the
code and makes it easier to work with in general, see justification for
the original PR. I also fixed a bunch of broken and/or unclosed spans
here too.
I intentionally avoided replacing spans with multiple classes (in most
cases) and spans in the middle of strings as it would impact readability
(in my opinion at least) and could be done later if required.

## Why It's Good For The Game

Cleaner code, actually using our macros, fixes borked HTML in some
places. See original PR.

## Changelog
Nothing player-facing
2024-09-26 19:36:13 +00:00
SmArtKar faf3eb5106 Adds OD's new pragma to lints, fixes all issues it found (#86568)
## About The Pull Request

Closes #86567
Don't think any of these were found/reported or actually could trigger
in-game

## Why It's Good For The Game
Glory to OpenDream

## Changelog
🆑
code: Fixed multiple minor logic issues with code found by OpenDream's
new pragma
/🆑
2024-09-10 10:33:26 +12:00
Waterpig 4c4930c71d Merge branch 'master' of https://github.com/tgstation/tgstation into pulls-tg-to-fix-shit 2024-09-08 00:59:39 +02:00
SkyratBot 16c66010c9 [MIRROR] /icons/ folder cleansing crusade part 3 (#27859)
* /icons/ folder cleansing crusade part 3

* fixes

---------

Co-authored-by: YesterdaysPromise <122572637+YesterdaysPromise@users.noreply.github.com>
Co-authored-by: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com>
2024-06-09 12:00:28 +05:30
YesterdaysPromise 8eb3b51ad9 /icons/ folder cleansing crusade part 3 (#83420)
## About The Pull Request

In my effort to make the /icons/ folder cleaner and more intuitive
instead of having to rely on recalling names of stuff and looking them
up in code to find them for poor sods such as myself, plus in spurt of
complusion to organize stuff, here goes. I've tracked all changes in
commit descriptions. A lot still to be done, but I know these waves go
over dozens of files making things slow, so went lighter on it.
Destroyed useless impostor files taking up space and cleaned a stray
pixel on my way.

## Why It's Good For The Game

Cleaner /icons/ file means saner spriters, less time spent. Stray pixels
and impostor files (ones which are copies of actually used ones
elsewhere) are not good.

## Changelog

🆑
image: Cleaned a single stray pixel in a single frame of a bite
telegraphing accidentaly found while re-organizing the files.
/🆑
2024-05-25 21:08:08 -07:00
SpaceLoveSs13 a9ff046352 Administrator Cherrypick (#27405)
* Admin Verb Datums MkIII | Now with functional command bar (#82511)

* Modular stuffs

* Put some admin jump verbs back into the context menu | sorts area jump list again (#82647)

## About The Pull Request

See title.

## Why It's Good For The Game

Some admins wanted all the jump verbs back, aswell as making them not
AGhost you.
Also make the Jump To Area verb use a sorted list again

* Hey what if admins were allowed to use the player panel (#82682)

Re-adds the player panel verb to the verb panel.

* Controller Overview UI (#82739)

* Fixes a minor spelling mistake on the admin panel/verb list (#82747)

## About The Pull Request

Corrects `inisimin` to `invisimin`. This addresses #82728, but only
fixes one of the two issues mentioned

## Why It's Good For The Game

-1 spelling mistake

## Changelog
🆑
spellcheck: 'inisimin' verb corrected to 'invisimin'
/🆑

* Player Panel-age (#82757)

* Admin Forced Mob Rename and Preference Update (#82715)

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
Co-authored-by: Useroth <37159550+Useroth@users.noreply.github.com>
Co-authored-by: chel <64568243+iliyaxox@users.noreply.github.com>
2024-04-23 20:43:45 +02:00
Zephyr 7f8752be14 Admin Verb Datums MkIII | Now with functional command bar (#82511) 2024-04-12 12:27:09 -07:00
SkyratBot ea111b194e [MIRROR] Feeds OOC messages back to client if blocked in validate_client() (#26779)
* Feeds OOC messages back to client if blocked in validate_client() (#81769)

## About The Pull Request

Basically, if your long and well-thought-out OOC message gets eaten due
to your client not being fully initialized, the server will feed back
the message to you so you can copy-paste and try again.

In order to facilitate this, I turned `validate_client` into a proc.
This didn't have the ubiquitous usage that we were hoping for (where it
could be dropped and placed anywhere) and I don't think I liked the
"always exit out of proc" stuff anyhow. Also adds some code niceties.

There's probably a way cooler way to do this with tgui_say and whatever
but I don't use tgui_say (byond command bar my beloved) so we'll cope
with this.
## Why It's Good For The Game

![image](https://github.com/tgstation/tgstation/assets/34697715/a96f7168-aad3-4772-9abe-7a6aa2b8779a)

Let me know if I should revert the `span_big()` stuff, I just added it
because I wanted it to be obvious to the player instead of look like a
generic error message.
## Changelog
🆑
qol: If your OOC message gets eaten due to some weird circumstance in
how your message is handled, it will feed the applicable message back to
you so you can copy-paste and try to send it again.
/🆑

* Feeds OOC messages back to client if blocked in validate_client()

---------

Co-authored-by: san7890 <the@san7890.com>
2024-03-06 22:27:03 -05:00
san7890 9a3e74f30c Feeds OOC messages back to client if blocked in validate_client() (#81769)
## About The Pull Request

Basically, if your long and well-thought-out OOC message gets eaten due
to your client not being fully initialized, the server will feed back
the message to you so you can copy-paste and try again.

In order to facilitate this, I turned `validate_client` into a proc.
This didn't have the ubiquitous usage that we were hoping for (where it
could be dropped and placed anywhere) and I don't think I liked the
"always exit out of proc" stuff anyhow. Also adds some code niceties.

There's probably a way cooler way to do this with tgui_say and whatever
but I don't use tgui_say (byond command bar my beloved) so we'll cope
with this.
## Why It's Good For The Game


![image](https://github.com/tgstation/tgstation/assets/34697715/a96f7168-aad3-4772-9abe-7a6aa2b8779a)

Let me know if I should revert the `span_big()` stuff, I just added it
because I wanted it to be obvious to the player instead of look like a
generic error message.
## Changelog
🆑
qol: If your OOC message gets eaten due to some weird circumstance in
how your message is handled, it will feed the applicable message back to
you so you can copy-paste and try to send it again.
/🆑
2024-03-06 23:13:04 +00:00
SkyratBot 2ac66a8a4a [MIRROR] Adds sanity checking to prefs checks, fixing a bug that can cause emotes to stop displaying intermittently [MDB IGNORE] (#23081)
* Adds sanity checking to prefs checks, fixing a bug that can cause emotes to stop displaying intermittently

* Update vox_procs.dm

---------

Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
2023-08-14 19:40:51 -04:00
Bloop ed8445a312 Adds sanity checking to prefs checks, fixing a bug that can cause emotes to stop displaying intermittently (#76946)
## About The Pull Request

This PR adds a bunch of sanity checking to the `prefs.chat_toggles` var
accesses.

Prefs can be null when client is creating/deleting and this causes a
runtime where you might not be able to use emotes.


![image](https://github.com/tgstation/tgstation/assets/13398309/d89649d4-19c7-439f-b080-332709196505)

EDIT: as per suggestion I stopped masking the issue and added stack
traces instead. And made them into helper procs to avoid code
duplication.

For some of these procs it is important that we are able to continue
running to get to the end. **A ghost having null prefs should not stop
everyone else from hearing/seeing the emote.**

So now they will put the stack trace and keep on trucking if that issue
occurs. This is the main 'point' of the PR, which has seemingly gotten
bogged down in the creation of the two helper procs--apologies.

See https://github.com/tgstation/tgstation/pull/70404 for essentially
the same issue but applied to chat messages. I have gone back and
replaced the duplicated code from that to use the new helper procs
instead.

## Why It's Good For The Game

Anything chat related is a bad place to runtime. Some messages can take
a while to type out and to have it not display is frustrating at worst,
possibly detrimental if you have to communicate something urgently.

## Changelog

🆑
fix: fixes a bug that can cause emotes to stop working if a client is
being created or deleted
/🆑
2023-08-14 22:30:35 +02:00
SkyratBot 3ecc9f859d [MIRROR] Allows Export of your Preferences JSON File [MDB IGNORE] (#20894)
* Allows Export of your Preferences JSON File (#75014)

## About The Pull Request

Hey there,

This was spoken about in #70492 (specifically
https://github.com/tgstation/tgstation/pull/70492#issuecomment-1278069607),
and I have been waiting for this to be implemented for some time. It
never got implemented, so I decided to code it myself.

Basically, **if the server host doesn't disable it**, you are free to
export your JSONs as a player, right from the stat-panel. It's a pretty
JSON on 515 versions, too!

It's right here:

![image](https://user-images.githubusercontent.com/34697715/235251447-1c977718-51fd-4025-8d89-c60bffc379ec.png)

Here's what the prettified JSON looks like on 515.

![image](https://user-images.githubusercontent.com/34697715/235321061-4a217e26-c082-4bba-b54a-2c780defda0a.png)

There's a cooldown (default to 10 seconds) between exporting your
preferences.

#### Why is this config?

It's because in the past, a server host could always just file-share the
.sav or .json or whatever to the player, but they would have to do the
explicit option of actually bothering to make the files accessible to
the player. In that same line of logic, the server operator will have to
explicitly make the files accessible. This is mostly because I'm not
sure how good `ftp()` is at being a player function and wanted to have
some sort of cap/control somehow in case an exploit vector is detected
or it's just plain spammed by bots, so we'll just leave it up to the
direct providers of this data to elect if they wish to provide the data
or not.
## Why It's Good For The Game

Players don't have to log into Server A to remember what hairstyle they
loved using when they want to swap to Server B! That's amazing actually.
I always forget what ponytail my character has, and it'll be nice to
have the hairstyle in a readily accessible place (after I prettify the
JSON for myself).

It's also more convenient for server hosts to make player data like this
accessible if they really want to, too.

If we ever add an _import_ feature in the future (which would have to be
done with a LOT of care), this will also be useful. I wouldn't advise it
though having taken a precursory look at how much goes into it while
trying to ascertain the scope of this PR.
## Changelog
🆑
qol: The game now supports export of your preferences into a JSON file!
The verb (export-preferences) should now be available in the OOC tab of
your stat-panel if enabled by server operators.
server: Exporting player preferences is controlled by a configuration
option, 'FORBID_PREFERENCES_EXPORT'. If you do not wish to let clients
access the ftp() function to their own preferences file (probably for
bandwidth reasons?) you should uncomment this or add it to your config
somehow.
config: Server operators are also able to set the cooldown between
requests to download the JSON Preferences file via the
'SECONDS_COOLDOWN_FOR_PREFERENCES_EXPORT' config option.
/🆑

* Allows Export of your Preferences JSON File

---------

Co-authored-by: san7890 <the@san7890.com>
2023-05-02 15:27:19 -04:00
san7890 912e843f53 Allows Export of your Preferences JSON File (#75014)
## About The Pull Request

Hey there,

This was spoken about in #70492 (specifically
https://github.com/tgstation/tgstation/pull/70492#issuecomment-1278069607),
and I have been waiting for this to be implemented for some time. It
never got implemented, so I decided to code it myself.

Basically, **if the server host doesn't disable it**, you are free to
export your JSONs as a player, right from the stat-panel. It's a pretty
JSON on 515 versions, too!

It's right here:


![image](https://user-images.githubusercontent.com/34697715/235251447-1c977718-51fd-4025-8d89-c60bffc379ec.png)

Here's what the prettified JSON looks like on 515.


![image](https://user-images.githubusercontent.com/34697715/235321061-4a217e26-c082-4bba-b54a-2c780defda0a.png)

There's a cooldown (default to 10 seconds) between exporting your
preferences.

#### Why is this config?

It's because in the past, a server host could always just file-share the
.sav or .json or whatever to the player, but they would have to do the
explicit option of actually bothering to make the files accessible to
the player. In that same line of logic, the server operator will have to
explicitly make the files accessible. This is mostly because I'm not
sure how good `ftp()` is at being a player function and wanted to have
some sort of cap/control somehow in case an exploit vector is detected
or it's just plain spammed by bots, so we'll just leave it up to the
direct providers of this data to elect if they wish to provide the data
or not.
## Why It's Good For The Game

Players don't have to log into Server A to remember what hairstyle they
loved using when they want to swap to Server B! That's amazing actually.
I always forget what ponytail my character has, and it'll be nice to
have the hairstyle in a readily accessible place (after I prettify the
JSON for myself).

It's also more convenient for server hosts to make player data like this
accessible if they really want to, too.

If we ever add an _import_ feature in the future (which would have to be
done with a LOT of care), this will also be useful. I wouldn't advise it
though having taken a precursory look at how much goes into it while
trying to ascertain the scope of this PR.
## Changelog
🆑
qol: The game now supports export of your preferences into a JSON file!
The verb (export-preferences) should now be available in the OOC tab of
your stat-panel if enabled by server operators.
server: Exporting player preferences is controlled by a configuration
option, 'FORBID_PREFERENCES_EXPORT'. If you do not wish to let clients
access the ftp() function to their own preferences file (probably for
bandwidth reasons?) you should uncomment this or add it to your config
somehow.
config: Server operators are also able to set the cooldown between
requests to download the JSON Preferences file via the
'SECONDS_COOLDOWN_FOR_PREFERENCES_EXPORT' config option.
/🆑
2023-05-02 08:22:44 -07:00
SkyratBot 496b82be71 [MIRROR] Adds VERB_REF and derivative [MDB IGNORE] (#20346)
* Adds VERB_REF and derivative (#74500)

## About The Pull Request

Apparently in (one) place in the codebase, we were still using stuff
like `.verb/example_verb` for stuff like `INVOKE_ASYNC()` and
`CALLBACK()`s, and I'm pretty sure this is one of those things that are
being phased out in 515 (like we had to deal with in
4d6a8bc537), so let's give it the same
treatment as we did `PROC_REF` in November 2022.

In order to make this work, I created a generic backend of define
macros, and then moved two things: `PROC_REF` and `VERB_REF` to just
leverage that backend as needed. This was done just so we didn't have to
copy-paste code in case we needed to update these macros in the future,
let me know if I should approach this a different way.
## Why It's Good For The Game

code don't break (or at least the compile-time assertions won't break)
when we inevitably fully shift to 515. whoopie!
## Changelog
Nothing players should be concerned about.

* Adds VERB_REF and derivative

---------

Co-authored-by: san7890 <the@san7890.com>
2023-04-05 11:34:08 -07:00
san7890 3d9accccd8 Adds VERB_REF and derivative (#74500)
## About The Pull Request

Apparently in (one) place in the codebase, we were still using stuff
like `.verb/example_verb` for stuff like `INVOKE_ASYNC()` and
`CALLBACK()`s, and I'm pretty sure this is one of those things that are
being phased out in 515 (like we had to deal with in
4d6a8bc537), so let's give it the same
treatment as we did `PROC_REF` in November 2022.

In order to make this work, I created a generic backend of define
macros, and then moved two things: `PROC_REF` and `VERB_REF` to just
leverage that backend as needed. This was done just so we didn't have to
copy-paste code in case we needed to update these macros in the future,
let me know if I should approach this a different way.
## Why It's Good For The Game

code don't break (or at least the compile-time assertions won't break)
when we inevitably fully shift to 515. whoopie!
## Changelog
Nothing players should be concerned about.
2023-04-05 04:42:22 -07:00
SkyratBot 78dad8f155 [MIRROR] Clients can't OOC until they have fully gone through New() [MDB IGNORE] (#20338)
* Clients can't OOC until they have fully gone through `New()` (#74493)

People are able to send OOC messages before `client/New()` is able to
fully set itself up. Let's guard against this by re-using the variable
we set at the end of New() and blocking any usage of the OOC verb if
they aren't set up. I made it a define so we can use it in other spots
as well if the occasion should call for it.

Define included in this PR can be (and probably should be when someone
has time) replicated in other spots where we need it.

* Clients can't OOC until they have fully gone through `New()`

---------

Co-authored-by: san7890 <the@san7890.com>
2023-04-04 19:00:11 -07:00
san7890 8b827f32c9 Clients can't OOC until they have fully gone through New() (#74493)
People are able to send OOC messages before `client/New()` is able to
fully set itself up. Let's guard against this by re-using the variable
we set at the end of New() and blocking any usage of the OOC verb if
they aren't set up. I made it a define so we can use it in other spots
as well if the occasion should call for it.

Define included in this PR can be (and probably should be when someone
has time) replicated in other spots where we need it.
2023-04-05 11:23:15 +12:00
Mothblocks d67555a0b5 the inevitable Revert "Refactors admin verbs from giant ass lists into datums" in case stuff breaks (#73206)
Reverts tgstation/tgstation#72407
2023-02-05 11:44:38 +13:00
Zephyr fca90f5c78 Redoes the admin verb define to require passing in an Admin Visible Name, and restores the usage of '-' for the verb bar when you want to call verbs from the command bar. Also cleans up and organizes the backend for drawing verbs to make it easier in the future for me to make it look better (#73214)
## About The Pull Request

Damn that's a long title.

Admin Verbs can be used in the verb bar with hyphens instead of spaces
again.
## Why It's Good For The Game

Admin muscle memory
## Changelog
2023-02-04 01:20:18 -08:00
Zephyr 7f25d7f17b Refactors admin verbs from giant ass lists into datums (#72407)
## About The Pull Request

See title.
## Why It's Good For The Game

Makes it easier for people to add new admin buttons, and also removes
the giant ass ugly lists that are an affront to my eyes.

Yes you are still able to call them manually via the verb bar

![image](https://user-images.githubusercontent.com/12817816/210163285-2ecb4b59-67b4-47d2-b324-77048ce852fe.png)

![image](https://user-images.githubusercontent.com/12817816/210163288-5a0ec98c-9589-4cab-8a6b-1ab5151aa040.png)
## Changelog
🆑
refactor: Admin verbs are now datums with a dedicated panel handler
admin: Admin verbs now come with a handy description when you hover over
them!
/🆑

---------

Signed-off-by: GitHub <noreply@github.com>
2023-02-03 16:32:37 -08:00
SkyratBot fd91b9929b [MIRROR] Log filters better, including the message [MDB IGNORE] (#12233)
* Log filters better (#65539)

* Log filters better, including the message

Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2022-03-22 20:47:13 -07:00
Mothblocks 0d4f2c1e47 Log filters better (#65539) 2022-03-22 17:08:29 -04:00
SkyratBot b90e25684b [MIRROR] Fit Viewport cleanup [MDB IGNORE] (#11922)
* Fit Viewport cleanup (#65225)

* Fit Viewport cleanup

Changes how Fit Viewport works slightly.
From what I understand, the verb was created with the goal of
eliminating the pixel hunting required to get rid of letterboxing.

This works fine for stretch to fit, but ever since the command bar got
nuked it's ended up creating a lot of blackspace for targeted zoom
modes.

I've changed how it decides on its optimal width slightly, if the client
has a non stretch to fit zoom mode, we use it, the world icon size and
the clients view size to figure out the exact width we want.

The bars on the left and right have been bugging me forever. Want them
gone.

In light of this, I'm also making changing your zoom amount attempt to
fit the viewport, if you have the pref enabled.

Oh and I'm trying something with auto fit viewport stuff.
It currently waits a second between view change and fitting. The comment
implies this is to avoid winget strangeness from Login calls. When I
blamed it, I found a commit from antruk talking about client dropping,
and this being a potential fix.

Unfortunately none wrote down what dropping means, and anturk's
forgotten.

I'm making the assumption that it's related to attempting the related
winsets before an inital login is over.
I might be wrong about this, if I am we'll know what went wrong I
suppose.

* Whoops, this needs to be invoke async

* Ensures client safety, autodocs code, adds proper cleanup

* Fit Viewport cleanup

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2022-03-06 11:48:34 -05:00
LemonInTheDark 1616fb2dcc Fit Viewport cleanup (#65225)
* Fit Viewport cleanup

Changes how Fit Viewport works slightly.
From what I understand, the verb was created with the goal of
eliminating the pixel hunting required to get rid of letterboxing.

This works fine for stretch to fit, but ever since the command bar got
nuked it's ended up creating a lot of blackspace for targeted zoom
modes.

I've changed how it decides on its optimal width slightly, if the client
has a non stretch to fit zoom mode, we use it, the world icon size and
the clients view size to figure out the exact width we want.

The bars on the left and right have been bugging me forever. Want them
gone.

In light of this, I'm also making changing your zoom amount attempt to
fit the viewport, if you have the pref enabled.

Oh and I'm trying something with auto fit viewport stuff.
It currently waits a second between view change and fitting. The comment
implies this is to avoid winget strangeness from Login calls. When I
blamed it, I found a commit from antruk talking about client dropping,
and this being a potential fix.

Unfortunately none wrote down what dropping means, and anturk's
forgotten.

I'm making the assumption that it's related to attempting the related
winsets before an inital login is over.
I might be wrong about this, if I am we'll know what went wrong I
suppose.

* Whoops, this needs to be invoke async

* Ensures client safety, autodocs code, adds proper cleanup
2022-03-05 22:06:29 -06:00
SkyratBot d04e8abace [MIRROR] Re-organizes the files in the root of the icons/ folder into it's substituents [MDB IGNORE] (#11100)
* Re-organizes the files in the root of the icons/ folder into it's substituents

* Update code/__DEFINES/fonts.dm

Co-authored-by: san7890 <34697715+san7890@users.noreply.github.com>
Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
2022-01-29 13:33:14 +00:00
san7890 510ce05992 Re-organizes the files in the root of the icons/ folder into it's substituents #6441
About The Pull Request

Same vein (although a lot larger than) #64118

On the tin. This moves them into their own folders and the paths were updated in the code.
Why It's Good For The Game

It's not exactly good visuals for stuff that can be placed elsewhere to just be sitting in the root. Organization is nice.
Changelog

cl
fix: For those of you into code, some stuff with the icon pathing has been shuffled around so it's no longer in the roots of the icon/ folder. If you aren't into code, that's fine too.
/cl
2022-01-29 20:45:17 +13:00
SkyratBot 092e534e75 [MIRROR] TGUI list conversions + bug fixes [MDB IGNORE] (#10355)
* TGUI list conversions + bug fixes

* Fixing conflicts

* Maintaining a few modular files while we're at it...

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
2022-01-03 22:53:58 +00:00
Jeremiah 9c6fdb567d TGUI list conversions + bug fixes (#63354)
About The Pull Request

    Converts more inputs to TGUI. Possibly all user-facing input lists in the game.
    Did any surrounding text/number inputs as well
    Added null choice support so users can press cancel.
    Added some misc TGUI input fixes
    Fixed custom vendors while I was there

I refactored a lot of code while just poking around.
Primarily, usage of .len in files where I was already working on lists.
Some code was just awful - look at guardian.dm and its non use of early returns
If there are any disputes, I can revert it just fine, those changes are not integral to the PR.
Why It's Good For The Game

Fixes #63629
Fixes #63307
Fixes custom vendors /again/
Text input is more performant.
Part of a long series of TGUI conversion to make the game more visually appealing
Changelog

cl
refactor: The majority of user facing input lists have been converted to TGUI.
refactor: Tgui text inputs now scale with entered input.
fix: Many inputs now properly accept cancelling out of the menu.
fix: Fixes an edge case where users could not press enter on number inputs.
fix: Custom vendor bluescreen.
fix: You can now press ENTER on text inputs without an entry to cancel.
/cl
2021-12-31 11:07:28 +13:00
Gandalf 49a1a276e7 CROSSLINK + Population control cap (#9979)
* Ew

* Update login.dm

* Update code/modules/mob/dead/new_player/login.dm

Co-authored-by: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com>

* Oogleboogle

* E

* EEE

* Update client_procs.dm

* E

* E

* E

* Update communications.dm

* Update communications.dm

* E

* Update chat_link.dm

* EEEE

* EEE

* Update communications.dm

* EEE

* 0

* E

* Update skyrat_config.txt

* EEEE

* E

* E

* E

* E

* 0

* Update code/modules/admin/verbs/adminhelp.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update modular_skyrat/master_files/code/_onclick/hud/new_player.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update modular_skyrat/modules/server_overflow/code/client_procs.dm

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* Update tgui/packages/tgui/interfaces/ServerControlPanel.js

Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>

* You missed one

Co-authored-by: OrionTheFox <76465278+OrionTheFox@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
2021-12-25 19:08:27 +00:00
SkyratBot 854c7ef90c [MIRROR] creates SSspeech_controller so the MC can control say() execution [MDB IGNORE] (#10256)
* creates SSspeech_controller so the MC can control say() execution

* Update mob_say.dm

Co-authored-by: Kylerace <kylerlumpkin1@gmail.com>
Co-authored-by: Gandalf <jzo123@hotmail.com>
2021-12-25 13:44:46 +00:00