Skip to content

Commit

Permalink
Транспорт (#551)
Browse files Browse the repository at this point in the history
## Описание PR
<!-- Что вы изменили в этом пулл реквесте? -->
Вернул транспорт с древних времён

## Почему / Баланс
<!-- Почему оно было изменено? Ссылайтесь на любые обсуждения или
вопросы здесь. Пожалуйста, обсудите, как это повлияет на игровой баланс.
-->
Оффовский рефактор это миф, потому возвращаю то, что и так нормально
работало

**Ссылка на публикацию в Discord**
<!-- Укажите ссылки на соответствующие обсуждения, проблемы, баги,
заказы в разработку или предложения
- [Технические проблемы](ссылка)
- [Баги](ссылка)
- [Заказы-разработка](ссылка)
- [Предложения](ссылка)
- [Перенос контента](ссылка)-->

## Техническая информация
<!-- Если речь идет об изменении кода, кратко изложите на высоком уровне
принцип работы нового кода. Это облегчает рецензирование.- -->
Ну, новая система. Ничего критичного.

## Медиа
<!--
Пулл реквесты, которые вносят внутриигровые изменения (добавление
одежды, предметов, новых возможностей и т.д.), должны содержать медиа,
демонстрирующие изменения.
Небольшие исправления/рефакторы не требуют медиа.

Если Вы не уверены в том, что Ваш пулл реквест требует медиа, спросите
мейнтейнера.
-->

## Требования
<!--
В связи с наплывом ПР'ов нам необходимо убедиться, что ПР'ы следуют
правильным рекомендациям.

Пожалуйста, уделите время прочтению, если делаете пулл реквест (ПР)
впервые.

Отметьте поля ниже, чтобы подтвердить, что Вы действительно видели их
(поставьте X в скобках, например [X]):
-->
- [x] Я прочитал(а) и следую [Руководство по созданию пулл
реквестов](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html).
Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению
мейнтейнера.
- [ ] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие
его изменения в игре, **или** этот пулл реквест не требует демонстрации
в игре

## Критические изменения
<!--
Перечислите все критические изменения, включая изменения пространства
имён, публичных классов/методов/полей, переименования прототипов, и
предоставьте инструкции по их исправлению.
-->

**Чейнджлог**
<!--
Здесь Вы можете заполнить журнал изменений, который будет автоматически
добавлен в игру при мердже Вашего пулл реквест.

Чтобы игроки узнали о новых возможностях и изменениях, которые могут
повлиять на их игру, добавьте запись в журнал изменений.

Не считайте суффикс типа записи (например, add) "частью" предложения:
плохо: - add: новый инструмент для инженеров
хорошо: - add: добавлен новый инструмент для инженеров

Помещение имени после символа 🆑 изменит имя, которое будет
отображаться в журнале изменений (в противном случае будет
использоваться ваше имя пользователя GitHub).
Например: 🆑 AruMoon
-->

🆑 Котя
- add: Добавлен (возвращён) транспорт!
  • Loading branch information
FaDeOkno authored Sep 28, 2024
1 parent c5d145e commit f9ff8ab
Show file tree
Hide file tree
Showing 43 changed files with 604,799 additions and 602,124 deletions.
80 changes: 80 additions & 0 deletions Content.Client/ADT/Vehicle/VehicleSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using Content.Shared.Vehicle;
using Content.Shared.Vehicle.Components;
using Robust.Client.GameObjects;
using Robust.Shared.GameStates;

namespace Content.Client.Vehicle;

public sealed class VehicleSystem : SharedVehicleSystem
{
[Dependency] private EyeSystem _eye = default!;

public override void Initialize()
{
base.Initialize();

SubscribeLocalEvent<RiderComponent, ComponentStartup>(OnRiderStartup);
SubscribeLocalEvent<RiderComponent, ComponentShutdown>(OnRiderShutdown);
SubscribeLocalEvent<RiderComponent, ComponentHandleState>(OnRiderHandleState);
SubscribeLocalEvent<VehicleComponent, AppearanceChangeEvent>(OnVehicleAppearanceChange);
}

private void OnRiderStartup(EntityUid uid, RiderComponent component, ComponentStartup args)
{
// Center the player's eye on the vehicle
if (TryComp(uid, out EyeComponent? eyeComp))
{
_eye.SetTarget(uid, eyeComp.Target ?? component.Vehicle, eyeComp);
}
}

private void OnRiderShutdown(EntityUid uid, RiderComponent component, ComponentShutdown args)
{
// reset the riders eye centering.
if (TryComp(uid, out EyeComponent? eyeComp))
{
_eye.SetTarget(uid, null, eyeComp);
}
}

private void OnRiderHandleState(EntityUid uid, RiderComponent component, ref ComponentHandleState args)
{
if (args.Current is not RiderComponentState state)
return;

var entity = EnsureEntity<RiderComponent>(state.Entity, uid);

if (TryComp(uid, out EyeComponent? eyeComp) && eyeComp.Target == component.Vehicle)
{
_eye.SetTarget(uid, entity, eyeComp);
}

component.Vehicle = entity;
}

private void OnVehicleAppearanceChange(EntityUid uid, VehicleComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite == null)
return;

if (component.HideRider
&& Appearance.TryGetData<bool>(uid, VehicleVisuals.HideRider, out var hide, args.Component)
&& TryComp<SpriteComponent>(component.LastRider, out var riderSprite))
riderSprite.Visible = !hide;

// First check is for the sprite itself
if (Appearance.TryGetData<int>(uid, VehicleVisuals.DrawDepth, out var drawDepth, args.Component))
args.Sprite.DrawDepth = drawDepth;

// Set vehicle layer to animated or not (i.e. are the wheels turning or not)
if (component.AutoAnimate
&& Appearance.TryGetData<bool>(uid, VehicleVisuals.AutoAnimate, out var autoAnimate, args.Component))
args.Sprite.LayerSetAutoAnimated(VehicleVisualLayers.AutoAnimate, autoAnimate);
}
}

public enum VehicleVisualLayers : byte
{
/// Layer for the vehicle's wheels
AutoAnimate,
}
7 changes: 7 additions & 0 deletions Content.Server/ADT/Vehicle/VehicleSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
using Content.Shared.Vehicle;

namespace Content.Server.Vehicle;

public sealed class VehicleSystem : SharedVehicleSystem
{
}
17 changes: 17 additions & 0 deletions Content.Shared/ADT/Vehicle/Components/InVehicleComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using Robust.Shared.GameStates;

namespace Content.Shared.Vehicle.Components
{
/// <summary>
/// Added to objects inside a vehicle to stop people besides the rider from
/// removing them.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class InVehicleComponent : Component
{
/// <summary>
/// The vehicle this rider is currently riding.
/// </summary>
[ViewVariables] public VehicleComponent? Vehicle;
}
}
25 changes: 25 additions & 0 deletions Content.Shared/ADT/Vehicle/Components/RiderComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;

namespace Content.Shared.Vehicle.Components;

/// <summary>
/// Added to people when they are riding in a vehicle
/// used mostly to keep track of them for entityquery.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class RiderComponent : Component
{
/// <summary>
/// The vehicle this rider is currently riding.
/// </summary>
[ViewVariables] public EntityUid? Vehicle;

public override bool SendOnlyToOwner => true;
}

[Serializable, NetSerializable]
public sealed class RiderComponentState : ComponentState
{
public NetEntity? Entity;
}
114 changes: 114 additions & 0 deletions Content.Shared/ADT/Vehicle/Components/VehicleComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
using System.Numerics;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;

namespace Content.Shared.Vehicle.Components;

/// <summary>
/// This is particularly for vehicles that use
/// buckle. Stuff like clown cars may need a different
/// component at some point.
/// All vehicles should have Physics, Strap, and SharedPlayerInputMover components.
/// </summary>
[AutoGenerateComponentState]
[RegisterComponent, NetworkedComponent]
[Access(typeof(SharedVehicleSystem))]
public sealed partial class VehicleComponent : Component
{
/// <summary>
/// The entity currently riding the vehicle.
/// </summary>
[ViewVariables]
[AutoNetworkedField]
public EntityUid? Rider;

[ViewVariables]
[AutoNetworkedField]
public EntityUid? LastRider;

/// <summary>
/// The base offset for the vehicle (when facing east)
/// </summary>
[ViewVariables]
public Vector2 BaseBuckleOffset = Vector2.Zero;

/// <summary>
/// The sound that the horn makes
/// </summary>
[DataField("hornSound")]
[ViewVariables(VVAccess.ReadWrite)]
public SoundSpecifier? HornSound = new SoundPathSpecifier("/Audio/Effects/Vehicle/carhorn.ogg")
{
Params = AudioParams.Default.WithVolume(-3f)
};

[ViewVariables]
public EntityUid? HonkPlayingStream;

/// Use ambient sound component for the idle sound.

[DataField("hornAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string? HornAction = "ADTActionVehicleHorn";

/// <summary>
/// The action for the horn (if any)
/// </summary>
[DataField("hornActionEntity")]
[ViewVariables(VVAccess.ReadWrite)]
public EntityUid? HornActionEntity;

/// <summary>
/// Whether the vehicle has a key currently inside it or not.
/// </summary>
[DataField("hasKey")]
[ViewVariables(VVAccess.ReadWrite)]
public bool HasKey;

/// <summary>
/// Determines from which side the vehicle will be displayed on top of the player.
/// </summary>

[DataField("southOver")]
[ViewVariables(VVAccess.ReadWrite)]
public bool SouthOver;

[DataField("northOver")]
[ViewVariables(VVAccess.ReadWrite)]
public bool NorthOver;

[DataField("westOver")]
[ViewVariables(VVAccess.ReadWrite)]
public bool WestOver;

[DataField("eastOver")]
[ViewVariables(VVAccess.ReadWrite)]
public bool EastOver;

/// <summary>
/// What the y buckle offset should be in north / south
/// </summary>
[DataField("northOverride")]
[ViewVariables(VVAccess.ReadWrite)]
public float NorthOverride;

/// <summary>
/// What the y buckle offset should be in north / south
/// </summary>
[DataField("southOverride")]
[ViewVariables(VVAccess.ReadWrite)]
public float SouthOverride;

[DataField("autoAnimate")]
[ViewVariables(VVAccess.ReadWrite)]
public bool AutoAnimate = true;

[DataField("useHand")]
[ViewVariables(VVAccess.ReadWrite)]
public bool UseHand = true;

[DataField("hideRider")]
[ViewVariables(VVAccess.ReadWrite)]
public bool HideRider;
}
41 changes: 41 additions & 0 deletions Content.Shared/ADT/Vehicle/Systems/SharedVehicleSystem.Rider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
using Content.Shared.Hands;
using Content.Shared.Movement.Pulling.Events;
using Content.Shared.Vehicle.Components;
using Robust.Shared.GameStates;

namespace Content.Shared.Vehicle;

public abstract partial class SharedVehicleSystem
{
private void InitializeRider()
{
SubscribeLocalEvent<RiderComponent, ComponentGetState>(OnRiderGetState);
SubscribeLocalEvent<RiderComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted);
SubscribeLocalEvent<RiderComponent, PullAttemptEvent>(OnPullAttempt);
}

private void OnRiderGetState(EntityUid uid, RiderComponent component, ref ComponentGetState args)
{
args.State = new RiderComponentState()
{
Entity = GetNetEntity(component.Vehicle),
};
}

/// <summary>
/// Kick the rider off the vehicle if they press q / drop the virtual item
/// </summary>
private void OnVirtualItemDeleted(EntityUid uid, RiderComponent component, VirtualItemDeletedEvent args)
{
if (args.BlockingEntity == component.Vehicle)
{
_buckle.TryUnbuckle(uid, uid, true);
}
}

private void OnPullAttempt(EntityUid uid, RiderComponent component, PullAttemptEvent args)
{
if (component.Vehicle != null)
args.Cancelled = true;
}
}
Loading

0 comments on commit f9ff8ab

Please sign in to comment.