-
Notifications
You must be signed in to change notification settings - Fork 154
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
using Robust.Shared.Audio; | ||
|
||
namespace Content.Server._White.Teleporter; | ||
|
||
[RegisterComponent] | ||
public sealed partial class ExperimentalTeleporterComponent : Component | ||
{ | ||
[DataField] | ||
public int MinTeleportRange = 3; | ||
|
||
[DataField] | ||
public int MaxTeleportRange = 8; | ||
|
||
[DataField] | ||
public int EmergencyLength = 4; | ||
|
||
[DataField] | ||
public List<int> RandomRotations = new() {90, -90}; | ||
|
||
[DataField] | ||
public string? TeleportInEffect = "ExperimentalTeleporterInEffect"; | ||
|
||
[DataField] | ||
public string? TeleportOutEffect = "ExperimentalTeleporterOutEffect"; | ||
|
||
[DataField] | ||
public SoundSpecifier TeleportSound = new SoundPathSpecifier("/Audio/Backman/Object/Devices/experimentalsyndicateteleport.ogg"); | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
using System.Linq; | ||
using System.Numerics; | ||
using Content.Server.Body.Systems; | ||
using Content.Server.Standing; | ||
using Content.Shared.Charges.Systems; | ||
using Content.Shared.Coordinates.Helpers; | ||
using Content.Shared.Interaction.Events; | ||
using Content.Shared.Maps; | ||
using Content.Shared.Tag; | ||
using Robust.Server.Audio; | ||
using Robust.Server.Containers; | ||
using Robust.Server.GameObjects; | ||
using Robust.Shared.Map; | ||
using Robust.Shared.Map.Components; | ||
using Robust.Shared.Random; | ||
|
||
namespace Content.Server._White.Teleporter; | ||
|
||
public sealed class ExperimentalTeleporterSystem : EntitySystem | ||
{ | ||
[Dependency] private readonly TransformSystem _transform = default!; | ||
[Dependency] private readonly BodySystem _bodySystem = default!; | ||
[Dependency] private readonly MapSystem _mapSystem = default!; | ||
[Dependency] private readonly IEntityManager _entManager = default!; | ||
[Dependency] private readonly AudioSystem _audio = default!; | ||
[Dependency] private readonly ContainerSystem _containerSystem = default!; | ||
[Dependency] private readonly IRobustRandom _random = default!; | ||
[Dependency] private readonly LayingDownSystem _layingDown = default!; | ||
Check failure on line 28 in Content.Server/Backmen/Teleporter/ExperimentalTeleporterSystem.cs
|
||
[Dependency] private readonly SharedChargesSystem _charges = default!; | ||
[Dependency] private readonly TagSystem _tag = default!; | ||
|
||
public override void Initialize() | ||
{ | ||
base.Initialize(); | ||
SubscribeLocalEvent<ExperimentalTeleporterComponent, UseInHandEvent>(OnUse); | ||
} | ||
|
||
private void OnUse(EntityUid uid, ExperimentalTeleporterComponent component, UseInHandEvent args) | ||
{ | ||
if (_charges.IsEmpty(uid) | ||
|| !TryComp<TransformComponent>(args.User, out var xform) | ||
|| (_containerSystem.IsEntityInContainer(args.User) | ||
&& !_containerSystem.TryRemoveFromContainer(args.User))) | ||
return; | ||
|
||
var oldCoords = xform.Coordinates; | ||
var range = _random.Next(component.MinTeleportRange, component.MaxTeleportRange); | ||
var offset = xform.LocalRotation.ToWorldVec().Normalized(); | ||
var direction = xform.LocalRotation.GetDir().ToVec(); | ||
var newOffset = offset + direction * range; | ||
|
||
var coords = xform.Coordinates.Offset(newOffset).SnapToGrid(EntityManager); | ||
|
||
Teleport(args.User, uid, component, coords, oldCoords); | ||
|
||
if (!TryCheckWall(coords) | ||
|| EmergencyTeleportation(args.User, uid, component, xform, oldCoords, newOffset)) | ||
return; | ||
|
||
_bodySystem.GibBody(args.User, true, splatModifier: 3F); | ||
} | ||
|
||
private bool EmergencyTeleportation(EntityUid uid, EntityUid teleporterUid, ExperimentalTeleporterComponent component, TransformComponent xform, EntityCoordinates oldCoords, Vector2 offset) | ||
{ | ||
var newOffset = offset + VectorRandomDirection(component, offset, component.EmergencyLength); | ||
var coords = xform.Coordinates.Offset(newOffset).SnapToGrid(EntityManager); | ||
|
||
if (_charges.IsEmpty(teleporterUid)) | ||
return false; | ||
|
||
Teleport(uid, teleporterUid, component, coords, oldCoords); | ||
|
||
return !TryCheckWall(coords); | ||
} | ||
|
||
private void Teleport(EntityUid uid, EntityUid teleporterUid, ExperimentalTeleporterComponent component, EntityCoordinates coords, EntityCoordinates oldCoords) | ||
{ | ||
PlaySoundAndEffects(component, coords, oldCoords); | ||
|
||
_layingDown.LieDownInRange(uid, coords); | ||
_transform.SetCoordinates(uid, coords); | ||
|
||
_charges.UseCharge(teleporterUid); | ||
} | ||
|
||
private void PlaySoundAndEffects(ExperimentalTeleporterComponent component, EntityCoordinates coords, EntityCoordinates oldCoords) | ||
{ | ||
_audio.PlayPvs(component.TeleportSound, coords); | ||
_audio.PlayPvs(component.TeleportSound, oldCoords); | ||
|
||
_entManager.SpawnEntity(component.TeleportInEffect, coords); | ||
_entManager.SpawnEntity(component.TeleportOutEffect, oldCoords); | ||
} | ||
|
||
private bool TryCheckWall(EntityCoordinates coords) | ||
{ | ||
if (!coords.TryGetTileRef(out var tile) | ||
|| !TryComp<MapGridComponent>(tile.Value.GridUid, out var mapGridComponent)) | ||
return false; | ||
|
||
var anchoredEntities = _mapSystem.GetAnchoredEntities(tile.Value.GridUid, mapGridComponent, coords); | ||
|
||
return anchoredEntities.Any(x => _tag.HasTag(x, "Wall")); | ||
} | ||
|
||
private Vector2 VectorRandomDirection(ExperimentalTeleporterComponent component, Vector2 offset, int length) | ||
{ | ||
if (component.RandomRotations.Count == 0) | ||
return Vector2.Zero; | ||
|
||
var randomRotation = _random.Next(0, component.RandomRotations.Count); | ||
return Angle.FromDegrees(component.RandomRotations[randomRotation]).RotateVec(offset.Normalized() * length); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
- files: ["experimentalsyndicateteleport.ogg"] | ||
license: "CC-BY-NC-SA-4.0" | ||
copyright: "Taken from White Dream" | ||
source: "https://github.com/frosty-dev/ss14-core/blob/master/Resources/Audio/White/Devices/expsyndicateteleport.ogg" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
uplink-emp-flashlight-name = Emp Flashlight | ||
uplink-emp-flashlight-desc = A rechargeable device disguised as a flashlight designed to disrupt electronic systems. Useful for disrupting communications, security's energy weapons, and APCs when you're in a tight spot. | ||
uplink-betrayal-knife-name = Betrayal dagger | ||
uplink-betrayal-knife-desc = The betrayal dagger allows the user to teleport a short distance, and also causes significant damage when stabbed in the back. | ||
uplink-betrayal-knife-name = Experimental syndicate teleporter | ||
uplink-betrayal-knife-desc = Syndicate teleporter, when used, moves 3-8 meters forward. In case of teleportation into a wall, uses emergency teleportation. Has 4 charge. | ||
uplink-ebow-name = Small energy crossbow | ||
uplink-ebow-desc = A fairly quiet weapon that automatically reloads and stuns. It goes well with other types of weapons. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
ent-ExperimentalSyndicateTeleporter = экспериментальный телепортер синдиката | ||
.desc = Телепортер синдиката, при использовании перемещает на 3-8 метров вперед. В случае телепортации в стену, использует экстренную телепортацию. Имеет 4 заряда и автоматически заряжается. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
uplink-emp-flashlight-name = Электромагнитный фонарик | ||
uplink-emp-flashlight-desc = Замаскированное под фонарик устройство. При ударе выпускает ЭМИ, поражающий электрические устройства. | ||
uplink-betrayal-knife-name = Предательский кинжал | ||
uplink-betrayal-knife-desc = Предательский кинжал позволяет пользователю телепортироваться на короткое расстояние, а также наносит значительные повреждения при ударе в спину. | ||
uplink-experimental-syndicate-teleporter-name = Экспериментальный телепортер синдиката | ||
uplink-experimental-syndicate-teleporter-desc = Телепортер синдиката, при использовании перемещает на 3-8 метров вперед. В случае телепортации в стену, использует экстренную телепортацию. Имеет 4 заряда и автоматически заряжается. | ||
uplink-ebow-name = Маленький энергетический арбалет | ||
uplink-ebow-desc = Довольно тихое оружие, которое автоматически перезаряжается и оглушает. Хорошо сочетается с другими видами оружия. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
- type: entity | ||
id: ExperimentalTeleporterInEffect | ||
name: experimental syndicate teleporter in effect | ||
components: | ||
- type: TimedDespawn | ||
lifetime: 0.6 | ||
- type: EvaporationSparkle | ||
- type: Transform | ||
noRot: true | ||
anchored: true | ||
- type: Sprite | ||
layers: | ||
- sprite: /Textures/Backmen/Objects/Devices/experimentalsyndicateteleporter.rsi | ||
state: in | ||
shader: unshaded | ||
netsync: false | ||
drawdepth: Effects | ||
- type: PointLight | ||
color: "#008DFE" | ||
|
||
- type: entity | ||
id: ExperimentalTeleporterOutEffect | ||
name: experimental syndicate teleporter out effect | ||
components: | ||
- type: TimedDespawn | ||
lifetime: 0.6 | ||
- type: EvaporationSparkle | ||
- type: Transform | ||
noRot: true | ||
anchored: true | ||
- type: Sprite | ||
layers: | ||
- sprite: /Textures/Backmen/Objects/Devices/experimentalsyndicateteleporter.rsi | ||
state: out | ||
shader: unshaded | ||
netsync: false | ||
drawdepth: Effects | ||
- type: PointLight | ||
color: "#008DFE" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
- type: entity | ||
id: ExperimentalSyndicateTeleporter | ||
parent: BaseItem | ||
name: experimental syndicate teleporter | ||
description: Syndicate teleporter, when used, moves 3-8 meters forward. In case of teleportation into a wall, uses emergency teleportation. Has 4 charge. | ||
components: | ||
- type: Sprite | ||
sprite: /Textures/Backmen/Objects/Devices/experimentalsyndicateteleporter.rsi | ||
layers: | ||
- state: icon | ||
- type: ExperimentalTeleporter | ||
- type: LimitedCharges | ||
maxCharges: 4 | ||
charges: 4 | ||
- type: AutoRecharge | ||
rechargeDuration: 10 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
{ | ||
"version": 1, | ||
"license": "CC-BY-SA-3.0", | ||
"copyright": "Taken from tgstation, remade by CaypenNow", | ||
"size": { | ||
"x": 32, | ||
"y": 32 | ||
}, | ||
"states": [ | ||
{ | ||
"name": "icon", | ||
"delays": [ | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
] | ||
] | ||
}, | ||
{ | ||
"name": "inhand-left", | ||
"directions": 4 | ||
}, | ||
{ | ||
"name": "inhand-right", | ||
"directions": 4 | ||
}, | ||
{ | ||
"name": "in", | ||
"directions": 4, | ||
"delays": [ | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
], | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
], | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
], | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
] | ||
] | ||
}, | ||
{ | ||
"name": "out", | ||
"directions": 4, | ||
"delays": [ | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
], | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
], | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
], | ||
[ | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1, | ||
0.1 | ||
] | ||
] | ||
} | ||
] | ||
} |