mirror of
https://github.com/space-syndicate/space-station-14.git
synced 2026-10-24 17:21:18 +03:00
Merge remote-tracking branch 'upstream/master' into upstream-sync
This commit is contained in:
commit
d9bc64e7b0
12 changed files with 131 additions and 65 deletions
|
|
@ -3,6 +3,7 @@ using System.Threading.Tasks;
|
|||
using Content.Server.Chemistry.EntitySystems;
|
||||
using Content.Server.DoAfter;
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Interaction.Helpers;
|
||||
|
|
@ -70,11 +71,7 @@ namespace Content.Server.Fluids.Components
|
|||
return false;
|
||||
}
|
||||
|
||||
if (mopComponent.CurrentVolume == mopComponent.MaxVolume)
|
||||
{
|
||||
Owner.PopupMessage(eventArgs.User, Loc.GetString("bucket-component-mop-is-full-message"));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
_currentlyUsing.Add(eventArgs.Using);
|
||||
|
||||
|
|
@ -92,25 +89,49 @@ namespace Content.Server.Fluids.Components
|
|||
CurrentVolume <= 0 || !Owner.InRangeUnobstructed(mopComponent.Owner))
|
||||
return false;
|
||||
|
||||
// Top up mops solution given it needs it to annihilate puddles I guess
|
||||
|
||||
var transferAmount = FixedPoint2.Min(mopComponent.MaxVolume - mopComponent.CurrentVolume, CurrentVolume);
|
||||
if (transferAmount == 0)
|
||||
//Checks if the mop is empty
|
||||
if(mopComponent.CurrentVolume == 0)
|
||||
{
|
||||
return false;
|
||||
// Transfers up to half the mop's available capacity to the mop
|
||||
// Takes the lower of the mop's available volume and the bucket's current volume.
|
||||
var transferAmount = FixedPoint2.Min(0.5*mopComponent.AvailableVolume, CurrentVolume);
|
||||
if (transferAmount == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var mopContents = mopComponent.MopSolution;
|
||||
|
||||
if (mopContents == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Transfer solution from the bucket to the mop
|
||||
// Owner is the bucket being interacted with. contents is the Solution contained by said bucket.
|
||||
var solution = solutionsSys.SplitSolution(Owner, contents, transferAmount);
|
||||
if (!solutionsSys.TryAddSolution(mopComponent.Owner, mopComponent.MopSolution, solution))
|
||||
{
|
||||
return false; //if the attempt fails
|
||||
}
|
||||
Owner.PopupMessage(eventArgs.User, Loc.GetString("bucket-component-mop-is-now-wet-message"));
|
||||
|
||||
}
|
||||
|
||||
var mopContents = mopComponent.MopSolution;
|
||||
|
||||
if (mopContents == null)
|
||||
else //if mop is not empty
|
||||
{
|
||||
return false;
|
||||
}
|
||||
//Transfer the mop solution to the bucket
|
||||
|
||||
if (mopComponent.MopSolution == null)
|
||||
return false;
|
||||
|
||||
var solutionFromMop = solutionsSys.SplitSolution(mopComponent.Owner, mopComponent.MopSolution, mopComponent.CurrentVolume);
|
||||
EntitySystem.Get<SolutionContainerSystem>().TryGetSolution(Owner, SolutionName, out var solution);
|
||||
if (!solutionsSys.TryAddSolution(Owner, solution, solutionFromMop))
|
||||
{
|
||||
return false; //if the attempt fails
|
||||
}
|
||||
Owner.PopupMessage(eventArgs.User, Loc.GetString("bucket-component-mop-is-now-dry-message"));
|
||||
|
||||
var solution = solutionsSys.SplitSolution(Owner, contents, transferAmount);
|
||||
if (!solutionsSys.TryAddSolution(mopComponent.Owner, mopContents, solution))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
SoundSystem.Play(Filter.Pvs(Owner), _sound.GetSound(), Owner);
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ namespace Content.Server.Fluids.Components
|
|||
/// </summary>
|
||||
public bool Mopping { get; private set; }
|
||||
|
||||
// MopSolution Object stores whatever solution the mop has absorbed.
|
||||
public Solution? MopSolution
|
||||
{
|
||||
get
|
||||
|
|
@ -43,6 +44,7 @@ namespace Content.Server.Fluids.Components
|
|||
}
|
||||
}
|
||||
|
||||
// MaxVolume is the Maximum volume the mop can absorb (however, this is defined in janitor.yml)
|
||||
public FixedPoint2 MaxVolume
|
||||
{
|
||||
get => MopSolution?.MaxVolume ?? FixedPoint2.Zero;
|
||||
|
|
@ -56,8 +58,12 @@ namespace Content.Server.Fluids.Components
|
|||
}
|
||||
}
|
||||
|
||||
// CurrentVolume is the volume the mop has absorbed.
|
||||
public FixedPoint2 CurrentVolume => MopSolution?.CurrentVolume ?? FixedPoint2.Zero;
|
||||
|
||||
// AvailableVolume is the remaining volume capacity of the mop.
|
||||
public FixedPoint2 AvailableVolume => MopSolution?.AvailableVolume ?? FixedPoint2.Zero;
|
||||
|
||||
// Currently there's a separate amount for pickup and dropoff so
|
||||
// Picking up a puddle requires multiple clicks
|
||||
// Dumping in a bucket requires 1 click
|
||||
|
|
@ -99,11 +105,6 @@ namespace Content.Server.Fluids.Components
|
|||
return false;
|
||||
}
|
||||
|
||||
if (CurrentVolume <= 0)
|
||||
{
|
||||
Owner.PopupMessage(eventArgs.User, Loc.GetString("mop-component-mop-is-dry-message"));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (eventArgs.Target is not {Valid: true} target)
|
||||
{
|
||||
|
|
@ -117,8 +118,15 @@ namespace Content.Server.Fluids.Components
|
|||
!solutionSystem.TryGetSolution((puddleComponent).Owner, puddleComponent.SolutionName, out var puddleSolution))
|
||||
return false;
|
||||
|
||||
// So if the puddle has 20 units we mop in 2 seconds. Don't just store CurrentVolume given it can change so need to re-calc it anyway.
|
||||
var doAfterArgs = new DoAfterEventArgs(eventArgs.User, _mopSpeed * puddleSolution.CurrentVolume.Float() / 10.0f,
|
||||
// if the mop is full
|
||||
if(AvailableVolume <= 0)
|
||||
{
|
||||
Owner.PopupMessage(eventArgs.User, Loc.GetString("mop-component-mop-is-full-message"));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Mopping duration (aka delay) should scale with PickupAmount and not puddle volume, because we are picking up a constant volume of solution with each click.
|
||||
var doAfterArgs = new DoAfterEventArgs(eventArgs.User, _mopSpeed * PickupAmount.Float() / 10.0f,
|
||||
target: target)
|
||||
{
|
||||
BreakOnUserMove = true,
|
||||
|
|
@ -138,30 +146,22 @@ namespace Content.Server.Fluids.Components
|
|||
FixedPoint2 transferAmount;
|
||||
// does the puddle actually have reagents? it might not if its a weird cosmetic entity.
|
||||
if (puddleSolution.TotalVolume == 0)
|
||||
transferAmount = FixedPoint2.Min(PickupAmount, CurrentVolume);
|
||||
transferAmount = FixedPoint2.Min(PickupAmount, AvailableVolume);
|
||||
else
|
||||
transferAmount = FixedPoint2.Min(PickupAmount, puddleSolution.TotalVolume, CurrentVolume);
|
||||
transferAmount = FixedPoint2.Min(PickupAmount, puddleSolution.TotalVolume, AvailableVolume);
|
||||
|
||||
|
||||
// is the puddle cleaned?
|
||||
if (puddleSolution.TotalVolume - transferAmount <= 0)
|
||||
bool isCleaned = (puddleSolution.TotalVolume - transferAmount <= 0);
|
||||
|
||||
// Transfers solution from the puddle to the mop
|
||||
solutionSystem.TryAddSolution(Owner, contents, solutionSystem.SplitSolution(target, puddleSolution, transferAmount));
|
||||
|
||||
if (isCleaned)
|
||||
{
|
||||
// deletes the puddle
|
||||
_entities.DeleteEntity(puddleComponent.Owner);
|
||||
|
||||
// After cleaning the puddle, make a new puddle with solution from the mop as a "wet floor". Then evaporate it slowly.
|
||||
// we do this WITHOUT adding to the existing puddle. Otherwise we have might have water puddles with the vomit sprite.
|
||||
var splitSolution = solutionSystem.SplitSolution(Owner, contents, transferAmount)
|
||||
.SplitSolution(ResidueAmount);
|
||||
spillableSystem.SpillAt(splitSolution, eventArgs.ClickLocation, "PuddleSmear", combine: false);
|
||||
}
|
||||
else
|
||||
{
|
||||
// remove solution from the puddle
|
||||
solutionSystem.SplitSolution(target, puddleSolution, transferAmount);
|
||||
|
||||
// and from the mop
|
||||
solutionSystem.SplitSolution(Owner, contents, transferAmount);
|
||||
}
|
||||
|
||||
SoundSystem.Play(Filter.Pvs(Owner), _pickupSound.GetSound(), Owner);
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -1,15 +1,4 @@
|
|||
Entries:
|
||||
- author: moony
|
||||
changes:
|
||||
- {message: 'Added a warning dialog to the observe button, no more misclicks.',
|
||||
type: Add}
|
||||
id: 417
|
||||
time: '2021-10-08T14:22:58.0000000+00:00'
|
||||
- author: metalgearsloth
|
||||
changes:
|
||||
- {message: Shuttle rotation is now enabled., type: Add}
|
||||
id: 418
|
||||
time: '2021-10-08T23:55:11.0000000+00:00'
|
||||
- author: Zumorica
|
||||
changes:
|
||||
- {message: Added grilles., type: Add}
|
||||
|
|
@ -2919,3 +2908,19 @@ Entries:
|
|||
- {message: Added to codebase new xeno artifacts with random effects., type: Add}
|
||||
id: 918
|
||||
time: '2022-01-22T12:55:11.0000000+00:00'
|
||||
- author: Lamrr
|
||||
changes:
|
||||
- {message: Shotgun shells ('shots') are now available in boxes., type: Add}
|
||||
id: 919
|
||||
time: '2022-01-22T20:47:55.0000000+00:00'
|
||||
- author: Willhelm53
|
||||
changes:
|
||||
- {message: Added ability for mop buckets to receive fluid from mops, type: Add}
|
||||
- {message: Popup messages informing when the mop becomes full (from puddles or
|
||||
mop bucket) or empty (from mop bucket), type: Add}
|
||||
- {message: The mop now transfers solution from the puddle to the mop instead of
|
||||
consuming water to destroy puddles, type: Fix}
|
||||
- {message: 'The mop bucket now receives fluid from a wet mop, or gives fluid to
|
||||
a dry mop', type: Tweak}
|
||||
id: 920
|
||||
time: '2022-01-23T05:27:22.0000000+00:00'
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
bucket-component-bucket-is-empty-message = Bucket is empty
|
||||
bucket-component-mop-is-full-message = Bucket is full
|
||||
bucket-component-mop-is-now-wet-message = Mop is now wet
|
||||
bucket-component-mop-is-now-dry-message = Mop is now dry
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
mop-component-mop-is-dry-message = Mop needs to be wet!
|
||||
mop-component-mop-is-dry-message = Mop needs to be wet!
|
||||
mop-component-mop-is-full-message = Mop is full!
|
||||
|
|
|
|||
|
|
@ -57,3 +57,35 @@
|
|||
layers:
|
||||
- state: box_security
|
||||
- state: ziptie
|
||||
|
||||
- type: entity
|
||||
name: box of beanbag shots
|
||||
parent: BoxCardboard
|
||||
id: BoxBeanbag
|
||||
description: A box full of beanbag shots, designed for riot shotguns.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: ShellShotgunBeanbag
|
||||
amount: 6
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: box_beanbag
|
||||
- type: Storage
|
||||
capacity: 30
|
||||
|
||||
- type: entity
|
||||
name: box of lethal shots
|
||||
parent: BoxCardboard
|
||||
id: BoxLethalshot
|
||||
description: A box full of lethal shots, designed for riot shotguns.
|
||||
components:
|
||||
- type: StorageFill
|
||||
contents:
|
||||
- id: ShellShotgunBase
|
||||
amount: 6
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: box_lethalshot
|
||||
- type: Storage
|
||||
capacity: 30
|
||||
|
|
|
|||
|
|
@ -21,5 +21,5 @@
|
|||
contents:
|
||||
- id: ShotgunGladstone
|
||||
amount: 2
|
||||
- id: ShellShotgun
|
||||
amount: 18
|
||||
- id: BoxLethalshot
|
||||
amount: 3
|
||||
|
|
|
|||
|
|
@ -61,8 +61,8 @@
|
|||
amount: 2
|
||||
- id: ShotgunGladstone
|
||||
amount: 2
|
||||
- id: ShellShotgunBeanbag
|
||||
amount: 12
|
||||
- id: BoxBeanbag
|
||||
amount: 2
|
||||
# - ShieldRiot
|
||||
# - SecGasmask
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
- type: SolutionContainerManager
|
||||
solutions:
|
||||
mop:
|
||||
maxVol: 10
|
||||
maxVol: 50
|
||||
|
||||
- type: entity
|
||||
name: mop bucket
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
maxVol: 500
|
||||
reagents:
|
||||
- ReagentId: Water
|
||||
Quantity: 500
|
||||
Quantity: 250 # half-full at roundstart to leave room for puddles
|
||||
- type: Physics
|
||||
bodyType: Dynamic
|
||||
- type: Fixtures
|
||||
|
|
|
|||
BIN
Resources/Textures/Objects/Storage/boxes.rsi/box_beanbag.png
Normal file
BIN
Resources/Textures/Objects/Storage/boxes.rsi/box_beanbag.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 337 B |
BIN
Resources/Textures/Objects/Storage/boxes.rsi/box_lethalshot.png
Normal file
BIN
Resources/Textures/Objects/Storage/boxes.rsi/box_lethalshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 359 B |
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-SA-3.0",
|
||||
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/17dc39d12005f3279a90212b5c61a781c08693a5",
|
||||
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 32
|
||||
|
|
@ -113,6 +113,12 @@
|
|||
"name": "hug-inhand-right",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "box_lethalshot"
|
||||
},
|
||||
{
|
||||
"name": "box_beanbag"
|
||||
},
|
||||
{
|
||||
"name": "ziptie"
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue