Revert "Friday31" (#869)
Revert "Friday31 (#868)"
This reverts commit 10a2b918fd.
@@ -1,117 +0,0 @@
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Client.ResourceManagement;
|
||||
using Robust.Shared.Enums;
|
||||
using Robust.Shared.Graphics.RSI;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Log;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Client._Friday31.Slenderman;
|
||||
|
||||
public sealed class SlendermanScreamerOverlay : Overlay
|
||||
{
|
||||
[Dependency] private readonly IResourceCache _resourceCache = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||
|
||||
private ISawmill _sawmill = default!;
|
||||
|
||||
public override OverlaySpace Space => OverlaySpace.WorldSpace;
|
||||
|
||||
private TimeSpan _startTime;
|
||||
private TimeSpan _endTime;
|
||||
private Texture? _slendermanTexture;
|
||||
private bool _isActive;
|
||||
|
||||
public SlendermanScreamerOverlay()
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
_sawmill = Logger.GetSawmill("slenderman.screamer");
|
||||
ZIndex = 200;
|
||||
}
|
||||
|
||||
public void Show(float duration)
|
||||
{
|
||||
_startTime = _timing.CurTime;
|
||||
_endTime = _startTime + TimeSpan.FromSeconds(duration);
|
||||
_isActive = true;
|
||||
|
||||
if (_slendermanTexture == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var rsi = _resourceCache.GetResource<RSIResource>("/Textures/_Friday31/Mobs/slenderman.rsi").RSI;
|
||||
if (rsi.TryGetState("slenderman", out var state))
|
||||
{
|
||||
_slendermanTexture = state.GetFrame(RsiDirection.South, 0);
|
||||
_sawmill.Debug("Texture loaded successfully!");
|
||||
}
|
||||
else
|
||||
{
|
||||
_sawmill.Error("Failed to get 'slenderman' state from RSI!");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_sawmill.Error($"Error loading texture: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsActive()
|
||||
{
|
||||
if (!_isActive)
|
||||
return false;
|
||||
|
||||
if (_timing.CurTime >= _endTime)
|
||||
{
|
||||
_isActive = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override bool BeforeDraw(in OverlayDrawArgs args)
|
||||
{
|
||||
if (!IsActive())
|
||||
return false;
|
||||
|
||||
if (_slendermanTexture == null)
|
||||
{
|
||||
_sawmill.Warning("Texture is null!");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!_entityManager.TryGetComponent(_playerManager.LocalEntity, out EyeComponent? eyeComp))
|
||||
return false;
|
||||
|
||||
if (args.Viewport.Eye != eyeComp.Eye)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override void Draw(in OverlayDrawArgs args)
|
||||
{
|
||||
if (_slendermanTexture == null)
|
||||
return;
|
||||
|
||||
var worldHandle = args.WorldHandle;
|
||||
var viewport = args.WorldAABB;
|
||||
|
||||
var textureSize = _slendermanTexture.Size;
|
||||
var cropHeight = textureSize.Y * 0.44f;
|
||||
var sourceRect = new UIBox2(0, 0, textureSize.X, cropHeight);
|
||||
worldHandle.DrawTextureRectRegion(_slendermanTexture, viewport, null, sourceRect);
|
||||
}
|
||||
|
||||
protected override void DisposeBehavior()
|
||||
{
|
||||
base.DisposeBehavior();
|
||||
_slendermanTexture = null;
|
||||
}
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
using Content.Shared._Friday31.Slenderman;
|
||||
using Robust.Client.Graphics;
|
||||
using Robust.Shared.Log;
|
||||
|
||||
namespace Content.Client._Friday31.Slenderman;
|
||||
|
||||
public sealed class SlendermanScreamerSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IOverlayManager _overlayManager = default!;
|
||||
|
||||
private SlendermanScreamerOverlay? _overlay;
|
||||
private ISawmill _sawmill = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
_sawmill = Logger.GetSawmill("slenderman.screamer");
|
||||
SubscribeNetworkEvent<SlendermanScreamerEvent>(OnScreamerEvent);
|
||||
}
|
||||
|
||||
public override void Shutdown()
|
||||
{
|
||||
base.Shutdown();
|
||||
|
||||
if (_overlay != null)
|
||||
{
|
||||
_overlayManager.RemoveOverlay(_overlay);
|
||||
_overlay = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnScreamerEvent(SlendermanScreamerEvent ev)
|
||||
{
|
||||
_sawmill.Info($"Received screamer event! Duration: {ev.Duration}");
|
||||
|
||||
if (_overlay == null)
|
||||
{
|
||||
_overlay = new SlendermanScreamerOverlay();
|
||||
_sawmill.Debug("Created new overlay instance");
|
||||
}
|
||||
|
||||
_overlay.Show(ev.Duration);
|
||||
_sawmill.Debug($"Overlay.Show() called, IsActive: {_overlay.IsActive()}");
|
||||
|
||||
if (!_overlayManager.HasOverlay<SlendermanScreamerOverlay>())
|
||||
{
|
||||
_overlayManager.AddOverlay(_overlay);
|
||||
_sawmill.Info("Overlay added to manager");
|
||||
}
|
||||
else
|
||||
{
|
||||
_sawmill.Debug("Overlay already in manager");
|
||||
}
|
||||
}
|
||||
|
||||
public override void FrameUpdate(float frameTime)
|
||||
{
|
||||
base.FrameUpdate(frameTime);
|
||||
|
||||
if (_overlay != null && !_overlay.IsActive())
|
||||
{
|
||||
if (_overlayManager.HasOverlay<SlendermanScreamerOverlay>())
|
||||
{
|
||||
_overlayManager.RemoveOverlay(_overlay);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,9 +11,4 @@ public sealed partial class RandomHumanoidAppearanceComponent : Component
|
||||
/// After randomizing, sets the hair style to this, if possible
|
||||
/// </summary>
|
||||
[DataField] public string? Hair = null;
|
||||
|
||||
/// <summary>
|
||||
/// After randomizing, sets the facial hair style to this, if possible
|
||||
/// </summary>
|
||||
[DataField] public string? FacialHair = null;
|
||||
}
|
||||
|
||||
@@ -28,10 +28,6 @@ public sealed class RandomHumanoidAppearanceSystem : EntitySystem
|
||||
//If we have a specified hair style, change it to this
|
||||
if(component.Hair != null)
|
||||
profile = profile.WithCharacterAppearance(profile.Appearance.WithHairStyleName(component.Hair));
|
||||
|
||||
//If we have a specified facial hair style, change it to this
|
||||
if(component.FacialHair != null)
|
||||
profile = profile.WithCharacterAppearance(profile.Appearance.WithFacialHairStyleName(component.FacialHair));
|
||||
|
||||
_humanoid.LoadProfile(uid, profile, humanoid);
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
using Content.Server.Chat.Managers;
|
||||
using Content.Shared._Friday31.AdminNotifyOnPickup;
|
||||
using Content.Shared.Hands;
|
||||
using Content.Shared.IdentityManagement;
|
||||
|
||||
namespace Content.Server._Friday31.AdminNotifyOnPickup;
|
||||
|
||||
public sealed class AdminNotifyOnPickupSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IChatManager _chatManager = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<AdminNotifyOnPickupComponent, ItemPickedUpEvent>(OnItemPickedUp);
|
||||
}
|
||||
|
||||
private void OnItemPickedUp(EntityUid uid, AdminNotifyOnPickupComponent component, ItemPickedUpEvent args)
|
||||
{
|
||||
if (string.IsNullOrEmpty(component.Message))
|
||||
return;
|
||||
|
||||
var playerName = Identity.Name(args.User, EntityManager);
|
||||
var itemName = MetaData(uid).EntityName;
|
||||
|
||||
var fullMessage = $"Игрок {playerName} {component.Message}";
|
||||
|
||||
_chatManager.SendAdminAnnouncement(fullMessage, null, null);
|
||||
}
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
using Content.Server.Administration.Systems;
|
||||
using Content.Shared._Friday31.AutoRevive;
|
||||
using Content.Shared._Friday31.Jason;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Mobs;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.Popups;
|
||||
using Content.Shared.Standing;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Timing;
|
||||
|
||||
namespace Content.Server._Friday31.AutoRevive;
|
||||
|
||||
public sealed class AutoReviveSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly MobStateSystem _mobState = default!;
|
||||
[Dependency] private readonly RejuvenateSystem _rejuvenate = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly StandingStateSystem _standing = default!;
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<AutoReviveComponent, MobStateChangedEvent>(OnMobStateChanged);
|
||||
}
|
||||
|
||||
public override void Update(float frameTime)
|
||||
{
|
||||
base.Update(frameTime);
|
||||
|
||||
var query = EntityQueryEnumerator<AutoReviveComponent, MobStateComponent>();
|
||||
var currentTime = _timing.CurTime;
|
||||
|
||||
while (query.MoveNext(out var uid, out var autoRevive, out var mobState))
|
||||
{
|
||||
if (!_mobState.IsDead(uid, mobState))
|
||||
continue;
|
||||
|
||||
if (autoRevive.DeathTime == null)
|
||||
continue;
|
||||
|
||||
var timeSinceDeath = currentTime - autoRevive.DeathTime.Value;
|
||||
if (timeSinceDeath.TotalSeconds < autoRevive.ReviveDelay)
|
||||
continue;
|
||||
|
||||
PerformAutoRevive(uid, autoRevive);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnMobStateChanged(EntityUid uid, AutoReviveComponent component, MobStateChangedEvent args)
|
||||
{
|
||||
if (args.NewMobState == MobState.Dead)
|
||||
{
|
||||
component.DeathTime = _timing.CurTime;
|
||||
|
||||
var message = Loc.GetString("auto-revive-death-message",
|
||||
("name", Name(uid)),
|
||||
("seconds", component.ReviveDelay));
|
||||
_popup.PopupEntity(message, uid, PopupType.LargeCaution);
|
||||
}
|
||||
}
|
||||
|
||||
private void PerformAutoRevive(EntityUid uid, AutoReviveComponent component)
|
||||
{
|
||||
_rejuvenate.PerformRejuvenate(uid);
|
||||
|
||||
var message = Loc.GetString("auto-revive-revived-message", ("name", Name(uid)));
|
||||
_popup.PopupEntity(message, uid, PopupType.Large);
|
||||
|
||||
_audio.PlayPvs("/Audio/_Friday31/jason_revive.ogg", uid, AudioParams.Default.WithVolume(5f));
|
||||
|
||||
_standing.Stand(uid);
|
||||
|
||||
if (TryComp<JasonDecapitateAbilityComponent>(uid, out var decapitateAbility) && decapitateAbility.ActionEntity != null)
|
||||
{
|
||||
_actions.StartUseDelay(decapitateAbility.ActionEntity);
|
||||
}
|
||||
|
||||
component.DeathTime = null;
|
||||
}
|
||||
}
|
||||
@@ -1,76 +0,0 @@
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Shared._Friday31.Jason;
|
||||
using Content.Shared._Shitmed.Body.Events;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Body.Components;
|
||||
using Content.Shared.Body.Part;
|
||||
using Content.Shared.CombatMode;
|
||||
using Content.Shared.Popups;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
|
||||
namespace Content.Server._Friday31.Jason;
|
||||
|
||||
public sealed class JasonDecapitateAbilitySystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly BodySystem _body = default!;
|
||||
[Dependency] private readonly SharedPopupSystem _popup = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<JasonDecapitateAbilityComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<JasonDecapitateAbilityComponent, DecapitateActionEvent>(OnDecapitate);
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, JasonDecapitateAbilityComponent component, MapInitEvent args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ActionEntity, component.Action);
|
||||
}
|
||||
|
||||
private void OnDecapitate(EntityUid uid, JasonDecapitateAbilityComponent component, DecapitateActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
if (!TryComp<CombatModeComponent>(uid, out var combatMode) || !combatMode.IsInCombatMode)
|
||||
return;
|
||||
|
||||
var target = args.Target;
|
||||
|
||||
if (!TryComp<BodyComponent>(target, out var body))
|
||||
return;
|
||||
|
||||
EntityUid? headPart = null;
|
||||
foreach (var (partId, part) in _body.GetBodyChildren(target, body))
|
||||
{
|
||||
if (part.PartType == BodyPartType.Head)
|
||||
{
|
||||
headPart = partId;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (headPart == null)
|
||||
{
|
||||
_popup.PopupEntity(Loc.GetString("jason-decapitate-no-head"), uid, uid);
|
||||
return;
|
||||
}
|
||||
|
||||
_chat.TryEmoteWithChat(target, "Scream");
|
||||
|
||||
var ev = new AmputateAttemptEvent(headPart.Value);
|
||||
RaiseLocalEvent(headPart.Value, ref ev);
|
||||
|
||||
if (args.Sound != null)
|
||||
_audio.PlayPvs(args.Sound, uid);
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("jason-decapitate-success", ("target", target)), uid, PopupType.LargeCaution);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
@@ -1,200 +0,0 @@
|
||||
using Content.Server.Humanoid;
|
||||
using Content.Server.Polymorph.Components;
|
||||
using Content.Server.Polymorph.Systems;
|
||||
using Content.Shared.Polymorph.Components;
|
||||
using Content.Shared._Friday31.Pennywise;
|
||||
using Content.Shared.ActionBlocker;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Mobs;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Mobs.Systems;
|
||||
using Content.Shared.StatusIcon.Components;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Content.Shared.Physics;
|
||||
using Robust.Shared.Physics;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
using Robust.Shared.Timing;
|
||||
using Content.Server.GameTicking;
|
||||
using Content.Shared.Eye;
|
||||
using Robust.Server.GameObjects;
|
||||
using Content.Shared.Revenant;
|
||||
using System.Linq;
|
||||
|
||||
namespace Content.Server._Friday31.Pennywise;
|
||||
|
||||
public sealed class PennywiseAbilitySystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly PolymorphSystem _polymorph = default!;
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
[Dependency] private readonly MetaDataSystem _meta = default!;
|
||||
[Dependency] private readonly MobThresholdSystem _mobThreshold = default!;
|
||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||
[Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!;
|
||||
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
[Dependency] private readonly IGameTiming _timing = default!;
|
||||
[Dependency] private readonly VisibilitySystem _visibility = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<PennywiseAbilityComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<PennywiseAbilityComponent, PennywiseChameleonEvent>(OnChameleonDisguise);
|
||||
SubscribeLocalEvent<PennywiseAbilityComponent, PennywisePhaseToggleEvent>(OnPhaseToggle);
|
||||
SubscribeLocalEvent<PennywiseAbilityComponent, PennywiseSpawnBalloonEvent>(OnSpawnBalloon);
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, PennywiseAbilityComponent component, MapInitEvent args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ChameleonActionEntity, component.ChameleonAction);
|
||||
_actions.AddAction(uid, ref component.PhaseToggleActionEntity, component.PhaseToggleAction);
|
||||
_actions.AddAction(uid, ref component.SpawnBalloonActionEntity, component.SpawnBalloonAction);
|
||||
|
||||
var phaseComp = EnsureComp<PennywisePhaseComponent>(uid);
|
||||
_actions.SetToggled(component.PhaseToggleActionEntity, phaseComp.IsPhasing);
|
||||
}
|
||||
|
||||
private void OnChameleonDisguise(EntityUid uid, PennywiseAbilityComponent component, PennywiseChameleonEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
var target = args.Target;
|
||||
|
||||
if (!_actionBlocker.CanInteract(uid, target))
|
||||
return;
|
||||
|
||||
if (HasComp<ChameleonDisguiseComponent>(target))
|
||||
return;
|
||||
|
||||
if (!_proto.TryIndex<EntityPrototype>("ChameleonProjector", out var projectorProto))
|
||||
return;
|
||||
|
||||
if (!projectorProto.TryGetComponent<ChameleonProjectorComponent>(out var projComp))
|
||||
return;
|
||||
|
||||
var polymorphConfig = projComp.Polymorph;
|
||||
var minHealth = projComp.MinHealth;
|
||||
var maxHealth = projComp.MaxHealth;
|
||||
var noRotAction = projComp.NoRotAction;
|
||||
var anchorAction = projComp.AnchorAction;
|
||||
|
||||
if (_polymorph.PolymorphEntity(uid, polymorphConfig) is not {} disguise)
|
||||
return;
|
||||
|
||||
var targetMeta = MetaData(target);
|
||||
_meta.SetEntityName(disguise, targetMeta.EntityName);
|
||||
_meta.SetEntityDescription(disguise, targetMeta.EntityDescription);
|
||||
|
||||
var comp = EnsureComp<ChameleonDisguiseComponent>(disguise);
|
||||
comp.SourceEntity = target;
|
||||
comp.SourceProto = Prototype(target)?.ID;
|
||||
Dirty(disguise, comp);
|
||||
|
||||
RemComp<StatusIconComponent>(disguise);
|
||||
|
||||
_appearance.CopyData(target, disguise);
|
||||
|
||||
if (TryComp<HumanoidAppearanceComponent>(target, out var sourceHumanoid))
|
||||
{
|
||||
var targetHumanoid = EnsureComp<HumanoidAppearanceComponent>(disguise);
|
||||
_humanoid.CloneAppearance(target, disguise, sourceHumanoid, targetHumanoid);
|
||||
}
|
||||
|
||||
var mass = CompOrNull<PhysicsComponent>(target)?.Mass ?? 0f;
|
||||
if (TryComp<MobThresholdsComponent>(disguise, out var thresholds))
|
||||
{
|
||||
var playerMax = _mobThreshold.GetThresholdForState(uid, MobState.Dead).Float();
|
||||
var max = playerMax == 0f ? maxHealth : Math.Max(maxHealth, playerMax);
|
||||
var health = Math.Clamp(mass, minHealth, maxHealth);
|
||||
|
||||
_mobThreshold.SetMobStateThreshold(disguise, health, MobState.Critical, thresholds);
|
||||
_mobThreshold.SetMobStateThreshold(disguise, max, MobState.Dead, thresholds);
|
||||
}
|
||||
|
||||
_actions.AddAction(disguise, noRotAction);
|
||||
_actions.AddAction(disguise, anchorAction);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnPhaseToggle(EntityUid uid, PennywiseAbilityComponent component, PennywisePhaseToggleEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
if (!TryComp<PennywisePhaseComponent>(uid, out var phaseComp))
|
||||
return;
|
||||
|
||||
var currentTime = _timing.CurTime;
|
||||
if ((currentTime - phaseComp.LastToggleTime).TotalSeconds < phaseComp.Cooldown)
|
||||
return;
|
||||
|
||||
if (!TryComp<FixturesComponent>(uid, out var fixtures) || fixtures.FixtureCount < 1)
|
||||
return;
|
||||
|
||||
phaseComp.IsPhasing = !phaseComp.IsPhasing;
|
||||
phaseComp.LastToggleTime = currentTime;
|
||||
|
||||
var fixture = fixtures.Fixtures.First();
|
||||
|
||||
if (phaseComp.IsPhasing)
|
||||
{
|
||||
_physics.SetHard(uid, fixture.Value, false, fixtures);
|
||||
_physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int)CollisionGroup.GhostImpassable, fixtures);
|
||||
_physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, 0, fixtures);
|
||||
|
||||
if (TryComp<VisibilityComponent>(uid, out var visibility))
|
||||
{
|
||||
_visibility.AddLayer((uid, visibility), (int)VisibilityFlags.Ghost, false);
|
||||
_visibility.RefreshVisibility(uid, visibility);
|
||||
}
|
||||
|
||||
_appearance.SetData(uid, RevenantVisuals.Corporeal, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
_physics.SetHard(uid, fixture.Value, true, fixtures);
|
||||
_physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int)CollisionGroup.SmallMobMask, fixtures);
|
||||
_physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, (int)CollisionGroup.SmallMobLayer, fixtures);
|
||||
|
||||
if (TryComp<VisibilityComponent>(uid, out var visibility))
|
||||
{
|
||||
_visibility.RemoveLayer((uid, visibility), (int)VisibilityFlags.Ghost, false);
|
||||
_visibility.RefreshVisibility(uid, visibility);
|
||||
}
|
||||
|
||||
_appearance.SetData(uid, RevenantVisuals.Corporeal, true);
|
||||
}
|
||||
|
||||
_actions.SetToggled(component.PhaseToggleActionEntity, phaseComp.IsPhasing);
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnSpawnBalloon(EntityUid uid, PennywiseAbilityComponent component, PennywiseSpawnBalloonEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
var currentTime = _timing.CurTime;
|
||||
if ((currentTime - component.LastBalloonSpawn).TotalSeconds < component.BalloonCooldown)
|
||||
return;
|
||||
|
||||
if (component.BalloonPrototypes.Count == 0)
|
||||
return;
|
||||
|
||||
var random = new System.Random();
|
||||
var balloonProto = component.BalloonPrototypes[random.Next(component.BalloonPrototypes.Count)];
|
||||
|
||||
var balloon = Spawn(balloonProto, Transform(uid).Coordinates);
|
||||
|
||||
component.LastBalloonSpawn = currentTime;
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
@@ -1,78 +0,0 @@
|
||||
using Content.Shared._Friday31.Slenderman;
|
||||
using Content.Shared.Actions;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Player;
|
||||
|
||||
namespace Content.Server._Friday31.Slenderman;
|
||||
|
||||
public sealed class SlendermanAlertSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<SlendermanAlertComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<SlendermanAlertComponent, SlendermanAlertEvent>(OnAlert);
|
||||
SubscribeLocalEvent<SlendermanAlertComponent, ComponentShutdown>(OnShutdown);
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, SlendermanAlertComponent component, MapInitEvent args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ActionEntity, component.Action);
|
||||
_actions.SetToggled(component.ActionEntity, component.IsActive);
|
||||
}
|
||||
|
||||
private void OnAlert(EntityUid uid, SlendermanAlertComponent component, SlendermanAlertEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
component.IsActive = !component.IsActive;
|
||||
|
||||
if (component.IsActive)
|
||||
{
|
||||
StartAlert(uid, component);
|
||||
}
|
||||
else
|
||||
{
|
||||
StopAlert(uid, component);
|
||||
}
|
||||
|
||||
_actions.SetToggled(component.ActionEntity, component.IsActive);
|
||||
|
||||
Dirty(uid, component);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OnShutdown(EntityUid uid, SlendermanAlertComponent component, ComponentShutdown args)
|
||||
{
|
||||
StopAlert(uid, component);
|
||||
}
|
||||
|
||||
private void StartAlert(EntityUid uid, SlendermanAlertComponent component)
|
||||
{
|
||||
StopAlert(uid, component);
|
||||
var audioParams = AudioParams.Default
|
||||
.WithLoop(true)
|
||||
.WithMaxDistance(component.MaxDistance)
|
||||
.WithReferenceDistance(component.ReferenceDistance)
|
||||
.WithVolume(5f);
|
||||
|
||||
component.SoundStream = _audio.PlayPvs(component.AlertSound, uid, audioParams)?.Entity;
|
||||
Dirty(uid, component);
|
||||
}
|
||||
|
||||
private void StopAlert(EntityUid uid, SlendermanAlertComponent component)
|
||||
{
|
||||
if (component.SoundStream != null)
|
||||
{
|
||||
_audio.Stop(component.SoundStream.Value);
|
||||
component.SoundStream = null;
|
||||
Dirty(uid, component);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
using Content.Server.Body.Systems;
|
||||
using Content.Server.Chat.Systems;
|
||||
using Content.Shared._Friday31.Slenderman;
|
||||
using Content.Shared._Shitmed.Body.Events;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Body.Components;
|
||||
using Content.Shared.Body.Part;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Log;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server._Friday31.Slenderman;
|
||||
|
||||
public sealed class SlendermanDismemberAbilitySystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly BodySystem _body = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
|
||||
private ISawmill _sawmill = default!;
|
||||
|
||||
private static readonly string[] FleshSounds = new[]
|
||||
{
|
||||
"/Audio/Weapons/Xeno/alien_claw_flesh1.ogg",
|
||||
"/Audio/Weapons/Xeno/alien_claw_flesh2.ogg",
|
||||
"/Audio/Weapons/Xeno/alien_claw_flesh3.ogg"
|
||||
};
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
_sawmill = Logger.GetSawmill("slenderman.dismember");
|
||||
SubscribeLocalEvent<SlendermanDismemberAbilityComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<SlendermanDismemberAbilityComponent, SlendermanDismemberActionEvent>(OnDismember);
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, SlendermanDismemberAbilityComponent component, MapInitEvent args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ActionEntity, component.Action);
|
||||
}
|
||||
|
||||
private void OnDismember(EntityUid uid, SlendermanDismemberAbilityComponent component, SlendermanDismemberActionEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
var target = args.Target;
|
||||
|
||||
if (!TryComp<BodyComponent>(target, out var body))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var partsToRemove = new List<EntityUid>();
|
||||
foreach (var (partId, part) in _body.GetBodyChildren(target, body))
|
||||
{
|
||||
if (part.PartType is BodyPartType.Arm or BodyPartType.Hand or BodyPartType.Leg or BodyPartType.Foot or BodyPartType.Head)
|
||||
{
|
||||
partsToRemove.Add(partId);
|
||||
}
|
||||
}
|
||||
|
||||
if (partsToRemove.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_chat.TryEmoteWithChat(target, "Scream");
|
||||
if (TryComp<ActorComponent>(target, out var actor))
|
||||
{
|
||||
var screamerEvent = new SlendermanScreamerEvent(component.ScreamerDuration);
|
||||
RaiseNetworkEvent(screamerEvent, actor.PlayerSession);
|
||||
_sawmill.Info($"Sent screamer event to player {actor.PlayerSession.Name} with duration {component.ScreamerDuration}");
|
||||
}
|
||||
else
|
||||
{
|
||||
_sawmill.Warning($"Target {target} has no ActorComponent, screamer not sent!");
|
||||
}
|
||||
|
||||
if (args.DismemberSound != null)
|
||||
{
|
||||
_audio.PlayPvs(args.DismemberSound, uid, AudioParams.Default.WithMaxDistance(args.SoundRange));
|
||||
}
|
||||
|
||||
var fleshSound = _random.Pick(FleshSounds);
|
||||
_audio.PlayPvs(fleshSound, target);
|
||||
|
||||
foreach (var part in partsToRemove)
|
||||
{
|
||||
var ev = new AmputateAttemptEvent(part);
|
||||
RaiseLocalEvent(part, ref ev);
|
||||
}
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
@@ -1,90 +0,0 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Stealth;
|
||||
using Content.Shared._Friday31.Slenderman;
|
||||
using Content.Shared.Actions;
|
||||
using Content.Shared.Physics;
|
||||
using Content.Shared.Stealth.Components;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Audio.Systems;
|
||||
using Robust.Shared.Physics;
|
||||
using Robust.Shared.Physics.Components;
|
||||
using Robust.Shared.Physics.Systems;
|
||||
|
||||
namespace Content.Server._Friday31.Slenderman;
|
||||
|
||||
public sealed class SlendermanShadowWalkSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedActionsSystem _actions = default!;
|
||||
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||
[Dependency] private readonly StealthSystem _stealth = default!;
|
||||
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<SlendermanShadowWalkComponent, MapInitEvent>(OnMapInit);
|
||||
SubscribeLocalEvent<SlendermanShadowWalkComponent, SlendermanShadowWalkEvent>(OnShadowWalk);
|
||||
}
|
||||
|
||||
private void OnMapInit(EntityUid uid, SlendermanShadowWalkComponent component, MapInitEvent args)
|
||||
{
|
||||
_actions.AddAction(uid, ref component.ActionEntity, component.Action);
|
||||
_actions.SetToggled(component.ActionEntity, component.InShadow);
|
||||
}
|
||||
|
||||
private void OnShadowWalk(EntityUid uid, SlendermanShadowWalkComponent component, SlendermanShadowWalkEvent args)
|
||||
{
|
||||
if (args.Handled)
|
||||
return;
|
||||
|
||||
component.InShadow = !component.InShadow;
|
||||
|
||||
if (component.InShadow)
|
||||
{
|
||||
EnterShadow(uid, component);
|
||||
}
|
||||
else
|
||||
{
|
||||
ExitShadow(uid, component);
|
||||
}
|
||||
_actions.SetToggled(component.ActionEntity, component.InShadow);
|
||||
|
||||
Dirty(uid, component);
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void EnterShadow(EntityUid uid, SlendermanShadowWalkComponent component)
|
||||
{
|
||||
var stealth = EnsureComp<StealthComponent>(uid);
|
||||
_stealth.SetVisibility(uid, 0f, stealth);
|
||||
|
||||
if (!TryComp<FixturesComponent>(uid, out var fixtures) || fixtures.FixtureCount < 1)
|
||||
return;
|
||||
|
||||
var fixture = fixtures.Fixtures.First();
|
||||
_physics.SetHard(uid, fixture.Value, false, fixtures);
|
||||
_physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int)CollisionGroup.GhostImpassable, fixtures);
|
||||
_physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, 0, fixtures);
|
||||
|
||||
_audio.PlayPvs("/Audio/Effects/teleport_arrival.ogg", uid);
|
||||
}
|
||||
|
||||
private void ExitShadow(EntityUid uid, SlendermanShadowWalkComponent component)
|
||||
{
|
||||
if (TryComp<StealthComponent>(uid, out var stealth))
|
||||
{
|
||||
RemComp<StealthComponent>(uid);
|
||||
}
|
||||
|
||||
if (!TryComp<FixturesComponent>(uid, out var fixtures) || fixtures.FixtureCount < 1)
|
||||
return;
|
||||
|
||||
var fixture = fixtures.Fixtures.First();
|
||||
_physics.SetHard(uid, fixture.Value, true, fixtures);
|
||||
_physics.SetCollisionMask(uid, fixture.Key, fixture.Value, (int)CollisionGroup.MobMask, fixtures);
|
||||
_physics.SetCollisionLayer(uid, fixture.Key, fixture.Value, (int)CollisionGroup.MobLayer, fixtures);
|
||||
|
||||
_audio.PlayPvs("/Audio/Effects/teleport_departure.ogg", uid);
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._Friday31.AdminNotifyOnPickup;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class AdminNotifyOnPickupComponent : Component
|
||||
{
|
||||
[DataField(required: true)]
|
||||
public string Message = string.Empty;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._Friday31.AutoRevive;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class AutoReviveComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public float ReviveDelay = 3f;
|
||||
|
||||
[DataField]
|
||||
public TimeSpan? DeathTime;
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
using Content.Shared.Actions;
|
||||
using Robust.Shared.Audio;
|
||||
|
||||
namespace Content.Shared._Friday31.Jason;
|
||||
|
||||
public sealed partial class DecapitateActionEvent : EntityTargetActionEvent
|
||||
{
|
||||
[DataField]
|
||||
public SoundSpecifier? Sound;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Friday31.Jason;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class JasonDecapitateAbilityComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId Action = "ActionJasonDecapitate";
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? ActionEntity;
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Friday31.Pennywise;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed partial class PennywiseAbilityComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId ChameleonAction = "ActionPennywiseChameleon";
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? ChameleonActionEntity;
|
||||
|
||||
[DataField]
|
||||
public EntProtoId PhaseToggleAction = "ActionPennywisePhaseToggle";
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? PhaseToggleActionEntity;
|
||||
|
||||
[DataField]
|
||||
public EntProtoId SpawnBalloonAction = "ActionPennywiseSpawnBalloon";
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
public EntityUid? SpawnBalloonActionEntity;
|
||||
|
||||
[DataField]
|
||||
public List<EntProtoId> BalloonPrototypes = new()
|
||||
{
|
||||
"BalloonSyn"
|
||||
};
|
||||
|
||||
[DataField]
|
||||
public float BalloonCooldown = 5f;
|
||||
|
||||
public TimeSpan LastBalloonSpawn = TimeSpan.Zero;
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
using Content.Shared.Actions;
|
||||
|
||||
namespace Content.Shared._Friday31.Pennywise;
|
||||
|
||||
public sealed partial class PennywiseChameleonEvent : EntityTargetActionEvent;
|
||||
|
||||
public sealed partial class PennywisePhaseToggleEvent : InstantActionEvent;
|
||||
|
||||
public sealed partial class PennywiseSpawnBalloonEvent : InstantActionEvent;
|
||||
@@ -1,17 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Friday31.Pennywise;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class PennywiseNoclipComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId Action = "ActionPennywiseNoclip";
|
||||
|
||||
[DataField]
|
||||
public EntityUid? ActionEntity;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool IsNoclip;
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._Friday31.Pennywise;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class PennywisePhaseComponent : Component
|
||||
{
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField]
|
||||
public bool IsPhasing = false;
|
||||
|
||||
[DataField]
|
||||
public float Cooldown = 3f;
|
||||
|
||||
public TimeSpan LastToggleTime = TimeSpan.Zero;
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Friday31.Slenderman;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class SlendermanAlertComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId Action = "ActionSlendermanAlert";
|
||||
|
||||
[DataField]
|
||||
public EntityUid? ActionEntity;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool IsActive;
|
||||
|
||||
[DataField]
|
||||
public SoundSpecifier AlertSound = new SoundPathSpecifier("/Audio/_Friday31/slender/slenderman-sound-cut.ogg");
|
||||
|
||||
[DataField]
|
||||
public float MaxDistance = 30f;
|
||||
|
||||
[DataField]
|
||||
public float ReferenceDistance = 5f;
|
||||
|
||||
[DataField]
|
||||
public EntityUid? SoundStream;
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
using Content.Shared.Actions;
|
||||
|
||||
namespace Content.Shared._Friday31.Slenderman;
|
||||
|
||||
public sealed partial class SlendermanAlertEvent : InstantActionEvent
|
||||
{
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Friday31.Slenderman;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class SlendermanDismemberAbilityComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId Action = "ActionSlendermanDismember";
|
||||
|
||||
[DataField]
|
||||
public EntityUid? ActionEntity;
|
||||
|
||||
[DataField]
|
||||
public float ScreamerDuration = 5f;
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using Content.Shared.Actions;
|
||||
using Robust.Shared.Audio;
|
||||
using Robust.Shared.Serialization;
|
||||
|
||||
namespace Content.Shared._Friday31.Slenderman;
|
||||
|
||||
public sealed partial class SlendermanDismemberActionEvent : EntityTargetActionEvent
|
||||
{
|
||||
[DataField]
|
||||
public SoundSpecifier? DismemberSound;
|
||||
|
||||
[DataField]
|
||||
public float SoundRange = 10f;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class SlendermanScreamerEvent : EntityEventArgs
|
||||
{
|
||||
public float Duration;
|
||||
|
||||
public SlendermanScreamerEvent(float duration)
|
||||
{
|
||||
Duration = duration;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
using Robust.Shared.GameStates;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._Friday31.Slenderman;
|
||||
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class SlendermanShadowWalkComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public EntProtoId Action = "ActionSlendermanShadowWalk";
|
||||
|
||||
[DataField]
|
||||
public EntityUid? ActionEntity;
|
||||
|
||||
[DataField, AutoNetworkedField]
|
||||
public bool InShadow;
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
using Content.Shared.Actions;
|
||||
|
||||
namespace Content.Shared._Friday31.Slenderman;
|
||||
|
||||
public sealed partial class SlendermanShadowWalkEvent : InstantActionEvent
|
||||
{
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
jason-decapitate-no-head = Ты че дебил?
|
||||
jason-decapitate-success = Нихуя ты мощный
|
||||
|
||||
auto-revive-death-message = {$name} повержен, но его нельзя убить...
|
||||
auto-revive-revived-message = {$name} вернулся из ада.
|
||||
@@ -1,38 +0,0 @@
|
||||
ent-ClothingMaskPennywise = маска Пеннивайза
|
||||
.desc = Жуткая клоунская маска.
|
||||
ent-ClothingMaskPennywiseUnremoveable = маска Пеннивайза
|
||||
.desc = Жуткая клоунская маска. Её невозможно снять.
|
||||
.suffix = Неснимаемая
|
||||
|
||||
ent-ClothingUniformJumpsuitPennywise = костюм клоуна
|
||||
.desc = Клоунский костюм.
|
||||
.suffix = Неснимаемый
|
||||
ent-ClothingBackpackPennywise = рюкзак клоуна
|
||||
.desc = Рюкзак для хранения хонков.
|
||||
.suffix = Неснимаемый
|
||||
ent-ClothingShoesPennywise = ботинки клоуна
|
||||
.desc = Большие забавные ботинки.
|
||||
.suffix = Неснимаемые
|
||||
ent-ClothingHeadsetPennywise = гарнитура сервиса
|
||||
.desc = Гарнитура для связи.
|
||||
.suffix = Неснимаемая
|
||||
|
||||
ent-MobPennywise = Пеннивайз
|
||||
.desc = Мы все здесь плаваем... и ты тоже будешь плавать.
|
||||
|
||||
ent-SpawnMobPennywise = спавнер Пеннивайза
|
||||
.suffix = Friday31 Event
|
||||
.desc = Спавнит Пеннивайза для Хэллоуин ивента.
|
||||
|
||||
ghost-role-information-pennywise-name = Пеннивайз
|
||||
ghost-role-information-pennywise-description = Ты - Пеннивайз, танцующий клоун из глубин канализации. Твоя цель - наводить ужас на станцию.
|
||||
ghost-role-information-pennywise-rules = Будь зловещим и жутким клоуном.
|
||||
|
||||
ent-ActionPennywiseChameleon = Маскировка оборотня
|
||||
.desc = Маскировка под объект окружения. Маскировка разрушается при взятии в руки или деактивации.
|
||||
|
||||
ent-ActionPennywisePhaseToggle = Фазовый проход
|
||||
.desc = Переключает способность проходить сквозь стены. В фазовом режиме вы становитесь полупрозрачным и можете проходить сквозь препятствия.
|
||||
|
||||
ent-ActionPennywiseSpawnBalloon = Создать шарик
|
||||
.desc = Создает шарик.
|
||||
1377715
Resources/Maps/_Event/Lake.yml
@@ -1,48 +0,0 @@
|
||||
# Base
|
||||
- type: dungeonRoom
|
||||
id: RoomsRoomsHouse1
|
||||
size: 9,14
|
||||
atlas: Maps/_Event/LakeGen.yml
|
||||
offset: 1,1
|
||||
ignoreTile: FloorShuttleOrange
|
||||
tags: [ RoomsHouse1 ]
|
||||
|
||||
- type: dungeonRoom
|
||||
id: RoomsRoomsHouse2
|
||||
size: 9,14
|
||||
atlas: Maps/_Event/LakeGen.yml
|
||||
offset: 1,16
|
||||
ignoreTile: FloorShuttleOrange
|
||||
tags: [ RoomsHouse2 ]
|
||||
|
||||
- type: dungeonRoom
|
||||
id: RoomsRoomsHouse3
|
||||
size: 14,9
|
||||
atlas: Maps/_Event/LakeGen.yml
|
||||
offset: 1,31
|
||||
ignoreTile: FloorShuttleOrange
|
||||
tags: [ RoomsHouse1 ]
|
||||
|
||||
- type: dungeonRoom
|
||||
id: RoomsRoomsHouse4
|
||||
size: 14,9
|
||||
atlas: Maps/_Event/LakeGen.yml
|
||||
offset: 1,41
|
||||
ignoreTile: FloorShuttleOrange
|
||||
tags: [ RoomsHouse2 ]
|
||||
|
||||
- type: dungeonRoom
|
||||
id: RoomsRoomsHouseCafe1
|
||||
size: 27,18
|
||||
atlas: Maps/_Event/LakeGen.yml
|
||||
offset: 1,51
|
||||
ignoreTile: FloorShuttleOrange
|
||||
tags: [ RoomsHouse1 ]
|
||||
|
||||
- type: dungeonRoom
|
||||
id: RoomsRoomsHouseLead1
|
||||
size: 18,11
|
||||
atlas: Maps/_Event/LakeGen.yml
|
||||
offset: 1,70
|
||||
ignoreTile: FloorShuttleOrange
|
||||
tags: [ RoomsHouse1 ]
|
||||
@@ -1,156 +0,0 @@
|
||||
# Hpuse
|
||||
- type: entity
|
||||
id: RoomSpawnerHouse1
|
||||
name: Room marker HE HOUSE
|
||||
parent: BaseRoomMarker
|
||||
suffix: Halloween, House1, S
|
||||
components:
|
||||
- type: RoomFill
|
||||
clearExisting: True
|
||||
minSize: 9,14
|
||||
maxSize: 9,14
|
||||
roomWhitelist:
|
||||
tags:
|
||||
- RoomsHouse1
|
||||
rotation: false
|
||||
- type: Sprite
|
||||
granularLayersRendering: true
|
||||
alpha: 0.25
|
||||
layers:
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
offset: 2, 2
|
||||
scale: 4, 4
|
||||
renderingStrategy: NoRotation
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
|
||||
- type: entity
|
||||
id: RoomSpawnerHouse2
|
||||
name: Room marker HE HOUSE
|
||||
parent: BaseRoomMarker
|
||||
suffix: Halloween, House2, N
|
||||
components:
|
||||
- type: RoomFill
|
||||
clearExistingAll: True
|
||||
minSize: 9,14
|
||||
maxSize: 9,14
|
||||
roomWhitelist:
|
||||
tags:
|
||||
- RoomsHouse2
|
||||
rotation: false
|
||||
- type: Sprite
|
||||
granularLayersRendering: true
|
||||
alpha: 0.25
|
||||
layers:
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
offset: 2, 2
|
||||
scale: 4, 4
|
||||
renderingStrategy: NoRotation
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
|
||||
- type: entity
|
||||
id: RoomSpawnerHouse3
|
||||
name: Room marker HE HOUSE
|
||||
parent: BaseRoomMarker
|
||||
suffix: Halloween, House3, E
|
||||
components:
|
||||
- type: RoomFill
|
||||
clearExistingAll: True
|
||||
minSize: 14,9
|
||||
maxSize: 14,9
|
||||
roomWhitelist:
|
||||
tags:
|
||||
- RoomsHouse1
|
||||
rotation: false
|
||||
- type: Sprite
|
||||
granularLayersRendering: true
|
||||
alpha: 0.25
|
||||
layers:
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
offset: 2, 2
|
||||
scale: 4, 4
|
||||
renderingStrategy: NoRotation
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
|
||||
- type: entity
|
||||
id: RoomSpawnerHouse4
|
||||
name: Room marker HE HOUSE
|
||||
parent: BaseRoomMarker
|
||||
suffix: Halloween, House4, W
|
||||
components:
|
||||
- type: RoomFill
|
||||
clearExistingAll: True
|
||||
minSize: 14,9
|
||||
maxSize: 14,9
|
||||
roomWhitelist:
|
||||
tags:
|
||||
- RoomsHouse2
|
||||
rotation: false
|
||||
- type: Sprite
|
||||
granularLayersRendering: true
|
||||
alpha: 0.25
|
||||
layers:
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
offset: 2, 2
|
||||
scale: 4, 4
|
||||
renderingStrategy: NoRotation
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
|
||||
- type: entity
|
||||
id: RoomSpawnerHouseCafe1
|
||||
name: Room marker HE HOUSE
|
||||
parent: BaseRoomMarker
|
||||
suffix: Halloween, House1, E, Cafe
|
||||
components:
|
||||
- type: RoomFill
|
||||
clearExistingAll: True
|
||||
minSize: 27,18
|
||||
maxSize: 27,18
|
||||
roomWhitelist:
|
||||
tags:
|
||||
- RoomsHouse1
|
||||
rotation: false
|
||||
- type: Sprite
|
||||
granularLayersRendering: true
|
||||
alpha: 0.25
|
||||
layers:
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
offset: 2, 2
|
||||
scale: 4, 4
|
||||
renderingStrategy: NoRotation
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
|
||||
- type: entity
|
||||
id: RoomSpawnerHouseLead1
|
||||
name: Room marker HE HOUSE
|
||||
parent: BaseRoomMarker
|
||||
suffix: Halloween, House1, E, Lead
|
||||
components:
|
||||
- type: RoomFill
|
||||
clearExistingAll: True
|
||||
minSize: 18,11
|
||||
maxSize: 18,11
|
||||
roomWhitelist:
|
||||
tags:
|
||||
- RoomsHouse1
|
||||
rotation: false
|
||||
- type: Sprite
|
||||
granularLayersRendering: true
|
||||
alpha: 0.25
|
||||
layers:
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
offset: 2, 2
|
||||
scale: 4, 4
|
||||
renderingStrategy: NoRotation
|
||||
- sprite: Objects/Specific/Hydroponics/tobacco.rsi
|
||||
state: produce
|
||||
@@ -1,7 +0,0 @@
|
||||
# House
|
||||
- type: Tag
|
||||
id: RoomsHouse1
|
||||
|
||||
- type: Tag
|
||||
id: RoomsHouse2
|
||||
|
||||
@@ -1,107 +0,0 @@
|
||||
- type: tile
|
||||
id: FloorGrassHW
|
||||
editorHidden: false
|
||||
name: tiles-grass-hw
|
||||
sprite: /Textures/_Event/Tiles/Planet/Grass/grass.png
|
||||
variants: 4
|
||||
placementVariants:
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
edgeSpritePriority: 7
|
||||
edgeSprites:
|
||||
SouthEast: /Textures/_Event/Tiles/Planet/Grass/single_edge_SE.png
|
||||
NorthEast: /Textures/_Event/Tiles/Planet/Grass/single_edge_NE.png
|
||||
NorthWest: /Textures/_Event/Tiles/Planet/Grass/single_edge_NW.png
|
||||
SouthWest: /Textures/_Event/Tiles/Planet/Grass/single_edge_SW.png
|
||||
South: /Textures/_Event/Tiles/Planet/Grass/double_edge_S.png
|
||||
East: /Textures/_Event/Tiles/Planet/Grass/double_edge_E.png
|
||||
North: /Textures/_Event/Tiles/Planet/Grass/double_edge_N.png
|
||||
West: /Textures/_Event/Tiles/Planet/Grass/double_edge_W.png
|
||||
isSubfloor: false
|
||||
footstepSounds:
|
||||
collection: FootstepGrass
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
|
||||
- type: tile
|
||||
id: FloorGrassLightHW
|
||||
editorHidden: false
|
||||
name: tiles-grass-light-hw
|
||||
sprite: /Textures/_Event/Tiles/Planet/GrassLight/grass.png
|
||||
variants: 4
|
||||
placementVariants:
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
edgeSpritePriority: 8
|
||||
edgeSprites:
|
||||
SouthEast: /Textures/_Event/Tiles/Planet/GrassLight/single_edge_SE.png
|
||||
NorthEast: /Textures/_Event/Tiles/Planet/GrassLight/single_edge_NE.png
|
||||
NorthWest: /Textures/_Event/Tiles/Planet/GrassLight/single_edge_NW.png
|
||||
SouthWest: /Textures/_Event/Tiles/Planet/GrassLight/single_edge_SW.png
|
||||
South: /Textures/_Event/Tiles/Planet/GrassLight/double_edge_S.png
|
||||
East: /Textures/_Event/Tiles/Planet/GrassLight/double_edge_E.png
|
||||
North: /Textures/_Event/Tiles/Planet/GrassLight/double_edge_N.png
|
||||
West: /Textures/_Event/Tiles/Planet/GrassLight/double_edge_W.png
|
||||
isSubfloor: false
|
||||
footstepSounds:
|
||||
collection: FootstepGrass
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
|
||||
- type: tile
|
||||
id: FloorGrassDarkHW
|
||||
editorHidden: false
|
||||
name: tiles-grass-dark-hw
|
||||
sprite: /Textures/_Event/Tiles/Planet/GrassDark/grass.png
|
||||
variants: 4
|
||||
placementVariants:
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
edgeSpritePriority: 6
|
||||
edgeSprites:
|
||||
SouthEast: /Textures/_Event/Tiles/Planet/GrassDark/single_edge_SE.png
|
||||
NorthEast: /Textures/_Event/Tiles/Planet/GrassDark/single_edge_NE.png
|
||||
NorthWest: /Textures/_Event/Tiles/Planet/GrassDark/single_edge_NW.png
|
||||
SouthWest: /Textures/_Event/Tiles/Planet/GrassDark/single_edge_SW.png
|
||||
South: /Textures/_Event/Tiles/Planet/GrassDark/double_edge_S.png
|
||||
East: /Textures/_Event/Tiles/Planet/GrassDark/double_edge_E.png
|
||||
North: /Textures/_Event/Tiles/Planet/GrassDark/double_edge_N.png
|
||||
West: /Textures/_Event/Tiles/Planet/GrassDark/double_edge_W.png
|
||||
isSubfloor: false
|
||||
footstepSounds:
|
||||
collection: FootstepGrass
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
|
||||
- type: tile
|
||||
id: FloorGrassDarkWoodHW
|
||||
editorHidden: false
|
||||
name: tiles-grass-darkwood-hw
|
||||
sprite: /Textures/_Event/Tiles/Planet/GrassDarkwood/grass.png
|
||||
variants: 4
|
||||
placementVariants:
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
- 1.0
|
||||
edgeSpritePriority: 5
|
||||
edgeSprites:
|
||||
SouthEast: /Textures/_Event/Tiles/Planet/GrassDarkwood/single_edge_SE.png
|
||||
NorthEast: /Textures/_Event/Tiles/Planet/GrassDarkwood/single_edge_NE.png
|
||||
NorthWest: /Textures/_Event/Tiles/Planet/GrassDarkwood/single_edge_NW.png
|
||||
SouthWest: /Textures/_Event/Tiles/Planet/GrassDarkwood/single_edge_SW.png
|
||||
South: /Textures/_Event/Tiles/Planet/GrassDarkwood/double_edge_S.png
|
||||
East: /Textures/_Event/Tiles/Planet/GrassDarkwood/double_edge_E.png
|
||||
North: /Textures/_Event/Tiles/Planet/GrassDarkwood/double_edge_N.png
|
||||
West: /Textures/_Event/Tiles/Planet/GrassDarkwood/double_edge_W.png
|
||||
isSubfloor: false
|
||||
footstepSounds:
|
||||
collection: FootstepGrass
|
||||
heatCapacity: 10000
|
||||
weather: true
|
||||
@@ -1,25 +0,0 @@
|
||||
- type: entity
|
||||
parent: ClothingNeckBase
|
||||
id: ClothingNeckCrossFriday31Gold
|
||||
name: золотой крестик
|
||||
description: Осталось найти серебряный.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Friday31/Clothing/Neck/gold-cross.rsi
|
||||
- type: Clothing
|
||||
sprite: _Friday31/Clothing/Neck/gold-cross.rsi
|
||||
- type: AdminNotifyOnPickup
|
||||
message: подобрал золотой крестик
|
||||
|
||||
- type: entity
|
||||
parent: ClothingNeckBase
|
||||
id: ClothingNeckCrossFriday31Silver
|
||||
name: серебряный крестик
|
||||
description: Осталось найти золотой.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Friday31/Clothing/Neck/silver-cross.rsi
|
||||
- type: Clothing
|
||||
sprite: _Friday31/Clothing/Neck/silver-cross.rsi
|
||||
- type: AdminNotifyOnPickup
|
||||
message: подобрал серебряный крестик
|
||||
@@ -1,18 +0,0 @@
|
||||
- type: entity
|
||||
id: ActionJasonDecapitate
|
||||
name: Обезглавить
|
||||
description: Отрубить голову жертве одним мощным ударом.
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: EntityTargetAction
|
||||
useDelay: 120
|
||||
range: 1.5
|
||||
canTargetSelf: false
|
||||
itemIconStyle: BigAction
|
||||
icon: _Friday31/Actions/machete.png
|
||||
whitelist:
|
||||
components:
|
||||
- Body
|
||||
event: !type:DecapitateActionEvent
|
||||
sound:
|
||||
path: /Audio/_Friday31/jason_revive.ogg
|
||||
@@ -1,90 +0,0 @@
|
||||
- type: entity
|
||||
parent: ClothingMaskBase
|
||||
id: ClothingMaskHorror
|
||||
name: Жуткая хоккейная маска
|
||||
description: Ужасающая маска, вселяющая страх в сердца тех, кто ее видит.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Friday31/Clothing/Mask/horror-mask.rsi
|
||||
state: icon
|
||||
- type: Clothing
|
||||
sprite: _Friday31/Clothing/Mask/horror-mask.rsi
|
||||
clothingVisuals:
|
||||
mask:
|
||||
- state: mask-on
|
||||
- type: IdentityBlocker
|
||||
- type: Tag
|
||||
tags:
|
||||
- WhitelistChameleon
|
||||
- type: FlavorProfile
|
||||
flavors:
|
||||
- plastic
|
||||
|
||||
- type: entity
|
||||
parent: ClothingMaskHorror
|
||||
id: JasonHorrorMask
|
||||
suffix: Unremoveable
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: Machete
|
||||
id: JasonMachete
|
||||
suffix: Unremoveable
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingUniformJumpsuitExplorerDeltaV
|
||||
id: JasonJumpsuit
|
||||
suffix: Unremoveable
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingOuterCoatJacketBiker
|
||||
id: JasonJacket
|
||||
suffix: Unremoveable
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingShoesLeather
|
||||
id: JasonShoes
|
||||
suffix: Unremoveable
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingHandsGlovesColorBlack
|
||||
id: JasonGloves
|
||||
suffix: Unremoveable
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingBackpackDuffel
|
||||
id: JasonBackpack
|
||||
suffix: Unremoveable
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: startingGear
|
||||
id: JasonVoorheesGear
|
||||
equipment:
|
||||
mask: JasonHorrorMask
|
||||
jumpsuit: JasonJumpsuit
|
||||
outerClothing: JasonJacket
|
||||
shoes: JasonShoes
|
||||
gloves: JasonGloves
|
||||
back: JasonBackpack
|
||||
inhand:
|
||||
- JasonMachete
|
||||
storage:
|
||||
back:
|
||||
- BodyBagFolded
|
||||
- BodyBagFolded
|
||||
- BodyBagFolded
|
||||
- BodyBagFolded
|
||||
- BodyBagFolded
|
||||
- CrayonRed
|
||||
@@ -1,7 +0,0 @@
|
||||
- type: ghostRole
|
||||
id: JasonVoorhees
|
||||
name: Jason Voorhees
|
||||
description: Ты - Джейсон Вурхис, легендарный мать твою убийца из Хрустального озера.
|
||||
rules: Не будь дебилом.
|
||||
entityPrototype: MobJasonVoorhees
|
||||
iconPrototype: Machete
|
||||
@@ -1,38 +0,0 @@
|
||||
- type: entity
|
||||
parent: MobHuman
|
||||
id: MobJasonVoorhees
|
||||
name: Jason Voorhees
|
||||
description: Неудержимый убийца из Хрустального озера. Тише... он идёт за тобой.
|
||||
components:
|
||||
- type: HumanoidAppearance
|
||||
species: Human
|
||||
sex: Male
|
||||
- type: RandomHumanoidAppearance
|
||||
randomizeName: false
|
||||
hair: HairBald
|
||||
facialHair: FacialHairShaved
|
||||
- type: Loadout
|
||||
prototypes: [JasonVoorheesGear]
|
||||
- type: NpcFactionMember
|
||||
factions:
|
||||
- SimpleHostile
|
||||
- type: AutoRevive
|
||||
reviveDelay: 5
|
||||
- type: JasonDecapitateAbility
|
||||
- type: MobThresholds
|
||||
thresholds:
|
||||
0: Alive
|
||||
200: Dead
|
||||
- type: Bloodstream
|
||||
bloodlossThreshold: 0
|
||||
bleedReductionAmount: 0
|
||||
maxBleedAmount: 0
|
||||
bloodlossDamage:
|
||||
types:
|
||||
Bloodloss: 0
|
||||
bloodRegenerationHunger: 0
|
||||
bloodRegenerationThirst: 0
|
||||
- type: Hunger
|
||||
baseDecayRate: 0
|
||||
- type: Thirst
|
||||
baseDecayRate: 0
|
||||
@@ -1,14 +0,0 @@
|
||||
- type: entity
|
||||
parent: MarkerBase
|
||||
id: SpawnMobJasonVoorhees
|
||||
name: Jason Voorhees spawner
|
||||
suffix: Friday31 Event
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: red
|
||||
- sprite: Objects/Weapons/Melee/machete.rsi
|
||||
state: icon
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- MobJasonVoorhees
|
||||
@@ -1,46 +0,0 @@
|
||||
- type: entity
|
||||
id: ActionPennywiseChameleon
|
||||
name: Маскировка оборотня
|
||||
description: Маскировка под объект окружения. Маскировка разрушается при взятии в руки или деактивации.
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: EntityTargetAction
|
||||
useDelay: 5
|
||||
itemIconStyle: NoItem
|
||||
range: 2
|
||||
canTargetSelf: false
|
||||
icon:
|
||||
sprite: Objects/Devices/chameleon_projector.rsi
|
||||
state: icon
|
||||
event: !type:PennywiseChameleonEvent
|
||||
|
||||
- type: entity
|
||||
id: ActionPennywisePhaseToggle
|
||||
name: Фазовый проход
|
||||
description: Переключает способность проходить сквозь стены. В фазовом режиме вы становитесь полупрозрачным и можете проходить сквозь препятствия.
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: InstantAction
|
||||
useDelay: 3
|
||||
itemIconStyle: NoItem
|
||||
icon:
|
||||
sprite: Interface/Actions/actions_ai.rsi
|
||||
state: bolt_door
|
||||
iconOn:
|
||||
sprite: Interface/Actions/actions_ai.rsi
|
||||
state: unbolt_door
|
||||
event: !type:PennywisePhaseToggleEvent
|
||||
|
||||
- type: entity
|
||||
id: ActionPennywiseSpawnBalloon
|
||||
name: Создать шарик
|
||||
description: Создает случайный воздушный шарик. Идеально для запугивания экипажа!
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: InstantAction
|
||||
useDelay: 5
|
||||
itemIconStyle: NoItem
|
||||
icon:
|
||||
sprite: Objects/Fun/toys.rsi
|
||||
state: synb
|
||||
event: !type:PennywiseSpawnBalloonEvent
|
||||
@@ -1,7 +0,0 @@
|
||||
- type: emoteSounds
|
||||
id: Pennywise
|
||||
params:
|
||||
volume: 5
|
||||
sounds:
|
||||
Laugh:
|
||||
path: /Audio/_Friday31/penis/pennywise-laugh.ogg
|
||||
@@ -1,85 +0,0 @@
|
||||
- type: entity
|
||||
parent: ClothingMaskBase
|
||||
id: ClothingMaskPennywise
|
||||
name: маска Пеннивайза
|
||||
description: Жуткая клоунская маска.
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Friday31/Clothing/Mask/pennywise-mask.rsi
|
||||
- type: Clothing
|
||||
sprite: _Friday31/Clothing/Mask/pennywise-mask.rsi
|
||||
clothingVisuals:
|
||||
mask:
|
||||
- state: equipped-MASK
|
||||
offset: "0, 0.05"
|
||||
- type: IdentityBlocker
|
||||
- type: Tag
|
||||
tags:
|
||||
- WhitelistChameleon
|
||||
- type: HideLayerClothing
|
||||
slots:
|
||||
- Snout
|
||||
|
||||
- type: entity
|
||||
parent: ClothingMaskPennywise
|
||||
id: ClothingMaskPennywiseUnremoveable
|
||||
suffix: Unremoveable
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingUniformBase
|
||||
id: ClothingUniformJumpsuitPennywise
|
||||
name: костюм Пеннивайза
|
||||
description: Персик соси хуй
|
||||
suffix: Unremoveable
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Friday31/Clothing/Uniforms/pennywise-jumpsuit.rsi
|
||||
- type: Clothing
|
||||
sprite: _Friday31/Clothing/Uniforms/pennywise-jumpsuit.rsi
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingBackpackClown
|
||||
id: ClothingBackpackPennywise
|
||||
name: рюкзак клоуна
|
||||
description: Рюкзак для хранения хонков.
|
||||
suffix: Unremoveable
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingShoesBase
|
||||
id: ClothingShoesPennywise
|
||||
name: ботинки Пеннивайза
|
||||
description: Персик соси хуй
|
||||
suffix: Unremoveable
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Sprite
|
||||
sprite: _Friday31/Clothing/Shoes/pennywise-boots.rsi
|
||||
- type: Clothing
|
||||
sprite: _Friday31/Clothing/Shoes/pennywise-boots.rsi
|
||||
- type: Unremoveable
|
||||
|
||||
- type: entity
|
||||
parent: ClothingHeadsetService
|
||||
id: ClothingHeadsetPennywise
|
||||
name: гарнитура сервиса
|
||||
description: Гарнитура для связи.
|
||||
suffix: Unremoveable
|
||||
noSpawn: true
|
||||
components:
|
||||
- type: Unremoveable
|
||||
|
||||
- type: startingGear
|
||||
id: PennywiseGear
|
||||
equipment:
|
||||
jumpsuit: ClothingUniformJumpsuitPennywise
|
||||
shoes: ClothingShoesPennywise
|
||||
mask: ClothingMaskPennywiseUnremoveable
|
||||
ears: ClothingHeadsetPennywise
|
||||
@@ -1,7 +0,0 @@
|
||||
- type: ghostRole
|
||||
id: Pennywise
|
||||
name: Pennywise the Dancing Clown
|
||||
description: Ты - Пеннивайз, танцующий клоун из глубин канализации. Твоя цель - наводить ужас на станцию.
|
||||
rules: Будь зловещим и жутким клоуном.
|
||||
entityPrototype: MobPennywise
|
||||
iconPrototype: BikeHorn
|
||||
@@ -1,27 +0,0 @@
|
||||
- type: entity
|
||||
parent: MobHuman
|
||||
id: MobPennywise
|
||||
name: Pennywise
|
||||
description: Мы все здесь плаваем... и ты тоже будешь плавать.
|
||||
components:
|
||||
- type: HumanoidAppearance
|
||||
species: Human
|
||||
sex: Male
|
||||
randomizeName: false
|
||||
hair: HairBald
|
||||
facialHair: FacialHairShaved
|
||||
- type: Loadout
|
||||
prototypes: [PennywiseGear]
|
||||
- type: NpcFactionMember
|
||||
factions:
|
||||
- SimpleHostile
|
||||
- type: Godmode
|
||||
- type: Hunger
|
||||
baseDecayRate: 0
|
||||
- type: Thirst
|
||||
baseDecayRate: 0
|
||||
- type: PennywiseAbility
|
||||
- type: PennywisePhase
|
||||
- type: Vocal
|
||||
sounds:
|
||||
Male: Pennywise
|
||||
@@ -1,14 +0,0 @@
|
||||
- type: entity
|
||||
parent: MarkerBase
|
||||
id: SpawnMobPennywise
|
||||
name: Pennywise spawner
|
||||
suffix: Friday31 Event
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: red
|
||||
- sprite: Objects/Fun/bikehorn.rsi
|
||||
state: icon
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- MobPennywise
|
||||
@@ -1,55 +0,0 @@
|
||||
- type: entity
|
||||
id: ActionSlendermanDismember
|
||||
name: Расчленение
|
||||
description: Оторвать жертве все конечности, включая голову, и показать ей кошмар. Жертва потеряет руки, ноги и голову, а также увидит ваше истинное лицо перед смертью.
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: EntityTargetAction
|
||||
useDelay: 30
|
||||
range: 2
|
||||
canTargetSelf: false
|
||||
itemIconStyle: BigAction
|
||||
icon:
|
||||
sprite: Objects/Weapons/Melee/armblade.rsi
|
||||
state: icon
|
||||
whitelist:
|
||||
components:
|
||||
- Body
|
||||
event: !type:SlendermanDismemberActionEvent
|
||||
dismemberSound:
|
||||
path: /Audio/_Friday31/slender/slenderman-sound.ogg
|
||||
soundRange: 10
|
||||
|
||||
- type: entity
|
||||
id: ActionSlendermanShadowWalk
|
||||
name: Уход в тень
|
||||
description: Стать невидимым и проходить сквозь стены. Повторное использование возвращает в обычное состояние.
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: InstantAction
|
||||
useDelay: 3
|
||||
itemIconStyle: BigAction
|
||||
icon:
|
||||
sprite: Interface/Actions/actions_ai.rsi
|
||||
state: door_overcharge_off
|
||||
iconOn:
|
||||
sprite: Interface/Actions/actions_ai.rsi
|
||||
state: door_overcharge_on
|
||||
event: !type:SlendermanShadowWalkEvent
|
||||
|
||||
- type: entity
|
||||
id: ActionSlendermanAlert
|
||||
name: Оповещение
|
||||
description: Издавать устрашающий звук, который слышат все в радиусе. Чем дальше - тем тише.
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: InstantAction
|
||||
useDelay: 1
|
||||
itemIconStyle: BigAction
|
||||
icon:
|
||||
sprite: Interface/Actions/actions_ai.rsi
|
||||
state: emergency_off
|
||||
iconOn:
|
||||
sprite: Interface/Actions/actions_ai.rsi
|
||||
state: emergency_on
|
||||
event: !type:SlendermanAlertEvent
|
||||
@@ -1,70 +0,0 @@
|
||||
- type: entity
|
||||
parent: [BaseMob, MobDamageable]
|
||||
id: MobSlenderman
|
||||
name: Slenderman
|
||||
description: Высокая темная фигура без лица. Он наблюдает за тобой из тени...
|
||||
components:
|
||||
- type: Sprite
|
||||
drawdepth: Mobs
|
||||
sprite: _Friday31/Mobs/slenderman.rsi
|
||||
layers:
|
||||
- map: ["enum.DamageStateVisualLayers.Base"]
|
||||
state: slenderman
|
||||
- type: Godmode
|
||||
- type: MovementSpeedModifier
|
||||
baseWalkSpeed: 3.5
|
||||
baseSprintSpeed: 5.5
|
||||
- type: Body
|
||||
prototype: Human
|
||||
- type: MobState
|
||||
allowedStates:
|
||||
- Alive
|
||||
- Dead
|
||||
- type: MobThresholds
|
||||
thresholds:
|
||||
0: Alive
|
||||
300: Dead
|
||||
- type: StatusEffects
|
||||
allowed:
|
||||
- Pacified
|
||||
- type: Pacified
|
||||
- type: DamageStateVisuals
|
||||
states:
|
||||
Alive:
|
||||
Base: slenderman
|
||||
Dead:
|
||||
Base: slenderman
|
||||
- type: Bloodstream
|
||||
bloodMaxVolume: 0
|
||||
bloodlossDamage:
|
||||
types:
|
||||
Bloodloss: 0
|
||||
bloodlossHealDamage:
|
||||
types:
|
||||
Bloodloss: 0
|
||||
- type: Fixtures
|
||||
fixtures:
|
||||
fix1:
|
||||
shape:
|
||||
!type:PhysShapeCircle
|
||||
radius: 0.35
|
||||
density: 100
|
||||
mask:
|
||||
- MobMask
|
||||
layer:
|
||||
- MobLayer
|
||||
- type: Hunger
|
||||
baseDecayRate: 0
|
||||
- type: Thirst
|
||||
baseDecayRate: 0
|
||||
- type: FootstepModifier
|
||||
footstepSoundCollection:
|
||||
path: /Audio/Effects/footstep_grass.ogg
|
||||
- type: Tag
|
||||
tags:
|
||||
- DoorBumpOpener
|
||||
- CannotSuicide
|
||||
- type: SlendermanDismemberAbility
|
||||
screamerDuration: 5
|
||||
- type: SlendermanShadowWalk
|
||||
- type: SlendermanAlert
|
||||
@@ -1,15 +0,0 @@
|
||||
- type: entity
|
||||
parent: MarkerBase
|
||||
id: SpawnMobSlenderman
|
||||
name: Slenderman spawner
|
||||
suffix: Friday31 Event
|
||||
components:
|
||||
- type: Sprite
|
||||
layers:
|
||||
- state: red
|
||||
- sprite: Mobs/Species/Human/parts.rsi
|
||||
state: full
|
||||
color: "#000000"
|
||||
- type: ConditionalSpawner
|
||||
prototypes:
|
||||
- MobSlenderman
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-NC-SA-4.0",
|
||||
"copyright": "Gersoon (gersoon458) for WWhiteDreamProject, 27.10.25",
|
||||
"size": {
|
||||
"x": 256,
|
||||
"y": 320
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "treelarge01"
|
||||
},
|
||||
{
|
||||
"name": "treelarge02"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 239 B |
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-NC-SA-4.0",
|
||||
"copyright": "Created by omsoyk (Discord), edited by gersoon458 for halloween event",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 64
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "full"
|
||||
},
|
||||
{
|
||||
"name": "leaf_0",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "leaf_1",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "leaf_2",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "leaf_3",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "leaf_4",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "leaf_5",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "leaf_6",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "leaf_7",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-NC-SA-4.0",
|
||||
"copyright": "Created by omsoyk (Discord), edited by gersoon458 for halloween event",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 64
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "full"
|
||||
},
|
||||
{
|
||||
"name": "spawner_0",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spawner_1",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spawner_2",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spawner_3",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spawner_4",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spawner_5",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spawner_6",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "spawner_7",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 239 B |
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-NC-SA-4.0",
|
||||
"copyright": "Created by omsoyk (Discord), edited by gersoon458 for halloween event",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 64
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "full"
|
||||
},
|
||||
{
|
||||
"name": "timed_0",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "timed_1",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "timed_2",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "timed_3",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "timed_4",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "timed_5",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "timed_6",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "timed_7",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 239 B |
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,46 +0,0 @@
|
||||
{
|
||||
"version": 1,
|
||||
"license": "CC-BY-NC-SA-4.0",
|
||||
"copyright": "Created by omsoyk (Discord), edited by gersoon458 for halloween event",
|
||||
"size": {
|
||||
"x": 32,
|
||||
"y": 64
|
||||
},
|
||||
"states": [
|
||||
{
|
||||
"name": "full"
|
||||
},
|
||||
{
|
||||
"name": "weak_0",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "weak_1",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "weak_2",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "weak_3",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "weak_4",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "weak_5",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "weak_6",
|
||||
"directions": 4
|
||||
},
|
||||
{
|
||||
"name": "weak_7",
|
||||
"directions": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 239 B |
@@ -1,13 +0,0 @@
|
||||
- files:
|
||||
- grass.png
|
||||
- double_edge_E.png
|
||||
- double_edge_N.png
|
||||
- double_edge_S.png
|
||||
- double_edge_W.png
|
||||
- single_edge_NE.png
|
||||
- single_edge_NW.png
|
||||
- single_edge_SE.png
|
||||
- single_edge_SW.png
|
||||
license: "CC-BY-NC-SA-4.0"
|
||||
copyright: "Gersoon (gersoon458) for WWhiteDreamProject, 27.10.25"
|
||||
source: "https://github.com/Gersoon458/EbuchiySyr"
|
||||
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |