+++ /dev/null
-namespace Content.Server.Drone.Components
-{
- [RegisterComponent]
- public sealed partial class DroneComponent : Component
- {
- public float InteractionBlockRange = 2.15f;
- }
-}
+++ /dev/null
-using Content.Server.Body.Systems;
-using Content.Server.Drone.Components;
-using Content.Server.Ghost.Roles.Components;
-using Content.Server.Popups;
-using Content.Server.Tools.Innate;
-using Content.Shared.UserInterface;
-using Content.Shared.Body.Components;
-using Content.Shared.Drone;
-using Content.Shared.Emoting;
-using Content.Shared.Examine;
-using Content.Shared.Ghost;
-using Content.Shared.IdentityManagement;
-using Content.Shared.Interaction.Components;
-using Content.Shared.Interaction.Events;
-using Content.Shared.Item;
-using Content.Shared.Mind.Components;
-using Content.Shared.Mobs;
-using Content.Shared.Mobs.Components;
-using Content.Shared.Mobs.Systems;
-using Content.Shared.Popups;
-using Content.Shared.Tag;
-using Content.Shared.Throwing;
-using Robust.Shared.Timing;
-
-namespace Content.Server.Drone
-{
- public sealed class DroneSystem : SharedDroneSystem
- {
- [Dependency] private readonly BodySystem _bodySystem = default!;
- [Dependency] private readonly PopupSystem _popupSystem = default!;
- [Dependency] private readonly TagSystem _tagSystem = default!;
- [Dependency] private readonly EntityLookupSystem _lookup = default!;
- [Dependency] private readonly IGameTiming _gameTiming = default!;
- [Dependency] private readonly InnateToolSystem _innateToolSystem = default!;
- [Dependency] private readonly MobStateSystem _mobStateSystem = default!;
- [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
-
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<DroneComponent, InteractionAttemptEvent>(OnInteractionAttempt);
- SubscribeLocalEvent<DroneComponent, UserOpenActivatableUIAttemptEvent>(OnActivateUIAttempt);
- SubscribeLocalEvent<DroneComponent, MobStateChangedEvent>(OnMobStateChanged);
- SubscribeLocalEvent<DroneComponent, ExaminedEvent>(OnExamined);
- SubscribeLocalEvent<DroneComponent, MindAddedMessage>(OnMindAdded);
- SubscribeLocalEvent<DroneComponent, MindRemovedMessage>(OnMindRemoved);
- SubscribeLocalEvent<DroneComponent, EmoteAttemptEvent>(OnEmoteAttempt);
- SubscribeLocalEvent<DroneComponent, ThrowAttemptEvent>(OnThrowAttempt);
- }
-
- private void OnInteractionAttempt(EntityUid uid, DroneComponent component, InteractionAttemptEvent args)
- {
- if (args.Target != null && !HasComp<UnremoveableComponent>(args.Target) && NonDronesInRange(uid, component))
- args.Cancel();
-
- if (HasComp<ItemComponent>(args.Target) && !HasComp<UnremoveableComponent>(args.Target))
- {
- if (!_tagSystem.HasAnyTag(args.Target.Value, "DroneUsable", "Trash"))
- args.Cancel();
- }
- }
-
- private void OnActivateUIAttempt(EntityUid uid, DroneComponent component, UserOpenActivatableUIAttemptEvent args)
- {
- if (!_tagSystem.HasTag(args.Target, "DroneUsable"))
- {
- args.Cancel();
- }
- }
-
- private void OnExamined(EntityUid uid, DroneComponent component, ExaminedEvent args)
- {
- if (TryComp<MindContainerComponent>(uid, out var mind) && mind.HasMind)
- {
- args.PushMarkup(Loc.GetString("drone-active"));
- }
- else
- {
- args.PushMarkup(Loc.GetString("drone-dormant"));
- }
- }
-
- private void OnMobStateChanged(EntityUid uid, DroneComponent drone, MobStateChangedEvent args)
- {
- if (args.NewMobState == MobState.Dead)
- {
- if (TryComp<InnateToolComponent>(uid, out var innate))
- _innateToolSystem.Cleanup(uid, innate);
-
- if (TryComp<BodyComponent>(uid, out var body))
- _bodySystem.GibBody(uid, body: body);
- QueueDel(uid);
- }
- }
-
- private void OnMindAdded(EntityUid uid, DroneComponent drone, MindAddedMessage args)
- {
- UpdateDroneAppearance(uid, DroneStatus.On);
- _popupSystem.PopupEntity(Loc.GetString("drone-activated"), uid, PopupType.Large);
- }
-
- private void OnMindRemoved(EntityUid uid, DroneComponent drone, MindRemovedMessage args)
- {
- UpdateDroneAppearance(uid, DroneStatus.Off);
- EnsureComp<GhostTakeoverAvailableComponent>(uid);
- }
-
- private void OnEmoteAttempt(EntityUid uid, DroneComponent component, EmoteAttemptEvent args)
- {
- // No.
- args.Cancel();
- }
-
- private void OnThrowAttempt(EntityUid uid, DroneComponent drone, ThrowAttemptEvent args)
- {
- args.Cancel();
- }
-
- private void UpdateDroneAppearance(EntityUid uid, DroneStatus status)
- {
- if (TryComp<AppearanceComponent>(uid, out var appearance))
- {
- _appearance.SetData(uid, DroneVisuals.Status, status, appearance);
- }
- }
-
- private bool NonDronesInRange(EntityUid uid, DroneComponent component)
- {
- var xform = Comp<TransformComponent>(uid);
- foreach (var entity in _lookup.GetEntitiesInRange(xform.MapPosition, component.InteractionBlockRange))
- {
- // Return true if the entity is/was controlled by a player and is not a drone or ghost.
- if (HasComp<MindContainerComponent>(entity) && !HasComp<DroneComponent>(entity) && !HasComp<GhostComponent>(entity))
- {
- // Filter out dead ghost roles. Dead normal players are intended to block.
- if ((TryComp<MobStateComponent>(entity, out var entityMobState) && HasComp<GhostTakeoverAvailableComponent>(entity) && _mobStateSystem.IsDead(entity, entityMobState)))
- continue;
- if (_gameTiming.IsFirstTimePredicted)
- _popupSystem.PopupEntity(Loc.GetString("drone-too-close", ("being", Identity.Entity(entity, EntityManager))), uid, uid);
- return true;
- }
- }
- return false;
- }
- }
-}
{
[DataField("tools")] public List<EntitySpawnEntry> Tools = new();
public List<EntityUid> ToolUids = new();
+ public List<string> ToSpawn = new();
}
}
+using System.Linq;
+using Content.Shared.Body.Part;
using Content.Shared.Destructible;
+using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction.Components;
using Content.Shared.Storage;
using Content.Shared.Tag;
+using Robust.Shared.Network;
using Robust.Shared.Random;
-namespace Content.Server.Tools.Innate
+namespace Content.Server.Tools.Innate;
+
+/// <summary>
+/// Spawns a list unremovable tools in hands if possible. Used for drones,
+/// borgs, or maybe even stuff like changeling armblades!
+/// </summary>
+public sealed class InnateToolSystem : EntitySystem
{
- /// <summary>
- /// Spawns a list unremovable tools in hands if possible. Used for drones,
- /// borgs, or maybe even stuff like changeling armblades!
- /// </summary>
- public sealed class InnateToolSystem : EntitySystem
+ [Dependency] private readonly IRobustRandom _robustRandom = default!;
+ [Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!;
+ [Dependency] private readonly TagSystem _tagSystem = default!;
+
+ public override void Initialize()
{
- [Dependency] private readonly IRobustRandom _robustRandom = default!;
- [Dependency] private readonly SharedHandsSystem _sharedHandsSystem = default!;
- [Dependency] private readonly TagSystem _tagSystem = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<InnateToolComponent, ComponentStartup>(OnStartup);
- SubscribeLocalEvent<InnateToolComponent, ComponentShutdown>(OnShutdown);
- SubscribeLocalEvent<InnateToolComponent, DestructionEventArgs>(OnDestroyed);
- }
+ base.Initialize();
+ SubscribeLocalEvent<InnateToolComponent, MapInitEvent>(OnMapInit);
+ SubscribeLocalEvent<InnateToolComponent, HandCountChangedEvent>(OnHandCountChanged);
+ SubscribeLocalEvent<InnateToolComponent, ComponentShutdown>(OnShutdown);
+ SubscribeLocalEvent<InnateToolComponent, DestructionEventArgs>(OnDestroyed);
+ }
- private void OnStartup(EntityUid uid, InnateToolComponent component, ComponentStartup args)
- {
- if (component.Tools.Count == 0)
- return;
+ private void OnMapInit(EntityUid uid, InnateToolComponent component, MapInitEvent args)
+ {
+ if (component.Tools.Count == 0)
+ return;
- var spawnCoord = Transform(uid).Coordinates;
+ component.ToSpawn = EntitySpawnCollection.GetSpawns(component.Tools, _robustRandom);
+ }
- if (TryComp<HandsComponent>(uid, out var hands) && hands.Count >= component.Tools.Count)
- {
- var items = EntitySpawnCollection.GetSpawns(component.Tools, _robustRandom);
- foreach (var entry in items)
- {
- var item = Spawn(entry, spawnCoord);
- AddComp<UnremoveableComponent>(item);
- if (!_sharedHandsSystem.TryPickupAnyHand(uid, item, checkActionBlocker: false))
- {
- QueueDel(item);
- continue;
- }
- component.ToolUids.Add(item);
- }
- }
- }
+ private void OnHandCountChanged(EntityUid uid, InnateToolComponent component, HandCountChangedEvent args)
+ {
+ if (component.ToSpawn.Count == 0)
+ return;
+
+ var spawnCoord = Transform(uid).Coordinates;
- private void OnShutdown(EntityUid uid, InnateToolComponent component, ComponentShutdown args)
+ var toSpawn = component.ToSpawn.First();
+
+ var item = Spawn(toSpawn, spawnCoord);
+ AddComp<UnremoveableComponent>(item);
+ if (!_sharedHandsSystem.TryPickupAnyHand(uid, item, checkActionBlocker: false))
{
- foreach (var tool in component.ToolUids)
- {
- RemComp<UnremoveableComponent>(tool);
- }
+ QueueDel(item);
+ component.ToSpawn.Clear();
}
+ component.ToSpawn.Remove(toSpawn);
+ component.ToolUids.Add(item);
+ }
- private void OnDestroyed(EntityUid uid, InnateToolComponent component, DestructionEventArgs args)
+ private void OnShutdown(EntityUid uid, InnateToolComponent component, ComponentShutdown args)
+ {
+ foreach (var tool in component.ToolUids)
{
- Cleanup(uid, component);
+ RemComp<UnremoveableComponent>(tool);
}
+ }
- public void Cleanup(EntityUid uid, InnateToolComponent component)
+ private void OnDestroyed(EntityUid uid, InnateToolComponent component, DestructionEventArgs args)
+ {
+ Cleanup(uid, component);
+ }
+
+ public void Cleanup(EntityUid uid, InnateToolComponent component)
+ {
+ foreach (var tool in component.ToolUids)
{
- foreach (var tool in component.ToolUids)
+ if (_tagSystem.HasTag(tool, "InnateDontDelete"))
{
- if (_tagSystem.HasTag(tool, "InnateDontDelete"))
- {
- RemComp<UnremoveableComponent>(tool);
- }
- else
- {
- Del(tool);
- }
+ RemComp<UnremoveableComponent>(tool);
+ }
+ else
+ {
+ Del(tool);
+ }
- if (TryComp<HandsComponent>(uid, out var hands))
+ if (TryComp<HandsComponent>(uid, out var hands))
+ {
+ foreach (var hand in hands.Hands)
{
- foreach (var hand in hands.Hands)
- {
- _sharedHandsSystem.TryDrop(uid, hand.Value, checkActionBlocker: false, handsComp: hands);
- }
+ _sharedHandsSystem.TryDrop(uid, hand.Value, checkActionBlocker: false, handsComp: hands);
}
}
-
- component.ToolUids.Clear();
}
+
+ component.ToolUids.Clear();
}
}
using Content.Server.Chat;
using Content.Server.Chat.Systems;
using Content.Server.Cloning;
-using Content.Server.Drone.Components;
using Content.Server.Emoting.Systems;
using Content.Server.Inventory;
using Content.Server.Speech.EntitySystems;
if (args.User == entity)
continue;
- if (!TryComp<MobStateComponent>(entity, out var mobState) || HasComp<DroneComponent>(entity))
+ if (!TryComp<MobStateComponent>(entity, out var mobState))
continue;
if (HasComp<ZombieComponent>(entity))
+++ /dev/null
-using Robust.Shared.Serialization;
-
-namespace Content.Shared.Drone
-{
- public abstract class SharedDroneSystem : EntitySystem
- {
- [Serializable, NetSerializable]
- public enum DroneVisuals : byte
- {
- Status
- }
-
- [Serializable, NetSerializable]
- public enum DroneStatus : byte
- {
- Off,
- On
- }
- }
-}
+++ /dev/null
-drone-active = A maintenance drone. It seems totally unconcerned with you.
-drone-dormant = A dormant maintenance drone. Who knows when it will wake up?
-drone-activated = The drone whirrs to life!
-drone-too-close = Your laws prevent this action near {THE($being)}.
+++ /dev/null
-- type: body
- id: Drone
- name: "drone"
- root: hand 1
- slots:
- hand 1:
- part: LeftArmBorg
- connections:
- - hand 2
- hand 2:
- part: LeftArmBorg
- connections:
- - hand 3
- hand 3:
- part: LeftArmBorg
- connections:
- - hand 4
- hand 4:
- part: LeftArmBorg
- connections:
- - hand 5
- hand 5:
- part: RightArmBorg
- connections:
- - hand 6
- hand 6:
- part: RightArmBorg
contents:
- id: BoxSurvival
-- type: entity
- noSpawn: true
- parent: ClothingBackpackSatchel
- id: ClothingBackpackSatchelDrone
- components:
- - type: Tag
- tags:
- - InnateDontDelete
-
- type: entity
noSpawn: true
parent: ClothingBackpackSatchelMime
components:
- type: Item
size: Large
- shape:
+ shape:
- 0,0,2,2
- type: Storage
maxItemSize: Small
whitelist:
components:
- LightBulb
- - type: Tag
- tags:
- - DroneUsable
- type: entity
name: lighttube box
whitelist:
components:
- LightBulb
- - type: Tag
- tags:
- - DroneUsable
- type: entity
name: mixed lights box
whitelist:
components:
- LightBulb
- - type: Tag
- tags:
- - DroneUsable
- type: entity
name: PDA box
layers:
- state: box
- state: inflatable
- - type: Tag
- tags:
- - DroneUsable
- type: entity
layers:
- state: box
- state: trashbag
- - type: Tag
- tags:
- - DroneUsable
- type: entity
name: passenger encryption key box
- type: Tag
tags:
- ClothMade
- - DroneUsable
- WhitelistChameleon
- type: entity
sprite: Clothing/Head/Hats/party_red.rsi
- type: Tag
tags:
- - DroneUsable
- WhitelistChameleon
- HamsterWearable
- type: AddAccentClothing
accent: ReplacementAccent
replacement: cowboy
-
+
- type: entity
parent: ClothingHeadHatCowboyBrown
id: ClothingHeadHatCowboyBlack
sprite: Clothing/Head/Hats/cowboyhatblack.rsi
- type: Clothing
sprite: Clothing/Head/Hats/cowboyhatblack.rsi
-
+
- type: entity
parent: ClothingHeadHatCowboyBrown
id: ClothingHeadHatCowboyGrey
sprite: Clothing/Head/Hats/cowboyhatgrey.rsi
- type: Clothing
sprite: Clothing/Head/Hats/cowboyhatgrey.rsi
-
+
- type: entity
parent: ClothingHeadHatCowboyBrown
id: ClothingHeadHatCowboyRed
sprite: Clothing/Head/Hats/cowboyhatred.rsi
- type: Clothing
sprite: Clothing/Head/Hats/cowboyhatred.rsi
-
+
- type: entity
parent: ClothingHeadHatCowboyBrown
id: ClothingHeadHatCowboyWhite
sprite: Clothing/Head/Hats/cowboyhatwhite.rsi
- type: Clothing
sprite: Clothing/Head/Hats/cowboyhatwhite.rsi
-
+
- type: entity
parent: ClothingHeadHatCowboyBrown
id: ClothingHeadHatCowboyBountyHunter
- type: Sprite
sprite: Clothing/Head/Hats/beret_medic.rsi
- type: Clothing
- sprite: Clothing/Head/Hats/beret_medic.rsi
\ No newline at end of file
+ sprite: Clothing/Head/Hats/beret_medic.rsi
suffix: DO NOT MAP
components:
- type: Tag
- tags: # ignore "WhitelistChameleon" tag
- - DroneUsable
+ tags: [] # ignore "WhitelistChameleon" tag
- type: Sprite
sprite: Clothing/Head/Hats/catears.rsi
- type: Clothing
sprite: Clothing/Head/Hats/catears.rsi
- type: AddAccentClothing
accent: OwOAccent
-
+
- type: entity
parent: ClothingHeadBase
id: ClothingHeadHatDogEars
description: Only for good boys.
suffix: DO NOT MAP
components:
- - type: Tag
- tags:
- - DroneUsable
- type: Sprite
sprite: Clothing/Head/Hats/dogears.rsi
- type: Clothing
price: 50
- type: Tag
tags:
- - DroneUsable
- WhitelistChameleon
- type: entity
sprite: Clothing/Head/Welding/welding.rsi
- type: Tag
tags:
- - DroneUsable
- HamsterWearable
- WhitelistChameleon
prototypes:
- MobRaccoonMorticia
-- type: entity
- name: Drone Spawner
- id: SpawnMobDrone
- parent: MarkerBase
- components:
- - type: Sprite
- layers:
- - state: green
- - sprite: Mobs/Silicon/drone.rsi
- state: shell
- - type: ConditionalSpawner
- prototypes:
- - Drone
-
- type: entity
name: Fox Renault Spawner
id: SpawnMobFoxRenault
- type: ConditionalSpawner
prototypes:
- MobPenguin
-
-
+
+
- type: entity
name: Hellspawn Spawner
id: SpawnMobHellspawn
- type: ConditionalSpawner
prototypes:
- MobHellspawn
-
+
- type: entity
name: ore crab spawner
id: SpawnMobOreCrab
-- type: entity
- save: false
- abstract: true
- id: PlayerSiliconBase #for player controlled silicons
- components:
- - type: Reactive
- groups:
- Acidic: [Touch]
- - type: Input
- context: "human"
- - type: DamageOnHighSpeedImpact
- damage:
- types:
- Blunt: 5
- soundHit:
- collection: MetalThud
- - type: Clickable
- - type: Damageable
- damageContainer: Inorganic
- - type: Bloodstream
- bloodReagent: Oil
- bloodlossDamage:
- types:
- Bloodloss:
- 1
- bloodlossHealDamage:
- types:
- Bloodloss:
- -1
- - type: InteractionOutline
- - type: Fixtures
- fixtures:
- fix1:
- shape:
- # Circles, cuz rotation of rectangles looks very bad
- !type:PhysShapeCircle
- radius: 0.35
- density: 50
- mask:
- - MobMask
- layer:
- - MobLayer
- - type: MovementSpeedModifier
- baseWalkSpeed : 4
- baseSprintSpeed : 3
- - type: Sprite
- noRot: true
- drawdepth: Mobs
- - type: Physics
- bodyType: KinematicController
- - type: Hands
- showInHands: false
- - type: Body
- prototype: Drone
- - type: IntrinsicRadioReceiver
- - type: IntrinsicRadioTransmitter
- channels:
- - Binary
- - type: ActiveRadio
- channels:
- - Binary
- - Common
- - type: DoAfter
- - type: Pullable
- - type: Examiner
- - type: Puller
- - type: StandingState
- - type: Alerts
- - type: Tag
- tags:
- - ShoesRequiredStepTriggerImmune
-
-- type: entity
- name: drone
- id: Drone
- parent: PlayerSiliconBase
- components:
- - type: Drone
- - type: InnateTool
- tools:
- - id: ClothingBackpackSatchelDrone
- - id: trayScanner
- - id: Omnitool
- - id: WelderExperimental
- - type: NameIdentifier
- group: Drone
- - type: Inventory
- templateId: drone
- - type: InventorySlots
- - type: Strippable
- - type: UserInterface
- interfaces:
- - key: enum.StrippingUiKey.Key
- type: StrippableBoundUserInterface
- - key: enum.SiliconLawsUiKey.Key
- type: SiliconLawBoundUserInterface
- #- type: GhostRole
- # makeSentient: true
- # name: Maintenance Drone
- # description: Maintain the station. Ignore other beings except drones.
- # rules: |
- # You are bound by these laws both in-game and out-of-character:
- # 1. You may not involve yourself in the matters of another being, even if such matters conflict with Law Two or Law Three, unless the other being is another Drone.
- # 2. You may not harm any being, regardless of intent or circumstance.
- # 3. Your goals are to build, maintain, repair, improve, and power to the best of your abilities, You must never actively work against these goals.
- #- type: GhostTakeoverAvailable
- - type: SiliconLawBound
- - type: SiliconLawProvider
- laws: Drone
- - type: MovementSpeedModifier
- baseWalkSpeed : 5
- baseSprintSpeed : 5
- - type: MobState
- allowedStates:
- - Alive
- - Dead
- - type: MobThresholds
- thresholds:
- 0: Alive
- 60: Dead
- - type: Flashable
- - type: NoSlip
- - type: StatusEffects
- allowed:
- - Stun
- - KnockedDown
- - SlowedDown
- - type: SlowOnDamage
- speedModifierThresholds:
- 30: 0.7
- 50: 0.5
- - type: Temperature
- heatDamageThreshold: 5000
- currentTemperature: 310.15
- specificHeat: 42
- heatDamage:
- types:
- Heat : 1 #per second, scales with temperature & other constants
- - type: Sprite
- drawdepth: SmallMobs
- layers:
- - state: shell
- sprite: Mobs/Silicon/drone.rsi
- map: ["base"]
- - type: MovementIgnoreGravity
- - type: Fixtures
- fixtures:
- fix1:
- shape:
- !type:PhysShapeCircle
- radius: 0.35
- density: 50
- mask:
- - SmallMobMask
- layer:
- - SmallMobLayer
- - type: Appearance
- - type: GenericVisualizer
- visuals:
- enum.DroneVisuals.Status:
- base:
- Off: { state: shell }
- On: { state: drone }
- - type: ReplacementAccent
- accent: silicon
- - type: Repairable
- fuelcost: 15
- doAfterDelay: 8
- - type: Actions
- - type: UnpoweredFlashlight
- - type: PointLight
- enabled: false
- radius: 3.5
- softness: 1
- mask: /Textures/Effects/LightMasks/cone.png
- autoRot: true
- - type: Tag
- tags:
- - ShoesRequiredStepTriggerImmune
- - CannotSuicide
-
-- type: entity
- name: onestar mecha
- id: Onestar
- parent: PlayerSiliconBase
- components:
- - type: InnateTool
- tools:
- - id: WeaponMinigun
- - id: EnergySword
- - id: WeaponLauncherMultipleRocket
- - id: WeaponXrayCannon
- - type: UserInterface
- interfaces:
- - key: enum.StrippingUiKey.Key
- type: StrippableBoundUserInterface
- - type: GhostRole
- makeSentient: true
- name: ghost-role-information-onestar-mecha-name
- description: ghost-role-information-onestar-mecha-description
- rules: ghost-role-information-onestar-mecha-rules
- - type: GhostTakeoverAvailable
- - type: MovementSpeedModifier
- baseWalkSpeed : 3
- baseSprintSpeed : 2
- - type: MobState
- allowedStates:
- - Alive
- - Dead
- - type: MobThresholds
- thresholds:
- 0: Alive
- 1000: Dead
- - type: Sprite
- drawdepth: Mobs
- layers:
- - state: onestar_boss
- sprite: Mobs/Silicon/onestar.rsi
- - state: onestar_boss_screen
- sprite: Mobs/Silicon/onestar.rsi
- shader: unshaded
- - type: FootstepModifier
- footstepSoundCollection:
- path: /Audio/Mecha/sound_mecha_powerloader_step.ogg
- - type: MovementIgnoreGravity
- - type: Fixtures
- fixtures:
- fix1:
- shape:
- !type:PhysShapeCircle
- radius: 1
- density: 160
- mask:
- - LargeMobMask
- layer:
- - MobLayer
- - type: Appearance
- - type: CombatMode
- - type: Tag
- tags:
- - FootstepSound
-
- type: entity
id: PlayerBorgGeneric
parent: BorgChassisGeneric
- type: ContainerFill
containers:
borg_brain:
- - PositronicBrain
+ - PositronicBrain
borg_module:
- - BorgModuleTool
+ - BorgModuleTool
- type: ItemSlots
slots:
cell_slot:
- type: ContainerFill
containers:
borg_brain:
- - MMIFilled
+ - MMIFilled
- type: ItemSlots
slots:
cell_slot:
parent: BorgChassisSyndicateAssault
suffix: Battery, Module, Operative
components:
- - type: NukeOperative
- - type: ContainerFill
- containers:
- borg_brain:
- - PositronicBrain
- borg_module:
- - BorgModuleOperative
- - BorgModuleL6C
- - BorgModuleEsword
- - type: ItemSlots
- slots:
- cell_slot:
- name: power-cell-slot-component-slot-name-default
- startingItem: PowerCellHyper
+ - type: NukeOperative
+ - type: ContainerFill
+ containers:
+ borg_brain:
+ - PositronicBrain
+ borg_module:
+ - BorgModuleOperative
+ - BorgModuleL6C
+ - BorgModuleEsword
+ - type: ItemSlots
+ slots:
+ cell_slot:
+ name: power-cell-slot-component-slot-name-default
+ startingItem: PowerCellHyper
- type: Tag
tags:
- Trash
- - DroneUsable
- WhitelistChameleon
- type: TrashOnSolutionEmpty
solution: drink
state: generic
- type: Item
storedRotation: -90
- - type: Tag
- tags:
- - DroneUsable
- type: StaticPrice
price: 100
- type: PhysicalComposition
state: cpuboard
- type: Item
storedRotation: -90
- - type: Tag
- tags:
- - DroneUsable
- type: StaticPrice
price: 100
- type: PhysicalComposition
prototype: ComputerCargoOrders
- type: StaticPrice
price: 750
- - type: Tag
- tags:
- - DroneUsable
- type: entity
id: CargoBountyComputerCircuitboard
- type: ComputerBoard
prototype: ComputerCargoBounty
- type: StaticPrice
- - type: Tag
- tags:
- - DroneUsable
- type: entity
parent: BaseComputerCircuitboard
prototype: ComputerSurveillanceCameraMonitor
- type: Tag
tags:
- - DroneUsable
- SurveillanceCameraMonitorCircuitboard
- type: entity
prototype: ComputerTelevision
- type: Tag
tags:
- - DroneUsable
- ComputerTelevisionCircuitboard
- type: entity
price: 750
- type: Tag
tags:
- - DroneUsable
- HighRiskItem
- type: entity
state: airalarm_electronics
- type: Tag
tags:
- - DroneUsable
- StationMapElectronics
- type: StaticPrice
- price: 15
\ No newline at end of file
+ price: 15
state: airalarm_electronics
- type: Tag
tags:
- - DroneUsable
- AirAlarmElectronics
- type: StaticPrice
price: 61
state: airalarm_electronics
- type: Tag
tags:
- - DroneUsable
- FireAlarmElectronics
- type: StaticPrice
price: 61
- type: Sprite
sprite: Objects/Misc/module.rsi
state: generic
- - type: Tag
- tags:
- - DroneUsable
- type: StaticPrice
price: 100
- type: PhysicalComposition
state: net_wired
- type: Tag
tags:
- - DroneUsable
- MailingUnitElectronics
- type: StaticPrice
price: 55
- type: Tag
tags:
- DoorElectronics
- - DroneUsable
- type: StaticPrice
price: 55
state: mainboard
- type: Tag
tags:
- - DroneUsable
- FirelockElectronics
- type: StaticPrice
price: 61
state: id_mod
- type: Tag
tags:
- - DroneUsable
- IntercomElectronics
- type: StaticPrice
price: 55
price: 40
- type: Tag
tags:
- - DroneUsable
- WallmountSubstationElectronics
# Wallmount Generator
Glass: 90
- type: Tag
tags:
- - DroneUsable
- WallmountGeneratorElectronics
# APU
price: 40
- type: Tag
tags:
- - DroneUsable
- WallmountGeneratorAPUElectronics
# Solar Tracker Electronics
price: 85
- type: Tag
tags:
- - DroneUsable
- SolarTrackerElectronics
cpu_supply: "#A46106"
- type: StaticPrice
price: 250
- - type: Tag
- tags:
- - DroneUsable
mask:
- ItemMask
- type: Rotatable
- - type: Tag
- tags:
- - DroneUsable
- type: entity
name: mousetrap
- type: Tag
tags:
- Sheet
- - DroneUsable
- type: Material
- type: Damageable
damageContainer: Inorganic
acts: [ "Destruction" ]
- type: SolutionContainerManager
solutions:
- glass:
+ glass:
canReact: false
- type: entity
- ReagentId: Carbon
Quantity: 0.5
canReact: false
-
+
- type: entity
parent: SheetGlassBase
id: SheetPGlass
Quantity: 4.5
- ReagentId: Carbon
Quantity: 0.5
- canReact: false
-
+ canReact: false
+
- type: entity
parent: SheetRUGlass
id: SheetRUGlass1
tags:
- Sheet
- Metal
- - DroneUsable
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Metallic
- type: Tag
tags:
- Sheet
- - DroneUsable
- type: Damageable
damageContainer: Inorganic
- type: Destructible
tags:
- Plastic
- Sheet
- - DroneUsable
- type: Material
- type: PhysicalComposition
materialComposition:
- type: Tag
tags:
- Sheet
- - DroneUsable
- type: Material
- type: PhysicalComposition
materialComposition:
size: Normal
- type: Tag
tags:
- - DroneUsable
- RawMaterial
- type: Damageable
damageContainer: Inorganic
- type: Tag
tags:
- ClothMade
- - DroneUsable
- Gauze
- RawMaterial
- type: Construction
- type: Tag
tags:
- ClothMade
- - DroneUsable
- RawMaterial
- type: entity
reagents: #Hell if I know what durathread is made out of.
- ReagentId: Fiber
Quantity: 6
-
+
- type: entity
parent: MaterialBase
id: MaterialWoodPlank
- type: Tag
tags:
- Wooden
- - DroneUsable
- RawMaterial
- type: Extractable
grindableSolutionName: wood
- type: Tag
tags:
- ClothMade
- - DroneUsable
- RawMaterial
-
- type: entity
parent: MaterialCotton
id: MaterialCotton1
- type: Tag
tags:
- ClothMade
- - DroneUsable
- RawMaterial
- type: entity
state: rods
- type: Item
sprite: Objects/Materials/parts.rsi
- - type: Tag
- tags:
- - DroneUsable
- type: Damageable
damageContainer: Inorganic
damageModifierSet: FlimsyMetallic
- type: Tag
tags:
- RodMetal1
- - DroneUsable
- type: Sprite
state: rods
- type: Stack
- type: Tag
tags:
- RodMetal1
- - DroneUsable
- type: Sprite
state: rods
- type: Stack
Blunt: 5
- type: Stack
count: 1
- - type: Tag
- tags:
- - DroneUsable
- type: Damageable
damageContainer: Inorganic
- type: Destructible
price: 500
- type: GuideHelp
guides: [ AME, Power ]
- - type: Tag
- tags:
- - DroneUsable
- type: StealTarget
stealGroup: AmePart
Quantity: 5
- type: Tag
tags:
- - DroneUsable
- PowerCell
- type: Appearance
- type: PowerCellVisuals
startingCharge: 70
- type: Tag
tags:
- - DroneUsable
- PotatoBattery
- type: Construction
graph: PowerCellPotato
- type: Battery
maxCharge: 1400
startingCharge: 1400
-
+
- type: entity
id: PowerCageMedium
parent: BasePowerCage
- type: Battery
maxCharge: 2700
startingCharge: 2700
-
+
- type: entity
id: PowerCageHigh
parent: BasePowerCage
- type: Battery
maxCharge: 6200
startingCharge: 6200
-
+
- type: entity
id: PowerCageSmallEmpty
parent: PowerCageSmall
- type: Battery
maxCharge: 1400
startingCharge: 0
-
+
- type: entity
id: PowerCageMediumEmpty
parent: PowerCageMedium
visible: false
- type: Battery
startingCharge: 0
-
+
- type: entity
id: PowerCageHighEmpty
parent: PowerCageHigh
shader: unshaded
visible: false
- type: Battery
- startingCharge: 0
\ No newline at end of file
+ startingCharge: 0
- type: Sprite
sprite: Objects/Power/solar_parts.rsi
state: solar_assembly_parts
- - type: Tag
- tags:
- - DroneUsable
delay: 1
- type: Tag
tags:
- - DroneUsable #No bucket because it holds chems, they can drag the cart or use a drain
- Mop
- MopBasic
- type: GuideHelp
maxVol: 100
- type: Tag
tags:
- - DroneUsable #No bucket because it holds chems, they can drag the cart or use a drain
- Mop
- MopAdv
delay: 1.5
- type: Tag
tags:
- - DroneUsable
- Mop
- type: CleansForensics
- type: Fiber
- type: Tag
tags:
- Spray
- - DroneUsable #They don't have any other chem stuff on their whitelist so they can't refill it
-
# Vapor
- type: entity
- type: Tag
tags:
- TrashBag
- - DroneUsable
- type: Appearance
- type: StorageFillVisualizer
maxFillLevels: 4
enabled:
True: { state: working }
False: { state: icon }
- - type: Tag
- tags:
- - DroneUsable
- type: StaticPrice
price: 80
- type: PhysicalComposition
- type: Tag
tags:
- CableCoil
- - DroneUsable
- type: Stack
stackType: Cable
- type: Sprite
- type: Sprite
state: coillv-10
- type: Stack
- count: 1
\ No newline at end of file
+ count: 1
- type: Tag
tags:
- Flashlight
- - DroneUsable
- type: HandheldLight
addPrefix: false
blinkingBehaviourId: blinking
doAfter: 1
removeOnInteract: true
- type: Clickable
- - type: Tag
- tags:
- - DroneUsable
# TODO: Add stack sprites + visuals.
- type: entity
doAfter: 1
removeOnInteract: true
- type: Clickable
- - type: Tag
- tags:
- - DroneUsable
# TODO: Add stack sprites + visuals.
- type: entity
amount: 8
- id: LightBulb
amount: 5
- - type: Tag
- tags:
- - DroneUsable
- type: StaticPrice
price: 100
- type: ContainerContainer
base:
On: { state: tray-on }
Off: { state: tray-off }
- - type: Tag
- tags:
- - DroneUsable
- type: StaticPrice
price: 60
path: "/Audio/Weapons/smash.ogg"
- type: Tag
tags:
- - DroneUsable
- Toolbox
- type: GenericVisualizer
visuals:
- type: UserInterface
interfaces:
- key: enum.ThiefBackpackUIKey.Key
- type: ThiefBackpackBoundUserInterface
\ No newline at end of file
+ type: ThiefBackpackBoundUserInterface
- type: Tag
tags:
- Multitool
- - DroneUsable
- type: PhysicalComposition
materialComposition:
Steel: 100
type: NetworkConfiguratorBoundUserInterface
- key: enum.NetworkConfiguratorUiKey.Link
type: NetworkConfiguratorBoundUserInterface
- - type: Tag
- tags:
- - DroneUsable
- type: StaticPrice
price: 56
- type: GuideHelp
radius: 1.5
energy: 1.6
color: "#e6e227"
- - type: Tag
- tags:
- - DroneUsable
- type: entity
parent: BaseComputer
- Implanter
- PillCanister
- ChemistryEmptyBottle01
- - Drone
- AdvMopItem
- WeaponSprayNozzle
- ClothingBackpackWaterTank
- type: Advertise
pack: ClothesMateAds
- type: Speech
- - type: Tag
- tags:
- - DroneUsable
- type: Sprite
sprite: Structures/Machines/VendingMachines/clothing.rsi
layers:
- type: Advertise
pack: ClothesMateAds
- type: Speech
- - type: Tag
- tags:
- - DroneUsable
- type: Sprite
sprite: Structures/Machines/VendingMachines/winterdrobe.rsi
layers:
radius: 1.5
energy: 1.6
color: "#c73434"
- - type: Tag
- tags:
- - DroneUsable
- type: entity
parent: VendingMachine
radius: 1.5
energy: 1.6
color: "#d4ab33"
- - type: Tag
- tags:
- - DroneUsable
- type: entity
parent: VendingMachine
materials:
Wood: 100
-- type: latheRecipe
- id: Drone
- result: Drone
- completetime: 6
- materials:
- Steel: 500
- Glass: 500
- Plastic: 500
-
- type: latheRecipe
id: SynthesizerInstrument
result: SynthesizerInstrument
cost: 5000
recipeUnlocks:
- ProximitySensor
- - Drone
- ExosuitFabricatorMachineCircuitboard
- type: technology
id: Holoparasite
prefix: HOLO
-- type: nameIdentifierGroup
- id: Drone
- prefix: DR
- fullName: true
- minValue: 10000
- maxValue: 99999
-
- type: nameIdentifierGroup
id: MMI
prefix: MMI
- type: Tag
id: DrinkBottle
-- type: Tag
- id: DroneUsable
-
- type: Tag
id: Duck
# 2024-02-01
YellowOxygenTank: OxygenTank
YellowOxygenTankFilled: OxygenTankFilled
+
+# 2024-02-19
+Drone: null
+SpawnMobDrone: null
+Onestar: null # I dont think this is even mapped, but just in case