Skip to content

Commit

Permalink
гостбар (#651)
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).
Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению
мейнтейнера.
- [x] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие
его изменения в игре, **или** этот пулл реквест не требует демонстрации
в игре

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

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

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

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

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


🆑 Ratyyy
- add: Призраки нашли для себя целое кафе, в котором они могут отдыхать
после смерти!

---------

Co-authored-by: FaDeOkno <[email protected]>
Co-authored-by: FaDeOkno <[email protected]>
  • Loading branch information
3 people authored Oct 22, 2024
1 parent d7f1f09 commit 14afdf5
Show file tree
Hide file tree
Showing 19 changed files with 20,949 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<DefaultWindow xmlns="https://spacestation14.io"
Title="{Loc 'ghost-target-window-ghostbar'}"
MinSize="550 400"
SetSize="550 400">
<BoxContainer Orientation="Vertical"
HorizontalExpand="True">
<RichTextLabel Name="TopBanner" VerticalExpand="True"/>
<Button Name="SpawnButton"
Text="{Loc 'ghost-window-spawn-ghostbar-button'}"
Disabled="True"
TextAlign="Center"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</BoxContainer>
</DefaultWindow>
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using Content.Shared.CCVar;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using Robust.Shared.Timing;
using Robust.Shared.Utility;

namespace Content.Client.ADT.UserInterface.Systems.Ghost.Controls
{
[GenerateTypedNameReferences]
public sealed partial class GhostBarRulesWindow : DefaultWindow
{
[Dependency] private readonly IConfigurationManager _cfg = IoCManager.Resolve<IConfigurationManager>();
private float _timer;

public event Action? SpawnButtonPressed;
public GhostBarRulesWindow()
{
RobustXamlLoader.Load(this);
var ghostBarTime = _cfg.GetCVar(CCVars.GhostRoleTime);
_timer = ghostBarTime;

if (ghostBarTime > 0f)
{
SpawnButton.Text = Loc.GetString("ghost-window-spawn-ghostbar-button-timer", ("time", $"{_timer:0.0}"));
TopBanner.SetMessage(FormattedMessage.FromMarkupPermissive(Loc.GetString("ghost-bar-rules") + "\n" + Loc.GetString("ghost-roles-window-rules-footer", ("time", ghostBarTime))));
SpawnButton.Disabled = true;
}

SpawnButton.OnPressed += _ => SpawnButtonPressed?.Invoke();
}


protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
if (!SpawnButton.Disabled) return;
if (_timer > 0.0)
{
_timer -= args.DeltaSeconds;
SpawnButton.Text = Loc.GetString("ghost-window-spawn-ghostbar-button-timer", ("time", $"{_timer:0.0}"));
}
else
{
SpawnButton.Disabled = false;
SpawnButton.Text = Loc.GetString("ghost-window-spawn-ghostbar-button");
}
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using Content.Client.Gameplay;
using Content.Client.Ghost;
using Content.Client.UserInterface.Systems.Gameplay;
using Content.Client.UserInterface.Systems.Ghost.Widgets;
using Content.Shared.Ghost;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controllers;
using Content.Client.UserInterface.Systems.Ghost;

namespace Content.Client.UserInterface.Systems.Ghost;

// TODO hud refactor BEFORE MERGE fix ghost gui being too far up
public sealed partial class GhostUIController
{
private void GhostBarPressed()
{
Gui?.GhostBarWindow.OpenCentered();
}

private void GhostBarSpawnPressed()
{
_system?.GhostBarSpawn();
}

public void LoadGhostbarGui()
{
if (Gui == null)
return;

Gui.GhostBarPressed += GhostBarPressed;
Gui.GhostBarWindow.SpawnButtonPressed += GhostBarSpawnPressed;
}

public void UnloadGhostbarGui()
{
if (Gui == null)
return;

Gui.GhostBarPressed -= GhostBarPressed;
Gui.GhostBarWindow.SpawnButtonPressed -= GhostBarSpawnPressed;
}
}
1 change: 1 addition & 0 deletions Content.Client/Entry/EntryPoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ public override void Init()
_prototypeManager.RegisterIgnore("nukeopsRole");
_prototypeManager.RegisterIgnore("stationGoal"); // Corvax-StationGoal
_prototypeManager.RegisterIgnore("ghostRoleRaffleDecider");
_prototypeManager.RegisterIgnore("ghostbarMap"); ///ADT-ghostber

_componentFactory.GenerateNetIds();
_adminManager.Initialize();
Expand Down
5 changes: 5 additions & 0 deletions Content.Client/Ghost/GhostSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ public void OpenGhostRoles()
_console.RemoteExecuteCommand(null, "ghostroles");
}

public void GhostBarSpawn() // Goobstation - Ghost Bar
{
RaiseNetworkEvent(new GhostBarSpawnEvent());
}

public void ToggleGhostVisibility(bool? visibility = null)
{
GhostVisibility = visibility ?? !GhostVisibility;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
namespace Content.Client.UserInterface.Systems.Ghost;

// TODO hud refactor BEFORE MERGE fix ghost gui being too far up
public sealed class GhostUIController : UIController, IOnSystemChanged<GhostSystem>
public sealed partial class GhostUIController : UIController, IOnSystemChanged<GhostSystem> // ADT - now this class is partial
{
[Dependency] private readonly IEntityNetworkManager _net = default!;

[UISystemDependency] private readonly GhostSystem? _system = default;

private GhostGui? Gui => UIManager.GetActiveUIWidgetOrNull<GhostGui>();


public override void Initialize()
{
base.Initialize();
Expand All @@ -29,11 +29,13 @@ public override void Initialize()
private void OnScreenLoad()
{
LoadGui();
LoadGhostbarGui(); // ADT ghostbar
}

private void OnScreenUnload()
{
UnloadGui();
UnloadGhostbarGui(); // ADT ghostbar
}

public void OnSystemLoaded(GhostSystem system)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
<Button Name="ReturnToBodyButton" Text="{Loc ghost-gui-return-to-body-button}" />
<Button Name="GhostWarpButton" Text="{Loc ghost-gui-ghost-warp-button}" />
<Button Name="GhostRolesButton" />
<Button Name="GhostBarButton" Text="{Loc 'ghost-target-window-ghostbar'}" /> <!-- Goobstation - Ghost Bar -->
</BoxContainer>
</widgets:GhostGui>
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,41 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Content.Client.ADT.UserInterface.Systems.Ghost.Controls;

namespace Content.Client.UserInterface.Systems.Ghost.Widgets;

[GenerateTypedNameReferences]
public sealed partial class GhostGui : UIWidget
{
public GhostTargetWindow TargetWindow { get; }
public GhostBarRulesWindow GhostBarWindow { get; }

public event Action? RequestWarpsPressed;
public event Action? ReturnToBodyPressed;
public event Action? GhostRolesPressed;
public event Action? GhostBarPressed; // Goobstation - Ghost Bar

public GhostGui()
{
RobustXamlLoader.Load(this);

TargetWindow = new GhostTargetWindow();

GhostBarWindow = new GhostBarRulesWindow();

MouseFilter = MouseFilterMode.Ignore;

GhostWarpButton.OnPressed += _ => RequestWarpsPressed?.Invoke();
ReturnToBodyButton.OnPressed += _ => ReturnToBodyPressed?.Invoke();
GhostRolesButton.OnPressed += _ => GhostRolesPressed?.Invoke();
GhostBarButton.OnPressed += _ => GhostBarPressed?.Invoke(); // Goobstation - Ghost Bar
}

public void Hide()
{
TargetWindow.Close();
GhostBarWindow.Close(); // Goobstation - Ghost Bar
Visible = false;
}

Expand Down Expand Up @@ -61,6 +68,7 @@ protected override void Dispose(bool disposing)
if (disposing)
{
TargetWindow.Dispose();
GhostBarWindow.Dispose(); // Goobstation - Ghost Bar
}
}
}
2 changes: 1 addition & 1 deletion Content.Server/ADT/Clothing/MadnessMaskSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
using Content.Shared.Stunnable;
using Robust.Shared.Random;

namespace Content.Server.Goobstation.Clothing;
namespace Content.Server.ADT.Clothing;

public sealed partial class MadnessMaskSystem : EntitySystem
{
Expand Down
10 changes: 10 additions & 0 deletions Content.Server/ADT/Ghostbar/Components/GhostBarPlayerComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Content.Server.ADT.Ghostbar.Components;

/// <summary>
/// Tracker for ghostbar players
/// </summary>
[RegisterComponent]
public sealed partial class GhostBarPlayerComponent : Component
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Content.Server.ADT.Ghostbar.Components;

/// <summary>
/// Target for ghosts to spawn at
/// </summary>
[RegisterComponent]
public sealed partial class GhostBarSpawnPointComponent : Component
{

}
62 changes: 62 additions & 0 deletions Content.Server/ADT/Ghostbar/GhostBarMapPrototype.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
using Robust.Shared.Prototypes;
using Content.Shared.Roles;
using Content.Shared.Roles.Jobs;
using Content.Shared.Weather;

namespace Content.Server.ADT.Ghostbar;

/// <summary>
/// прототип самих гост баров
/// <see cref="GhostBarSystem"/>
/// </summary>
[Prototype("ghostbarMap")]
public sealed partial class GhostBarMapPrototype : IPrototype
{
/// <inheritdoc/>
[IdDataField]
public string ID { get; private set; } = default!;

/// <summary>
/// путь до карты
/// </summary>
[DataField("path", required: true)]
public string Path = string.Empty;

/// <summary>
/// включает/выключает пацифизм
/// </summary>
[DataField("pacified")]
public bool Pacified = false;

/// <summary>
/// добавляет игрокам призрачную прозрачность, лучше не ставить меньше 0.8f
/// </summary>
[DataField("ghosted")]
public float Ghosted = 1f;

/// <summary>
/// список профессий, которые могут быть в гостбаре
/// </summary>
[DataField]
public List<JobComponent> Jobs = new()
{
new JobComponent { Prototype = "Passenger" },
new JobComponent { Prototype = "Bartender" },
new JobComponent { Prototype = "Botanist" },
new JobComponent { Prototype = "Chef" },
new JobComponent { Prototype = "Janitor" }
};

/// <summary>
/// погода на карте. если не заполнять строку - её не будет.
/// </summary>
[DataField("weather")]
public ProtoId<WeatherPrototype>? Weather = null;

/// <summary>
/// компоненты, добавляемые при заходе в гостбар человека(ТОЛЬКО КАСТОМНЫЕ, все компоненты туда лучше не добавлять)
/// </summary>
[DataField("componentsadd")]
public ComponentRegistry Componentsadd = new();
}

Loading

0 comments on commit 14afdf5

Please sign in to comment.