Вернуть дронов

This reverts commit 8c6a8c3c5c.

# Conflicts:
#	Resources/Prototypes/Entities/Mobs/Player/silicon.yml
#	Resources/Prototypes/Entities/Objects/Devices/Electronics/base_electronics.yml
#	Resources/Prototypes/Entities/Objects/Devices/flatpack.yml
#	Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml
#	Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml
#	Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml
#	Resources/Prototypes/Entities/Objects/Materials/parts.yml
#	Resources/Prototypes/Entities/Objects/Misc/tiles.yml
#	Resources/Prototypes/Entities/Objects/Power/antimatter_part.yml
#	Resources/Prototypes/Entities/Objects/Power/solar_parts.yml
#	Resources/Prototypes/tags.yml
#	Resources/migration.yml
This commit is contained in:
Remuchi
2024-03-27 21:50:24 +07:00
parent 208cea9e7e
commit 1076530ad8
53 changed files with 391 additions and 25 deletions

View File

@@ -0,0 +1,8 @@
namespace Content.Server.Drone.Components
{
[RegisterComponent]
public sealed partial class DroneComponent : Component
{
public float InteractionBlockRange = 2.15f;
}
}

View File

@@ -0,0 +1,146 @@
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;
}
}
}

View File

@@ -3,6 +3,7 @@ using Content.Server.Body.Systems;
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;
@@ -219,7 +220,7 @@ namespace Content.Server.Zombies
if (args.User == entity)
continue;
if (!TryComp<MobStateComponent>(entity, out var mobState))
if (!TryComp<MobStateComponent>(entity, out var mobState) || HasComp<DroneComponent>(entity))
continue;
if (HasComp<ZombieComponent>(entity))

View File

@@ -0,0 +1,20 @@
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
}
}
}

View File

@@ -0,0 +1,4 @@
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)}.

View File

@@ -0,0 +1,27 @@
- 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

View File

@@ -275,6 +275,15 @@
contents:
- id: BoxSurvival
- type: entity
noSpawn: true
parent: ClothingBackpackSatchel
id: ClothingBackpackSatchelDrone
components:
- type: Tag
tags:
- InnateDontDelete
- type: entity
noSpawn: true
parent: ClothingBackpackSatchelMime

View File

@@ -67,6 +67,9 @@
whitelist:
components:
- LightBulb
- type: Tag
tags:
- DroneUsable
- type: entity
name: lighttube box
@@ -88,6 +91,9 @@
whitelist:
components:
- LightBulb
- type: Tag
tags:
- DroneUsable
- type: entity
name: mixed lights box
@@ -111,6 +117,9 @@
whitelist:
components:
- LightBulb
- type: Tag
tags:
- DroneUsable
- type: entity
name: PDA box
@@ -215,6 +224,9 @@
layers:
- state: box
- state: inflatable
- type: Tag
tags:
- DroneUsable
- type: entity
@@ -266,6 +278,9 @@
layers:
- state: box
- state: trashbag
- type: Tag
tags:
- DroneUsable
- type: entity
name: passenger encryption key box

View File

@@ -23,6 +23,7 @@
- type: Tag
tags:
- ClothMade
- DroneUsable
- WhitelistChameleon
- type: StaticPrice
price: 25

View File

@@ -878,6 +878,7 @@
sprite: Clothing/Head/Hats/party_red.rsi
- type: Tag
tags:
- DroneUsable
- WhitelistChameleon
- HamsterWearable

View File

@@ -175,7 +175,8 @@
suffix: DO NOT MAP
components:
- type: Tag
tags: [] # ignore "WhitelistChameleon" tag
tags: # ignore "WhitelistChameleon" tag
- DroneUsable
- type: Sprite
sprite: Clothing/Head/Hats/catears.rsi
- type: Clothing
@@ -190,6 +191,9 @@
description: Only for good boys.
suffix: DO NOT MAP
components:
- type: Tag
tags:
- DroneUsable
- type: Sprite
sprite: Clothing/Head/Hats/dogears.rsi
- type: Clothing

View File

@@ -18,6 +18,7 @@
price: 50
- type: Tag
tags:
- DroneUsable
- WhitelistChameleon
- type: entity
@@ -32,6 +33,7 @@
sprite: Clothing/Head/Welding/welding.rsi
- type: Tag
tags:
- DroneUsable
- HamsterWearable
- WhitelistChameleon

View File

@@ -74,6 +74,20 @@
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

View File

@@ -352,6 +352,7 @@
- type: Tag
tags:
- Trash
- DroneUsable
- WhitelistChameleon
- type: TrashOnSolutionEmpty
solution: drink

View File

@@ -11,6 +11,9 @@
state: generic
- type: Item
storedRotation: -90
- type: Tag
tags:
- DroneUsable
- type: StaticPrice
price: 100
- type: PhysicalComposition

View File

@@ -10,6 +10,9 @@
state: cpuboard
- type: Item
storedRotation: -90
- type: Tag
tags:
- DroneUsable
- type: StaticPrice
price: 100
- type: PhysicalComposition
@@ -83,6 +86,9 @@
prototype: ComputerCargoOrders
- type: StaticPrice
price: 750
- type: Tag
tags:
- DroneUsable
- type: entity
id: CargoBountyComputerCircuitboard
@@ -95,6 +101,9 @@
- type: ComputerBoard
prototype: ComputerCargoBounty
- type: StaticPrice
- type: Tag
tags:
- DroneUsable
- type: entity
parent: BaseComputerCircuitboard
@@ -152,6 +161,7 @@
prototype: ComputerSurveillanceCameraMonitor
- type: Tag
tags:
- DroneUsable
- SurveillanceCameraMonitorCircuitboard
- type: entity
@@ -173,6 +183,7 @@
prototype: ComputerTelevision
- type: Tag
tags:
- DroneUsable
- ComputerTelevisionCircuitboard
- type: entity
@@ -231,6 +242,7 @@
price: 750
- type: Tag
tags:
- DroneUsable
- HighRiskItem
- type: entity

View File

@@ -11,6 +11,7 @@
state: airalarm_electronics
- type: Tag
tags:
- DroneUsable
- StationMapElectronics
- type: StaticPrice
price: 15

View File

@@ -9,6 +9,7 @@
state: airalarm_electronics
- type: Tag
tags:
- DroneUsable
- AirAlarmElectronics
- type: StaticPrice
price: 61
@@ -26,6 +27,7 @@
state: airalarm_electronics
- type: Tag
tags:
- DroneUsable
- FireAlarmElectronics
- type: StaticPrice
price: 61

View File

@@ -10,6 +10,9 @@
- type: Sprite
sprite: Objects/Misc/module.rsi
state: generic
- type: Tag
tags:
- DroneUsable
- type: StaticPrice
price: 100
- type: PhysicalComposition

View File

@@ -9,6 +9,7 @@
state: net_wired
- type: Tag
tags:
- DroneUsable
- MailingUnitElectronics
- type: StaticPrice
price: 55

View File

@@ -11,5 +11,6 @@
- type: Tag
tags:
- DoorElectronics
- DroneUsable
- type: StaticPrice
price: 55

View File

@@ -11,6 +11,7 @@
state: mainboard
- type: Tag
tags:
- DroneUsable
- FirelockElectronics
- type: StaticPrice
price: 61

View File

@@ -9,6 +9,7 @@
state: id_mod
- type: Tag
tags:
- DroneUsable
- IntercomElectronics
- type: StaticPrice
price: 55

View File

@@ -31,6 +31,7 @@
price: 40
- type: Tag
tags:
- DroneUsable
- WallmountSubstationElectronics
# Wallmount Generator
@@ -50,6 +51,7 @@
Glass: 90
- type: Tag
tags:
- DroneUsable
- WallmountGeneratorElectronics
# APU
@@ -66,6 +68,7 @@
price: 40
- type: Tag
tags:
- DroneUsable
- WallmountGeneratorAPUElectronics
# Solar Tracker Electronics
@@ -82,4 +85,5 @@
price: 85
- type: Tag
tags:
- DroneUsable
- SolarTrackerElectronics

View File

@@ -35,6 +35,9 @@
cpu_supply: "#A46106"
- type: StaticPrice
price: 250
- type: Tag
tags:
- DroneUsable
- type: entity
parent: BaseFlatpack

View File

@@ -54,6 +54,9 @@
mask:
- ItemMask
- type: Rotatable
- type: Tag
tags:
- DroneUsable
- type: entity
name: mousetrap

View File

@@ -16,6 +16,7 @@
tags:
- Sheet
- NoPaint
- DroneUsable
- type: Material
- type: Damageable
damageContainer: Inorganic

View File

@@ -16,6 +16,7 @@
- Sheet
- Metal
- NoPaint
- DroneUsable
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Metallic

View File

@@ -13,6 +13,7 @@
tags:
- Sheet
- NoPaint
- DroneUsable
- type: Damageable
damageContainer: Inorganic
- type: Destructible
@@ -135,6 +136,7 @@
- Plastic
- Sheet
- NoPaint
- DroneUsable
- type: Material
- type: PhysicalComposition
materialComposition:
@@ -251,6 +253,7 @@
- type: Tag
tags:
- Sheet
- DroneUsable
- type: Material
- type: PhysicalComposition
materialComposition:

View File

@@ -11,6 +11,7 @@
size: Normal
- type: Tag
tags:
- DroneUsable
- RawMaterial
- NoPaint
- type: Damageable
@@ -128,6 +129,7 @@
- type: Tag
tags:
- ClothMade
- DroneUsable
- Gauze
- RawMaterial
- type: Construction
@@ -195,6 +197,7 @@
- type: Tag
tags:
- ClothMade
- DroneUsable
- RawMaterial
- type: entity
@@ -242,6 +245,7 @@
- type: Tag
tags:
- Wooden
- DroneUsable
- RawMaterial
- type: Extractable
grindableSolutionName: wood
@@ -411,6 +415,7 @@
- type: Tag
tags:
- ClothMade
- DroneUsable
- RawMaterial
- type: entity
@@ -521,6 +526,7 @@
- type: Tag
tags:
- ClothMade
- DroneUsable
- RawMaterial
- type: entity

View File

@@ -8,6 +8,9 @@
state: rods
- type: Item
sprite: Objects/Materials/parts.rsi
- type: Tag
tags:
- DroneUsable
- type: Damageable
damageContainer: Inorganic
damageModifierSet: FlimsyMetallic
@@ -82,6 +85,7 @@
tags:
- RodMetal1
- CrossbowBolt
- DroneUsable
- type: Sprite
state: rods
- type: Stack
@@ -96,6 +100,7 @@
- type: Tag
tags:
- RodMetal1
- DroneUsable
- CrossbowBolt
- type: Ammo
muzzleFlash: null

View File

@@ -18,6 +18,7 @@
- type: Tag
tags:
- NoPaint
- DroneUsable
- type: Damageable
damageContainer: Inorganic
- type: Destructible

View File

@@ -29,6 +29,7 @@
Quantity: 5
- type: Tag
tags:
- DroneUsable
- PowerCell
- type: Appearance
- type: PowerCellVisuals
@@ -51,6 +52,7 @@
startingCharge: 70
- type: Tag
tags:
- DroneUsable
- PotatoBattery
- type: Construction
graph: PowerCellPotato

View File

@@ -30,6 +30,7 @@
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
@@ -80,6 +81,7 @@
maxVol: 100
- type: Tag
tags:
- DroneUsable #No bucket because it holds chems, they can drag the cart or use a drain
- Mop
- MopAdv
@@ -647,6 +649,7 @@
delay: 1.5
- type: Tag
tags:
- DroneUsable
- Mop
- type: CleansForensics
- type: Fiber

View File

@@ -91,6 +91,8 @@
- 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

View File

@@ -25,6 +25,7 @@
- type: Tag
tags:
- TrashBag
- DroneUsable
- type: Appearance
- type: StorageFillVisualizer
maxFillLevels: 4

View File

@@ -26,6 +26,9 @@
enabled:
True: { state: working }
False: { state: icon }
- type: Tag
tags:
- DroneUsable
- type: StaticPrice
price: 80
- type: PhysicalComposition

View File

@@ -12,6 +12,7 @@
- type: Tag
tags:
- CableCoil
- DroneUsable
- type: Stack
stackType: Cable
- type: Sprite

View File

@@ -7,6 +7,7 @@
- type: Tag
tags:
- Flashlight
- DroneUsable
- type: HandheldLight
addPrefix: false
blinkingBehaviourId: blinking

View File

