diff --git a/Content.Server/ADT/Abilities/XenoQeen/XenoQeenComponent.cs b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenComponent.cs
new file mode 100644
index 00000000000..1e4b46a9c18
--- /dev/null
+++ b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenComponent.cs
@@ -0,0 +1,29 @@
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+
+namespace Content.Server.Abilities.XenoQeen
+{
+ ///
+ /// Lets its owner entity use mime powers, like placing invisible walls.
+ ///
+ [RegisterComponent]
+ public sealed partial class XenoQeenComponent : Component
+ {
+ ///
+ /// Whether this component is active or not.
+ ///
+ [DataField("enabled")]
+ public bool Enabled = true;
+
+ ///
+ /// The wall prototype to use.
+ ///
+ [DataField("wallPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string XenoTurret = "WeaponTurretXeno";
+
+ [DataField("xenoTurretAction", customTypeSerializer: typeof(PrototypeIdSerializer))]
+ public string? XenoTurretAction = "ActionXenoQeenTurret";
+
+ [DataField("xenoTurretActionEntity")] public EntityUid? XenoTurretActionEntity;
+ }
+}
diff --git a/Content.Server/ADT/Abilities/XenoQeen/XenoQeenSystem.cs b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenSystem.cs
new file mode 100644
index 00000000000..fb4f41abde3
--- /dev/null
+++ b/Content.Server/ADT/Abilities/XenoQeen/XenoQeenSystem.cs
@@ -0,0 +1,66 @@
+using Content.Server.Popups;
+using Content.Shared.Actions;
+using Content.Shared.Actions.Events;
+using Content.Shared.Coordinates.Helpers;
+using Content.Shared.Maps;
+using Content.Shared.Physics;
+using Robust.Shared.Containers;
+using Robust.Shared.Map;
+
+namespace Content.Server.Abilities.XenoQeen
+{
+ public sealed class XenoQeenSystem : EntitySystem
+ {
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
+ [Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
+ [Dependency] private readonly TurfSystem _turf = default!;
+ [Dependency] private readonly IMapManager _mapMan = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnComponentInit);
+ SubscribeLocalEvent(OnCreateTurret);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+ }
+ private void OnComponentInit(EntityUid uid, XenoQeenComponent component, ComponentInit args)
+ {
+ _actionsSystem.AddAction(uid, ref component.XenoTurretActionEntity, component.XenoTurretAction, uid);
+ }
+ private void OnCreateTurret(EntityUid uid, XenoQeenComponent component, InvisibleWallActionEvent args)
+ {
+ if (!component.Enabled)
+ return;
+
+ if (_container.IsEntityOrParentInContainer(uid))
+ return;
+
+ var xform = Transform(uid);
+ // Get the tile in front of the Qeen
+ var offsetValue = xform.LocalRotation.ToWorldVec();
+ var coords = xform.Coordinates.Offset(offsetValue).SnapToGrid(EntityManager, _mapMan);
+ var tile = coords.GetTileRef(EntityManager, _mapMan);
+ if (tile == null)
+ return;
+
+ // Check if the tile is blocked by a wall or mob, and don't create the wall if so
+ if (_turf.IsTileBlocked(tile.Value, CollisionGroup.Impassable | CollisionGroup.Opaque))
+ {
+ _popupSystem.PopupEntity(Loc.GetString("create-turret-failed"), uid, uid);
+ return;
+ }
+
+ _popupSystem.PopupEntity(Loc.GetString("create-turret"), uid);
+ // Make sure we set the invisible wall to despawn properly
+ Spawn(component.XenoTurret, _turf.GetTileCenter(tile.Value));
+ // Handle args so cooldown works
+ args.Handled = true;
+ }
+
+ }
+}
diff --git a/Resources/Locale/ru-RU/ADT/prototypes/Actions/XenoQeen.ftl b/Resources/Locale/ru-RU/ADT/prototypes/Actions/XenoQeen.ftl
new file mode 100644
index 00000000000..9a3337faeba
--- /dev/null
+++ b/Resources/Locale/ru-RU/ADT/prototypes/Actions/XenoQeen.ftl
@@ -0,0 +1,14 @@
+ent-ActionXenoQeenTurret = Создать ксено турель.
+ .desc = Создаёт перед вами ксену турель, если хватает места.
+create-turret-failed = Найдите другое место.
+create-turret = Арргхсс. Шшшшш!
+ent-ActionSpawnMobXenoSpitter = Призвать Плевальщик
+ .desc = Родите Плевальщика, который будет плеваться!
+ent-ActionSpawnMobXenoPraetorian = Призвать Преторианеца
+ .desc = Родите Преторианеца, который будет сражаться за вас!
+ent-ActionSpawnMobXenoDrone = Просто Дрон. Кому он нужен?
+ .desc = Родите рабочего, Дрон.
+ent-ActionSpawnMobXenoRavager = Призвать Разрушителя
+ .desc = Родите смерть во плоти!
+ent-ActionSpawnMobXenoRunner = Призвать Бегуна
+ .desc = Родите самую быструю личинку!
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl
index d6fbec371b1..f1912d62683 100644
--- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl
+++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/mobs/npcs/xeno.ftl
@@ -1,19 +1,19 @@
ent-MobXeno = Бурильщик
.desc = Обычно они приходят ночью. Обычно.
ent-MobXenoPraetorian = Преторианец
- .desc = { ent-MobXeno.desc }
+ .desc = Преторианец. Личная гвардия королевы, задача которого - защитить королеву. Стойкий воин ксено с хорошим уроном.
ent-MobXenoDrone = Дрон
- .desc = { ent-MobXeno.desc }
+ .desc = Дрон. Рядовой представитель ксеносов, задача которых - защищать улей и иногда охотиться. Не обладают выдающимися характеристиками. Самый типичный ксено.
ent-MobXenoQueen = Королева
- .desc = { ent-MobXeno.desc }
+ .desc = Королева. Предводительница стаи, невероятно сильная и живучая, если она оказалась перед вами - считайте, что вы мертвы.
ent-MobXenoRavager = Разрушитель
- .desc = { ent-MobXeno.desc }
+ .desc = Разрушитель. Самый сильный и живучий ксенос, после королевы.
ent-MobXenoRunner = Бегун
- .desc = { ent-MobXeno.desc }
+ .desc = Бегун. Обладает малым уроном, но отличается большой скоростью, так что быстро бегает и бьёт.
ent-MobXenoRouny = Руни
.desc = { ent-MobXenoRunner.desc }
ent-MobXenoSpitter = Плевальщик
- .desc = { ent-MobXeno.desc }
+ .desc = Плевальщик. Рядовой представитель ксеносов, который плюётся едкой кислотой, прожигающую даже броню. Однако слаб в ближнем бою.
ent-MobPurpleSnake = космическая гадюка
.desc = Грозная пурпурная змея с Kepler-283c.
ent-MobSmallPurpleSnake = космическая гадюка
diff --git a/Resources/Prototypes/ADT/Actions/XenoQeen.yml b/Resources/Prototypes/ADT/Actions/XenoQeen.yml
new file mode 100644
index 00000000000..2c853b949ad
--- /dev/null
+++ b/Resources/Prototypes/ADT/Actions/XenoQeen.yml
@@ -0,0 +1,109 @@
+# Спавн турелей у королевы
+- type: entity
+ id: ActionXenoQeenTurret
+ name: Create Xeno turret
+ description: Create an xeno turret in front of you, if placeable there.
+ components:
+ - type: InstantAction
+ priority: -1
+ useDelay: 180
+ icon:
+ sprite: Objects/Weapons/Guns/Turrets/xenoturret.rsi
+ state: icon
+ event: !type:InvisibleWallActionEvent
+# Я не смог сделать отдельный ивент для спавнта турели. Он не видел прототип ивента.
+
+- type: entity
+ id: ActionSpawnMobXenoSpitter
+ name: Spawn Spitter
+ description: Give birth to Spitter who will spit!
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: WorldTargetAction
+ useDelay: 240
+ range: 4
+ itemIconStyle: BigAction
+ icon:
+ sprite: Mobs/Aliens/Xenos/spitter.rsi
+ state: crit
+ event: !type:WorldSpawnSpellEvent
+ prototypes:
+ - id: MobXenoSpitter
+ amount: 1
+ offset: 0, 1
+
+- type: entity
+ id: ActionSpawnMobXenoPraetorian
+ name: Spawn Praetorian
+ description: Give birth to a Praetorian who will fight for you!
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: WorldTargetAction
+ useDelay: 300
+ range: 4
+ itemIconStyle: BigAction
+ icon:
+ sprite: Mobs/Aliens/Xenos/praetorian.rsi
+ state: crit
+ event: !type:WorldSpawnSpellEvent
+ prototypes:
+ - id: MobXenoPraetorian
+ amount: 1
+ offset: 0, 1
+
+- type: entity
+ id: ActionSpawnMobXenoDrone
+ name: Just a Drone. Who needs it?
+ description: Give birth to a worker, Drone.
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: WorldTargetAction
+ useDelay: 80
+ range: 4
+ itemIconStyle: BigAction
+ icon:
+ sprite: Mobs/Aliens/Xenos/drone.rsi
+ state: crit
+ event: !type:WorldSpawnSpellEvent
+ prototypes:
+ - id: MobXenoDrone
+ amount: 1
+ offset: 0, 1
+
+- type: entity
+ id: ActionSpawnMobXenoRavager
+ name: Spawn Ravager
+ description: Give birth to death in the flesh!
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: WorldTargetAction
+ useDelay: 480
+ range: 4
+ itemIconStyle: BigAction
+ icon:
+ sprite: Mobs/Aliens/Xenos/ravager.rsi
+ state: crit
+ event: !type:WorldSpawnSpellEvent
+ prototypes:
+ - id: MobXenoRavager
+ amount: 1
+ offset: 0, 1
+
+- type: entity
+ id: ActionSpawnMobXenoRunner
+ name: Spawn Runner
+ description: Give birth to the fastest larva!
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: WorldTargetAction
+ useDelay: 120
+ range: 4
+ itemIconStyle: BigAction
+ icon:
+ sprite: Mobs/Aliens/Xenos/runner.rsi
+ state: crit
+ event: !type:WorldSpawnSpellEvent
+ prototypes:
+ - id: MobXenoRunner
+ amount: 1
+ offset: 0, 1
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
index a71adfc57cf..eacda126d91 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
@@ -146,12 +146,18 @@
- type: MobThresholds
thresholds:
0: Alive
- 100: Dead
+ 350: Dead # ADT Tweak
- type: Stamina
critThreshold: 300
- type: SlowOnDamage
speedModifierThresholds:
50: 0.7
+ #ADT Start: Xeno baff
+ - type: MeleeWeapon
+ damage:
+ groups:
+ Brute: 8
+ # ADT End
- type: Fixtures
fixtures:
fix1:
@@ -183,14 +189,14 @@
- type: MobThresholds
thresholds:
0: Alive
- 80: Dead
+ 100: Dead # ADT Tweak
- type: SlowOnDamage
speedModifierThresholds:
40: 0.7
- type: MeleeWeapon
damage:
groups:
- Brute: 6
+ Brute: 5 # ADT Tweak
- type: MovementSpeedModifier
baseSprintSpeed: 4
- type: Fixtures
@@ -214,6 +220,16 @@
parent: MobXeno
id: MobXenoQueen
components:
+ # ADT Start: Xeno buff
+ - type: XenoQeen # ADT Tweak: Способность спавнта турелей
+ - type: ActionGrant
+ actions:
+ - ActionSpawnMobXenoSpitter # Призыв Плевальщиков
+ - ActionSpawnMobXenoPraetorian # Призыв Преторианеца
+ - ActionSpawnMobXenoDrone # Призыв Дрона
+ - ActionSpawnMobXenoRavager # Призыв Разрушителя
+ - ActionSpawnMobXenoRunner # Призыв бегуна
+ #ADT End
- type: Sprite
drawdepth: Mobs
sprite: Mobs/Aliens/Xenos/queen.rsi
@@ -224,7 +240,7 @@
- type: MobThresholds
thresholds:
0: Alive
- 300: Dead
+ 1000: Dead # ADT Tweak
- type: SlowOnDamage
speedModifierThresholds:
150: 0.7
@@ -232,7 +248,7 @@
- type: MeleeWeapon
damage:
groups:
- Brute: 12
+ Brute: 20 # ADT Tweak
- type: Fixtures
fixtures:
fix1:
@@ -252,7 +268,6 @@
rankName: collective-mind-queen-rank
# ADT-CollectiveMind-Tweak-End
-
- type: entity
name: ravager
parent: MobXeno
@@ -268,13 +283,13 @@
- type: MobThresholds
thresholds:
0: Alive
- 100: Dead
+ 750: Dead # ADT Tweak
- type: MovementSpeedModifier
- baseSprintSpeed: 4
+ baseSprintSpeed: 2 # ADT Tweak
- type: MeleeWeapon
damage:
groups:
- Brute: 10
+ Brute: 30 # ADT Tweak
- type: SlowOnDamage
speedModifierThresholds:
50: 0.7
@@ -306,8 +321,14 @@
layers:
- map: ["enum.DamageStateVisualLayers.Base"]
state: running
+ # ADT Start: Xeno buff
+ - type: MobThresholds
+ thresholds:
+ 0: Alive
+ 100: Dead
+ # ADT End
- type: MovementSpeedModifier
- baseSprintSpeed: 6.0
+ baseSprintSpeed: 12.0 # ADT Tweak
- type: MeleeWeapon
damage:
groups:
@@ -362,7 +383,7 @@
- type: MobThresholds
thresholds:
0: Alive
- 50: Dead
+ 80: Dead # ADT Tweak
- type: SlowOnDamage
speedModifierThresholds:
25: 0.7
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
index f4043820d0c..247d3dcb314 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
@@ -805,7 +805,7 @@
- type: Projectile
damage:
types:
- Caustic: 5
+ Caustic: 12 # ADT Tweak
- type: Sprite
sprite: Objects/Weapons/Guns/Projectiles/xeno_toxic.rsi
layers:
diff --git a/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/icon.png b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/icon.png
new file mode 100644
index 00000000000..7eef088dfb6
Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json
index 3adb37ea5c3..071f869db31 100644
--- a/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json
+++ b/Resources/Textures/Objects/Weapons/Guns/Turrets/xenoturret.rsi/meta.json
@@ -7,6 +7,9 @@
"y": 32
},
"states": [
+ {
+ "name": "icon"
+ },
{
"name": "acid_turret",
"directions": 4,