Toy Box filled with toys (ready for merge) (#16252)

This commit is contained in:
brainfood1183
2023-06-03 04:31:47 +01:00
committed by GitHub
parent 3d29ab3486
commit c99585c94f
75 changed files with 1118 additions and 13 deletions

View File

@@ -0,0 +1,61 @@
using Content.Shared.IdentityManagement;
using Content.Shared.Popups;
using Content.Shared.Item;
using Content.Shared.Interaction.Components;
using Content.Shared.Glue;
using Content.Server.Nutrition.EntitySystems;
using Content.Shared.Interaction;
using Content.Server.Nutrition.Components;
namespace Content.Server.Glue
{
public sealed class GlueSystem : EntitySystem
{
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly FoodSystem _food = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GlueComponent, AfterInteractEvent>(OnInteract);
}
// When glue bottle is used on item it will apply the glued and unremoveable components.
private void OnInteract(EntityUid uid, GlueComponent component, AfterInteractEvent args)
{
if (args.Handled)
return;
if (!args.CanReach || args.Target is not { Valid: true } target)
return;
if (HasComp<GluedComponent>(target))
{
_popup.PopupEntity(Loc.GetString("glue-failure", ("target", Identity.Entity(target, EntityManager))), args.User,
args.User, PopupType.Medium);
return;
}
if (HasComp<ItemComponent>(target))
{
_audio.PlayPvs(component.Squeeze, uid);
EnsureComp<UnremoveableComponent>(target);
_popup.PopupEntity(Loc.GetString("glue-success", ("target", Identity.Entity(target, EntityManager))), args.User,
args.User, PopupType.Medium);
EnsureComp<GluedComponent>(target);
}
if (TryComp<FoodComponent>(uid, out var food))
{
_food.DeleteAndSpawnTrash(food, uid, args.User);
}
args.Handled = true;
}
}
}

View File

@@ -0,0 +1,64 @@
using Content.Shared.Interaction.Components;
using Robust.Shared.Timing;
using Content.Shared.Interaction;
using Content.Shared.Glue;
using Content.Shared.Hands.Components;
namespace Content.Server.Glue;
public sealed class GluedSystem : EntitySystem
{
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly IGameTiming _timing = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<GluedComponent, ComponentInit>(OnGluedInit);
SubscribeLocalEvent<GluedComponent, InteractHandEvent>(OnPickUp);
}
// Timing to remove glued and unremoveable.
public override void Update(float frameTime)
{
base.Update(frameTime);
var query = EntityQueryEnumerator<GluedComponent>();
while (query.MoveNext(out var uid, out var glue))
{
if (!glue.GlueBroken || glue.Glued)
continue;
if (_timing.CurTime < glue.GlueTime)
continue;
glue.Glued = false;
glue.GlueBroken = false;
MetaData(uid).EntityName = glue.BeforeGluedEntityName;
RemComp<UnremoveableComponent>(uid);
RemComp<GluedComponent>(uid);
}
}
//Adds the prefix on init.
private void OnGluedInit(EntityUid uid, GluedComponent component, ComponentInit args)
{
var meta = MetaData(uid);
var name = meta.EntityName;
component.BeforeGluedEntityName = meta.EntityName;
meta.EntityName = Loc.GetString("glued-name-prefix", ("target", name));
}
// Timers start only when the glued item is picked up.
private void OnPickUp(EntityUid uid, GluedComponent component, InteractHandEvent args)
{
var userHands = Comp<HandsComponent>(args.User);
if (userHands.ActiveHandEntity == uid)
{
component.GlueBroken = true;
component.GlueTime = _timing.CurTime + component.GlueCooldown;
}
}
}

View File