@@ -19,6 +19,9 @@
doAfter: 1
removeOnInteract: true
- type: Clickable
- type: Tag
tags:
- DroneUsable
# TODO: Add stack sprites + visuals.
- type: entity
@@ -42,6 +45,9 @@
doAfter: 1
removeOnInteract: true
- type: Clickable
- type: Tag
tags:
- DroneUsable
# TODO: Add stack sprites + visuals.
- type: entity

View File

@@ -15,6 +15,9 @@
amount: 8
- id: LightBulb
amount: 5
- type: Tag
tags:
- DroneUsable
- type: StaticPrice
price: 100
- type: ContainerContainer

View File

@@ -19,6 +19,9 @@
base:
On: { state: tray-on }
Off: { state: tray-off }
- type: Tag
tags:
- DroneUsable
- type: StaticPrice
price: 60
# WD edit sounds start

View File

@@ -32,6 +32,7 @@
path: "/Audio/Weapons/smash.ogg"
- type: Tag
tags:
- DroneUsable
- Toolbox
- type: GenericVisualizer
visuals:

View File

@@ -265,6 +265,7 @@
- type: Tag
tags:
- Multitool
- DroneUsable
- type: PhysicalComposition
materialComposition:
Steel: 100
@@ -322,6 +323,9 @@
type: NetworkConfiguratorBoundUserInterface
- key: enum.NetworkConfiguratorUiKey.Link
type: NetworkConfiguratorBoundUserInterface
- type: Tag
tags:
- DroneUsable
- type: StaticPrice
price: 56
- type: GuideHelp

View File

@@ -658,6 +658,9 @@
radius: 1.5
energy: 1.6
color: "#e6e227"
- type: Tag
tags:
- DroneUsable
- type: entity
parent: BaseComputer

View File

@@ -305,6 +305,7 @@
- Implanter
- PillCanister
- ChemistryEmptyBottle01
- Drone
- AdvMopItem
- WeaponSprayNozzle
- ClothingBackpackWaterTank

View File

@@ -299,6 +299,9 @@
- type: Advertise
pack: ClothesMateAds
- type: Speech
- type: Tag
tags:
- DroneUsable
- type: Sprite
sprite: Structures/Machines/VendingMachines/clothing.rsi
layers:
@@ -330,6 +333,9 @@
- type: Advertise
pack: ClothesMateAds
- type: Speech
- type: Tag
tags:
- DroneUsable
- type: Sprite
sprite: Structures/Machines/VendingMachines/winterdrobe.rsi
layers:
@@ -1121,6 +1127,9 @@
radius: 1.5
energy: 1.6
color: "#c73434"
- type: Tag
tags:
- DroneUsable
- type: entity
parent: VendingMachine
@@ -1216,6 +1225,9 @@
radius: 1.5
energy: 1.6
color: "#d4ab33"
- type: Tag
tags:
- DroneUsable
- type: entity
parent: VendingMachine

View File

@@ -93,6 +93,15 @@
materials:
Wood: 100
- type: latheRecipe
id: Drone
result: Drone
completetime: 6
materials:
Steel: 500
Glass: 500
Plastic: 500
- type: latheRecipe
id: SynthesizerInstrument
result: SynthesizerInstrument

View File

@@ -11,6 +11,7 @@
cost: 5000
recipeUnlocks:
- ProximitySensor
- Drone
- ExosuitFabricatorMachineCircuitboard
- type: technology

View File

@@ -11,6 +11,13 @@
id: Holoparasite
prefix: HOLO
- type: nameIdentifierGroup
id: Drone
prefix: DR
fullName: true
minValue: 10000
maxValue: 99999
- type: nameIdentifierGroup
id: MMI
prefix: MMI

View File

@@ -529,6 +529,9 @@
- type: Tag
id: DrinkSpaceGlue
- type: Tag
id: DroneUsable
- type: Tag
id: Duck

View File

@@ -196,11 +196,6 @@ VehicleJanicartDestroyed: null
YellowOxygenTank: OxygenTank
YellowOxygenTankFilled: OxygenTankFilled
# 2024-02-19
Drone: null
SpawnMobDrone: null
Onestar: null # I dont think this is even mapped, but just in case
# 2024-02-22
SolarAssemblyPart: SolarAssemblyFlatpack
AmePart: AmePartFlatpack