- add: interface for interaction

This commit is contained in:
2024-02-20 14:28:01 +03:00
parent c3135f160e
commit 28c8b45eec
32 changed files with 319 additions and 14 deletions

View File

@@ -1,4 +1,5 @@
using Content.Client._Amour.Hole;
using Content.Shared._Amour.HumanoidAppearanceExtension;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Humanoid.Prototypes;
@@ -117,6 +118,11 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
return;
}
// AMOUR START
var ev = new HumanoidAppearanceLoadingEvent(new Entity<HumanoidAppearanceComponent>(uid, humanoid), profile);
RaiseLocalEvent(uid, ev);
// AMOUR END
var customBaseLayers = new Dictionary<HumanoidVisualLayers, CustomBaseLayerInfo>();
var speciesPrototype = _prototypeManager.Index<SpeciesPrototype>(profile.Species);
@@ -197,12 +203,10 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
humanoid.SkinColor = profile.Appearance.SkinColor;
humanoid.EyeColor = profile.Appearance.EyeColor;
//AMOUR
foreach (var genitals in profile.Appearance.Genitals)
{
Log.Debug("CHLEN! " + genitals.GenitalId);
_holeSystem.AddHole(uid,genitals.GenitalId,genitals.Color);
}
// AMOUR START
var ev2 = new HumanoidAppearanceLoadedEvent(new Entity<HumanoidAppearanceComponent>(uid, humanoid), profile);
RaiseLocalEvent(uid, ev2);
// AMOUR END
UpdateSprite(humanoid, Comp<SpriteComponent>(uid));
}

View File

@@ -0,0 +1,27 @@
using Content.Client.Eui;
using Content.Shared.Eui;
namespace Content.Client._Amour.InteractionPanel;
public sealed class InteractionPanelEui : BaseEui
{
private InteractionPanelWindow _interactionPanelWindow;
public InteractionPanelEui()
{
_interactionPanelWindow = new InteractionPanelWindow();
_interactionPanelWindow.OnClose += () => SendMessage(new CloseEuiMessage());
}
public override void Closed()
{
base.Closed();
_interactionPanelWindow.Close();
}
public override void Opened()
{
base.Opened();
_interactionPanelWindow.OpenCentered();
}
}

View File

@@ -0,0 +1,51 @@
<controls:InteractionPanelWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client._Amour.InteractionPanel"
xmlns:controls1="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'interaction-panel-title'}"
MinSize="300 500">
<BoxContainer Orientation="Vertical" Margin="5 5 5 5">
<BoxContainer Orientation="Vertical" Margin="5 20 5 20" HorizontalAlignment="Stretch" HorizontalExpand="True">
<TextureRect TexturePath="/Textures/Interface/Misc/beakerlarge.png" Margin="5 10 5 15" HorizontalAlignment="Center"/>
<BoxContainer HorizontalAlignment="Center" HorizontalExpand="True">
<BoxContainer Orientation="Vertical" HorizontalAlignment="Left" Margin="5 5 5 5">
<PanelContainer/>
<Label Text="- У меня есть ручки"/>
<Label Text="- У меня есть ножки"/>
</BoxContainer>
<controls1:HighDivider HorizontalAlignment="Center" Margin="5 5 5 5"/>
<BoxContainer Orientation="Vertical" HorizontalAlignment="Right" Margin="5 5 5 5">
<PanelContainer/>
<Label Text="- У него есть дырка"/>
<Label Text="- Он няшный"/>
</BoxContainer>
</BoxContainer>
<ProgressBar Name="CummingProgress"
HorizontalExpand="True"
MinValue="0"
MaxValue="1"
MinHeight = "25"
Page="0"
Margin="10 10 0 0"
Value="0.5"
Modulate="#795695">
<Label Text="Смешной прогресс"/>
</ProgressBar>
</BoxContainer>
<PanelContainer StyleClasses="LowDivider" />
<BoxContainer Orientation="Vertical" Margin="5 20 5 20">
<Button Modulate="#ffaaaa">
<BoxContainer HorizontalAlignment="Left">
<TextureRect TexturePath="/Textures/Interface/NavMap/beveled_circle.png" Margin="5 5 5 5"/>
<Label Text="Трахать" Margin="10 0 15 0"/>
</BoxContainer>
<controls1:HighDivider HorizontalAlignment="Center"/>
<Label Text=">" Margin="5 0 5 0" HorizontalAlignment="Right"/>
</Button>
</BoxContainer>
</BoxContainer>
</controls:InteractionPanelWindow>

