carpet (#5464)
* carpet * reviews * why tf i gotta fix integration tests in the carpet pr
This commit is contained in:
@@ -26,7 +26,7 @@ namespace Content.IntegrationTests.Tests.Fluids
|
|||||||
|
|
||||||
server.Assert(() =>
|
server.Assert(() =>
|
||||||
{
|
{
|
||||||
var solution = new Solution("water", FixedPoint2.New(20));
|
var solution = new Solution("Water", FixedPoint2.New(20));
|
||||||
var grid = GetMainGrid(mapManager);
|
var grid = GetMainGrid(mapManager);
|
||||||
var (x, y) = GetMainTile(grid).GridIndices;
|
var (x, y) = GetMainTile(grid).GridIndices;
|
||||||
var coordinates = new EntityCoordinates(grid.GridEntityId, x, y);
|
var coordinates = new EntityCoordinates(grid.GridEntityId, x, y);
|
||||||
@@ -65,7 +65,7 @@ namespace Content.IntegrationTests.Tests.Fluids
|
|||||||
server.Assert(() =>
|
server.Assert(() =>
|
||||||
{
|
{
|
||||||
var coordinates = grid.ToCoordinates();
|
var coordinates = grid.ToCoordinates();
|
||||||
var solution = new Solution("water", FixedPoint2.New(20));
|
var solution = new Solution("Water", FixedPoint2.New(20));
|
||||||
var puddle = solution.SpillAt(coordinates, "PuddleSmear");
|
var puddle = solution.SpillAt(coordinates, "PuddleSmear");
|
||||||
Assert.Null(puddle);
|
Assert.Null(puddle);
|
||||||
});
|
});
|
||||||
@@ -125,7 +125,7 @@ namespace Content.IntegrationTests.Tests.Fluids
|
|||||||
// Spawn a puddle
|
// Spawn a puddle
|
||||||
await server.WaitAssertion(() =>
|
await server.WaitAssertion(() =>
|
||||||
{
|
{
|
||||||
var solution = new Solution("water", FixedPoint2.New(amount));
|
var solution = new Solution("Water", FixedPoint2.New(amount));
|
||||||
puddle = solution.SpillAt(sCoordinates, "PuddleSmear");
|
puddle = solution.SpillAt(sCoordinates, "PuddleSmear");
|
||||||
|
|
||||||
// Check that the puddle was created
|
// Check that the puddle was created
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ namespace Content.Server.Chemistry.Components
|
|||||||
public int Amount { get; set; }
|
public int Amount { get; set; }
|
||||||
public SolutionAreaEffectInceptionComponent? Inception { get; set; }
|
public SolutionAreaEffectInceptionComponent? Inception { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Have we reacted with our tile yet?
|
||||||
|
/// </summary>
|
||||||
|
public bool ReactedTile = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Adds an <see cref="SolutionAreaEffectInceptionComponent"/> to owner so the effect starts spreading and reacting.
|
/// Adds an <see cref="SolutionAreaEffectInceptionComponent"/> to owner so the effect starts spreading and reacting.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -138,7 +143,12 @@ namespace Content.Server.Chemistry.Components
|
|||||||
var reagent = PrototypeManager.Index<ReagentPrototype>(reagentQuantity.ReagentId);
|
var reagent = PrototypeManager.Index<ReagentPrototype>(reagentQuantity.ReagentId);
|
||||||
|
|
||||||
// React with the tile the effect is on
|
// React with the tile the effect is on
|
||||||
reagent.ReactionTile(tile, reagentQuantity.Quantity * solutionFraction);
|
// We don't multiply by solutionFraction here since the tile is only ever reacted once
|
||||||
|
if (!ReactedTile)
|
||||||
|
{
|
||||||
|
reagent.ReactionTile(tile, reagentQuantity.Quantity);
|
||||||
|
ReactedTile = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Touch every entity on the tile
|
// Touch every entity on the tile
|
||||||
foreach (var entity in tile.GetEntitiesInTileFast().ToArray())
|
foreach (var entity in tile.GetEntitiesInTileFast().ToArray())
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
using Content.Shared.Chemistry.Reaction;
|
||||||
|
using Content.Shared.Chemistry.Reagent;
|
||||||
|
using Content.Shared.FixedPoint;
|
||||||
|
using Content.Shared.Maps;
|
||||||
|
using Content.Shared.Whitelist;
|
||||||
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Map;
|
||||||
|
using Robust.Shared.Maths;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Serialization.Manager.Attributes;
|
||||||
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||||
|
|
||||||
|
namespace Content.Server.Chemistry.TileReactions;
|
||||||
|
|
||||||
|
[DataDefinition]
|
||||||
|
public class CreateEntityReaction : ITileReaction
|
||||||
|
{
|
||||||
|
[DataField("entity", required: true, customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||||
|
public string Entity = default!;
|
||||||
|
|
||||||
|
[DataField("usage")]
|
||||||
|
public FixedPoint2 Usage = FixedPoint2.New(1);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// How many of the whitelisted entity can fit on one tile?
|
||||||
|
/// </summary>
|
||||||
|
[DataField("maxOnTile")]
|
||||||
|
public int MaxOnTile = 1;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The whitelist to use when determining what counts as "max entities on a tile".0
|
||||||
|
/// </summary>
|
||||||
|
[DataField("maxOnTileWhitelist")]
|
||||||
|
public EntityWhitelist? Whitelist;
|
||||||
|
|
||||||
|
public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume)
|
||||||
|
{
|
||||||
|
if (reactVolume >= Usage)
|
||||||
|
{
|
||||||
|
// TODO probably pass this in args like reagenteffects do.
|
||||||
|
var entMan = IoCManager.Resolve<IEntityManager>();
|
||||||
|
|
||||||
|
if (Whitelist != null)
|
||||||
|
{
|
||||||
|
int acc = 0;
|
||||||
|
foreach (var ent in tile.GetEntitiesInTile())
|
||||||
|
{
|
||||||
|
if (Whitelist.IsValid(ent.Uid))
|
||||||
|
acc += 1;
|
||||||
|
|
||||||
|
if (acc >= MaxOnTile)
|
||||||
|
return FixedPoint2.Zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
entMan.SpawnEntity(Entity, tile.GridPosition().Offset(new Vector2(0.5f, 0.5f)));
|
||||||
|
return Usage;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FixedPoint2.Zero;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ using Robust.Server.GameObjects;
|
|||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Server.Fluids.Components
|
namespace Content.Server.Fluids.Components
|
||||||
{
|
{
|
||||||
@@ -129,7 +130,7 @@ namespace Content.Server.Fluids.Components
|
|||||||
if (solution.TotalVolume <= 0) return null;
|
if (solution.TotalVolume <= 0) return null;
|
||||||
|
|
||||||
var mapManager = IoCManager.Resolve<IMapManager>();
|
var mapManager = IoCManager.Resolve<IMapManager>();
|
||||||
var entityManager = IoCManager.Resolve<IEntityManager>();
|
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
|
||||||
var serverEntityManager = IoCManager.Resolve<IServerEntityManager>();
|
var serverEntityManager = IoCManager.Resolve<IServerEntityManager>();
|
||||||
|
|
||||||
// If space return early, let that spill go out into the void
|
// If space return early, let that spill go out into the void
|
||||||
@@ -138,6 +139,17 @@ namespace Content.Server.Fluids.Components
|
|||||||
var gridId = tileRef.GridIndex;
|
var gridId = tileRef.GridIndex;
|
||||||
if (!mapManager.TryGetGrid(gridId, out var mapGrid)) return null; // Let's not spill to invalid grids.
|
if (!mapManager.TryGetGrid(gridId, out var mapGrid)) return null; // Let's not spill to invalid grids.
|
||||||
|
|
||||||
|
// First, do all tile reactions
|
||||||
|
foreach (var reagent in solution.Contents.ToArray())
|
||||||
|
{
|
||||||
|
var proto = prototypeManager.Index<ReagentPrototype>(reagent.ReagentId);
|
||||||
|
proto.ReactionTile(tileRef, reagent.Quantity);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tile reactions used up everything.
|
||||||
|
if (solution.CurrentVolume == FixedPoint2.Zero)
|
||||||
|
return null;
|
||||||
|
|
||||||
// Get normalized co-ordinate for spill location and spill it in the centre
|
// Get normalized co-ordinate for spill location and spill it in the centre
|
||||||
// TODO: Does SnapGrid or something else already do this?
|
// TODO: Does SnapGrid or something else already do this?
|
||||||
var spillGridCoords = mapGrid.GridTileToLocal(tileRef.GridIndices);
|
var spillGridCoords = mapGrid.GridTileToLocal(tileRef.GridIndices);
|
||||||
|
|||||||
2
Resources/Locale/en-US/reagents/carpetium.ftl
Normal file
2
Resources/Locale/en-US/reagents/carpetium.ftl
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
carpetium-effect-blood-fibrous = Your blood feels oddly fibrous today.
|
||||||
|
carpetium-effect-jumpsuit-insides = You feel like there's a jumpsuit inside you, for some reason.
|
||||||
@@ -8,3 +8,8 @@
|
|||||||
- shoes
|
- shoes
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
state: icon
|
state: icon
|
||||||
|
- type: Extractable
|
||||||
|
juiceSolution:
|
||||||
|
reagents:
|
||||||
|
- ReagentId: Fiber
|
||||||
|
Quantity: 5
|
||||||
|
|||||||
@@ -9,6 +9,11 @@
|
|||||||
Slots: [innerclothing]
|
Slots: [innerclothing]
|
||||||
EquipSound:
|
EquipSound:
|
||||||
path: /Audio/Items/jumpsuit_equip.ogg
|
path: /Audio/Items/jumpsuit_equip.ogg
|
||||||
|
- type: Extractable
|
||||||
|
juiceSolution:
|
||||||
|
reagents:
|
||||||
|
- ReagentId: Fiber
|
||||||
|
Quantity: 10
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
abstract: true
|
abstract: true
|
||||||
@@ -22,3 +27,8 @@
|
|||||||
femaleMask: UniformTop
|
femaleMask: UniformTop
|
||||||
EquipSound:
|
EquipSound:
|
||||||
path: /Audio/Items/jumpsuit_equip.ogg
|
path: /Audio/Items/jumpsuit_equip.ogg
|
||||||
|
- type: Extractable
|
||||||
|
juiceSolution:
|
||||||
|
reagents:
|
||||||
|
- ReagentId: Fiber
|
||||||
|
Quantity: 5
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
- type: IconSmooth
|
- type: IconSmooth
|
||||||
key: full
|
key: full
|
||||||
base: carpet_
|
base: carpet_
|
||||||
|
- type: Tag
|
||||||
|
tags: [ Carpet ]
|
||||||
- type: Physics
|
- type: Physics
|
||||||
canCollide: false
|
canCollide: false
|
||||||
fixtures:
|
fixtures:
|
||||||
|
|||||||
25
Resources/Prototypes/Reagents/fun.yml
Normal file
25
Resources/Prototypes/Reagents/fun.yml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
- type: reagent
|
||||||
|
id: Carpetium
|
||||||
|
name: carpetium
|
||||||
|
desc: A mystical chemical, usually outsourced from the Clown Planet, that covers everything it touches in carpet.
|
||||||
|
physicalDesc: fibrous
|
||||||
|
color: "#800000"
|
||||||
|
tileReactions:
|
||||||
|
- !type:CreateEntityReaction
|
||||||
|
entity: Carpet
|
||||||
|
maxOnTileWhitelist:
|
||||||
|
tags: [ Carpet ]
|
||||||
|
metabolisms:
|
||||||
|
Poison:
|
||||||
|
effects:
|
||||||
|
- !type:PopupMessage
|
||||||
|
type: Local
|
||||||
|
messages: [ "carpetium-effect-blood-fibrous", "carpetium-effect-jumpsuit-insides" ]
|
||||||
|
probability: 0.1
|
||||||
|
|
||||||
|
- type: reagent
|
||||||
|
id: Fiber
|
||||||
|
name: fiber
|
||||||
|
desc: A raw material, usually extracted from wool or other fabric products.
|
||||||
|
physicalDesc: fibrous
|
||||||
|
color: "#808080"
|
||||||
9
Resources/Prototypes/Recipes/Reactions/fun.yml
Normal file
9
Resources/Prototypes/Recipes/Reactions/fun.yml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
- type: reaction
|
||||||
|
id: Carpetium
|
||||||
|
reactants:
|
||||||
|
SpaceDrugs:
|
||||||
|
amount: 1
|
||||||
|
Fiber:
|
||||||
|
amount: 2
|
||||||
|
products:
|
||||||
|
Carpetium: 3
|
||||||
@@ -27,6 +27,9 @@
|
|||||||
- type: Tag
|
- type: Tag
|
||||||
id: Carrot
|
id: Carrot
|
||||||
|
|
||||||
|
- type: Tag
|
||||||
|
id: Carpet
|
||||||
|
|
||||||
- type: Tag
|
- type: Tag
|
||||||
id: CanPilot
|
id: CanPilot
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user