Merge remote-tracking branch 'upstream/master' into upstream-sync

This commit is contained in:
Arthur 2022-01-23 14:02:02 +03:00
commit d9bc64e7b0
12 changed files with 131 additions and 65 deletions

View file

@ -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);

View file

@ -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;

View file

@ -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'

View file

@ -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

View file

@ -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!

View file

@ -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

View file

@ -21,5 +21,5 @@
contents:
- id: ShotgunGladstone
amount: 2
- id: ShellShotgun
amount: 18
- id: BoxLethalshot
amount: 3

View file

@ -61,8 +61,8 @@
amount: 2
- id: ShotgunGladstone
amount: 2
- id: ShellShotgunBeanbag
amount: 12
- id: BoxBeanbag
amount: 2
# - ShieldRiot
# - SecGasmask

View file

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

View file

@ -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"
}