- fix: some message for interactions
This commit is contained in:
@@ -7,15 +7,15 @@
|
|||||||
<BoxContainer Orientation="Vertical" Margin="5 5 5 5">
|
<BoxContainer Orientation="Vertical" Margin="5 5 5 5">
|
||||||
<BoxContainer Orientation="Vertical" Margin="5 20 5 20" HorizontalAlignment="Stretch" HorizontalExpand="True">
|
<BoxContainer Orientation="Vertical" Margin="5 20 5 20" HorizontalAlignment="Stretch" HorizontalExpand="True">
|
||||||
<BoxContainer HorizontalAlignment="Center" HorizontalExpand="True">
|
<BoxContainer HorizontalAlignment="Center" HorizontalExpand="True">
|
||||||
<BoxContainer Orientation="Vertical" Margin="5 5 5 5">
|
<BoxContainer Margin="5 5 5 5">
|
||||||
<SpriteView Name="PerformerView" Margin="5 10 5 15" HorizontalAlignment="Center"/>
|
|
||||||
<RichTextLabel Name="PerformerDesc"/>
|
<RichTextLabel Name="PerformerDesc"/>
|
||||||
|
<SpriteView Scale="2 2" Name="PerformerView" Margin="5 10 5 15" HorizontalAlignment="Center"/>
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
|
|
||||||
<controls1:HighDivider Margin="5 5 5 5"/>
|
<controls1:HighDivider Margin="5 5 5 5"/>
|
||||||
|
|
||||||
<BoxContainer Orientation="Vertical" Margin="5 5 5 5">
|
<BoxContainer Margin="5 5 5 5">
|
||||||
<SpriteView Name="TargetView" Margin="5 10 5 15" HorizontalAlignment="Center"/>
|
<SpriteView Scale="2 2" Name="TargetView" Margin="5 10 5 15" HorizontalAlignment="Center"/>
|
||||||
<RichTextLabel Name="TargerDesc"/>
|
<RichTextLabel Name="TargerDesc"/>
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<CheckBox Margin="5 0 5 0" Name="DisCheckbox"/>
|
<CheckBox Margin="5 0 5 0" Name="DisCheckbox"/>
|
||||||
<Label Margin="5 0 5 0" Text="{Loc 'interaction-hide-unvisible'}"/>
|
<Label Margin="5 0 5 0" Text="{Loc 'interaction-hide-unvisible'}"/>
|
||||||
</BoxContainer>
|
</BoxContainer>
|
||||||
<Button Margin="5 5 5 5" Text="Update"/>
|
<Button Margin="5 5 5 5" Text="{Loc 'interaction-update'}" Name="UpdateButton"/>
|
||||||
|
|
||||||
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
|
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
|
||||||
<BoxContainer Orientation="Vertical" Margin="5 20 5 20" Name="Interactions">
|
<BoxContainer Orientation="Vertical" Margin="5 20 5 20" Name="Interactions">
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using Robust.Client.UserInterface.Controls;
|
|||||||
using Robust.Client.UserInterface.CustomControls;
|
using Robust.Client.UserInterface.CustomControls;
|
||||||
using Robust.Client.UserInterface.XAML;
|
using Robust.Client.UserInterface.XAML;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
namespace Content.Client._Amour.InteractionPanel.UI;
|
namespace Content.Client._Amour.InteractionPanel.UI;
|
||||||
|
|
||||||
@@ -24,6 +25,7 @@ public sealed partial class InteractionPanelWindow : DefaultWindow
|
|||||||
IoCManager.InjectDependencies(this);
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
DisCheckbox.OnPressed += _ => OnUpdateRequired?.Invoke();
|
DisCheckbox.OnPressed += _ => OnUpdateRequired?.Invoke();
|
||||||
|
UpdateButton.OnPressed += _ => OnUpdateRequired?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddButton(InteractionEntry entry)
|
public void AddButton(InteractionEntry entry)
|
||||||
@@ -60,6 +62,31 @@ public sealed partial class InteractionPanelWindow : DefaultWindow
|
|||||||
Groups.Add(prototype.ID,Interactions.ChildCount - 1);
|
Groups.Add(prototype.ID,Interactions.ChildCount - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var messageUser = new FormattedMessage();
|
||||||
|
if (state.DescUser.Count == 0)
|
||||||
|
{
|
||||||
|
messageUser.AddMarkup($"- {Loc.GetString("interaction-empty")}\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var desc in state.DescUser)
|
||||||
|
{
|
||||||
|
messageUser.AddMarkup($"- {Loc.GetString(desc)}\n");
|
||||||
|
}
|
||||||
|
PerformerDesc.SetMessage(messageUser);
|
||||||
|
|
||||||
|
var messageTarget = new FormattedMessage();
|
||||||
|
if (state.DescTarget.Count == 0)
|
||||||
|
{
|
||||||
|
messageTarget.AddMarkup($"- {Loc.GetString("interaction-empty")}\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var desc in state.DescTarget)
|
||||||
|
{
|
||||||
|
messageTarget.AddMarkup($"- {Loc.GetString(desc)}\n");
|
||||||
|
}
|
||||||
|
TargerDesc.SetMessage(messageTarget);
|
||||||
|
|
||||||
|
|
||||||
TargetView.SetEntity(state.Target);
|
TargetView.SetEntity(state.Target);
|
||||||
PerformerView.SetEntity(state.Performer);
|
PerformerView.SetEntity(state.Performer);
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,23 @@
|
|||||||
using Content.Shared._Amour.Hole;
|
using Content.Server.Body.Systems;
|
||||||
|
using Content.Server.Chat.Systems;
|
||||||
|
using Content.Server.HealthExaminable;
|
||||||
|
using Content.Server.Mind;
|
||||||
|
using Content.Shared._Amour.Hole;
|
||||||
|
using Content.Shared.Damage;
|
||||||
|
using Content.Shared.Item;
|
||||||
using Robust.Server.Containers;
|
using Robust.Server.Containers;
|
||||||
using Robust.Shared.Containers;
|
using Robust.Shared.Containers;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
namespace Content.Server._Amour.Hole;
|
namespace Content.Server._Amour.Hole;
|
||||||
|
|
||||||
public sealed partial class HoleSystem
|
public sealed partial class HoleSystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly ContainerSystem _container = default!;
|
[Dependency] private readonly ContainerSystem _container = default!;
|
||||||
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
|
[Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!;
|
||||||
|
[Dependency] private readonly ChatSystem _chatSystem = default!;
|
||||||
|
[Dependency] private readonly BodySystem _bodySystem = default!;
|
||||||
|
|
||||||
private void InitializeInventory()
|
private void InitializeInventory()
|
||||||
{
|
{
|
||||||
@@ -17,4 +28,37 @@ public sealed partial class HoleSystem
|
|||||||
{
|
{
|
||||||
component.Slot = _container.EnsureContainer<ContainerSlot>(uid,HoleInventoryComponent.SlotName);
|
component.Slot = _container.EnsureContainer<ContainerSlot>(uid,HoleInventoryComponent.SlotName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void PutItem(Entity<ItemComponent?> item, Entity<HoleInventoryComponent?> entity)
|
||||||
|
{
|
||||||
|
if(!Resolve(entity,ref entity.Comp) || !Resolve(item,ref item.Comp))
|
||||||
|
return;
|
||||||
|
if(!_prototypeManager.TryIndex(item.Comp.Size, out var itemSizePrototype)
|
||||||
|
|| !_prototypeManager.TryIndex(entity.Comp.Size, out var holeSize)
|
||||||
|
|| !_prototypeManager.TryIndex(entity.Comp.MaxSize, out var maxHoleSize))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (itemSizePrototype.Weight >= maxHoleSize.Weight)
|
||||||
|
{
|
||||||
|
_bloodstreamSystem.TryModifyBleedAmount(entity, (itemSizePrototype.Weight - maxHoleSize.Weight)*8);
|
||||||
|
_chatSystem.TrySendInGameICMessage(item.Owner," с грохотом падает на пол", InGameICChatType.Emote, ChatTransmitRange.HideChat);
|
||||||
|
//_bodySystem.GibBody(entity);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (itemSizePrototype.Weight >= holeSize.Weight)
|
||||||
|
{
|
||||||
|
_bloodstreamSystem.TryModifyBleedAmount(entity, (itemSizePrototype.Weight - holeSize.Weight)*4);
|
||||||
|
}
|
||||||
|
|
||||||
|
_container.Insert(item.Owner, entity.Comp.Slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<EntityUid> TakeItem(Entity<HoleInventoryComponent?> entity)
|
||||||
|
{
|
||||||
|
if(!Resolve(entity,ref entity.Comp))
|
||||||
|
return new List<EntityUid>();
|
||||||
|
|
||||||
|
return _container.EmptyContainer(entity.Comp.Slot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ using Content.Server.EUI;
|
|||||||
using Content.Server.Interaction;
|
using Content.Server.Interaction;
|
||||||
using Content.Shared._Amour.Arousal;
|
using Content.Shared._Amour.Arousal;
|
||||||
using Content.Shared._Amour.InteractionPanel;
|
using Content.Shared._Amour.InteractionPanel;
|
||||||
|
using Content.Shared._Amour.InteractionPanel.Checks;
|
||||||
using Content.Shared.Eui;
|
using Content.Shared.Eui;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Reflection;
|
||||||
|
|
||||||
namespace Content.Server._Amour.InteractionPanel;
|
namespace Content.Server._Amour.InteractionPanel;
|
||||||
|
|
||||||
@@ -12,14 +14,38 @@ public sealed class InteractionPanelEui : BaseEui
|
|||||||
{
|
{
|
||||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
|
[Dependency] private readonly IReflectionManager _reflectionManager = default!;
|
||||||
|
private readonly InteractionPanelSystem _interactionPanelSystem;
|
||||||
|
|
||||||
public readonly Entity<InteractionPanelComponent> User;
|
public readonly Entity<InteractionPanelComponent> User;
|
||||||
public readonly Entity<InteractionPanelComponent> Target;
|
public readonly Entity<InteractionPanelComponent> Target;
|
||||||
|
|
||||||
|
public readonly List<IInteractionCheck> UserInfo = new()
|
||||||
|
{
|
||||||
|
new UserHasBreast(),
|
||||||
|
new UserHasButt(),
|
||||||
|
new UserHasPenis(),
|
||||||
|
new UserHasTesticles(),
|
||||||
|
new UserHasVagina(),
|
||||||
|
new IsUserCrawl()
|
||||||
|
};
|
||||||
|
|
||||||
|
public readonly List<IInteractionCheck> TargetInfo = new()
|
||||||
|
{
|
||||||
|
new HasSmallDistance(),
|
||||||
|
new TargetHasBreast(),
|
||||||
|
new TargetHasButt(),
|
||||||
|
new TargetHasPenis(),
|
||||||
|
new TargetHasTesticles(),
|
||||||
|
new TargetHasVagina(),
|
||||||
|
new IsTargetCrawl()
|
||||||
|
};
|
||||||
|
|
||||||
public InteractionPanelEui(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target)
|
public InteractionPanelEui(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target)
|
||||||
{
|
{
|
||||||
IoCManager.InjectDependencies(this);
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
_interactionPanelSystem = _entityManager.System<InteractionPanelSystem>();
|
||||||
User = user;
|
User = user;
|
||||||
Target = target;
|
Target = target;
|
||||||
}
|
}
|
||||||
@@ -42,13 +68,32 @@ public sealed class InteractionPanelEui : BaseEui
|
|||||||
if(!_prototypeManager.TryIndex(protoId,out var prototype))
|
if(!_prototypeManager.TryIndex(protoId,out var prototype))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
var isAvailable = prototype.Checks.All(check => check.IsAvailable(User, Target, _entityManager));
|
var isAvailable = _interactionPanelSystem.Check(User, Target, prototype, out _);
|
||||||
|
|
||||||
availableActions.Add(new InteractionEntry(protoId,isAvailable));
|
availableActions.Add(new InteractionEntry(protoId,isAvailable));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var descUser = new HashSet<string>();
|
||||||
|
foreach (var check in UserInfo)
|
||||||
|
{
|
||||||
|
if (TryCheck(check, out var desc))
|
||||||
|
descUser.Add(desc);
|
||||||
|
}
|
||||||
|
|
||||||
return new InteractionState(_entityManager.GetNetEntity(User), _entityManager.GetNetEntity(Target),availableActions,arousal);
|
var descTarget = new HashSet<string>();
|
||||||
|
foreach (var check in TargetInfo)
|
||||||
|
{
|
||||||
|
if (TryCheck(check, out var desc))
|
||||||
|
descTarget.Add(desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new InteractionState(_entityManager.GetNetEntity(User), _entityManager.GetNetEntity(Target),availableActions,arousal, descUser, descTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TryCheck(IInteractionCheck check, out string output)
|
||||||
|
{
|
||||||
|
output = $"interaction-success-{check.GetType().Name.ToLower()}";
|
||||||
|
return check.IsAvailable(User, Target, _entityManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void HandleMessage(EuiMessageBase msg)
|
public override void HandleMessage(EuiMessageBase msg)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Linq;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Linq;
|
||||||
using Content.Server.Access.Systems;
|
using Content.Server.Access.Systems;
|
||||||
using Content.Server.Chat.Managers;
|
using Content.Server.Chat.Managers;
|
||||||
using Content.Server.Chat.Systems;
|
using Content.Server.Chat.Systems;
|
||||||
@@ -6,13 +7,18 @@ using Content.Server.DoAfter;
|
|||||||
using Content.Server.EUI;
|
using Content.Server.EUI;
|
||||||
using Content.Shared._Amour.Hole;
|
using Content.Shared._Amour.Hole;
|
||||||
using Content.Shared._Amour.InteractionPanel;
|
using Content.Shared._Amour.InteractionPanel;
|
||||||
|
using Content.Shared._Amour.InteractionPanel.Checks;
|
||||||
|
using Content.Shared._White.GhostRecruitment;
|
||||||
|
using Content.Shared.ActionBlocker;
|
||||||
using Content.Shared.Carrying;
|
using Content.Shared.Carrying;
|
||||||
using Content.Shared.Chat;
|
using Content.Shared.Chat;
|
||||||
using Content.Shared.DoAfter;
|
using Content.Shared.DoAfter;
|
||||||
using Content.Shared.Emoting;
|
using Content.Shared.Emoting;
|
||||||
using Content.Shared.Fluids;
|
using Content.Shared.Fluids;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
|
using Content.Shared.Interaction.Events;
|
||||||
using Content.Shared.Mind;
|
using Content.Shared.Mind;
|
||||||
|
using Content.Shared.Movement.Events;
|
||||||
using Content.Shared.Random.Helpers;
|
using Content.Shared.Random.Helpers;
|
||||||
using Content.Shared.Verbs;
|
using Content.Shared.Verbs;
|
||||||
using Robust.Server.Audio;
|
using Robust.Server.Audio;
|
||||||
@@ -37,12 +43,23 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
[Dependency] private readonly IRobustRandom _robustRandom = default!;
|
||||||
[Dependency] private readonly IChatManager _chatManager = default!;
|
[Dependency] private readonly IChatManager _chatManager = default!;
|
||||||
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
|
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
|
||||||
|
[Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
SubscribeLocalEvent<InteractionPanelComponent,GetVerbsEvent<Verb>>(OnVerb);
|
SubscribeLocalEvent<InteractionPanelComponent,GetVerbsEvent<Verb>>(OnVerb);
|
||||||
SubscribeLocalEvent<InteractionPanelComponent,ComponentInit>(OnInit);
|
SubscribeLocalEvent<InteractionPanelComponent,ComponentInit>(OnInit);
|
||||||
SubscribeLocalEvent<InteractionPanelComponent,PanelDoAfterEvent>(OnPanel);
|
SubscribeLocalEvent<InteractionPanelComponent,PanelDoAfterEvent>(OnPanel);
|
||||||
|
SubscribeLocalEvent<InteractionPanelComponent,ChangeDirectionAttemptEvent>(OnCancelable);
|
||||||
|
SubscribeLocalEvent<InteractionPanelComponent,UpdateCanMoveEvent>(OnCancelable);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnCancelable(EntityUid uid, InteractionPanelComponent component, CancellableEntityEventArgs args)
|
||||||
|
{
|
||||||
|
if (component.IsActive || component.IsBlocked)
|
||||||
|
{
|
||||||
|
args.Cancel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPanel(EntityUid uid, InteractionPanelComponent component, PanelDoAfterEvent args)
|
private void OnPanel(EntityUid uid, InteractionPanelComponent component, PanelDoAfterEvent args)
|
||||||
@@ -71,7 +88,7 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
{
|
{
|
||||||
args.Verbs.Add(new Verb()
|
args.Verbs.Add(new Verb()
|
||||||
{
|
{
|
||||||
Text = "Open funny panel",
|
Text = Loc.GetString("interaction-open"),
|
||||||
Act = () => OpenPanel(args.User,args.User,uid)
|
Act = () => OpenPanel(args.User,args.User,uid)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -102,9 +119,9 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
|| !_prototypeManager.TryIndex(protoId, out var prototype))
|
|| !_prototypeManager.TryIndex(protoId, out var prototype))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
foreach (var check in prototype.Checks.Where(check => !check.IsAvailable(user!, target!, EntityManager)))
|
if(!Check(user!,target!,prototype, out var check))
|
||||||
{
|
{
|
||||||
if(!_playerManager.TryGetSessionByEntity(user,out var session))
|
if(_playerManager.TryGetSessionByEntity(user,out var session) || session is null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}");
|
var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}");
|
||||||
@@ -145,20 +162,18 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
private void Interact(Entity<InteractionPanelComponent> user,
|
private void Interact(Entity<InteractionPanelComponent> user,
|
||||||
Entity<InteractionPanelComponent> target, InteractionPrototype prototype, bool hasChecked = true)
|
Entity<InteractionPanelComponent> target, InteractionPrototype prototype, bool hasChecked = true)
|
||||||
{
|
{
|
||||||
if (!hasChecked)
|
if(!hasChecked && !Check(user,target,prototype, out var check))
|
||||||
{
|
{
|
||||||
foreach (var check in prototype.Checks.Where(check => !check.IsAvailable(user!, target!, EntityManager)))
|
if(_playerManager.TryGetSessionByEntity(user,out var session) || session is null)
|
||||||
{
|
|
||||||
if(!_playerManager.TryGetSessionByEntity(user,out var session))
|
|
||||||
return;
|
|
||||||
|
|
||||||
var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}");
|
|
||||||
_chatManager.ChatMessageToOne(ChatChannel.Emotes,message,message,EntityUid.Invalid,false,session.Channel);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
var message = ParseMessage(target, $"interaction-fail-{check.GetType().Name.ToLower()}");
|
||||||
|
_chatManager.ChatMessageToOne(ChatChannel.Emotes,message,message,EntityUid.Invalid,false,session.Channel);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
user.Comp.Timeout = _gameTiming.CurTime + prototype.Timeout;
|
|
||||||
|
user.Comp.Timeout = _gameTiming.CurTime + prototype.Timeout + prototype.EndTime;
|
||||||
user.Comp.EndTime = _gameTiming.CurTime + prototype.EndTime;
|
user.Comp.EndTime = _gameTiming.CurTime + prototype.EndTime;
|
||||||
user.Comp.IsActive = true;
|
user.Comp.IsActive = true;
|
||||||
user.Comp.CurrentAction = prototype.ID;
|
user.Comp.CurrentAction = prototype.ID;
|
||||||
@@ -180,6 +195,9 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
action.Run(user!,target!,EntityManager);
|
action.Run(user!,target!,EntityManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_actionBlockerSystem.UpdateCanMove(user);
|
||||||
|
_actionBlockerSystem.UpdateCanMove(target);
|
||||||
|
|
||||||
RaiseLocalEvent(user,new InteractionBeginningEvent(prototype.ID,user,target));
|
RaiseLocalEvent(user,new InteractionBeginningEvent(prototype.ID,user,target));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,6 +223,19 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
("target", GetName(target)), ("gender", GetGender(target)));
|
("target", GetName(target)), ("gender", GetGender(target)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool Check(Entity<InteractionPanelComponent> user,
|
||||||
|
Entity<InteractionPanelComponent> target, InteractionPrototype prototype,[NotNullWhen(false)] out IInteractionCheck? check)
|
||||||
|
{
|
||||||
|
check = null;
|
||||||
|
foreach (var checkout in prototype.Checks.Where(check => !check.IsAvailable(user!, target!, EntityManager)))
|
||||||
|
{
|
||||||
|
check = checkout;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public override void Update(float frameTime)
|
public override void Update(float frameTime)
|
||||||
{
|
{
|
||||||
base.Update(frameTime);
|
base.Update(frameTime);
|
||||||
@@ -221,6 +252,7 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
}
|
}
|
||||||
|
|
||||||
var user = new Entity<InteractionPanelComponent>(uid, component);
|
var user = new Entity<InteractionPanelComponent>(uid, component);
|
||||||
|
var target = component.CurrentPartner.Value;
|
||||||
|
|
||||||
if (_prototypeManager.TryIndex(component.CurrentAction, out var prototype))
|
if (_prototypeManager.TryIndex(component.CurrentAction, out var prototype))
|
||||||
{
|
{
|
||||||
@@ -242,11 +274,14 @@ public sealed class InteractionPanelSystem : EntitySystem
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
component.IsActive = false;
|
component.IsActive = false;
|
||||||
|
|
||||||
|
_actionBlockerSystem.UpdateCanMove(user);
|
||||||
|
_actionBlockerSystem.UpdateCanMove(target);
|
||||||
|
|
||||||
RaiseLocalEvent(uid, new InteractionEndingEvent(component.CurrentAction,
|
RaiseLocalEvent(uid, new InteractionEndingEvent(component.CurrentAction,
|
||||||
user,
|
user,
|
||||||
component.CurrentPartner.Value));
|
target));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Content.Server._Amour.Animation;
|
using Content.Server._Amour.Animation;
|
||||||
using Content.Server._Amour.Crawl;
|
using Content.Server._Amour.Crawl;
|
||||||
|
using Content.Server._Amour.Hole;
|
||||||
|
using Content.Server.Hands.Systems;
|
||||||
using Content.Server.Pulling;
|
using Content.Server.Pulling;
|
||||||
using Content.Shared._Amour.Animation;
|
using Content.Shared._Amour.Animation;
|
||||||
using Content.Shared._Amour.InteractionPanel;
|
using Content.Shared._Amour.InteractionPanel;
|
||||||
|
using Content.Shared.Hands.Components;
|
||||||
using Robust.Shared.Animations;
|
using Robust.Shared.Animations;
|
||||||
|
|
||||||
namespace Content.Server._Amour.InteractionPanel;
|
namespace Content.Server._Amour.InteractionPanel;
|
||||||
@@ -13,6 +16,9 @@ public sealed class Interactions : EntitySystem
|
|||||||
[Dependency] private readonly CrawlSystem _crawlSystem = default!;
|
[Dependency] private readonly CrawlSystem _crawlSystem = default!;
|
||||||
[Dependency] private readonly SharebleAnimationSystem _animationSystem = default!;
|
[Dependency] private readonly SharebleAnimationSystem _animationSystem = default!;
|
||||||
[Dependency] private readonly PullingSystem _pullingSystem = default!;
|
[Dependency] private readonly PullingSystem _pullingSystem = default!;
|
||||||
|
[Dependency] private readonly HoleSystem _holeSystem = default!;
|
||||||
|
[Dependency] private readonly HandsSystem _handsSystem = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
SubscribeLocalEvent<InteractionPanelComponent,InteractionBeginningEvent>(OnBegin);
|
SubscribeLocalEvent<InteractionPanelComponent,InteractionBeginningEvent>(OnBegin);
|
||||||
@@ -43,6 +49,41 @@ public sealed class Interactions : EntitySystem
|
|||||||
case "CrawlTarget" :
|
case "CrawlTarget" :
|
||||||
_crawlSystem.EnableCrawl(args.Target);
|
_crawlSystem.EnableCrawl(args.Target);
|
||||||
break;
|
break;
|
||||||
|
case "ItemOnButt":
|
||||||
|
PutHole(uid,"Anus");
|
||||||
|
break;
|
||||||
|
case "ItemOnVagina":
|
||||||
|
PutHole(uid,"Vagina");
|
||||||
|
break;
|
||||||
|
case "ItemFromButt":
|
||||||
|
TakeHole(uid,"Anus");
|
||||||
|
break;
|
||||||
|
case "ItemFromVagina":
|
||||||
|
TakeHole(uid,"Vagina");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PutHole(EntityUid uid,string holeType)
|
||||||
|
{
|
||||||
|
if (!TryComp<HandsComponent>(uid, out var handsComponent)
|
||||||
|
|| handsComponent.ActiveHand?.HeldEntity is null
|
||||||
|
|| !_holeSystem.TryFind(uid,holeType,out var hole))
|
||||||
|
return;
|
||||||
|
|
||||||
|
var ent = handsComponent.ActiveHand.HeldEntity.Value;
|
||||||
|
|
||||||
|
_holeSystem.PutItem(ent,hole.Owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TakeHole(EntityUid uid,string holeType)
|
||||||
|
{
|
||||||
|
if (!_holeSystem.TryFind(uid,holeType,out var hole))
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var entity in _holeSystem.TakeItem(hole.Owner))
|
||||||
|
{
|
||||||
|
_handsSystem.TryPickup(uid, entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ public sealed class ArousalSystem : EntitySystem
|
|||||||
|
|
||||||
private void OnComponentInit(EntityUid uid, ArousalComponent component, ComponentInit args)
|
private void OnComponentInit(EntityUid uid, ArousalComponent component, ComponentInit args)
|
||||||
{
|
{
|
||||||
UpdateAlarm(new Entity<ArousalComponent?>(uid,component));
|
//UpdateAlarm(new Entity<ArousalComponent?>(uid,component));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateAlarm(Entity<ArousalComponent?> entity)
|
private void UpdateAlarm(Entity<ArousalComponent?> entity)
|
||||||
|
|||||||
27
Content.Shared/_Amour/InteractionPanel/Checks/HandsCheck.cs
Normal file
27
Content.Shared/_Amour/InteractionPanel/Checks/HandsCheck.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using Content.Shared.Hands.Components;
|
||||||
|
|
||||||
|
namespace Content.Shared._Amour.InteractionPanel.Checks;
|
||||||
|
|
||||||
|
public sealed class HasItemInUserHand : IInteractionCheck
|
||||||
|
{
|
||||||
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
|
{
|
||||||
|
return entityManager.TryGetComponent<HandsComponent>(user, out var handsComponent) && handsComponent.ActiveHand?.HeldEntity is not null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class UserHasHand : IInteractionCheck
|
||||||
|
{
|
||||||
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
|
{
|
||||||
|
return entityManager.HasComponent<HandsComponent>(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class TargetHasHand : IInteractionCheck
|
||||||
|
{
|
||||||
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
|
{
|
||||||
|
return entityManager.HasComponent<HandsComponent>(target);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@ public sealed class UserHasButt : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Anus", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Anus");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ public sealed class TargetHasButt : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Anus", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Anus");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ public sealed class UserHasPenis : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Dick", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Dick");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ public sealed class TargetHasPenis : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Dick", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Dick");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ public sealed class UserHasVagina : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Vagina", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Vagina");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ public sealed class TargetHasVagina : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Vagina", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Vagina");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ public sealed class UserHasTesticles : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Testicles", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Testicles");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ public sealed class TargetHasTesticles : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Testicles", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Testicles");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ public sealed class UserHasBreast : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(user.Owner, "Breast", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(user.Owner, "Breast");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,6 +78,6 @@ public sealed class TargetHasBreast : IInteractionCheck
|
|||||||
{
|
{
|
||||||
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
public bool IsAvailable(Entity<InteractionPanelComponent> user, Entity<InteractionPanelComponent> target, IEntityManager entityManager)
|
||||||
{
|
{
|
||||||
return entityManager.System<SharedHoleSystem>().TryFind(target.Owner, "Breast", out _);
|
return entityManager.System<SharedHoleSystem>().HasAccessTo(target.Owner, "Breast");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,14 +26,20 @@ public sealed class InteractionState: EuiStateBase
|
|||||||
public NetEntity Performer { get; }
|
public NetEntity Performer { get; }
|
||||||
public NetEntity Target { get; }
|
public NetEntity Target { get; }
|
||||||
public HashSet<InteractionEntry> AvailableInteractions;
|
public HashSet<InteractionEntry> AvailableInteractions;
|
||||||
|
|
||||||
|
public HashSet<string> DescUser;
|
||||||
|
public HashSet<string> DescTarget;
|
||||||
|
|
||||||
public byte? Arousal;
|
public byte? Arousal;
|
||||||
|
|
||||||
public InteractionState(NetEntity performer, NetEntity target, HashSet<InteractionEntry> availableInteractions, byte? arousal)
|
public InteractionState(NetEntity performer, NetEntity target, HashSet<InteractionEntry> availableInteractions, byte? arousal, HashSet<string> descUser, HashSet<string> descTarget)
|
||||||
{
|
{
|
||||||
Performer = performer;
|
Performer = performer;
|
||||||
Target = target;
|
Target = target;
|
||||||
AvailableInteractions = availableInteractions;
|
AvailableInteractions = availableInteractions;
|
||||||
Arousal = arousal;
|
Arousal = arousal;
|
||||||
|
DescUser = descUser;
|
||||||
|
DescTarget = descTarget;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
Resources/Locale/ru-RU/_amour/arosual/arousal.ftl
Normal file
2
Resources/Locale/ru-RU/_amour/arosual/arousal.ftl
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
alerts-arousal-name = Прикольное
|
||||||
|
alerts-arousal-desc = Показывает ваш уровень возбуждения. В разработке.
|
||||||
16
Resources/Locale/ru-RU/_amour/interactions/fail.ftl
Normal file
16
Resources/Locale/ru-RU/_amour/interactions/fail.ftl
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
interaction-fail-userhasbutt = Но у меня нет попы!
|
||||||
|
interaction-fail-targethasbutt = Но у того нет попы!
|
||||||
|
interaction-fail-userhaspenis = Но у меня нет члена!
|
||||||
|
interaction-fail-targethaspenis = Но у того нет члена!
|
||||||
|
interaction-fail-userhasvagina = Но у меня нет вагины!
|
||||||
|
interaction-fail-targethasvagina = Но у неё нет вагины!
|
||||||
|
interaction-fail-userhastesticles = Но у меня нет яиц!
|
||||||
|
interaction-fail-targethastesticles = Но у него нет яиц!
|
||||||
|
interaction-fail-userhasbreast = Но у меня нет груди!
|
||||||
|
interaction-fail-targethasbreast = Но у неё нет груди!
|
||||||
|
|
||||||
|
interaction-fail-hassmalldistance = До цели так далеко...
|
||||||
|
interaction-fail-interactself = Я могу сделать это лишь с собой!
|
||||||
|
interaction-fail-cantinteractself = Я не могу сделать это с собой!
|
||||||
|
interaction-fail-isusercrawl = Но я не лежу!
|
||||||
|
interaction-fail-istargetcrawl = Но цель не лежит!
|
||||||
@@ -4,7 +4,8 @@ interaction-name-dickinbutt = выебать в очко
|
|||||||
interaction-name-dickinvagina = выебать в вагину
|
interaction-name-dickinvagina = выебать в вагину
|
||||||
interaction-name-itemonbutt = засунуть вещь в очко
|
interaction-name-itemonbutt = засунуть вещь в очко
|
||||||
interaction-name-itemonvagina = засунуть вещь в вагину
|
interaction-name-itemonvagina = засунуть вещь в вагину
|
||||||
interaction-name-itemonpenis = засунуть вещь в член
|
interaction-name-itemfrombutt = засунуть руку в очко
|
||||||
|
interaction-name-itemfromvagina = засунуть руку в вагину
|
||||||
interaction-name-lickdick = отлизать мужсокй половой орган
|
interaction-name-lickdick = отлизать мужсокй половой орган
|
||||||
interaction-name-lickvagina = отлизать вагину
|
interaction-name-lickvagina = отлизать вагину
|
||||||
interaction-name-lickface = отлизать лицо
|
interaction-name-lickface = отлизать лицо
|
||||||
@@ -17,12 +18,92 @@ interaction-name-combbutt = погладить по попе
|
|||||||
interaction-name-pulltarget = держать за ручку
|
interaction-name-pulltarget = держать за ручку
|
||||||
interaction-name-sitwithbutt = насадить на своё очко хуй
|
interaction-name-sitwithbutt = насадить на своё очко хуй
|
||||||
interaction-name-sitwithvagina = насадить на свою вагину хуй
|
interaction-name-sitwithvagina = насадить на свою вагину хуй
|
||||||
|
interaction-name-drochdick = подрочить хуй
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
interaction-butt-slap1 = шлёпает попку { $target }
|
interaction-butt-slap1 = шлёпает попку { $target }
|
||||||
interaction-butt-slap2 = со всей силы бьёт по жопе { $target }
|
interaction-butt-slap2 = со всей силы бьёт по жопе { $target }
|
||||||
interaction-butt-slap3 = шлёпает попку { $target }
|
interaction-butt-slap3 = примерясь, звонко шлёпает { $target } по попке
|
||||||
|
|
||||||
|
interaction-crawl-before1 = пытается толкнуть { $target }
|
||||||
|
interaction-crawl1 = с грохотом роняет { $target }
|
||||||
|
interaction-crawl2 = заставляет упасть { $target }
|
||||||
|
interaction-crawl3 = толкает { $target } на пол
|
||||||
|
|
||||||
|
interaction-butt-fuck1 = схватив за бёдра, нежно просовывает член прямо в булки { $target }
|
||||||
|
interaction-butt-fuck2 = войдя в дырочку своим половым органом, начинает проникать всё глубже в { $target }
|
||||||
|
interaction-butt-fuck3 = просунув в колечко свой орган, с пристрастием входит в анал { $target }
|
||||||
|
|
||||||
|
interaction-vagina-fuck1 = вставляет свой возбуждённый член в киску и с силой совершает толчки бёдрами в сторону { $target }
|
||||||
|
interaction-vagina-fuck2 = вводит стоячий орган прямо в вагину, начиная входить всё глубже в { $target }
|
||||||
|
interaction-vagina-fuck3 = войдя в киску своим горячим членом, занялся актом совокупления с { $target }
|
||||||
|
|
||||||
|
interaction-butt-put-before1 = суёт между булок { $target } нечто
|
||||||
|
interaction-butt-put1 = засунул вещь между булок { $target }
|
||||||
|
interaction-butt-put2 = засунул вещь между булок { $target }
|
||||||
|
interaction-butt-put3 = засунул вещь между булок { $target }
|
||||||
|
|
||||||
|
interaction-vagina-put-before1 = суёт в киску { $target } нечто смешное
|
||||||
|
interaction-vagina-put1 = успешно засунул в киску { $target } вещь
|
||||||
|
interaction-vagina-put2 = успешно засунул в киску { $target } вещь
|
||||||
|
interaction-vagina-put3 = успешно засунул в киску { $target } вещь
|
||||||
|
|
||||||
|
interaction-butt-take-before1 = суёт между булок { $target } свою руку
|
||||||
|
interaction-butt-take1 = иследовал булки { $target } своими руками
|
||||||
|
interaction-butt-take2 = иследовал булки { $target } своими руками
|
||||||
|
interaction-butt-take3 = иследовал булки { $target } своими руками
|
||||||
|
|
||||||
|
interaction-vagina-take-before1 = суёт в киску { $target } свою руку
|
||||||
|
interaction-vagina-take1 = успешно исследовал киску { $target } своими ручками
|
||||||
|
interaction-vagina-take2 = успешно исследовал киску { $target } своими ручками
|
||||||
|
interaction-vagina-take3 = успешно исследовал киску { $target } своими ручками
|
||||||
|
|
||||||
|
interaction-sit-butt1 = присаживается дырочкой прямиком на член { $target }
|
||||||
|
interaction-sit-butt2 = осторожно садится на половой орган { $target }
|
||||||
|
interaction-sit-butt3 = вставляет в свой анал член и присаживается на { $target }
|
||||||
|
|
||||||
|
interaction-sit-vagina1 = медленно садится своей киской прямо на член { $target }
|
||||||
|
interaction-sit-vagina2 = вставляя в себя член, аккуратно опускается вагиной на орган { $target }
|
||||||
|
interaction-sit-vagina3 = постепенно опустившись вниз, присаживается своей киской на член { $target }
|
||||||
|
interaction-dick-lick1 = вобрав в свой ротик член, начинает посасывать орган { $target }
|
||||||
|
interaction-dick-lick2 = приблизившись к половому органу своим ртом, просовывает тот внутрь себя и начинает массировать язычком член { $target }
|
||||||
|
interaction-dick-lick3 = ласково облизав своим язычком член, начинает отсасывать у { $target }
|
||||||
|
|
||||||
|
interaction-vagina-lick1 = начинает оживлённо полизывать сладкую киску язычком у { $target }
|
||||||
|
interaction-vagina-lick2 = вылизывая вагину языком, слегка слюнявит { $target }
|
||||||
|
interaction-vagina-lick3 = осторожно проникает своим язычишком прямо в киску { $target }
|
||||||
|
|
||||||
|
interaction-face-lick1 = высунув горячий язычок, полизывает личико { $target }
|
||||||
|
interaction-face-lick2 = быстрым движением языка ласково лижет лицо { $target }
|
||||||
|
interaction-face-lick3 = проводит язычком по личику, оставляя след из слюнок на { $target }
|
||||||
|
|
||||||
|
interaction-droch-dick1 = прильнув ручкой к половому органу, начинает ласкать член { $target }
|
||||||
|
interaction-droch-dick2 = опустив ручку к члену, мастурбирует орган { $target }
|
||||||
|
interaction-droch-dick3 = удерживая член, ласкает половой орган { $target }
|
||||||
|
|
||||||
|
interaction-mouth-kiss1 = приблизившись устами к губкам, страстно целует { $target }
|
||||||
|
interaction-mouth-kiss2 = не теряя ни минуты, начинает жаркий поцелуй с { $target }
|
||||||
|
interaction-mouth-kiss3 = тут же начинает упиваться сладостным поцелуем с { $target }
|
||||||
|
|
||||||
|
interaction-neck-kiss1 = приблизился губами к шейке и оставил след от поцелуя с { $target }
|
||||||
|
interaction-neck-kiss2 = жарко поцеловав устами шею, оставляет заметный след на { $target }
|
||||||
|
interaction-neck-kiss3 = с любовью расцеловывает шейку { $target }
|
||||||
|
|
||||||
|
interaction-face-kiss1 = оставляет лёгкий поцелуйчик на щеке { $target }
|
||||||
|
interaction-face-kiss2 = чмокает в щёчку { $target }
|
||||||
|
interaction-face-kiss3 = легонько целует в щёку { $target }
|
||||||
|
|
||||||
|
interaction-head-comb1 = опустив руку на голову, поглаживает { $target }
|
||||||
|
interaction-head-comb2 = ласково и с любовью гладит { $target }
|
||||||
|
interaction-head-comb3 = выражает свою любовь, поглаживая по макушке { $target }
|
||||||
|
|
||||||
|
interaction-ears-comb1 = убрав руку за ушко, почёсывает { $target }
|
||||||
|
interaction-ears-comb2 = с лаской чешет за ушком { $target }
|
||||||
|
interaction-ears-comb3 = заботливо почёсывает ушко { $target }
|
||||||
|
|
||||||
|
interaction-butt-comb1 = спустившись к булочкам, поглаживает { $target }
|
||||||
|
interaction-butt-comb2 = мнёт и полаживает ягодицы { $target }
|
||||||
|
interaction-butt-comb3 = проводя ладошкой по упругой попке, гладит { $target }
|
||||||
|
|
||||||
|
interaction-pull1 = робко схватил за ручки { $target }
|
||||||
|
interaction-pull2 = подхватывает { $target } за руки
|
||||||
|
interaction-pull3 = подхватывает { $target } за руки
|
||||||
|
|||||||
16
Resources/Locale/ru-RU/_amour/interactions/success.ftl
Normal file
16
Resources/Locale/ru-RU/_amour/interactions/success.ftl
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
interaction-success-userhasbreast = У меня есть грудь
|
||||||
|
interaction-success-userhasbutt = У меня есть попа
|
||||||
|
interaction-success-userhaspenis = У меня есть член
|
||||||
|
interaction-success-userhastesticles = У меня есть яйца
|
||||||
|
interaction-success-userhasvagina = У меня есть вагина
|
||||||
|
interaction-success-isusercrawl = Я лежу!
|
||||||
|
|
||||||
|
interaction-success-hassmalldistance = ..Довольно близко
|
||||||
|
interaction-success-targethasbreast = ..Имеет грудь
|
||||||
|
interaction-success-targethasbutt = ..Имеет попу
|
||||||
|
interaction-success-targethaspenis = ..Имеет член
|
||||||
|
interaction-success-targethastesticles = ..Имеет яйца
|
||||||
|
interaction-success-targethasvagina = ..Имеет вагину
|
||||||
|
interaction-success-istargetcrawl = ..Лежит
|
||||||
|
|
||||||
|
interaction-empty = ..Пусто
|
||||||
@@ -1,2 +1,4 @@
|
|||||||
interaction-panel-title = Панель взаимодействий
|
interaction-panel-title = Панель взаимодействий
|
||||||
interaction-hide-unvisible = Спрятать недоступные действия
|
interaction-hide-unvisible = Спрятать недоступные действия
|
||||||
|
interaction-update = Обновить список
|
||||||
|
interaction-open = Открыть панель взаимодействий
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
- interaction-butt-fuck2
|
- interaction-butt-fuck2
|
||||||
- interaction-butt-fuck3
|
- interaction-butt-fuck3
|
||||||
group: Danger
|
group: Danger
|
||||||
|
endTime: 6
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
id: DickInVagina
|
id: DickInVagina
|
||||||
@@ -60,17 +61,28 @@
|
|||||||
- !type:TargetHasVagina
|
- !type:TargetHasVagina
|
||||||
beginningSound:
|
beginningSound:
|
||||||
path: /Audio/Effects/Emotes/clap1.ogg
|
path: /Audio/Effects/Emotes/clap1.ogg
|
||||||
|
beginningActions:
|
||||||
|
- !type:RequireAnimation
|
||||||
|
k0: 0
|
||||||
|
k1: 0.1
|
||||||
|
k3: 0.25
|
||||||
|
repeat: 12
|
||||||
beginningMessages:
|
beginningMessages:
|
||||||
- interaction-butt-fuck1
|
- interaction-vagina-fuck1
|
||||||
- interaction-butt-fuck2
|
- interaction-vagina-fuck2
|
||||||
- interaction-butt-fuck3
|
- interaction-vagina-fuck3
|
||||||
group: Danger
|
group: Danger
|
||||||
|
endTime: 6
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
id: ItemOnButt
|
id: ItemOnButt
|
||||||
checks:
|
checks:
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
- !type:TargetHasButt
|
- !type:TargetHasButt
|
||||||
|
- !type:HasItemInUserHand
|
||||||
|
beginningTimeout: 10
|
||||||
|
preBeginMessages:
|
||||||
|
- interaction-butt-put-before1
|
||||||
beginningMessages:
|
beginningMessages:
|
||||||
- interaction-butt-put1
|
- interaction-butt-put1
|
||||||
- interaction-butt-put2
|
- interaction-butt-put2
|
||||||
@@ -82,6 +94,10 @@
|
|||||||
checks:
|
checks:
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
- !type:TargetHasVagina
|
- !type:TargetHasVagina
|
||||||
|
- !type:HasItemInUserHand
|
||||||
|
beginningTimeout: 10
|
||||||
|
preBeginMessages:
|
||||||
|
- interaction-vagina-put-before1
|
||||||
beginningMessages:
|
beginningMessages:
|
||||||
- interaction-vagina-put1
|
- interaction-vagina-put1
|
||||||
- interaction-vagina-put2
|
- interaction-vagina-put2
|
||||||
@@ -90,15 +106,35 @@
|
|||||||
|
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
id: ItemOnPenis
|
id: ItemFromButt
|
||||||
checks:
|
checks:
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
- !type:TargetHasPenis
|
- !type:TargetHasButt
|
||||||
|
- !type:UserHasHand
|
||||||
|
beginningTimeout: 10
|
||||||
|
preBeginMessages:
|
||||||
|
- interaction-butt-take-before1
|
||||||
beginningMessages:
|
beginningMessages:
|
||||||
- interaction-penis-put1
|
- interaction-butt-take1
|
||||||
- interaction-penis-put2
|
- interaction-butt-take2
|
||||||
- interaction-penis-put3
|
- interaction-butt-take3
|
||||||
group: Extreme
|
group: Danger
|
||||||
|
|
||||||
|
- type: interaction
|
||||||
|
id: ItemFromVagina
|
||||||
|
checks:
|
||||||
|
- !type:HasSmallDistance
|
||||||
|
- !type:TargetHasVagina
|
||||||
|
- !type:UserHasHand
|
||||||
|
beginningTimeout: 10
|
||||||
|
preBeginMessages:
|
||||||
|
- interaction-vagina-take-before1
|
||||||
|
beginningMessages:
|
||||||
|
- interaction-vagina-take1
|
||||||
|
- interaction-vagina-take2
|
||||||
|
- interaction-vagina-take3
|
||||||
|
group: Danger
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
@@ -106,6 +142,7 @@
|
|||||||
checks:
|
checks:
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
- !type:TargetHasPenis
|
- !type:TargetHasPenis
|
||||||
|
- !type:CantInteractSelf
|
||||||
#- !type:UserHasButt
|
#- !type:UserHasButt
|
||||||
- !type:IsTargetCrawl
|
- !type:IsTargetCrawl
|
||||||
beginningSound:
|
beginningSound:
|
||||||
@@ -117,6 +154,7 @@
|
|||||||
- interaction-sit-butt2
|
- interaction-sit-butt2
|
||||||
- interaction-sit-butt3
|
- interaction-sit-butt3
|
||||||
group: Danger
|
group: Danger
|
||||||
|
endTime: 6
|
||||||
|
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
@@ -124,6 +162,7 @@
|
|||||||
checks:
|
checks:
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
- !type:TargetHasPenis
|
- !type:TargetHasPenis
|
||||||
|
- !type:CantInteractSelf
|
||||||
- !type:UserHasVagina
|
- !type:UserHasVagina
|
||||||
- !type:IsTargetCrawl
|
- !type:IsTargetCrawl
|
||||||
beginningSound:
|
beginningSound:
|
||||||
@@ -135,11 +174,13 @@
|
|||||||
- interaction-sit-vagina2
|
- interaction-sit-vagina2
|
||||||
- interaction-sit-vagina3
|
- interaction-sit-vagina3
|
||||||
group: Danger
|
group: Danger
|
||||||
|
endTime: 6
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
id: LickDick
|
id: LickDick
|
||||||
checks:
|
checks:
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
|
- !type:CantInteractSelf
|
||||||
- !type:TargetHasPenis
|
- !type:TargetHasPenis
|
||||||
beginningSound:
|
beginningSound:
|
||||||
path: /Audio/White/Felinid/lick.ogg
|
path: /Audio/White/Felinid/lick.ogg
|
||||||
@@ -150,14 +191,18 @@
|
|||||||
- interaction-dick-lick2
|
- interaction-dick-lick2
|
||||||
- interaction-dick-lick3
|
- interaction-dick-lick3
|
||||||
group: Danger
|
group: Danger
|
||||||
|
endTime: 6
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
id: LickVagina
|
id: LickVagina
|
||||||
checks:
|
checks:
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
|
- !type:CantInteractSelf
|
||||||
- !type:TargetHasVagina
|
- !type:TargetHasVagina
|
||||||
beginningSound:
|
beginningSound:
|
||||||
path: /Audio/White/Felinid/lick.ogg
|
path: /Audio/White/Felinid/lick.ogg
|
||||||
|
beginningActions:
|
||||||
|
- !type:RequireHorizontalAnimation
|
||||||
beginningAction:
|
beginningAction:
|
||||||
- !type:RequireHorizontalAnimation
|
- !type:RequireHorizontalAnimation
|
||||||
beginningMessages:
|
beginningMessages:
|
||||||
@@ -165,6 +210,7 @@
|
|||||||
- interaction-vagina-lick2
|
- interaction-vagina-lick2
|
||||||
- interaction-vagina-lick3
|
- interaction-vagina-lick3
|
||||||
group: Danger
|
group: Danger
|
||||||
|
endTime: 6
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
id: LickFace
|
id: LickFace
|
||||||
@@ -181,7 +227,25 @@
|
|||||||
- interaction-face-lick1
|
- interaction-face-lick1
|
||||||
- interaction-face-lick2
|
- interaction-face-lick2
|
||||||
- interaction-face-lick3
|
- interaction-face-lick3
|
||||||
|
group: Moderate
|
||||||
|
|
||||||
|
- type: interaction
|
||||||
|
id: DrochDick
|
||||||
|
checks:
|
||||||
|
- !type:HasSmallDistance
|
||||||
|
- !type:TargetHasPenis
|
||||||
|
beginningSound:
|
||||||
|
path: /Audio/Effects/Emotes/clap1.ogg
|
||||||
|
beginningActions:
|
||||||
|
- !type:RequireAnimation
|
||||||
|
k0: 0
|
||||||
|
k1: 0.1
|
||||||
|
k2: 3.4
|
||||||
|
k3: 0.25
|
||||||
|
beginningMessages:
|
||||||
|
- interaction-droch-dick1
|
||||||
group: Danger
|
group: Danger
|
||||||
|
endTime: 6
|
||||||
|
|
||||||
- type: interaction
|
- type: interaction
|
||||||
id: KissMouth
|
id: KissMouth
|
||||||
@@ -282,6 +346,7 @@
|
|||||||
- type: interaction
|
- type: interaction
|
||||||
id: CombButt
|
id: CombButt
|
||||||
checks:
|
checks:
|
||||||
|
- !type:CantInteractSelf
|
||||||
- !type:HasSmallDistance
|
- !type:HasSmallDistance
|
||||||
beginningSound:
|
beginningSound:
|
||||||
path: /Audio/White/Interactions/ches.ogg
|
path: /Audio/White/Interactions/ches.ogg
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
- DickInVagina
|
- DickInVagina
|
||||||
- ItemOnButt
|
- ItemOnButt
|
||||||
- ItemOnVagina
|
- ItemOnVagina
|
||||||
- ItemOnPenis
|
|
||||||
- LickVagina
|
- LickVagina
|
||||||
- LickDick
|
- LickDick
|
||||||
- LickFace
|
- LickFace
|
||||||
@@ -21,3 +20,6 @@
|
|||||||
- CrawlTarget
|
- CrawlTarget
|
||||||
- SitWithButt
|
- SitWithButt
|
||||||
- SitWithVagina
|
- SitWithVagina
|
||||||
|
- DrochDick
|
||||||
|
- ItemFromButt
|
||||||
|
- ItemFromVagina
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
- type: genitalsGroup
|
- type: genitalsGroup
|
||||||
id: Penis
|
id: Penis
|
||||||
prototypes:
|
prototypes:
|
||||||
- PenisAmputated0
|
#- PenisAmputated0
|
||||||
- PenisBarbknot1
|
- PenisBarbknot1
|
||||||
- PenisBarbknot2
|
- PenisBarbknot2
|
||||||
- PenisBarbknot3
|
- PenisBarbknot3
|
||||||
@@ -39,12 +39,12 @@
|
|||||||
- PenisTentacle2
|
- PenisTentacle2
|
||||||
- PenisTentacle3
|
- PenisTentacle3
|
||||||
- PenisTentacle4
|
- PenisTentacle4
|
||||||
- PenisThick1
|
#- PenisThick1
|
||||||
- PenisThick2
|
#- PenisThick2
|
||||||
- PenisThick3
|
#- PenisThick3
|
||||||
- PenisThick4
|
#- PenisThick4
|
||||||
- PenisThick5
|
#- PenisThick5
|
||||||
- VaginaCloaca1
|
#- VaginaCloaca1
|
||||||
- VaginaDentata1
|
- VaginaDentata1
|
||||||
- VaginaFurred1
|
- VaginaFurred1
|
||||||
- VaginaGaping1
|
- VaginaGaping1
|
||||||
@@ -72,16 +72,16 @@
|
|||||||
- BreastsPairD
|
- BreastsPairD
|
||||||
- BreastsPairE
|
- BreastsPairE
|
||||||
- BreastsPairF
|
- BreastsPairF
|
||||||
- BreastsPairGiga
|
#- BreastsPairGiga
|
||||||
- BreastsPairG
|
- BreastsPairG
|
||||||
- BreastsPairHuge
|
#- BreastsPairHuge
|
||||||
- BreastsPairH
|
- BreastsPairH
|
||||||
- BreastsPairImpossible
|
#- BreastsPairImpossible
|
||||||
- BreastsPairI
|
- BreastsPairI
|
||||||
- BreastsPairJ
|
- BreastsPairJ
|
||||||
- BreastsPairK
|
- BreastsPairK
|
||||||
- BreastsPairL
|
- BreastsPairL
|
||||||
- BreastsPairMassive
|
#- BreastsPairMassive
|
||||||
- BreastsPairM
|
- BreastsPairM
|
||||||
- BreastsPairN
|
- BreastsPairN
|
||||||
- BreastsPairO
|
- BreastsPairO
|
||||||
@@ -91,16 +91,16 @@
|
|||||||
- BreastsQuadD
|
- BreastsQuadD
|
||||||
- BreastsQuadE
|
- BreastsQuadE
|
||||||
- BreastsQuadF
|
- BreastsQuadF
|
||||||
- BreastsQuadGiga
|
#- BreastsQuadGiga
|
||||||
- BreastsQuadG
|
- BreastsQuadG
|
||||||
- BreastsQuadHuge
|
#- BreastsQuadHuge
|
||||||
- BreastsQuadH
|
- BreastsQuadH
|
||||||
- BreastsQuadImpossible
|
#- BreastsQuadImpossible
|
||||||
- BreastsQuadI
|
- BreastsQuadI
|
||||||
- BreastsQuadJ
|
- BreastsQuadJ
|
||||||
- BreastsQuadK
|
- BreastsQuadK
|
||||||
- BreastsQuadL
|
- BreastsQuadL
|
||||||
- BreastsQuadMassive
|
#- BreastsQuadMassive
|
||||||
- BreastsQuadM
|
- BreastsQuadM
|
||||||
- BreastsQuadN
|
- BreastsQuadN
|
||||||
- BreastsQuadO
|
- BreastsQuadO
|
||||||
@@ -110,16 +110,16 @@
|
|||||||
- BreastsSextupleD
|
- BreastsSextupleD
|
||||||
- BreastsSextupleE
|
- BreastsSextupleE
|
||||||
- BreastsSextupleF
|
- BreastsSextupleF
|
||||||
- BreastsSextupleGiga
|
#- BreastsSextupleGiga
|
||||||
- BreastsSextupleG
|
- BreastsSextupleG
|
||||||
- BreastsSextupleHuge
|
#- BreastsSextupleHuge
|
||||||
- BreastsSextupleH
|
- BreastsSextupleH
|
||||||
- BreastsSextupleImpossible
|
#- BreastsSextupleImpossible
|
||||||
- BreastsSextupleI
|
- BreastsSextupleI
|
||||||
- BreastsSextupleJ
|
- BreastsSextupleJ
|
||||||
- BreastsSextupleK
|
- BreastsSextupleK
|
||||||
- BreastsSextupleL
|
- BreastsSextupleL
|
||||||
- BreastsSextupleMassive
|
#- BreastsSextupleMassive
|
||||||
- BreastsSextupleM
|
- BreastsSextupleM
|
||||||
- BreastsSextupleN
|
- BreastsSextupleN
|
||||||
- BreastsSextupleO
|
- BreastsSextupleO
|
||||||
@@ -131,9 +131,9 @@
|
|||||||
- TesticlesSheath2
|
- TesticlesSheath2
|
||||||
- TesticlesSheath3
|
- TesticlesSheath3
|
||||||
- TesticlesSheath4
|
- TesticlesSheath4
|
||||||
- TesticlesSheath5
|
#- TesticlesSheath5
|
||||||
- TesticlesSingle1
|
#- TesticlesSingle1
|
||||||
- TesticlesSingle2
|
#- TesticlesSingle2
|
||||||
- TesticlesSingle3
|
#- TesticlesSingle3
|
||||||
- TesticlesSingle4
|
#- TesticlesSingle4
|
||||||
- TesticlesSingle5
|
#- TesticlesSingle5
|
||||||
|
|||||||
Reference in New Issue
Block a user