Water gun cargo crate (#16172)

This commit is contained in:
Nemanja
2023-05-06 23:14:54 -04:00
committed by GitHub
parent 883d6646ea
commit 4c2b521c90
22 changed files with 221 additions and 13 deletions

View File

@@ -45,14 +45,14 @@ public sealed class RandomSpriteSystem : SharedRandomSpriteSystem
if (_reflection.TryParseEnumReference(layer.Key, out var @enum))
{
if (!sprite.LayerMapTryGet(@enum, out index, logError: true))
return;
continue;
}
else if (!sprite.LayerMapTryGet(layer.Key, out index))
{
if (layer.Key is not string strKey || !int.TryParse(strKey, out index))
if (layer.Key is not { } strKey || !int.TryParse(strKey, out index))
{
Logger.Error($"Invalid key `{layer.Key}` for entity with random sprite {ToPrettyString(uid)}");
return;
continue;
}
}

View File

@@ -1,4 +1,3 @@
using System.Linq;
using Content.Shared.Decals;
using Content.Shared.Sprite;
using Robust.Shared.GameStates;
@@ -27,17 +26,29 @@ public sealed class RandomSpriteSystem: SharedRandomSpriteSystem
if (component.Available.Count == 0)
return;
var group = _random.Pick(component.Available);
component.Selected.EnsureCapacity(group.Count);
var groups = new List<Dictionary<string, (string, string?)>>();
if (component.GetAllGroups)
{
groups = component.Available;
}
else
{
groups.Add(_random.Pick(component.Available));
}
component.Selected.EnsureCapacity(groups.Count);
foreach (var group in groups)
{
foreach (var layer in group)
{
Color? color = null;
if (!string.IsNullOrEmpty(layer.Value.Color))
color = _random.Pick(_prototype.Index<ColorPalettePrototype>(layer.Value.Color).Colors.Values);
if (!string.IsNullOrEmpty(layer.Value.Item2))
color = _random.Pick(_prototype.Index<ColorPalettePrototype>(layer.Value.Item2).Colors.Values);
component.Selected.Add(layer.Key, (layer.Value.State, color));
component.Selected.Add(layer.Key, (layer.Value.Item1, color));
}
}
Dirty(component);

View File

@@ -5,6 +5,13 @@ namespace Content.Shared.Sprite;
[RegisterComponent, NetworkedComponent]
public sealed class RandomSpriteComponent : Component
{
/// <summary>
/// Whether or not all groups from <see cref="Available"/> are used,
/// or if only one is picked at random.
/// </summary>
[DataField("getAllGroups")]
public bool GetAllGroups;
/// <summary>
/// Available colors based on group, parsed layer enum, state, and color.
/// Stored as a list so we can have groups of random sprites (e.g. tech_base + tech_flare for holoparasite)

View File

@@ -16,5 +16,8 @@ ent-FunBoardGames = { ent-CrateFunBoardGames }
ent-FunATV = { ent-CrateFunATV }
.desc = { ent-CrateFunATV.desc }
ent-FunWaterGuns = { ent-CrateFunWaterGuns }
.desc = { ent-CrateFunWaterGuns.desc }
ent-FunParty = { ent-CrateFunParty }
.desc = { ent-CrateFunParty.desc }

View File

@@ -37,6 +37,9 @@ ent-CrateFunLightImplants = Light Implants
ent-CrateFunParty = Party Crate
.desc = An entire party just waiting for you to open it. Includes party favors, party beverages, and even a cake.
ent-CrateFunWaterGuns = Water Gun Crate
.desc = A summer special with a variety of brightly colored water guns. Water not included.
ent-CrateFunSyndicateSegway = Syndicate segway crate
.desc = A crate containing a two-wheeler that will help you escape from the security officers. Or not.

View File

@@ -78,6 +78,16 @@
category: Fun
group: market
- type: cargoProduct
id: CrateFunWaterGuns
icon:
sprite: Objects/Weapons/Guns/Pistols/water_pistol.rsi
state: display
product: CrateFunWaterGuns
cost: 750
category: Fun
group: market
- type: cargoProduct
id: FunPlushies
icon:

View File

@@ -186,6 +186,16 @@
amount: 4
- id: KnifePlastic
- type: entity
id: CrateFunWaterGuns
parent: CratePlastic
components:
- type: StorageFill
contents:
- id: WeaponWaterBlaster
- id: WeaponWaterPistol
amount: 5
- type: entity
id: CrateFunSyndicateSegway
parent: CrateLivestock

View File

@@ -0,0 +1,104 @@
- type: entity
id: WeaponWaterGunBase
abstract: true
parent: BaseItem
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/water_pistol.rsi
- type: Clothing
sprite: Objects/Weapons/Guns/Pistols/water_pistol.rsi
slots: BELT
- type: Item
sprite: Objects/Weapons/Guns/Pistols/water_pistol.rsi
size: 10
- type: Gun
cameraRecoilScalar: 0 #no recoil
fireRate: 1
selectedMode: SemiAuto
availableModes:
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/water_spray.ogg
- type: SolutionContainerManager
solutions:
chamber:
maxVol: 50 #5 shots
- type: SolutionAmmoProvider
solutionId: chamber
proto: BulletWaterShot
- type: SolutionTransfer
transferAmount: 10
maxTransferAmount: 50
minTransferAmount: 5
canChangeTransferAmount: true
- type: UserInterface
interfaces:
- key: enum.TransferAmountUiKey.Key
type: TransferAmountBoundUserInterface
- type: DrawableSolution
solution: chamber
- type: RefillableSolution
solution: chamber
- type: DrainableSolution
solution: chamber
- type: ExaminableSolution
solution: chamber
- type: StaticPrice
price: 100
- type: PhysicalComposition
materialComposition:
Plastic: 150
- type: entity
id: WeaponWaterPistol
parent: WeaponWaterGunBase
name: water pistol
description: The dinkiest of water-based weaponry. You swear the trigger doesn't do anything.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/water_pistol.rsi
layers:
- state: detail
- state: icon
map: [ "enum.DamageStateVisualLayers.Base" ]
- type: RandomSprite
available:
- enum.DamageStateVisualLayers.Base:
icon: Rainbow
- type: entity
id: WeaponWaterBlaster
parent: WeaponWaterGunBase
name: water blaster
description: With this bad boy, you'll be the cooleste kid at the summer barbecue.
components:
- type: Gun
cameraRecoilScalar: 0 #no recoil
fireRate: 2
selectedMode: FullAuto
availableModes:
- FullAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/water_spray.ogg
- type: SolutionContainerManager
solutions:
chamber:
maxVol: 100 #10 shots
- type: Sprite
sprite: Objects/Weapons/Guns/Pistols/soaker.rsi
layers:
- state: detail1
- state: detail2
map: ["enum.PowerDeviceVisualLayers.Powered"]
- state: icon
map: [ "enum.DamageStateVisualLayers.Base" ]
- type: Item
sprite: Objects/Weapons/Guns/Pistols/soaker.rsi
size: 35
- type: RandomSprite
getAllGroups: true
available:
- enum.DamageStateVisualLayers.Base:
icon: Rainbow
- enum.PowerDeviceVisualLayers.Powered:
detail2: Sixteen

View File

@@ -598,7 +598,7 @@
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.25,-0.25,0.25,0.25"
bounds: "-0.10,-0.30,0.10,0.15"
hard: false
mask:
- FullTileMask

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 281 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

View File

@@ -0,0 +1,28 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Created by EmoGarbage404 (github) for Space Station 14",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "detail1"
},
{
"name": "detail2"
},
{
"name": "icon"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 565 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 504 B

View File

@@ -0,0 +1,32 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Created by EmoGarbage404 (github) for Space Station 14",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
},
{
"name": "display"
},
{
"name": "detail"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
},
{
"name": "equipped-BELT",
"directions": 4
}
]
}