[DataField("enabled")]
public bool Enabled = true;
+ /// <summary>
+ /// The creature will continue invisible at death.
+ /// </summary>
+ [DataField("enabledOnDeath")]
+ public bool EnabledOnDeath = true;
+
/// <summary>
/// Whether or not the entity previously had an interaction outline prior to cloaking.
/// </summary>
using Content.Shared.Examine;
+using Content.Shared.Mobs;
+using Content.Shared.Mobs.Systems;
using Content.Shared.Stealth.Components;
using Robust.Shared.GameStates;
using Robust.Shared.Timing;
public abstract class SharedStealthSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _timing = default!;
+ [Dependency] private readonly MobStateSystem _mobState = default!;
public override void Initialize()
{
SubscribeLocalEvent<StealthComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<StealthComponent, ExamineAttemptEvent>(OnExamineAttempt);
SubscribeLocalEvent<StealthComponent, ExaminedEvent>(OnExamined);
+ SubscribeLocalEvent<StealthComponent, MobStateChangedEvent>(OnMobStateChanged);
}
private void OnExamineAttempt(EntityUid uid, StealthComponent component, ExamineAttemptEvent args)
return;
component.Enabled = value;
- Dirty(component);
+ Dirty(uid, component);
+ }
+
+ private void OnMobStateChanged(EntityUid uid, StealthComponent component, MobStateChangedEvent args)
+ {
+ if (args.NewMobState == MobState.Dead)
+ {
+ component.Enabled = component.EnabledOnDeath;
+ }
+ else
+ {
+ component.Enabled = true;
+ }
+
+ Dirty(uid, component);
}
private void OnPaused(EntityUid uid, StealthComponent component, ref EntityPausedEvent args)
{
component.LastVisibility = GetVisibility(uid, component);
component.LastUpdated = null;
- Dirty(component);
+ Dirty(uid, component);
}
private void OnUnpaused(EntityUid uid, StealthComponent component, ref EntityUnpausedEvent args)
{
component.LastUpdated = _timing.CurTime;
- Dirty(component);
+ Dirty(uid, component);
}
protected virtual void OnInit(EntityUid uid, StealthComponent component, ComponentInit args)
}
component.LastVisibility = Math.Clamp(component.LastVisibility + delta, component.MinVisibility, component.MaxVisibility);
- Dirty(component);
+ Dirty(uid, component);
}
/// <summary>
if (component.LastUpdated != null)
component.LastUpdated = _timing.CurTime;
- Dirty(component);
+ Dirty(uid, component);
}
/// <summary>
copyright: "Taken and modified from tgstation (clownstep 1 and 2) by brainfood1183 (github)"
source: "https://github.com/tgstation/tgstation/tree/f8ee37afc00bce1ad421615eaa0e4cbddd5eea90/sound/effects"
+- files:
+ - snake1.ogg
+ - snake2.ogg
+ - snake3.ogg
+ license: "Custom"
+ copyright: "Taken from https://zvukipro.com/"
+ source: "https://zvukipro.com/jivotnie/21-zvuki-zmej.html"
+
- files:
- bells1.ogg
- bells2.ogg
ghost-role-information-salvage-spider-name = Space spider on salvage wreck
ghost-role-information-salvage-spider-description = Space spiders are just as aggressive as regular spiders, feed.
+ghost-role-information-space-cobra-name = Space cobra
+ghost-role-information-space-cobra-description = Space cobras really don't like guests, and will always snack on a visitor.
+
+ghost-role-information-salvage-cobra-name = Space cobra on salvage wreck
+ghost-role-information-salvage-cobra-description = Space cobras really don't like guests, and will always snack on a visitor.
+
ghost-role-information-guardian-name = Guardian
ghost-role-information-guardian-description = Listen to your owner. Don't tank damage. Punch people hard.
petting-success-hamster = You pet {THE($target)} on {POSS-ADJ($target)} fluffy little head.
petting-success-bear = You reluctantly pet {THE($target)} on {POSS-ADJ($target)} mystical head.
petting-success-slimes = You pet {THE($target)} on {POSS-ADJ($target)} mucous surface.
+petting-success-snake = You pet {THE($target)} on {POSS-ADJ($target)} scaly large head.
petting-failure-generic = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} aloof towards you.
- type: Clothing
sprite: Clothing/Shoes/Misc/damedaneshoes.rsi
+- type: entity
+ parent: ClothingShoesBase
+ id: ClothingShoesSnakeskinBoots
+ name: snakeskin boots
+ description: Boots made of high-class snakeskin, everyone around you will be jealous.
+ components:
+ - type: Sprite
+ sprite: Clothing/Shoes/Misc/snakeskin.rsi
+ - type: Clothing
+ sprite: Clothing/Shoes/Misc/snakeskin.rsi
+ - type: NoSlip
+
- type: entity
parent: [ClothingShoesBase, PowerCellSlotSmallItem]
id: ClothingShoesBootsSpeed
- type: Sprite
layers:
- state: green
+ - state: spacespider
+ sprite: Mobs/Animals/spacespider.rsi
- type: ConditionalSpawner
prototypes:
- MobSpiderSpaceSalvage
+
+- type: entity
+ name: Salvage Space Cobra Spawner
+ id: SpawnMobCobraSalvage
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: green
+ - state: spacecobra
+ sprite: Mobs/Animals/spacecobra.rsi
+ - type: ConditionalSpawner
+ prototypes:
+ - MobCobraSpaceSalvage
- type: Sprite
layers:
- state: green
- - state: ai
+ - state: shiva
+ sprite: Mobs/Pets/shiva.rsi
- type: ConditionalSpawner
prototypes:
- MobSpiderShiva
- type: Sprite
layers:
- state: green
- - state: ai
+ - state: spacespider
+ sprite: Mobs/Animals/spacespider.rsi
- type: ConditionalSpawner
prototypes:
- MobSpiderSpace
+- type: entity
+ name: Space Cobra Spawner
+ id: SpawnMobSpaceCobra
+ parent: MarkerBase
+ components:
+ - type: Sprite
+ layers:
+ - state: green
+ - state: spacecobra
+ sprite: Mobs/Animals/spacecobra.rsi
+ - type: ConditionalSpawner
+ prototypes:
+ - MobCobraSpace
+
- type: entity
name: Slimes Spawner Blue
id: SpawnMobAdultSlimesBlue
damage:
types:
Piercing: 6
- Poison: 2
+ Poison: 4
- type: SolutionContainerManager
solutions:
melee:
reagents:
- ReagentId: ChloralHydrate
- Quantity: 60
+ Quantity: 80
- type: MeleeChemicalInjector
solution: melee
- transferAmount: 3
+ transferAmount: 4
- type: ReplacementAccent
accent: xeno
- type: InteractionPopup
name: ghost-role-information-salvage-spider-name
description: ghost-role-information-salvage-spider-description
- type: SalvageMobRestrictions
+
+- type: entity
+ name: space cobra
+ id: MobCobraSpace
+ parent: MobSpaceBasic
+ description: Long fangs and a glowing hood, and the alluring look begs to come closer.
+ components:
+ - type: Sprite
+ drawdepth: Mobs
+ sprite: Mobs/Animals/spacecobra.rsi
+ layers:
+ - map: [ "enum.DamageStateVisualLayers.Base" ]
+ state: spacecobra
+ - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ]
+ state: glow
+ shader: unshaded
+ - type: FootstepModifier
+ footstepSoundCollection:
+ collection: FootstepSnake
+ - type: MobThresholds
+ thresholds:
+ 0: Alive
+ 100: Dead
+ - type: Stamina
+ critThreshold: 150
+ - type: DamageStateVisuals
+ states:
+ Alive:
+ Base: spacecobra
+ BaseUnshaded: glow
+ Dead:
+ Base: dead_spacecobra
+ - type: Butcherable
+ spawned:
+ - id: FoodMeatSnake
+ amount: 2
+ - id: UraniumOre1
+ amount: 1
+ - id: ClothingShoesSnakeskinBoots
+ amount: 1
+ prob: 0.3
+ - type: Bloodstream
+ bloodMaxVolume: 200
+ bloodReagent: Cryoxadone
+ - type: Fixtures
+ fixtures:
+ fix1:
+ shape:
+ !type:PhysShapeCircle
+ radius: 0.40
+ density: 120
+ mask:
+ - MobMask
+ layer:
+ - MobLayer
+ - type: MeleeWeapon
+ hidden: true
+ soundHit:
+ path: /Audio/Effects/bite.ogg
+ angle: 0
+ animation: WeaponArcBite
+ damage:
+ types:
+ Piercing: 6
+ Poison: 4
+ - type: SolutionContainerManager
+ solutions:
+ melee:
+ reagents:
+ - ReagentId: NorepinephricAcid
+ Quantity: 90
+ - type: MeleeChemicalInjector
+ solution: melee
+ transferAmount: 6
+ - type: ReplacementAccent
+ accent: xeno
+ - type: InteractionPopup
+ successChance: 0.2
+ interactSuccessString: petting-success-snake
+ interactFailureString: petting-failure-generic
+ - type: PointLight
+ radius: 1.1
+ energy: 1.5
+ color: "#4faffb"
+ - type: GhostRole
+ prob: 0.25
+ name: ghost-role-information-space-cobra-name
+ description: ghost-role-information-space-cobra-description
+ - type: Stealth
+ enabledOnDeath: false
+ maxVisibility: 1.2
+ - type: StealthOnMove
+ passiveVisibilityRate: -0.25
+ movementVisibilityRate: 0.25
+
+- type: entity
+ id: MobCobraSpaceSalvage
+ parent: MobCobraSpace
+ suffix: "Salvage Ruleset"
+ components:
+ - type: GhostRole
+ prob: 0.25
+ name: ghost-role-information-salvage-cobra-name
+ description: ghost-role-information-salvage-cobra-description
+ - type: SalvageMobRestrictions
- MobMask
layer:
- MobLayer
-
+ - type: FootstepModifier
+ footstepSoundCollection:
+ collection: FootstepSnake
+ - type: Tag
+ tags:
+ - DoorBumpOpener
+ - FootstepSound
+
- type: entity
name: space adder
parent: MobPurpleSnake
- ReagentId: UncookedAnimalProteins
Quantity: 1
+- type: entity
+ name: raw snake meat
+ parent: FoodMeatBase
+ id: FoodMeatSnake
+ description: A long piece of snake meat, hopefully not poisonous.
+ components:
+ - type: Tag
+ tags:
+ - Raw
+ - type: Sprite
+ state: snake
+ - type: SolutionContainerManager
+ solutions:
+ food:
+ reagents:
+ - ReagentId: UncookedAnimalProteins
+ Quantity: 10
+ - ReagentId: Toxin
+ Quantity: 2
+
- type: entity
name: raw xeno meat
# not raw since acid kills bacteria or something, same as xeno
- /Audio/Effects/Footsteps/clownspiderstep1.ogg
- /Audio/Effects/Footsteps/clownspiderstep2.ogg
+- type: soundCollection
+ id: FootstepSnake
+ files:
+ - /Audio/Effects/Footsteps/snake1.ogg
+ - /Audio/Effects/Footsteps/snake2.ogg
+ - /Audio/Effects/Footsteps/snake3.ogg
+
- type: soundCollection
id: FootstepBells
files:
--- /dev/null
+{
+ "version": 1,
+ "license": "CC-BY-NC-3.0",
+ "copyright": "Made by Nimfar11 (GitHub) for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "equipped-FEET",
+ "directions": 4
+ },
+ {
+ "name": "inhand-left",
+ "directions": 4
+ },
+ {
+ "name": "inhand-right",
+ "directions": 4
+ }
+ ]
+}
--- /dev/null
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Sprited by Nimfar11 (Github) for Space Station 14",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "spacecobra",
+ "directions": 4,
+ "delays": [
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3],
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3],
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3],
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3]
+ ]
+ },
+ {
+ "name": "glow",
+ "directions": 4,
+ "delays": [
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3],
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3],
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3],
+ [0.3,0.2,0.2,0.4,0.2,0.2,0.3]
+ ]
+ },
+ {
+ "name": "dead_spacecobra"
+ }
+ ]
+}
{
"name": "slime"
},
+ {
+ "name": "snake"
+ },
{
"name": "spider"
},