Skip to content

Commit

Permalink
Пак контента лаваленда (#931)
Browse files Browse the repository at this point in the history
## Описание PR
<!-- Что вы изменили в этом пулл реквесте? -->
Добавлена небольшая часть из того, что было в лаваленде в тринашке.

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

## Техническая информация
<!-- Если речь идет об изменении кода, кратко изложите на высоком уровне
принцип работы нового кода. Это облегчает рецензирование.- -->
Все системы достаточно просты, объяснять не вижу смысла.
В функцию TryModifyBloodLevel класса BloodstreamSystem добавлена
переменная типа bool, отвечающая за то, будет ли создаваться лужа из
реагента
В ChasmSystem добавлена проверка на новый ивент перед удалением упавшей
сущности.

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

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

![image](https://github.com/user-attachments/assets/bc4f7b22-b65d-4399-88ba-f56f6664ab4f)

![image](https://github.com/user-attachments/assets/9732d246-125a-49fa-b7c7-d5d832c303e2)

![image](https://github.com/user-attachments/assets/a822c7dd-d290-43df-8a74-55f387f7412a)

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

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

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

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

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

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

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

Помещение имени после символа 🆑 изменит имя, которое будет
отображаться в журнале изменений (в противном случае будет
использоваться ваше имя пользователя GitHub).
Например: 🆑 AruMoon
-->
<!--
Чтобы шаблон Чейнджлога отображался, уберите его из блока комментариев. 
Чейнджлог должен содержать cl символ, 
чтобы бот распознал изменения и добавил их в журнал изменений игры. 
Используйте ключевые слова add, remove, tweak и fix.
-->
🆑 Котя
- add: Добавлены шипы некрополя на лаваленд.
- add: Добавлен древний голиаф на лаваленд. Атакует щупальцами наугад,
имеет повышенный урон и 400 единиц здоровья.
- add: Добавлено проклятое сердце, вавилонская книга и кристалл
вампиризма. Найдите их в сундуках некрополя и проверьте, что они делают.
- add: Добавлен джаунтер в ШахтёрМаг. Он позволяет не умереть от падения
в бездну. Одноразовый.

---------

Co-authored-by: Unlumination <[email protected]>
  • Loading branch information
2 people authored and Schrodinger71 committed Jan 10, 2025
1 parent cc46940 commit e059edb
Show file tree
Hide file tree
Showing 66 changed files with 1,150 additions and 58 deletions.
1 change: 1 addition & 0 deletions Content.Client/ADT/MiningShop/MiningShopBui.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ protected override void Open()

var tooltip = new Tooltip();
tooltip.SetMessage(msg);
tooltip.MaxWidth = 250f;

uiEntry.TooltipLabel.ToolTip = entity.Description;
uiEntry.TooltipLabel.TooltipDelay = 0;
Expand Down
5 changes: 3 additions & 2 deletions Content.Client/ADT/MiningShop/MiningShopWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
xmlns:controls="clr-namespace:Content.Client.ADT.MiningShop"
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
MinSize="530 700"
MaxSize="530 4000">
SetSize="530 700"
Resizable="False">
<BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal">
<Label Text="Search" Align="Left" />
Expand All @@ -20,7 +21,7 @@
VerticalExpand="True"/>
</BoxContainer>
<BoxContainer Orientation="Horizontal">
<RichTextLabel Name="YourPurchases" Access="Public" /> </BoxContainer>
<RichTextLabel Name="YourPurchases" Access="Public" MaxWidth="1000" /> </BoxContainer>
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
<BoxContainer Orientation="Vertical" Name="Sections" Access="Public" />
</ScrollContainer>
Expand Down
24 changes: 17 additions & 7 deletions Content.Server/ADT/Language/LanguageSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,7 @@ private void OnLanguageSwitch(LanguageChosenMessage args)

component.CurrentLanguage = args.SelectedLanguage;

Dirty(uid, component);

if (!GetLanguages(uid, out var understood, out _, out var translatorUnderstood, out _, out var current))
return;

var state = new LanguageMenuStateMessage(args.Uid, current, understood, translatorUnderstood);
RaiseNetworkEvent(state, uid);
UpdateUi(uid);
}

public string ObfuscateMessage(EntityUid uid, string originalMessage, LanguagePrototype? proto = null)
Expand Down Expand Up @@ -165,4 +159,20 @@ private int PseudoRandomNumber(int seed, int min, int max)
var random = ((seed * 1103515245) + 12345) & 0x7fffffff; // Source: http://cs.uccs.edu/~cs591/bufferOverflow/glibc-2.2.4/stdlib/random_r.c
return random % (max - min) + min;
}

public override void UpdateUi(EntityUid uid, LanguageSpeakerComponent? comp = null)
{
base.UpdateUi(uid, comp);

if (!Resolve(uid, ref comp))
return;

Dirty(uid, comp);

if (!GetLanguages(uid, out var understood, out _, out var translatorUnderstood, out _, out var current))
return;

var state = new LanguageMenuStateMessage(GetNetEntity(uid), current, understood, translatorUnderstood);
RaiseNetworkEvent(state, uid);
}
}
25 changes: 5 additions & 20 deletions Content.Server/ADT/Language/TranslatorSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,8 @@ private void OnTranslatorActivateInWorld(EntityUid translator, HandheldTranslato
Dirty(translator, component);

ToggleTranslator(translator);
if (_language.GetLanguages(args.User, out var understood, out _, out var translatorUnderstood, out _, out var current))
{
var ev = new LanguageMenuStateMessage(GetNetEntity(args.User), current, understood, translatorUnderstood);
RaiseNetworkEvent(ev, args.User);
}

_language.UpdateUi(args.User);
}

private void OnTranslatorUseInHand(EntityUid translator, HandheldTranslatorComponent component, UseInHandEvent args)
Expand All @@ -51,11 +48,7 @@ private void OnTranslatorUseInHand(EntityUid translator, HandheldTranslatorCompo
ToggleTranslator(translator);
component.User = component.Enabled ? args.User : null;

if (_language.GetLanguages(args.User, out var understood, out _, out var translatorUnderstood, out _, out var current))
{
var ev = new LanguageMenuStateMessage(GetNetEntity(args.User), current, understood, translatorUnderstood);
RaiseNetworkEvent(ev, args.User);
}
_language.UpdateUi(args.User);
}

private void OnPickUp(EntityUid translator, HandheldTranslatorComponent component, GotEquippedHandEvent args)
Expand All @@ -64,11 +57,7 @@ private void OnPickUp(EntityUid translator, HandheldTranslatorComponent componen

component.User = args.User;

if (_language.GetLanguages(args.User, out var understood, out _, out var translatorUnderstood, out _, out var current))
{
var ev = new LanguageMenuStateMessage(GetNetEntity(args.User), current, understood, translatorUnderstood);
RaiseNetworkEvent(ev, args.User);
}
_language.UpdateUi(args.User);
}

private void OnDrop(EntityUid translator, HandheldTranslatorComponent component, GotUnequippedHandEvent args)
Expand All @@ -80,11 +69,7 @@ private void OnDrop(EntityUid translator, HandheldTranslatorComponent component,

component.User = null;

if (_language.GetLanguages(args.User, out var understood, out _, out var translatorUnderstood, out _, out var current))
{
var ev = new LanguageMenuStateMessage(GetNetEntity(args.User), current, understood, translatorUnderstood);
RaiseNetworkEvent(ev, args.User);
}
_language.UpdateUi(args.User);
}

private void ToggleTranslator(EntityUid uid, HandheldTranslatorComponent? component = null)
Expand Down
2 changes: 2 additions & 0 deletions Content.Server/ADT/MiningShop/MiningShopSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,7 @@ protected override void OnVendBuiExpress(Entity<MiningShopComponent> vendor, ref

_droppod.CreateDroppod(xform.Coordinates, ids);
vendor.Comp.OrderList.Clear();
Dirty(vendor.Owner, vendor.Comp);
_ui.ServerSendUiMessage(vendor.Owner, args.UiKey, new MiningShopRefreshBuiMsg(), args.Actor);
}
}
11 changes: 11 additions & 0 deletions Content.Server/ADT/Salvage/Components/CursedHeartGrantComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Content.Shared.ADT.Salvage.Systems;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;

namespace Content.Server.ADT.Salvage.Components;

[RegisterComponent]
public sealed partial class CursedHeartGrantComponent : Component
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Content.Shared.ADT.Salvage.Systems;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;

namespace Content.Server.ADT.Salvage.Components;

[RegisterComponent]
public sealed partial class GrantAllLanguagesOnUseComponent : Component
{

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Content.Shared.ADT.Salvage.Systems;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;

namespace Content.Server.ADT.Salvage.Components;

/// <summary>
/// Джаунтер
/// </summary>
[RegisterComponent]
public sealed partial class PreventChasmFallingComponent : Component
{
[DataField]
public bool DeleteOnUse = true;
}
35 changes: 35 additions & 0 deletions Content.Server/ADT/Salvage/Components/TendrilComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Content.Shared.ADT.Salvage.Systems;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;

namespace Content.Server.ADT.Salvage.Components;

/// <summary>
/// Предназначение понятно по названию
/// Чисто серверный компонент. Нам не нужен предикт спавна npc
/// </summary>
[RegisterComponent]
public sealed partial class TendrilComponent : Component
{
[DataField]
public int MaxSpawns = 3;

[DataField]
public float SpawnDelay = 10f;

[DataField]
public float ChasmDelay = 5f;

[DataField]
public int ChasmRadius = 2;

[DataField(required: true)]
public List<EntProtoId> Spawns;

[ViewVariables(VVAccess.ReadWrite)]
public List<EntityUid> Mobs = new();

[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan LastSpawn = TimeSpan.Zero;
}
15 changes: 15 additions & 0 deletions Content.Server/ADT/Salvage/Components/TendrilMobComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Content.Shared.ADT.Salvage.Systems;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;

namespace Content.Server.ADT.Salvage.Components;

/// <summary>
/// Моб, созданный тендрилом. При смерти удаляется из списка его спавнов
/// </summary>
[RegisterComponent]
public sealed partial class TendrilMobComponent : Component
{
public EntityUid? Tendril;
}
4 changes: 4 additions & 0 deletions Content.Server/ADT/Salvage/Events/TendrilMobDeadEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
namespace Content.Server.ADT.Salvage.Components;

[ByRefEvent]
public record struct TendrilMobDeadEvent(EntityUid Entity);
102 changes: 102 additions & 0 deletions Content.Server/ADT/Salvage/Systems/CursedHeartSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
using Content.Server.Actions;
using Content.Server.ADT.Salvage.Components;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Server.Interaction;
using Content.Server.Popups;
using Content.Shared.Access.Systems;
using Content.Shared.ADT.Salvage.Components;
using Content.Shared.Chasm;
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Interaction.Events;
using Content.Shared.Inventory;
using Content.Shared.Lathe;
using Content.Shared.Mobs.Systems;
using Content.Shared.Popups;
using Robust.Server.Audio;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Containers;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;

namespace Content.Server.ADT.Salvage.Systems;

public sealed class CursedHeartSystem : EntitySystem
{
[Dependency] private readonly ActionsSystem _actions = default!;
[Dependency] private readonly AudioSystem _audio = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly DamageableSystem _damage = default!;
[Dependency] private readonly BloodstreamSystem _bloodstream = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;

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

SubscribeLocalEvent<CursedHeartComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<CursedHeartComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<CursedHeartComponent, PumpHeartActionEvent>(OnPump);

SubscribeLocalEvent<CursedHeartGrantComponent, UseInHandEvent>(OnUseInHand);
}

public override void Update(float frameTime)
{
base.Update(frameTime);

var query = EntityQueryEnumerator<CursedHeartComponent>();
while (query.MoveNext(out var uid, out var comp))
{
if (_mobState.IsDead(uid))
continue;
if (_timing.CurTime >= comp.LastPump + TimeSpan.FromSeconds(comp.MaxDelay))
{
Damage(uid);
comp.LastPump = _timing.CurTime;
}
}
}

private void Damage(EntityUid uid)
{
_bloodstream.TryModifyBloodLevel(uid, -50, spill: false);
_popup.PopupEntity(Loc.GetString("popup-cursed-heart-damage"), uid, uid, PopupType.MediumCaution);
}

private void OnMapInit(EntityUid uid, CursedHeartComponent comp, MapInitEvent args)
{
_actions.AddAction(uid, ref comp.PumpActionEntity, "ActionPumpCursedHeart");
}

private void OnShutdown(EntityUid uid, CursedHeartComponent comp, ComponentShutdown args)
{
_actions.RemoveAction(uid, comp.PumpActionEntity);
}

private void OnPump(EntityUid uid, CursedHeartComponent comp, PumpHeartActionEvent args)
{
if (args.Handled)
return;
args.Handled = true;
_audio.PlayGlobal(new SoundPathSpecifier("/Audio/ADT/Heretic/heartbeat.ogg"), uid);
_damage.TryChangeDamage(uid, new DamageSpecifier(_proto.Index<DamageGroupPrototype>("Brute"), -8), true, false);
_bloodstream.TryModifyBloodLevel(uid, 17);
comp.LastPump = _timing.CurTime;
}

private void OnUseInHand(EntityUid uid, CursedHeartGrantComponent comp, UseInHandEvent args)
{
_audio.PlayGlobal(new SoundPathSpecifier("/Audio/ADT/Heretic/heartbeat.ogg"), args.User);
var heart = EnsureComp<CursedHeartComponent>(args.User);
heart.LastPump = _timing.CurTime;
QueueDel(uid);
}
}
56 changes: 56 additions & 0 deletions Content.Server/ADT/Salvage/Systems/GrantAllLanguagesOnUseSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using Content.Server.Actions;
using Content.Server.ADT.Language;
using Content.Server.ADT.Salvage.Components;
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Server.Interaction;
using Content.Server.Popups;
using Content.Shared.Access.Systems;
using Content.Shared.ADT.Language;
using Content.Shared.ADT.Salvage.Components;
using Content.Shared.Chasm;
using Content.Shared.Damage;
using Content.Shared.Damage.Prototypes;
using Content.Shared.Interaction.Events;
using Content.Shared.Inventory;
using Content.Shared.Lathe;
using Content.Shared.Mobs.Systems;
using Content.Shared.Popups;
using Robust.Server.Audio;
using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Containers;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Timing;

namespace Content.Server.ADT.Salvage.Systems;

public sealed class GrantAllLanguagesOnUseSystem : EntitySystem
{
[Dependency] private readonly LanguageSystem _language = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;

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

SubscribeLocalEvent<GrantAllLanguagesOnUseComponent, UseInHandEvent>(OnUseInHand);
}

private void OnUseInHand(EntityUid uid, GrantAllLanguagesOnUseComponent comp, UseInHandEvent args)
{
var prototypes = _proto.EnumeratePrototypes<LanguagePrototype>();

foreach (var item in prototypes)
{
_language.AddSpokenLanguage(args.User, item.ID);
}

_popup.PopupEntity(Loc.GetString("popup-vavilon-book-used"), args.User, args.User);
QueueDel(uid);
}
}
Loading

0 comments on commit e059edb

Please sign in to comment.