@@ -300,7 +300,7 @@ namespace Content.Server.Nutrition.EntitySystems
DeleteAndSpawnTrash(component, uid, args.User); DeleteAndSpawnTrash(component, uid, args.User);
} }
private void DeleteAndSpawnTrash(FoodComponent component, EntityUid food, EntityUid? user = null) public void DeleteAndSpawnTrash(FoodComponent component, EntityUid food, EntityUid? user = null)
{ {
//We're empty. Become trash. //We're empty. Become trash.
var position = Transform(food).MapPosition; var position = Transform(food).MapPosition;

View File

@@ -0,0 +1,100 @@
using Content.Server.Ghost.Roles.Components;
using Content.Server.Popups;
using Content.Shared.Interaction.Events;
using Content.Shared.Puppet;
using Content.Shared.Hands.Components;
using Content.Server.Speech.Muting;
using Content.Shared.CombatMode;
using Content.Shared.Hands;
namespace Content.Server.Puppet
{
public sealed class PuppetDummySystem : SharedPuppetDummySystem
{
[Dependency] private readonly PopupSystem _popupSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PuppetDummyComponent, DroppedEvent>(OnDropped);
SubscribeLocalEvent<PuppetDummyComponent, UseInHandEvent>(OnUseInHand);
SubscribeLocalEvent<PuppetDummyComponent, GotUnequippedHandEvent>(OnUnequippedHand);
}
/// <summary>
/// When used user inserts hand into dummy and the dummy can speak, when used again the user removes hand
/// from dummy and the dummy cannot speak.
/// </summary>
/// <param name="uid"></param>
/// <param name="component"></param>
/// <param name="args"></param>
private void OnUseInHand(EntityUid uid, PuppetDummyComponent component, UseInHandEvent args)
{
if (args.Handled)
return;
var userHands = Comp<HandsComponent>(args.User);
if (userHands.ActiveHandEntity == uid && HasComp<MutedComponent>(uid))
{
RemComp<MutedComponent>(uid);
_popupSystem.PopupEntity(Loc.GetString("dummy-insert-hand"), uid, args.User);
_popupSystem.PopupEntity(Loc.GetString("dummy-inserted-hand"), uid, uid);
AddComp<CombatModeComponent>(uid);
if (!HasComp<GhostTakeoverAvailableComponent>(uid))
{
EnsureComp<GhostTakeoverAvailableComponent>(uid);
var ghostRole = AddComp<GhostRoleComponent>(uid);
ghostRole.RoleName = Loc.GetString("dummy-role-name");
ghostRole.RoleDescription = Loc.GetString("dummy-role-description");
}
}
else if (userHands.ActiveHandEntity == uid && !HasComp<MutedComponent>(uid))
{
_popupSystem.PopupEntity(Loc.GetString("dummy-remove-hand"), uid, args.User);
MuteDummy(uid, component);
}
args.Handled = true;
}
/// <summary>
/// When dropped the dummy is muted again.
/// </summary>
private void OnDropped(EntityUid uid, PuppetDummyComponent component, DroppedEvent args)
{
if (HasComp<MutedComponent>(uid))
return;
_popupSystem.PopupEntity(Loc.GetString("dummy-remove-hand"), uid, args.User);
MuteDummy(uid, component);
}
/// <summary>
/// When unequipped from a hand slot the dummy is muted again.
/// </summary>
private void OnUnequippedHand(EntityUid uid, PuppetDummyComponent component, GotUnequippedHandEvent args)
{
if (HasComp<MutedComponent>(uid))
return;
_popupSystem.PopupEntity(Loc.GetString("dummy-remove-hand"), uid, args.User);
MuteDummy(uid, component);
}
/// <summary>
/// Mutes the dummy.
/// </summary>
private void MuteDummy(EntityUid uid, PuppetDummyComponent component)
{
_popupSystem.PopupEntity(Loc.GetString("dummy-removed-hand"), uid, uid);
AddComp<MutedComponent>(uid);
RemComp<CombatModeComponent>(uid);
}
}
}

View File

@@ -4,6 +4,7 @@ using Content.Server.Popups;
using Content.Server.Speech.Components; using Content.Server.Speech.Components;
using Content.Server.Speech.EntitySystems; using Content.Server.Speech.EntitySystems;
using Content.Shared.Chat.Prototypes; using Content.Shared.Chat.Prototypes;
using Content.Shared.Puppet;
using Content.Shared.Speech; using Content.Shared.Speech;
namespace Content.Server.Speech.Muting namespace Content.Server.Speech.Muting
@@ -36,6 +37,7 @@ namespace Content.Server.Speech.Muting
if (HasComp<MimePowersComponent>(uid)) if (HasComp<MimePowersComponent>(uid))
_popupSystem.PopupEntity(Loc.GetString("mime-cant-speak"), uid, uid); _popupSystem.PopupEntity(Loc.GetString("mime-cant-speak"), uid, uid);
else else
_popupSystem.PopupEntity(Loc.GetString("speech-muted"), uid, uid); _popupSystem.PopupEntity(Loc.GetString("speech-muted"), uid, uid);
args.Handled = true; args.Handled = true;
@@ -46,8 +48,13 @@ namespace Content.Server.Speech.Muting
{ {
if (HasComp<MimePowersComponent>(uid)) if (HasComp<MimePowersComponent>(uid))
_popupSystem.PopupEntity(Loc.GetString("mime-cant-speak"), uid, uid); _popupSystem.PopupEntity(Loc.GetString("mime-cant-speak"), uid, uid);
if (HasComp<PuppetDummyComponent>(uid))
_popupSystem.PopupEntity(Loc.GetString("dummy-cant-speak"), uid, uid);
else else
_popupSystem.PopupEntity(Loc.GetString("speech-muted"), uid, uid); _popupSystem.PopupEntity(Loc.GetString("speech-muted"), uid, uid);
args.Cancel(); args.Cancel();
} }
} }

View File

@@ -0,0 +1,40 @@
using Content.Shared.Damage;
using Robust.Shared.Audio;
namespace Content.Server.Weapons.Melee.WeaponRandom;
[RegisterComponent]
internal sealed class WeaponRandomComponent : Component
{
/// <summary>
/// Amount of damage that will be caused. This is specified in the yaml.
/// </summary>
[DataField("damageBonus")]
public DamageSpecifier DamageBonus = new();
/// <summary>
/// Chance for the damage bonus to occur.
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
public float RandomDamageChance = 0.00001f;
/// <summary>
/// If this is true then the random damage will occur.
/// </summary>
[DataField("randomDamage")]
public bool RandomDamage = true;
/// <summary>
/// If this is true then the weapon will have a unique interaction with cluwnes.
/// </summary>
[DataField("antiCluwne")]
public bool AntiCluwne = true;
/// <summary>
/// Noise to play when the damage bonus occurs.
/// </summary>
[DataField("damageSound")]
public SoundSpecifier DamageSound = new SoundPathSpecifier("/Audio/Items/bikehorn.ogg");
}

View File

@@ -0,0 +1,36 @@
using Content.Shared.Weapons.Melee.Events;
using Robust.Shared.Random;
using Content.Shared.Cluwne;
namespace Content.Server.Weapons.Melee.WeaponRandom;
public sealed class WeaponRandomSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<WeaponRandomComponent, MeleeHitEvent>(OnMeleeHit);
}
private void OnMeleeHit(EntityUid uid, WeaponRandomComponent component, MeleeHitEvent args)
{
foreach (var entity in args.HitEntities)
{
if (HasComp<CluwneComponent>(entity) && component.AntiCluwne)
{
_audio.PlayPvs(component.DamageSound, uid);
args.BonusDamage = component.DamageBonus;
}
else if (_random.Prob(component.RandomDamageChance) && component.RandomDamage)
{
_audio.PlayPvs(component.DamageSound, uid);
args.BonusDamage = component.DamageBonus;
}
}
}
}

View File

@@ -0,0 +1,15 @@
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
namespace Content.Shared.Glue
{
[RegisterComponent, NetworkedComponent]
public sealed class GlueComponent : Component
{
/// <summary>
/// Noise made when glue applied.
/// </summary>
[DataField("squeeze")]
public SoundSpecifier Squeeze = new SoundPathSpecifier("/Audio/Items/squeezebottle.ogg");
}
}

View File

@@ -0,0 +1,42 @@
using Robust.Shared.Audio;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Shared.Glue;
[RegisterComponent]
public sealed class GluedComponent : Component
{
/// <summary>
/// Reverts name to before prefix event (essentially removes prefix).
/// </summary>
[DataField("beforeGluedEntityName"), ViewVariables(VVAccess.ReadOnly)]
public string BeforeGluedEntityName = String.Empty;
/// <summary>
/// Sound made when glue applied.
/// </summary>
[DataField("squeeze")]
public SoundSpecifier Squeeze = new SoundPathSpecifier("/Audio/Items/squeezebottle.ogg");
/// <summary>
/// Timings for glue duration and removal.
/// </summary>
[DataField("nextGlueTime", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)]
public TimeSpan? NextGlueTime;
[DataField("glueTime", customTypeSerializer: typeof(TimeOffsetSerializer))]
public TimeSpan GlueTime = TimeSpan.Zero;
[DataField("glueCooldown")]
public TimeSpan GlueCooldown = TimeSpan.FromSeconds(20);
/// <summary>
/// Bools which control timings and when to apply the glue effect.
/// </summary>
public bool GlueBroken = false;
[DataField("glued")]
[ViewVariables(VVAccess.ReadWrite)]
public bool Glued = false;
}

View File

@@ -0,0 +1,11 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Puppet
{
[RegisterComponent, NetworkedComponent]
public sealed class PuppetDummyComponent : Component
{
[DataField("enabled")]
public bool Enabled = false;
}
}

View File

@@ -0,0 +1,71 @@
using Content.Shared.ActionBlocker;
using Content.Shared.Hands;
using Content.Shared.Interaction.Events;
using Content.Shared.Item;
using Content.Shared.Emoting;
using Content.Shared.Movement.Events;
namespace Content.Shared.Puppet
{
public abstract class SharedPuppetDummySystem : EntitySystem
{
[Dependency] private readonly ActionBlockerSystem _blocker = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PuppetDummyComponent, UseAttemptEvent>(OnUseAttempt);
SubscribeLocalEvent<PuppetDummyComponent, InteractionAttemptEvent>(OnInteractAttempt);
SubscribeLocalEvent<PuppetDummyComponent, DropAttemptEvent>(OnDropAttempt);
SubscribeLocalEvent<PuppetDummyComponent, PickupAttemptEvent>(OnPickupAttempt);
SubscribeLocalEvent<PuppetDummyComponent, UpdateCanMoveEvent>(OnMoveAttempt);
SubscribeLocalEvent<PuppetDummyComponent, EmoteAttemptEvent>(OnEmoteAttempt);
SubscribeLocalEvent<PuppetDummyComponent, ChangeDirectionAttemptEvent>(OnChangeDirectionAttempt);
SubscribeLocalEvent<PuppetDummyComponent, ComponentStartup>(OnStartup);
}
private void OnStartup(EntityUid uid, PuppetDummyComponent component, ComponentStartup args)
{
_blocker.UpdateCanMove(uid);
}
private void OnMoveAttempt(EntityUid uid, PuppetDummyComponent component, UpdateCanMoveEvent args)
{
if (component.LifeStage > ComponentLifeStage.Running)
return;
args.Cancel();
}
private void OnChangeDirectionAttempt(EntityUid uid, PuppetDummyComponent component, ChangeDirectionAttemptEvent args)
{
args.Cancel();
}
private void OnUseAttempt(EntityUid uid, PuppetDummyComponent component, UseAttemptEvent args)
{
args.Cancel();
}
private void OnEmoteAttempt(EntityUid uid, PuppetDummyComponent component, EmoteAttemptEvent args)
{
args.Cancel();
}
private void OnInteractAttempt(EntityUid uid, PuppetDummyComponent component, InteractionAttemptEvent args)
{
args.Cancel();
}
private void OnDropAttempt(EntityUid uid, PuppetDummyComponent component, DropAttemptEvent args)
{
args.Cancel();
}
private void OnPickupAttempt(EntityUid uid, PuppetDummyComponent component, PickupAttemptEvent args)
{
args.Cancel();
}
}
}

View File

@@ -107,6 +107,10 @@ public sealed partial class VehicleComponent : Component
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
public bool AutoAnimate = true; public bool AutoAnimate = true;
[DataField("useHand")]
[ViewVariables(VVAccess.ReadWrite)]
public bool UseHand = true;
[DataField("hideRider")] [DataField("hideRider")]
[ViewVariables(VVAccess.ReadWrite)] [ViewVariables(VVAccess.ReadWrite)]
public bool HideRider; public bool HideRider;

View File

@@ -105,6 +105,8 @@ public abstract partial class SharedVehicleSystem : EntitySystem
{ {
// Add Rider // Add Rider
if (args.Buckling) if (args.Buckling)
{
if (component.UseHand == true)
{ {
// Add a virtual item to rider's hand, unbuckle if we can't. // Add a virtual item to rider's hand, unbuckle if we can't.
if (!_virtualItemSystem.TrySpawnVirtualItemInHand(uid, args.BuckledEntity)) if (!_virtualItemSystem.TrySpawnVirtualItemInHand(uid, args.BuckledEntity))
@@ -112,7 +114,7 @@ public abstract partial class SharedVehicleSystem : EntitySystem
_buckle.TryUnbuckle(uid, uid, true); _buckle.TryUnbuckle(uid, uid, true);
return; return;
} }
}
// Set up the rider and vehicle with each other // Set up the rider and vehicle with each other
EnsureComp<InputMoverComponent>(uid); EnsureComp<InputMoverComponent>(uid);
var rider = EnsureComp<RiderComponent>(args.BuckledEntity); var rider = EnsureComp<RiderComponent>(args.BuckledEntity);
@@ -148,6 +150,8 @@ public abstract partial class SharedVehicleSystem : EntitySystem
// Clean up actions and virtual items // Clean up actions and virtual items
_actionsSystem.RemoveProvidedActions(args.BuckledEntity, uid); _actionsSystem.RemoveProvidedActions(args.BuckledEntity, uid);
if (component.UseHand == true)
_virtualItemSystem.DeleteInHandsMatching(args.BuckledEntity, uid); _virtualItemSystem.DeleteInHandsMatching(args.BuckledEntity, uid);

Binary file not shown.

View File

@@ -3,3 +3,5 @@ vehiclestartup.ogg and vehicleengineidle.ogg taken from user InspectorJ at https
carhorn.ogg taken from /tg/station at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a carhorn.ogg taken from /tg/station at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a
policesiren.ogg taken from freesound user blukotek at https://freesound.org/people/blukotek/sounds/431651/ policesiren.ogg taken from freesound user blukotek at https://freesound.org/people/blukotek/sounds/431651/
bicyclebell.ogg taken from freesound user 12gkopeckak at https://freesound.org/people/13gkopeckak/sounds/378911/

View File

@@ -38,6 +38,11 @@
copyright: "Created by SamKolber, shortened and converted to OGG and mono" copyright: "Created by SamKolber, shortened and converted to OGG and mono"
source: "https://freesound.org/people/SamKolber/sounds/210022/" source: "https://freesound.org/people/SamKolber/sounds/210022/"
- files: ["squeezebottle.ogg"]
license: "CC0-1.0"
copyright: "Created by Breviceps, shortened and converted to OGG and mono"
source: "https://freesound.org/people/Breviceps/sounds/445118/"
- files: ["Toys/toyfall1.ogg, Toys/toyfall2.ogg"] - files: ["Toys/toyfall1.ogg, Toys/toyfall2.ogg"]
license: "CC0-1.0" license: "CC0-1.0"
copyright: "Created by HighTechPuddle" copyright: "Created by HighTechPuddle"

Binary file not shown.

View File

@@ -14,6 +14,8 @@ block_metal1.ogg taken from https://github.com/Citadel-Station-13/Citadel-Statio
pierce.ogg taken from: https://github.com/tgstation/tgstation/commit/106cd26fc00851a51dd362f3131120318d848a53 pierce.ogg taken from: https://github.com/tgstation/tgstation/commit/106cd26fc00851a51dd362f3131120318d848a53
rubberhammer.ogg taken from https://freesound.org/people/ScreamStudio/sounds/392617/ under CC0 1.0
- files: ["weoweo.ogg"] - files: ["weoweo.ogg"]
license: "SONNISS #GAMEAUDIOGDC BUNDLE LICENSING" license: "SONNISS #GAMEAUDIOGDC BUNDLE LICENSING"
copyright: "Taken from Sonniss.com - GDC 2023 - Systematic Sound - TonalElements Obscurum - Dark Drones" copyright: "Taken from Sonniss.com - GDC 2023 - Systematic Sound - TonalElements Obscurum - Dark Drones"

Binary file not shown.

View File

@@ -0,0 +1,7 @@
dummy-cant-speak = You cannot speak without a helping hand.
dummy-insert-hand = You insert your hand.
dummy-remove-hand = You remove your hand.
dummy-inserted-hand = You have a helping hand.
dummy-removed-hand = you have lost your helping hand.
dummy-role-name = A dummy
dummy-role-description = Become a dummy, dummy!

View File

@@ -143,6 +143,8 @@ flavor-complex-chaos = like chaos
flavor-complex-squirming = like squirming flavor-complex-squirming = like squirming
flavor-complex-electrons = like electrons flavor-complex-electrons = like electrons
flavor-complex-parents = like someone's parents flavor-complex-parents = like someone's parents
flavor-complex-plastic = like plastic
flavor-complex-glue = like glue
# Drink-specific flavors. # Drink-specific flavors.

View File

@@ -0,0 +1,3 @@
glue-success = {THE($target)} has been covered in glue.
glued-name-prefix = Glued {$target}
glue-failure = {THE($target)} is already covered in glue.

View File

@@ -157,3 +157,13 @@
cost: 400 cost: 400
category: Fun category: Fun
group: market group: market
- type: cargoProduct
id: FunToyBox
icon:
sprite: Structures/Storage/Crates/toybox.rsi
state: crate_icon
product: CrateFunToyBox
cost: 900
category: Fun
group: market

View File

@@ -239,3 +239,24 @@
- id: HatBandRed - id: HatBandRed
- id: FoamCutlass - id: FoamCutlass
amount: 2 amount: 2
- type: entity
id: CrateFunToyBox
parent: CrateToyBox
suffix: Filled
components:
- type: StorageFill
contents:
- id: CrazyGlue
amount: 2
- id: PlasticBanana
- id: WhoopieCushion
- id: ToyHammer
- id: MrChips
orGroup: GiftPool
- id: MrDips
orGroup: Giftpool
- id: RevolverCapGun
- id: VehicleUnicycleFolded
- id: ClothingShoesClownLarge
- id: ClothingHeadHatMagician

View File

@@ -247,9 +247,9 @@
- type: entity - type: entity
parent: ClothingBackpackClown parent: ClothingBackpackClown
id: ClothingBackpackCluwne id: ClothingBackpackCluwne
name: cursed giggles von honkerton name: jiggles von jonkerton
suffix: Unremoveable suffix: Unremoveable
description: Cursed giggles von honkerton backpack. description: It's a backpack made by Jonk! Co.
components: components:
- type: Sprite - type: Sprite
sprite: Clothing/Back/Backpacks/cluwne.rsi sprite: Clothing/Back/Backpacks/cluwne.rsi

View File

@@ -586,3 +586,34 @@
sprite: Clothing/Head/Hats/hetman_hat.rsi sprite: Clothing/Head/Hats/hetman_hat.rsi
- type: Clothing - type: Clothing
sprite: Clothing/Head/Hats/hetman_hat.rsi sprite: Clothing/Head/Hats/hetman_hat.rsi
- type: entity
parent: ClothingHeadBase
id: ClothingHeadHatMagician
name: magician's top hat.
description: "A magician's top hat."
components:
- type: Icon
sprite: Clothing/Head/Hats/magician.rsi
state: "icon"
- type: Sprite
state: "icon"
sprite: Clothing/Head/Hats/magician.rsi
- type: Clothing
clothingVisuals:
head:
- state: equipped-HELMET
offset: "0, 0.12"
sprite: Clothing/Head/Hats/magician.rsi
- type: Item
size: 10
sprite: Clothing/Head/Hats/magician.rsi
- type: Storage
capacity: 10
- type: UserInterface
interfaces:
- key: enum.StorageUiKey.Key
type: StorageBoundUserInterface
- type: ContainerContainer
containers:
storagebase: !type:Container

View File

@@ -161,3 +161,25 @@
- type: Clothing - type: Clothing
sprite: Clothing/Shoes/Specific/cluwne.rsi sprite: Clothing/Shoes/Specific/cluwne.rsi
- type: Unremoveable - type: Unremoveable
- type: entity
parent: ClothingShoesClown
id: ClothingShoesClownLarge
name: large clown shoes
description: "When you need to stand out in a room full of clowns!"
components:
- type: Sprite
state: "icon"
sprite: Clothing/Shoes/Specific/large_clown.rsi
- type: Clothing
sprite: Clothing/Shoes/Specific/large_clown.rsi
clothingVisuals:
shoes:
- state: equipped-FEET
offset: "0, -0.02"
- type: Item
size: 10
sprite: Clothing/Shoes/Specific/large_clown.rsi
- type: ClothingSpeedModifier
walkModifier: 0.85
sprintModifier: 0.8

View File

@@ -0,0 +1,45 @@
- type: entity
parent: BaseItem
id: MrChips
name: mr chips
suffix: Dummy
description: It's a dummy, dummy!
components:
- type: Sprite
netsync: false
sprite: Objects/Fun/mrchips.rsi
layers:
- state: icon
- type: Input
context: "human"
- type: DoAfter
- type: PuppetDummy
- type: Item
size: 30
- type: Muted
- type: TypingIndicator
proto: robot
- type: Actions
- type: MobState
allowedStates:
- Alive
- type: MeleeWeapon
hidden: true
soundHit:
path: /Audio/Weapons/boxingpunch1.ogg
angle: 30
animation: WeaponArcPunch
damage:
types:
Blunt: 2
- type: entity
parent: MrChips
id: MrDips
name: mr dips
components:
- type: Sprite
netsync: false
sprite: Objects/Fun/mrdips.rsi
layers:
- state: icon

View File

@@ -987,3 +987,160 @@
tags: tags:
- ClownRecorder - ClownRecorder
- type: entity
parent: BaseItem
id: ToyHammer
name: rubber hammer
description: A brightly colored hammer made of rubber.
components:
- type: Sprite
sprite: Objects/Fun/rubber_hammer.rsi
layers:
- state: icon
shader: unshaded
- type: WeaponRandom
damageBonus:
types:
Blunt: 1000
- type: StaminaDamageOnHit
damage: 8
- type: Item
size: 5
sprite: Objects/Fun/rubber_hammer.rsi
- type: Appearance
- type: DisarmMalus
malus: 0
- type: MeleeWeapon
soundHit:
collection: RubberHammer
params:
variation: 0.03
volume: 3
soundNoDamage:
collection: RubberHammer
params:
variation: 0.03
volume: 3
damage:
types:
Blunt: 0
- type: entity
parent: BaseItem
id: WhoopieCushion
name: whoopie cushion
description: A practical joke device involving flatulence humour.
components:
- type: Sprite
sprite: Objects/Fun/whoopie.rsi
state: icon
quickEquip: false
- type: ItemCooldown
- type: EmitSoundOnUse
sound:
collection: Parp
params:
variation: 0.125
- type: UseDelay
delay: 0.8
- type: Slippery
paralyzeTime: 0
slipSound:
collection: Parp
params:
variation: 0.125
- type: MeleeWeapon
soundHit:
collection: Parp
params:
variation: 0.125
damage:
types:
Blunt: 0
- type: StepTrigger
intersectRatio: 0.2
requiredTriggeredSpeed: 1
- type: TriggerOnStepTrigger
- type: Appearance
- type: CollisionWake
enabled: false
- type: Physics
bodyType: Dynamic
- type: Fixtures
fixtures:
slips:
shape:
!type:PhysShapeAabb
bounds: "-0.2,-0.2,0.2,0.2"
hard: false
layer:
- SlipLayer
fix1:
shape:
!type:PhysShapeAabb
bounds: "-0.2,-0.2,0.2,0.2"
density: 30
mask:
- ItemMask
- type: entity
name: banana
parent: FoodProduceBase
id: PlasticBanana
description: A plastic banana.
suffix: Plastic
components:
- type: FlavorProfile
flavors:
- plastic
- type: Food
- type: Sprite
sprite: Objects/Specific/Hydroponics/banana.rsi
- type: SolutionContainerManager
solutions:
food:
reagents:
- ReagentId: Nothing
Quantity: 100
- type: entity
parent: FoodProduceBase
id: CrazyGlue
name: crazy glue
description: A bottle of crazy glue manufactured by Honk! Co.
components:
- type: FlavorProfile
flavors:
- glue
- type: Food
trash: CrazyGlueEmpty
- type: Sprite
sprite: Objects/Fun/glue.rsi
state: icon-0
- type: Appearance
- type: Glue
- type: Item
sprite: Objects/Fun/glue.rsi
- type: SolutionContainerManager
solutions:
food:
maxVol: 15
reagents:
- ReagentId: SpaceGlue
Quantity: 6
- type: entity
name: empty crazy glue
parent: BaseItem
id: CrazyGlueEmpty
components:
- type: Sprite
sprite: Objects/Fun/glue.rsi
state: icon-1
- type: Item
sprite: Objects/Fun/glue.rsi
- type: Tag
tags:
- Recyclable
- Trash
- type: SpaceGarbage

View File

@@ -372,3 +372,65 @@
path: /Audio/Effects/Vehicle/vehiclestartup.ogg path: /Audio/Effects/Vehicle/vehiclestartup.ogg
params: params:
volume: -3 volume: -3
- type: entity
id: VehicleUnicycle
parent: [BaseVehicle, BaseFoldable, BaseItem]
name: unicycle
description: It only has one wheel!
components:
- type: Vehicle
useHand: false
northOver: true
southOver: true
northOverride: -0.15
southOverride: 0.15
hasKey: true
hornSound:
path: /Audio/Effects/Vehicle/bicyclebell.ogg
- type: Sprite
sprite: Objects/Vehicles/unicycle.rsi
layers:
- state: vehicle
map: ["enum.VehicleVisualLayers.AutoAnimate", "unfoldedLayer"]
- state: vehicle_folded
map: ["foldedLayer"]
visible: false
netsync: false
noRot: true
- type: Strap
buckleOffset: "0.1, -0.05"
maxBuckleDistance: 1
- type: MovementSpeedModifier
acceleration: 1
friction: 0.8
baseWalkSpeed: 3.5
baseSprintSpeed: 4.3
- type: Tag
tags:
- DoorBumpOpener
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 200
behaviors:
- !type:DoActsBehavior
acts: [ "Destruction" ]
- trigger:
!type:DamageTrigger
damage: 240
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
path: /Audio/Effects/metalbreak.ogg
- type: entity
parent: VehicleUnicycle
id: VehicleUnicycleFolded
suffix: folded
components:
- type: Foldable
folded: true

View File

@@ -372,3 +372,24 @@
- type: EntityStorageVisuals - type: EntityStorageVisuals
stateDoorOpen: crate_open stateDoorOpen: crate_open
stateDoorClosed: crate_door stateDoorClosed: crate_door
- type: entity
parent: CratePirate
id: CrateToyBox
name: toy box
suffix: Empty
description: A box overflowing with fun.
components:
- type: Sprite
sprite: Structures/Storage/Crates/toybox.rsi
layers:
- state: crate
map: ["enum.StorageVisualLayers.Base"]
- state: crate_door
map: ["enum.StorageVisualLayers.Door"]
- state: welded
visible: false
map: ["enum.WeldableLayers.BaseWelded"]
- type: Icon
sprite: Structures/Storage/Crates/toybox.rsi
state: crate_icon

View File

@@ -799,6 +799,16 @@
flavorType: Complex flavorType: Complex
description: flavor-complex-themartinez description: flavor-complex-themartinez
- type: flavor
id: plastic
flavorType: Complex
description: flavor-complex-plastic
- type: flavor
id: glue
flavorType: Complex
description: flavor-complex-glue
- type: flavor - type: flavor
id: rocksandstones id: rocksandstones
flavorType: Complex flavorType: Complex

View File

@@ -56,7 +56,7 @@
name: reagent-name-space-glue name: reagent-name-space-glue
desc: reagent-desc-space-glue desc: reagent-desc-space-glue
physicalDesc: reagent-physical-desc-sticky physicalDesc: reagent-physical-desc-sticky
flavor: funny flavor: glue
color: "#ffffff" color: "#ffffff"
boilingPoint: 250.0 boilingPoint: 250.0
meltingPoint: 380.0 meltingPoint: 380.0

View File

@@ -22,3 +22,13 @@
id: BoxingBell id: BoxingBell
files: files:
- /Audio/Weapons/boxingbell.ogg - /Audio/Weapons/boxingbell.ogg
- type: soundCollection
id: RubberHammer
files:
- /Audio/Weapons/rubberhammer.ogg
- type: soundCollection
id: Parp
files:
- /Audio/Effects/Emotes/parp1.ogg

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,26 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfood1183 (github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
},
{
"name": "equipped-HELMET",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 B

View File

@@ -0,0 +1,26 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfood1183 (github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
},
{
"name": "equipped-FEET",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

View File

@@ -5,7 +5,7 @@
"y": 64 "y": 64
}, },
"license": "CC-BY-SA-3.0", "license": "CC-BY-SA-3.0",
"copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github)", "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 | Moth sprites made by PuroSlavKing (Github), dummy made by brainfood1183 (github)",
"states": [ "states": [
{ {
"name": "alien0", "name": "alien0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfood1183 (github) for ss14",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon-0"
},
{
"name": "icon-1"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,22 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfoo1183 (github) for ss14",
"states": [
{
"name": "icon"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,22 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfoo1183 (github) for ss14",
"states": [
{
"name": "icon"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,22 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "https://github.com/goonstation/goonstation/commit/be4f220b65aa315165b5f3c2c24eeb5674caf03b#diff-a67180777ae47f2c84f3ebf93c61442bbe34aebcad5b7cbd76feb78f177bcee1",
"states": [
{
"name": "icon"
},
{
"name": "inhand-left",
"directions": 4
},
{
"name": "inhand-right",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfood1183 (github) for ss14",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
}
]
}

View File

@@ -0,0 +1,43 @@
{
"version": 1,
"size": {
"x": 32,
"y": 32
},
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfood1183 (github) for ss14",
"states": [
{
"name": "vehicle",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2
]
]
},
{
"name": "vehicle_folded"
},
{
"name": "vehicle_unfolded"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,40 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made by brainfood118 (github) for ss14",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "crate"
},
{
"name": "crate_door"
},
{
"name": "welded"
},
{
"name": "crate_icon"
},
{
"name": "sparking",
"directions": 1,
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "crate_open"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB