Revert "Friday31" (#869)

Revert "Friday31 (#868)"

This reverts commit 10a2b918fd.
This commit is contained in:
Kutosss
2025-11-03 17:36:11 +03:00
committed by GitHub
parent 10a2b918fd
commit 362fce56d6
176 changed files with 2 additions and 1389706 deletions

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -1,7 +0,0 @@
using Content.Shared.Actions;
namespace Content.Shared._Friday31.Slenderman;
public sealed partial class SlendermanAlertEvent : InstantActionEvent
{
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -1,7 +0,0 @@
using Content.Shared.Actions;
namespace Content.Shared._Friday31.Slenderman;
public sealed partial class SlendermanShadowWalkEvent : InstantActionEvent
{
}

View File

@@ -1,5 +0,0 @@
jason-decapitate-no-head = Ты че дебил?
jason-decapitate-success = Нихуя ты мощный
auto-revive-death-message = {$name} повержен, но его нельзя убить...
auto-revive-revived-message = {$name} вернулся из ада.

View File

@@ -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 = Создает шарик.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -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 ]

View File

@@ -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

View File

@@ -1,7 +0,0 @@
# House
- type: Tag
id: RoomsHouse1
- type: Tag
id: RoomsHouse2

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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: подобрал серебряный крестик

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +0,0 @@
- type: ghostRole
id: JasonVoorhees
name: Jason Voorhees
description: Ты - Джейсон Вурхис, легендарный мать твою убийца из Хрустального озера.
rules: Не будь дебилом.
entityPrototype: MobJasonVoorhees
iconPrototype: Machete

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +0,0 @@
- type: emoteSounds
id: Pennywise
params:
volume: 5
sounds:
Laugh:
path: /Audio/_Friday31/penis/pennywise-laugh.ogg

View File

@@ -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

View File

@@ -1,7 +0,0 @@
- type: ghostRole
id: Pennywise
name: Pennywise the Dancing Clown
description: Ты - Пеннивайз, танцующий клоун из глубин канализации. Твоя цель - наводить ужас на станцию.
rules: Будь зловещим и жутким клоуном.
entityPrototype: MobPennywise
iconPrototype: BikeHorn

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

View File

@@ -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
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -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
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -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
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -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
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 B

View File

@@ -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"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More