View File

@@ -0,0 +1,16 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._Amour.InteractionPanel;
[GenerateTypedNameReferences]
public sealed partial class InteractionPanelWindow : DefaultWindow
{
public InteractionPanelWindow()
{
RobustXamlLoader.Load(this);
}
}

View File

@@ -1,5 +1,6 @@
using System.Linq;
using Content.Server._Amour.Hole;
using Content.Shared._Amour.HumanoidAppearanceExtension;
using Content.Shared.Examine;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
@@ -49,17 +50,17 @@ public sealed partial class HumanoidAppearanceSystem : SharedHumanoidAppearanceS
return;
}
// AMOUR START
var ev = new HumanoidAppearanceLoadingEvent(new Entity<HumanoidAppearanceComponent>(uid, humanoid), profile);
RaiseLocalEvent(uid, ev);
// AMOUR END
SetSpecies(uid, profile.Species, false, humanoid);
SetSex(uid, profile.Sex, false, humanoid);
humanoid.EyeColor = profile.Appearance.EyeColor;
SetSkinColor(uid, profile.Appearance.SkinColor, false);
//AMOUR
foreach (var genitals in profile.Appearance.Genitals)
{
_holeSystem.AddHole(uid,genitals.GenitalId,genitals.Color);
}
humanoid.MarkingSet.Clear();
@@ -124,6 +125,11 @@ public sealed partial class HumanoidAppearanceSystem : SharedHumanoidAppearanceS
humanoid.Age = profile.Age;
// AMOUR START
var ev2 = new HumanoidAppearanceLoadedEvent(new Entity<HumanoidAppearanceComponent>(uid, humanoid), profile);
RaiseLocalEvent(uid, ev2);
// AMOUR END
Dirty(humanoid);
}

View File

@@ -1,5 +1,7 @@
using Content.Server.Chemistry.Containers.EntitySystems;
using Content.Shared._Amour.Arousal;
using Content.Shared._Amour.Hole;
using Content.Shared.Chemistry.Components;
namespace Content.Server._Amour.Hole;
@@ -11,6 +13,7 @@ public sealed partial class HoleSystem
{
SubscribeLocalEvent<HoleSolutionComponent,ComponentInit>(OnSolutionInit);
SubscribeLocalEvent<HoleSolutionComponent,EntityUnpausedEvent>(OnUnpaused);
SubscribeLocalEvent<HoleSolutionComponent,ArousalSplash>(OnSplash);
}
private void OnSolutionInit(EntityUid uid, HoleSolutionComponent component, ComponentInit args)
@@ -25,6 +28,40 @@ public sealed partial class HoleSystem
component.NextGenerationTime += args.PausedTime;
}
public void SplitSolution(Entity<HoleSolutionComponent?> entity, Entity<SolutionComponent?>? to = null)
{
if(!Resolve(entity,ref entity.Comp))
return;
if (!to.HasValue)
{
entity.Comp.Solution.SplitSolution(entity.Comp.Solution.Volume);
}
else
{
var entityUid = to.Value;
if(Resolve(entityUid, ref entityUid.Comp))
{
_solutionContainer.AddSolution(
new Entity<SolutionComponent>(entityUid.Owner,entityUid.Comp)
, entity.Comp.Solution);
}
}
}
private void OnSplash(EntityUid uid, HoleSolutionComponent component, ref ArousalSplash args)
{
if(!TryComp<HoleContainerComponent>(uid,out var holeContainer))
return;
var holeUid = GetEntity(holeContainer.MainHole);
if(!TryComp<HoleComponent>(holeUid,out var holeComponent))
return;
SplitSolution(holeUid.Value);
}
private void UpdateSolution(float frameTime)
{
return;

View File

@@ -0,0 +1,11 @@
using Content.Server.EUI;
namespace Content.Server._Amour.InteractionPanel;
public sealed class InteractionPanelEui : BaseEui
{
public InteractionPanelEui()
{
IoCManager.InjectDependencies(this);
}
}

View File

@@ -0,0 +1,27 @@
using Content.Server.EUI;
using Content.Shared._Amour.Hole;
using Content.Shared.Verbs;
using Robust.Server.Player;
namespace Content.Server._Amour.InteractionPanel;
public sealed class InteractionPanelSystem : EntitySystem
{
[Dependency] private readonly EuiManager _eui = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
public override void Initialize()
{
SubscribeLocalEvent<HoleContainerComponent,GetVerbsEvent<Verb>>(OnVerb);
}
private void OnVerb(EntityUid uid, HoleContainerComponent component, GetVerbsEvent<Verb> args)
{
if(!_playerManager.TryGetSessionByEntity(uid, out var session))
return;
args.Verbs.Add(new Verb()
{
Text = "MEOW",
Act = () => _eui.OpenEui(new InteractionPanelEui(), session)
});
}
}

View File

@@ -11,6 +11,7 @@ public enum AlertCategory
Buckled,
Health,
Mood, //WD-edit
Arousal, //AMOUR-edit
Internals,
Stamina,
Piloting,

View File

@@ -38,6 +38,7 @@ namespace Content.Shared.Alert
VeryGood,
VeryVeryGood,
MoodDead,
Arousal, //AMOUR
//WD end
CultBuffed,
PilotingShuttle,

View File

@@ -0,0 +1,9 @@
namespace Content.Shared._Amour.Arousal;
[RegisterComponent]
public sealed partial class ArousalComponent : Component
{
[ViewVariables] public short Arousal;
[DataField] public short ArousalExide;
}

View File

@@ -0,0 +1,5 @@
namespace Content.Shared._Amour.Arousal;
public record struct ArousalUpdated(Entity<ArousalComponent> Entity);
public record struct ArousalSplash(Entity<ArousalComponent> Entity);

View File

@@ -0,0 +1,51 @@
using Content.Shared.Alert;
namespace Content.Shared._Amour.Arousal;
public sealed class ArousalSystem : EntitySystem
{
[Dependency] private readonly AlertsSystem _alerts = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ArousalComponent,ComponentInit>(OnComponentInit);
}
private void OnComponentInit(EntityUid uid, ArousalComponent component, ComponentInit args)
{
UpdateAlarm(new Entity<ArousalComponent?>(uid,component));
}
private void UpdateAlarm(Entity<ArousalComponent?> entity)
{
if(!Resolve(entity,ref entity.Comp))
return;
if (entity.Comp.Arousal is > 100 or < 0)
{
entity.Comp.Arousal = 0;
RaiseLocalEvent(entity,new ArousalSplash(new Entity<ArousalComponent>(entity,entity.Comp)));
}
RaiseLocalEvent(entity,new ArousalUpdated(new Entity<ArousalComponent>(entity,entity.Comp)));
_alerts.ShowAlert(entity,AlertType.Arousal,(short)(entity.Comp.Arousal/10));
}
public void SetArousal(Entity<ArousalComponent?> entity, short count)
{
if(!Resolve(entity,ref entity.Comp))
return;
entity.Comp.Arousal = count;
UpdateAlarm(entity);
}
public void AddArousal(Entity<ArousalComponent?> entity, short count)
{
if(!Resolve(entity,ref entity.Comp))
return;
SetArousal(entity,(short) (entity.Comp.Arousal + count));
}
}

View File

@@ -1,4 +1,6 @@
using Robust.Shared.Containers;
using Content.Shared._Amour.Arousal;
using Content.Shared._Amour.HumanoidAppearanceExtension;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
namespace Content.Shared._Amour.Hole;
@@ -10,6 +12,15 @@ public abstract partial class SharedHoleSystem
public void InitializeContainer()
{
SubscribeLocalEvent<HoleContainerComponent,ComponentInit>(OnContainerInit);
SubscribeLocalEvent<HoleContainerComponent,HumanoidAppearanceLoadedEvent>(OnAppearanceLoaded);
}
private void OnAppearanceLoaded(EntityUid uid, HoleContainerComponent component, HumanoidAppearanceLoadedEvent args)
{
foreach (var genitals in args.Profile.Appearance.Genitals)
{
AddHole(new Entity<HoleContainerComponent?>(uid,component),genitals.GenitalId,genitals.Color);
}
}
private void OnContainerInit(EntityUid uid, HoleContainerComponent component, ComponentInit args)

View File

@@ -1,4 +1,5 @@
using Robust.Shared.Containers;
using Content.Shared._Amour.Arousal;
using Robust.Shared.Containers;
using Robust.Shared.GameStates;
namespace Content.Shared._Amour.Hole;
@@ -24,7 +25,9 @@ public abstract partial class SharedHoleSystem : EntitySystem
public virtual void Exide(Entity<HoleComponent?> entity, bool value = true)
{
if(!Resolve(entity.Owner,ref entity.Comp)) return;
if(!Resolve(entity.Owner,ref entity.Comp))
return;
entity.Comp.IsExcited = value;
Dirty(entity);
}

View File

@@ -0,0 +1,13 @@
using Content.Shared.Humanoid;
using Content.Shared.Preferences;
using Robust.Shared.Serialization;
namespace Content.Shared._Amour.HumanoidAppearanceExtension;
public record struct HumanoidAppearanceLoadingEvent(
Entity<HumanoidAppearanceComponent> Entity,
HumanoidCharacterProfile Profile);
public record struct HumanoidAppearanceLoadedEvent(
Entity<HumanoidAppearanceComponent> Entity,
HumanoidCharacterProfile Profile);

View File

@@ -7,6 +7,7 @@
- category: Health
- alertType: Bleeding
- category: Mood # WD edit
- category: Arousal # Amour edit
- category: Stamina
- alertType: SuitPower
- category: Internals

View File

@@ -264,6 +264,7 @@
- type: Penetrated
- type: Mood
- type: HoleContainer
- type: Arousal
- type: entity
save: false

View File

@@ -0,0 +1,30 @@
- type: alert
id: Arousal
category: Arousal
icons:
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal0
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal10
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal20
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal30
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal40
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal50
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal60
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal70
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal80
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal90
- sprite: /Textures/_Amour/Alerts/arousal.rsi
state: arousal100
name: alerts-arousal-name
description: alerts-arousal-desc
minSeverity: 0
maxSeverity: 10

View File

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 383 B

View File

Before

Width:  |  Height:  |  Size: 417 B

After

Width:  |  Height:  |  Size: 417 B

View File

Before

Width:  |  Height:  |  Size: 417 B

After

Width:  |  Height:  |  Size: 417 B

View File

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 383 B

View File

Before

Width:  |  Height:  |  Size: 417 B

After

Width:  |  Height:  |  Size: 417 B

View File

Before

Width:  |  Height:  |  Size: 417 B

After

Width:  |  Height:  |  Size: 417 B

View File

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 422 B

View File

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 422 B

View File

Before

Width:  |  Height:  |  Size: 422 B

After

Width:  |  Height:  |  Size: 422 B

View File

Before

Width:  |  Height:  |  Size: 445 B

After

Width:  |  Height:  |  Size: 445 B

View File

Before

Width:  |  Height:  |  Size: 445 B

After

Width:  |  Height:  |  Size: 445 B

View File

Before

Width:  |  Height:  |  Size: 383 B

After

Width:  |  Height:  |  Size: 383 B