From 1d16ddf1abf5639e398027e004fe9590057ffc9a Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 00:48:33 +0300 Subject: [PATCH 01/38] [Feature] Headcrabs --- .../_White/Headcrab/HeadcrabComponent.cs | 42 +++ .../_White/Headcrab/HeadcrabSystem.cs | 256 ++++++++++++++++++ .../_White/Headcrab/SharedHeadcrab.cs | 10 + .../_White/Misc/Headcrab/headcrab_jump.ogg | Bin 0 -> 36271 bytes .../en-US/_white/prototypes/actions/types.ftl | 2 + .../ru-RU/_white/guidbook/antagonist.ftl | 5 + .../Locale/ru-RU/_white/popups/headcrab.ftl | 8 + .../ru-RU/_white/prototypes/actions/types.ftl | 3 + .../entities/markers/spawners/headcrabs.ftl | 5 + .../entities/mobs/npcs/headcrab.ftl | 9 + .../entities/structures/other/headcrab.ftl | 2 + Resources/Prototypes/_White/Actions/types.yml | 16 +- .../Entities/Markers/Spawners/headcrab.yml | 55 ++++ .../_White/Entities/Mobs/NPCs/headcrab.yml | 158 +++++++++++ .../Structures/Other/headcrab_nest.yml | 51 ++++ .../Prototypes/_White/GameRules/events.yml | 15 + .../_White/Guidebook/Antags/Headcrabs.yml | 14 + .../Antagonist/Antagonist/Antagonist.xml | 11 + .../Antagonist/Antagonist/Headcrabs.xml | 22 ++ .../Antagonist/Headcrabs/Headcrab.xml | 24 ++ .../Antagonist/Headcrabs/HeadcrabFast.xml | 24 ++ .../Antagonist/Headcrabs/HeadcrabPoison.xml | 24 ++ .../Interface/Actions/headcrab.rsi/jump.png | Bin 0 -> 642 bytes .../Interface/Actions/headcrab.rsi/meta.json | 11 + .../Mobs/Animals/headcrab.rsi/alive.png | Bin 0 -> 992 bytes .../_White/Mobs/Animals/headcrab.rsi/dead.png | Bin 0 -> 479 bytes .../equipped-HELMET-reptilian.png | Bin 0 -> 1028 bytes .../headcrab.rsi/equipped-HELMET-vox.png | Bin 0 -> 1058 bytes .../Animals/headcrab.rsi/equipped-HELMET.png | Bin 0 -> 1023 bytes .../headcrab.rsi/equipped-MASK-reptilian.png | Bin 0 -> 1028 bytes .../headcrab.rsi/equipped-MASK-vox.png | Bin 0 -> 1058 bytes .../Animals/headcrab.rsi/equipped-MASK.png | Bin 0 -> 1023 bytes .../Mobs/Animals/headcrab.rsi/meta.json | 26 ++ .../Mobs/Animals/headcrab_fast.rsi/alive.png | Bin 0 -> 1826 bytes .../Mobs/Animals/headcrab_fast.rsi/dead.png | Bin 0 -> 708 bytes .../equipped-HELMET-reptilian.png | Bin 0 -> 1497 bytes .../headcrab_fast.rsi/equipped-HELMET-vox.png | Bin 0 -> 1495 bytes .../headcrab_fast.rsi/equipped-HELMET.png | Bin 0 -> 1440 bytes .../equipped-MASK-reptilian.png | Bin 0 -> 1497 bytes .../headcrab_fast.rsi/equipped-MASK-vox.png | Bin 0 -> 1495 bytes .../headcrab_fast.rsi/equipped-MASK.png | Bin 0 -> 1440 bytes .../Mobs/Animals/headcrab_fast.rsi/meta.json | 26 ++ .../Animals/headcrab_poison.rsi/alive.png | Bin 0 -> 1510 bytes .../Mobs/Animals/headcrab_poison.rsi/dead.png | Bin 0 -> 710 bytes .../equipped-HELMET-reptilian.png | Bin 0 -> 1259 bytes .../equipped-HELMET-vox.png | Bin 0 -> 1321 bytes .../headcrab_poison.rsi/equipped-HELMET.png | Bin 0 -> 1250 bytes .../equipped-MASK-reptilian.png | Bin 0 -> 1259 bytes .../headcrab_poison.rsi/equipped-MASK-vox.png | Bin 0 -> 1321 bytes .../headcrab_poison.rsi/equipped-MASK.png | Bin 0 -> 1250 bytes .../Animals/headcrab_poison.rsi/meta.json | 26 ++ .../Other/headcrab_nest.rsi/icon.png | Bin 0 -> 3502 bytes .../Other/headcrab_nest.rsi/meta.json | 20 ++ 53 files changed, 864 insertions(+), 1 deletion(-) create mode 100644 Content.Server/_White/Headcrab/HeadcrabComponent.cs create mode 100644 Content.Server/_White/Headcrab/HeadcrabSystem.cs create mode 100644 Content.Shared/_White/Headcrab/SharedHeadcrab.cs create mode 100644 Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg create mode 100644 Resources/Locale/en-US/_white/prototypes/actions/types.ftl create mode 100644 Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl create mode 100644 Resources/Locale/ru-RU/_white/popups/headcrab.ftl create mode 100644 Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl create mode 100644 Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl create mode 100644 Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl create mode 100644 Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml create mode 100644 Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml create mode 100644 Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml create mode 100644 Resources/Prototypes/_White/Guidebook/Antags/Headcrabs.yml create mode 100644 Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist.xml create mode 100644 Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs.xml create mode 100644 Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/Headcrab.xml create mode 100644 Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml create mode 100644 Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml create mode 100644 Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump.png create mode 100644 Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/dead.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-reptilian.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-reptilian.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/alive.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-reptilian.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-reptilian.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/alive.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-reptilian.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-reptilian.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png create mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json create mode 100644 Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/icon.png create mode 100644 Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs new file mode 100644 index 0000000000..6334919bc2 --- /dev/null +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -0,0 +1,42 @@ +using Content.Shared.Damage; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server._White.Headcrab; + +[Access(typeof(HeadcrabSystem))] +[RegisterComponent] +public sealed partial class HeadcrabComponent : Component +{ + /// + /// WorldTargetAction + /// + [DataField("jumpAction", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + public string JumpAction = "ActionHeadcrabJump"; + + public EntityUid? WormJumpAction; + + [DataField("paralyzeTime"), ViewVariables(VVAccess.ReadWrite)] + public float ParalyzeTime = 3f; + + [DataField("chansePounce"), ViewVariables(VVAccess.ReadWrite)] + public int ChansePounce = 33; + + [DataField("damage", required: true)] + [ViewVariables(VVAccess.ReadWrite)] + public DamageSpecifier Damage = default!; + + public bool IsDeath = false; + + public EntityUid EquipedOn; + + [ViewVariables] public float Accumulator = 0; + + [DataField("damageFrequency"), ViewVariables(VVAccess.ReadWrite)] + public float DamageFrequency = 5; + + [ViewVariables(VVAccess.ReadWrite), DataField("jumpSound")] + public SoundSpecifier? HeadcrabJumpSound = new SoundPathSpecifier("/Audio/_White/Misc/Headcrab/headcrab_jump.ogg"); + +} diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs new file mode 100644 index 0000000000..5223cf534c --- /dev/null +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -0,0 +1,256 @@ +using System.Linq; +using Content.Server.Actions; +using Content.Server.NPC.Components; +using Content.Server.Nutrition.Components; +using Content.Server.Nutrition.EntitySystems; +using Content.Server.Popups; +using Content.Server.NPC.Components; +using Content.Server.NPC.Systems; +using Content.Server._White.Headcrab; +using Content.Server.Zombies; +using Content.Shared.Zombies; +using Content.Shared.CombatMode; +using Content.Shared.Damage; +using Content.Shared.CombatMode.Pacification; +using Content.Shared.Hands; +using Content.Shared.Humanoid; +using Content.Shared.Nutrition.Components; +using Content.Shared.SVO; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Popups; +using Content.Shared.Stunnable; +using Content.Shared.Throwing; +using Content.Shared.Weapons.Melee.Events; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; +using Robust.Shared.Random; + +namespace Content.Server._White.Headcrab; + +public sealed partial class HeadcrabSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedStunSystem _stunSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly NpcFactionSystem _npcFaction = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly SharedCombatModeSystem _combat = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly ActionsSystem _action = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMeleeHit); + SubscribeLocalEvent(OnHeadcrabDoHit); + SubscribeLocalEvent(OnGotEquipped); + SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnGotEquippedHand); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnUnequipAttempt); + SubscribeLocalEvent(OnJump); + } + + private void OnStartup(EntityUid uid, HeadcrabComponent component, ComponentStartup args) + { + _action.AddAction(uid, component.JumpAction); + } + + private void OnHeadcrabDoHit(EntityUid uid, HeadcrabComponent component, ThrowDoHitEvent args) + { + if (component.IsDeath) + return; + if (HasComp(args.Target)) + return; + if (!HasComp(args.Target)) + return; + if (TryComp(args.Target, out MobStateComponent? mobState)) + { + if (mobState.CurrentState is not MobState.Alive) + { + return; + } + } + + _inventory.TryGetSlotEntity(args.Target, "head", out var headItem); + if (HasComp(headItem)) + return; + + if (!_inventory.TryEquip(args.Target, uid, "mask", true)) + return; + + component.EquipedOn = args.Target; + + _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head"), + args.Target, args.Target, PopupType.LargeCaution); + + _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", + ("entity", args.Target)), + uid, uid, PopupType.LargeCaution); + + _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", + ("entity", args.Target)), args.Target, Filter.PvsExcept(uid), true, PopupType.Large); + + EnsureComp(uid); + _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(component.ParalyzeTime), true); + _damageableSystem.TryChangeDamage(args.Target, component.Damage); + } + + private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquippedEvent args) + { + if (args.Slot != "mask") + return; + component.EquipedOn = args.Equipee; + EnsureComp(uid); + _npcFaction.AddFaction(uid, "Zombie"); + } + + private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingUnequippedAttemptEvent args) + { + if (args.Slot != "mask") + return; + if (component.EquipedOn != args.Unequipee) + return; + if (HasComp(args.Unequipee)) + return; + _popup.PopupEntity(Loc.GetString("headcrab-try-unequip"), + args.Unequipee, args.Unequipee, PopupType.Large); + args.Cancel(); + } + + private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEquippedHandEvent args) + { + if (HasComp(args.User)) + return; + if (component.IsDeath) + return; + // _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); + _damageableSystem.TryChangeDamage(args.User, component.Damage); + _popup.PopupEntity(Loc.GetString("headcrab-entity-bite"), + args.User, args.User); + } + + private void OnGotUnequipped(EntityUid uid, HeadcrabComponent component, GotUnequippedEvent args) + { + if (args.Slot != "mask") + return; + component.EquipedOn = EntityUid.Invalid; + RemCompDeferred(uid); + var combatMode = EnsureComp(uid); + _combat.SetInCombatMode(uid, true, combatMode); + EnsureComp(uid); + _npcFaction.RemoveFaction(uid, "Zombie"); + } + + private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEvent args) + { + if (!args.HitEntities.Any()) + return; + + foreach (var entity in args.HitEntities) + { + if (!HasComp(entity)) + return; + + if (TryComp(entity, out MobStateComponent? mobState)) + { + if (mobState.CurrentState is not MobState.Alive) + { + return; + } + } + + _inventory.TryGetSlotEntity(entity, "head", out var headItem); + if (HasComp(headItem)) + return; + + var shouldEquip = _random.Next(1, 101) <= component.ChansePounce; + if (!shouldEquip) + return; + + var equipped = _inventory.TryEquip(entity, uid, "mask", true); + if (!equipped) + return; + + component.EquipedOn = entity; + + _popup.PopupEntity(Loc.GetString("headcrab-eat-entity-face"), + entity, entity, PopupType.LargeCaution); + + _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", ("entity", entity)), + uid, uid, PopupType.LargeCaution); + + _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", + ("entity", entity)), entity, Filter.PvsExcept(entity), true, PopupType.Large); + + EnsureComp(uid); + _stunSystem.TryParalyze(entity, TimeSpan.FromSeconds(component.ParalyzeTime), true); + _damageableSystem.TryChangeDamage(entity, component.Damage, origin: entity); + break; + } + } + + private static void OnMobStateChanged(EntityUid uid, HeadcrabComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead) + { + component.IsDeath = true; + } + } + private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent args) + { + if (args.Handled) + return; + + args.Handled = true; + var xform = Transform(uid); + var mapCoords = _transform.ToMapCoordinates(args.Target); + var direction = mapCoords.Position - _transform.GetMapCoordinates(xform).Position; + + _throwing.TryThrow(uid, direction, 7F, uid, 10F); + if (component.HeadcrabJumpSound != null) + { + _audioSystem.PlayPvs(component.HeadcrabJumpSound, uid, component.HeadcrabJumpSound.Params); + } + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + foreach (var comp in EntityQuery()) + { + comp.Accumulator += frameTime; + + if (comp.Accumulator <= comp.DamageFrequency) + continue; + + comp.Accumulator = 0; + + if (comp.EquipedOn is not { Valid: true } targetId) + continue; + if (HasComp(comp.EquipedOn)) + return; + if (TryComp(targetId, out MobStateComponent? mobState)) + { + if (mobState.CurrentState is not MobState.Alive) + { + _inventory.TryUnequip(targetId, "mask", true, true); + comp.EquipedOn = EntityUid.Invalid; + return; + } + } + _damageableSystem.TryChangeDamage(targetId, comp.Damage); + _popup.PopupEntity(Loc.GetString("headcrab-eat-entity-face"), + targetId, targetId, PopupType.LargeCaution); + _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", + ("entity", targetId)), targetId, Filter.PvsExcept(targetId), true); + } + } +} diff --git a/Content.Shared/_White/Headcrab/SharedHeadcrab.cs b/Content.Shared/_White/Headcrab/SharedHeadcrab.cs new file mode 100644 index 0000000000..3e716e33ab --- /dev/null +++ b/Content.Shared/_White/Headcrab/SharedHeadcrab.cs @@ -0,0 +1,10 @@ +using Content.Shared.Actions; +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.SVO; + +public sealed partial class JumpActionEvent : WorldTargetActionEvent +{ + +} diff --git a/Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg b/Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0071d773429167d1112f1258c8e107115c179b6c GIT binary patch literal 36271 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

K@UE&7bY`}mFc;9SAL9>rcWcl@KB-r()0I+xdu zEC$P_Ej1^vcFv#q#k1?d)aAv{GZCZh`aH$ZYXZjR3mG-qxwv=N`Ogf_J$Qrcwd(mB zJ7UVB7=l*`crI%tqC+*`i9_wTIK zU3WlRW`We+`!wjHpXMlaR{WP4PCjWao3{D(Y9eTPI!L&3=|%s(oDI9@$ya#qeYa!X zmp$2B9U|><+5APjvd%HMrn-iA@_SIJJcVz2PReyA8NqfCs zbv8Gn&e%l63pXAWgvG!)aJ$k3gTh=-di7|6iVTHny@=a|3&>f6M)P|rK{FEE$+bY3Ze(@{aEFp@!X*FdMoq!`|Pvbw4|-ua_z6>)aB`} zY6bMVn!-r$>2D-ZuEJR~x7zD|-q?3?Wug9r6D+&PfyPdA_+OijA_A{%WT0i?l@}Y(9lEl#tzVc(*RD*jFwM%c^7B!O%|R8dKU>dd<%0AP&0S$=M8=-mEpf&A;$;$05{{98nS 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 + # Антагонисты + + Простая и общая информация об уникальных антагонистах сборки. + + Мидраунд антагонисты: + + + + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs.xml new file mode 100644 index 0000000000..da863ee938 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs.xml @@ -0,0 +1,22 @@ + + # Хедкрабы + + Хедкрабы (Headcrab, дословный перевод — головной краб, головокраб) — самые многочисленные создания-паразиты из мира Зен. Вырвавшись на свободу из мира Зен во время инцидента в исследовательском центре «Чёрная Меза», эти существа выжили и размножились на Земле, а после и вовсе перебрались по всей галактике. + + Хедкрабы начинают размножение из своего гнезда. + + ## Виды + + Гнездо: + + + + + Хедкрабы: + + + + + + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/Headcrab.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/Headcrab.xml new file mode 100644 index 0000000000..815649b226 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/Headcrab.xml @@ -0,0 +1,24 @@ + + # Обычный хедкраб + + + + + Данный вид хедкрабов называют обыкновенным или классическим хедкрабом. Он выглядит как небольшое мешкообразное создание с четырьмя заострёнными конечностями. Существо передвигается при помощи задних конечностей и маленьких передних лапок (при этом подняв передние лапы-клешни) или на задних и передних больших лапах. Снизу тела хедкраба расположено широкое ротовое отверстие-присоска с острыми зубами-крючками по краям. Кожа у создания белёсого цвета с желтоватым оттенком. Ноги окрашены в кроваво-красный и чёрный цвет. Помимо четырёх больших конечностей и двух маленьких лапок, у хедкраба есть два образования в передней части тела, напоминающие паучьи челюсти-хелицеры с крючковидными зубами на конце. Возможно, эти челюсти используются для прокуса черепа добычи. + + По размерам хедкраб соизмерим с тушкой индейки. Длина его тела от передних конечностей до задних примерно равна 60 см. + + Несмотря на то что хедкраб небольшой, медлительный и уязвимый, он может совершать прыжки на расстояния порядка 5-10 метров при помощи своих задних лап. В полёте существо расставляет лапы широко в стороны. При успешной атаке хедкраб зацепляется за голову жертвы с целью получить контроль над её нервной системой, головным и спинным мозгом и, следовательно, над всем телом. + + ## Особенности + + - Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении. + - Имеет 50 ХП. + - Передвигается на 10% медленее. + + Способности: + + + + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml new file mode 100644 index 0000000000..b935b734d4 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml @@ -0,0 +1,24 @@ + + # Быстрый хедкраб + + + + + Быстрый хедкраб по строению схож с обычным, однако его тело несколько меньше, а конечности более длинные и тонкие, отдалённо похожие на паучьи лапки. При помощи своих лап быстрый хедкраб способен висеть на стенах и потолках. Отличается тем, что быстро передвигается. + + По размерам хедкраб соизмерим с тушкой индейки. Длина его тела от передних конечностей до задних примерно равна 60 см. + + Несмотря на то что хедкраб небольшой и уязвимый, он может совершать прыжки на расстояния порядка 5-10 метров при помощи своих задних лап. В полёте существо расставляет лапы широко в стороны. При успешной атаке хедкраб зацепляется за голову жертвы с целью получить контроль над её нервной системой, головным и спинным мозгом и, следовательно, над всем телом. + + ## Особенности + + - Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении. + - Имеет 50 ХП. + - Передвигается на 20% быстрее. + + Способности: + + + + + diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml new file mode 100644 index 0000000000..c055ef8be4 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml @@ -0,0 +1,24 @@ + + # Ядовитый хедкраб + + + + + Ядовитый хедкраб, в отличие от быстрого, больше похож на паука, чем на обычного хедкраба — сходны лишь очертания и пропорции. Ядовитого краба легко определить по его чёрной коже и конечностям, похожим на паучьи, а также по «приземлённой» посадке туловища. Покрыт редкими волосами. Присутствуют челюсти-хелицеры с острыми зубами, которыми он наносит ядовитый укус. На спине существа находится рисунок, похожий на рисунок пауков вида «крестовик обыкновенный». Передвигается ядовитый хедкраб по-паучьи, поочерёдно переставляя ногами. Нейротоксин ядовитых хедкрабов очень опасен. + + По размерам хедкраб соизмерим с тушкой индейки. Длина его тела от передних конечностей до задних примерно равна 60 см. + + Несмотря на то что хедкраб небольшой, медлительный и уязвимый, он может совершать прыжки на расстояния порядка 5-10 метров при помощи своих задних лап. В полёте существо расставляет лапы широко в стороны. При успешной атаке хедкраб зацепляется за голову жертвы с целью получить контроль над её нервной системой, головным и спинным мозгом и, следовательно, над всем телом. + + ## Особенности + + - Наносит [color=#46A446]1.2 яда[/color] своими челюстями, в том числе при закреплении. + - Имеет 50 ХП. + - Передвигается на 40% медленее. + + Способности: + + + + + diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump.png b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump.png new file mode 100644 index 0000000000000000000000000000000000000000..b50e7de51c5b919db681e08bb8cf7aa652fe2605 GIT binary patch literal 642 zcmV-|0)737P)`g*1J19@9oU& z+*(Ltp3;~r`u{-S#y{-w#Y}1;ATqH_k~rFTEAG9e#L6nSG~oilU=QTL+jol!!wcYO zA0$%}0Jyo7VMb%pCJ~eaB-wl1%7fXGkcvqp;D6;TL_*4X5eLTbKUH5wL z!|8?SJ-y1AqipLUx)B9BgNKaO>u60KkJsTUq>v7wEj`<6ygm_h-NH?)=gV zJ{5t@CBeqM3F!IvU+F??S+KgciuIKReEBv?=Rb}9RDuKU5EQOUYguyOv1@%2R+LEE zjZqXa7LcS_1kEC7N!i}1o9zMTu@VmipDa*xA>v>#DASQ>%;1<_hd?UE7{p`}k4PQh z017#v)5+;K#Le-3SlwE6mG~YJy7sM-5ziiqTI=iF_`J8mG~;5_aQMW@#a8X zpjzx}NYz|pTfeF=+n?IW6(SKq(p+P0#GWtf%l2zKg+gTKgeytQCQB77zP6Qb!t8yS zjqN#->70moLDjkh5lHT<9(#=D$hhozL*OE=!KRTaeY*}MW!CQXx+dk)*S$|a_(@iq c%>B>lUmt*ui2wiq literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json new file mode 100644 index 0000000000..3ea3560fb7 --- /dev/null +++ b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json @@ -0,0 +1,11 @@ +{ + "license": "CC BY-NC-SA 4.0", + "copyright": "Sprited by PuroSlavKing (Github)", + "version": 1, + "size": { "y": 32, "x": 32 }, + "states": [ + { + "name": "jump" + } + ] +} diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png new file mode 100644 index 0000000000000000000000000000000000000000..dd87a278352049fd787fd267e241d3a45c6153fd GIT binary patch literal 992 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|WCU zPZ!6KiaBqi{5?bxMd~Lxxr&SD8tdqGtZ1Hc!IA4#l9R|oRRa&F8+x)@6ZoDMa&xZS zBj%P9a3OW#p*uFBj_nSI54bM65_9Ql?)N0IB|e|4-!#nF`MsvT z?sHni_wT1XizS#mh`=HLAN>4Td+p=ot_y4UIus@ToZqsO z^~vYYQguEHOc-B=bO{9uheU5re|qQY7KS$;J~P+(E)ZeNZ7++=Sfg&`GsDdxO5zQ*!=o~_1(hBd)nfK zHCzw;c_i;Av9q{$w)3PfcXZ6}6>d4^$z}cL!FyAI&!;Qq*o)6{xUytc^e@>47N#AS zXZo~BpHDISY&ki}{QbAjQWrPgzv5MxXR@KTy;%173ih&44?%-Daa!D8`6AZ8i+h%K zeE->i_*G50wfVwle*L>^T9fyCqy0~Y2{N*)7hP+X%)7yB^50%R;U(vadr=Q4mMRepc)O7k#pgKS-|%d|JX6Vw!@{RlP7_jg=)VCkD| z)>+PP9)2l_+r6XjS?D9JT2Z~LbK=jgJ`%e2;2(33S%(E22x8}%4No3xv(}gL#=VK1 zewRT%J3z@n<=oWej4PZr{Pu0SZmOZ{u|xRjUVOuJgyX&X6Xw(3%GL@LrYg8HxUF1T*3Ie~wqn!NsZ(omEG`{6pR(j7 zOMhDRb!PYD--S9P=lcYy)SRqjSGfP8{rexwaNTKl118R6=$PzO-)`f##i;LUoUC>1WnHyW7RX<6-9-BWaE8A>0#M zJ35nf&P&Vf43zc=nD}DqlaI%aO6F~t!Swq0kJCroe4AKATO)qXPB1K+xTCtj$#Z@< jqnL7+srodHkPqS?KAAmoju*@aW?2SLS3j3^P6F63{@KO94#Jj3IHC#>ooEVM0J(cbD>lY=&=a3n-|Nd&3nTk>x5V=IaQI_p7zI zz*#Tgbh$9>>qRbA$9<85)9nKP@PhTVNm?d5an8CP&>}cBqTJKCDK@u7k+_JJu@D-? zZK_1#!n-QrciM@bzA$|ZJ#r5O`>QH(+Mvzp$8Ka6h+dLv<3sm%bPLd#%|j%@6W?3~ zVDId@RS(bk@T^=KT<@tcyaM@58d9Zah%$vvV_Z5=mI00n8@bvg5Z}+}~6j@uAZcBa|q1QcKbnMCd0y2#5_)-Ei zR&LA)4see4#&6HOhVGBXL@*IQv;g%xH+Z#Ghx1;8{>dMmUQ6$=b`ea)4=up>_dn@l zEVI-++ITAoyDpi!e2K|R> zu9685>qhNfCVJD$p^SbMj{YmHucXG6+5@ohwB0(xihTGc!P@yJ+R<-n59m((Dwv3O zd6)K=Q`0E?U{@-Wp+(%^wWXUzYYFw!muyXm*tj}8hj7C2tr)e=EB>=w< zgKFn$Ukph98q~c67aI3}09lR`fGo!eK$hbKAj@$AkmWc5$a0(jWI0X%vK%LX>KEbG zUOstbR$Ix5_`LipH2%2G6VGox=pS<*dwZ9uP=M1sHGsY+< zpI@(=T<-+1K0hawcN3IufuJ)Bf}TA#CS72x;D##}o-3y?NDBb-llk<~%z$ui2S-1% zV_0Y{y>Ze3ia&7n9y^8$jO89I966~Nvq~!fMZ%#4t#w=2>|+mT+rEd{=OrtaXf;YP z)~;wN+vwmz18&A%Z10=X*h&Jx1LW>73{#xLAVuLV^+&0?;ePsc79C)$f#Gp#Ydl5g zuia%r;C{!9b4Lme^}MVAv3S4|fFYU~V@dFt&-N07Dj16!vk*dz&p{jF%bK&&0%Qx$ z;WHr4j1DkXh5v{XW60)~3+=xJbT0k*7+bplSgt0VV*VD0?s2sWuuyM@%mw#zm@LN$ yK$hbKAj@$AkmWc5$a0(jWI0X%vK%J>S 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 yK$hbKAj@$AkmWc5$a0(jWI0X%vK%J>S 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..96b7e9e77b422b098d377d46af1e9207abb37c34 GIT binary patch literal 708 zcmV;#0z3VQP)Q6=NO{6Dp7Qwrs*pnb0 z)Pwip4<4Ev)QdL-DWX_nE42otwIG<<)L1QTlm@hx*r-jLpEgYsHp#~PY{r=tqeyEv zam7nsSY~#Ho%i{^nQvB)|EwB74WI^41JDe>VLwHFeLvB8oBQVg;|@ES_PtU1g;WfI zh=|KQZpHXmTPtyTeCt9~1rYXhm!qw>T9kHdbfj#~q{h4|0A`*_t{@UiA{>p;XBnAn z7J|tHPuE2fjl{r7Y z$e-3z4REL9FiC_$2t^ig|G`sOECOV?1fDmbR3b2&1r&>=pXMs13V@XuJLODS8fnX} zZAeRBQ79H^)JD|RnU%SB&I!lw-*(;_nB$$&|1zQ(@na}tGc-=E$LkDaI-iqB6 z!2f9;^+pRgosL5AnCcs6=2ur+V=Z%408FgB4r0@Rd)Hi#PF`w1y0y^?nsub4tTONI zeRY901J5CSK!s9$2I%6W^i;d2LyK7G9vRrkas0=e?2~D6(CM*i%vAwAc6rPFL@*3_ zDFHo)!48Bkee^xS5)ho0Wb|s&Ol3548Ur-bw>m7 q&Bry#LRG(Gt<0+i&{8#k8o)Q6GY$%AR^r3}0000zm!&HtOUko`%bL9Fq zG-6T6F-Lr<6pAD-{mfAD^A&e0YkDlZBE00d)ag*~YGZ^D8HTZs>t zJcx+DoqG@fKwtmHmw6lt0|0?UjFp8;*yE+#yEvFPyqlHXr%K4x!n9Q5ORMs=^6!1y zLo`o+RE$=-znWaMbpsKpBuu_1xt6>bPuAll=t*cwr;$#lL9K@|Avd45&gHV#oqY11 zxa(r_P(7;5wZNYI!5}=12#tK-X&5>swY(gjGPTK#E@ zyFiG;DWTCy(a1;`{LWGHkE4Fon!?R@Nl{4&+QR5bi+*FqNo(g}KUJMQ=)inzHKK$) zO-^p0VWo;)yhcam0~0}b>8kc2n!zF2cg>J5(jyn0Hb$NW*p&!7=>fL3#!R8U^27Gj zq<$QS&r%P|xS+cirXV&S9hv}6FF}M|7QbCulgdVF3rpN`eWMk3tYReS$WytOJRVZ? zh={$Kcx^YN;v%{N;kj$h%8DYMp#Sr1)`WJXO`_{?A#$8)A5qY0nsTNN46e)YD$6B5 zzS2I5mOpm*Q~kJ@dF#MUT(Ib%!n+i1j*5{Xk%Zx-Y9tqbpFJnFA}bI5@-xNQlktSB z(zPXax+{gvCywNq7`6UUm*G%wo$y@7p%|MfaaDt+B@@zlO&{o{=q!r3{@Sgjg#}MR z&HsXhWcH@JwW$ZU5DSJQHWya=VNO5J>!w5RgHJYwRoeMrHGBlNKv&C8G}x>dH*L%; z=~9vv`4!EK-k7j9?+_R}No#BEY*XPh=TPLp7dlRgFVNCvpW42l-e$lP`RVPEDt9Zi zqbb0Y`Ig^G9}3_3hJMBANocG>af#V5c=!Cn>IF@I-bYt0jxjW4TZkKa-tcV4TeO-fH z?YbLV_td6D-4!kMm|DR9%N5iM-`>p|xDSO#Fje<82=Tt>0XO-XiJ_p82%6Fm)o`^> zTP1g66!Mw#$ir_9Wbh=gj*z+{u(e}|?`9O+pfBb}oiYN`$K&h?^OQzYUWZV%JHo>H zD8>scfRKsndk-bbS^uey({Fn30@7h!nBdHH2*g=kAgic%@li-rwq=$If%U1W=9&{$ zrtBncVyy-{EZ}L<7<|^C3?~D;ya3e&!graY)3^YWgNP#wJa|9 zQsbCRPra{$F2yX$+Vtm4WK%F~NH*zJP3L0WM0+ah)_6uNHqLep&+&JJ^+I7t>3~na z)^*b`-jYfa=^Dk!U%8&na5h?DV592_$fZs0+t z>Xy*YZH7t@GSTk0@|q@UkGJUng?oCvw|^{QEz9FRKVGlE4SbC)aR~_b5?g9nwu zy{jL7optXpRv(nzP%u||!R=SBWEsX<&W3JhOR`r*3khMU43kWy+K%H8X5fn0B~@k8 k-qo=t;H(b#ztx!Wee}$p#z(N#4!#<|SUXzPpgqa|0)U{eL;wH) literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9ca35351fdc5e0618b57429d8cec7e5eb98134 GIT binary patch literal 1495 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9ca35351fdc5e0618b57429d8cec7e5eb98134 GIT binary patch literal 1495 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 H+~fZTuIICo literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b4fd2dd30f20e42f0b7c1607f9e82855395442 GIT binary patch literal 710 zcmV;%0y+JOP)0BQ547jlT4D5mw7ZzQj=*ShGtbo5TVk5A};*` zf=j=YdvWbrEVL-Pj3^C6ZC)ksnM{&NI?2pj?;S`$kUZLm2y<5F&b@QakMlq0&hYrh zW&v0L7Jvm{0aySQz_kG)p#TZ^{ia_mRk*(bkVy%o*YBHtTkOq~u;gq#nM{e(=`hc& z3$YY{1#NY@kcY}V@EswM%~xuL84TOI;q?$)!4?AiDLJ#jSUo%1zl{q~#?N+}+ud>z zUDx3>jLibDJwuD{$Uz|3aao=d%g z;P+vyjKC3sPOlG}jbmT{t!E0Xav#zfHWnUdwO(8>3w*KdnbESG>noWd+H&}dPU z{QB`{PK8avdHaF9;Hliec4a)tKJ@VBwO62Qz@DNE&QTb)c%ZncpS zl5o?|)n<$K127(qa3Bbf#$%M|zDOIl)svUr32WVi9EZq$<`xW1hi2$7Tuvl*V{jV; z9?phgUxuoxQd3caF5aG7CFaTiOw06M()5+fOK4NgoB+4OK|9`nP8)HmX;Nu02-1;! z@uMT2ZWMrN84d-_>FSEo{5kX3bhzk6G_~1+9-e<*?1-;djk}fvh41HFDiMD~$1_@M swBBF?w)WSsRI49jgZBUb4_w!N0X7;cK9AMbY5)KL07*qoM6N<$f`4&IssI20 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-reptilian.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-reptilian.png new file mode 100644 index 0000000000000000000000000000000000000000..e3f12f33fe9331cb0cb5f33cb4f31ed45bf7ca65 GIT binary patch literal 1259 zcmVJNRCt{2npbR{ERjSlRvTu7` zwg0943H>uwZqr*=YARK#Qnhugf@0UyoP)dUE{AZ~&NncaIAC^RsT9pV5@KP8@B7|& zW@mvJFC@n?0FqJ4~2?t?#%j(^0GSVn$J26Q^z z!*D40Msh;DR#fefJ-M(XmXY7I0XsWsgOXndou_u0OxAW2mX+U>0qO13cQ7tr(~!G5 z1V{`_0VHNS5&Nd&bz{Zve>>@rPNRXYrr@Mlu~mF3vGFCvt+GdS z^Y+yI)%^LW{b{lM#7t~c2JEEMMmn{H?CBW-Or$Vj91^d0``G>HV|asSMkZ_DWk6zf zHeyg-x3J14I|{ry7QJl@I$m$J5Pr{xOxc`x!rUdm#FOJnwFGZG3B9f%FdPj+xYy(6 z=c_k^ygf4jcEQ9OBtGEtf!zgYwnyvAP^b6lyuwVN_L*|UR0qs7;NjkbeR`(hMG3mP z26wxIc4UnkLBidNg6`@HKTqxG`lQeOcJyN5TOt#~^Ha}~IMCx7sGay6Ght@_nFf%E zdacT@JrYOaeSrXK`8>RV8))fGMAoD1SqD7e?T-KWo#p{sz7LQHCgy-09&!`dNGSiS zzSX-Mw?c*x&p0q6o-lnIeKq{);rRLikV z8NhneMH3-i?{s`O6nx_fY_yu(knpWF!y634&IxeYm>vNnicFwm-uq*S*EAWvOX3Mj zUxjChd)LGh&aXj8j$;5M$1wns;}`(RaSVXuI0is+90MRZjscJy#{fuhb05O&vjXVSSr7IYzM;VY4K^P zTxB&yHxg*{t!)vpWWae{b9wqjBbrE{TF3*;1Yvbs9~AVeR6sZuNBaFO=(US|v#Yez zpk?mlojb_>eFmjc!g@S8%0-Y|mDNJxFN#H+YufVW00AX}dyu%}o{&#b;BGdtsCa^6 z+-I>UCP4;|voh>)Ueg>{HlXWqJ@)pDpVro6XnQ>TJ=z%}*t>TRL7yMF^8!A5u)F{B zi^cX0QjC9CtPj#@Xsrg0UcMZiqxpzf?e$QvRCsMx<6AZ$uc*&JlZ>X}_RXLnMnHrO zO_~!5xjf%MK`bg>#CVuWA(t=kO&FVrB){fsY$TBJGy*bpZSLFcLSKaqm+LXR?>?jZ zFBL>vWKJp-7g%p>#n!)qO`Kyn-dAUTc!kQ~PVNRDFwB*!rTlH(Wv$&ucG{{RxD VZwEyzp!NU&002ovPDHLkV1npHQRV;u literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..dce1ff1268fdc39e063d636d4703ee8b6734e930 GIT binary patch literal 1321 zcmV+^1=jkBP)zwaQ(k{!i&a3sjP+F;;YoetuG5DGPOlBPKnnF@a4v5+yQ#ONa0>ffw!xoo0#W95OJ?8qZgdx_o*EvD0=So?jJY) zCLj`w%oaP`;Ucg|sQuTxFuIF(Vwxb&uw{lk;aUNR#7U#hlMj(2@}WosjdB_O$SrhQ zr${U$*}et%z}xM;`Hd2xZ68EBnJYt@M5&=Uao?tsARk#>1TeCPO~r$z!taGcx3u>< zd69`{1*QaGqv@eUNbfrxe-w*;kb>HsQ!YsS&b;Q2#$jgyoHk5H0FfdQ=$McG2*f!h z!&xFvnCLs;I&!l{o-h+1LeqpR02~fi05}}30B|^50pM`B0>I&L1%Sih3IK=06#x#$ zjRko4)q}CsxR<}avi0AgY1z4v01wtb89HSwRtkr2>fk8xaRpKG;nm(>mTg!TfC>?# z=c5%{u@^#E6+w_Ut_Ls{M#-0P#S$~HBtRyWc+yu@{x9%otA#I z)G%EX6|f`#BflL_EjQ*?L&!3`r>8JWolv$Q4wQ-b?z5Dtec02~fi05}}30B|^50pM`B0>I&L1%Sih f3IK=0@dEr0G9{0-LkCMF00000NkvXXu0mjfi*IJq literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd1446e077d64c5d06f2f9c40de6289485d81a5 GIT binary patch literal 1250 zcmV<81ReW{P)iCfm2AlJJ?|Xg> zd?x_O@eF|E*fQYLt;Sz4dw`D-P-Pw&r zBbR~`)@xPMciEEymvAG#umS7qS(Aca1)Znsa=ESh+nl zezkBiy#BCMej?JgkOAx2teMTMB7b;NOL)NVAcEJpzCwxickm4G~mJ3{cU=t;Y9&Dh7Mn= zjaGbt8$rT-s*2A196wLj(fp*({jvA_Ki?9W7#^Q`mc)S`S3uWUpJOJ>j6c%=5>c;J z`P?IMBt94pqgE&&5Waz?agO+6f;}66AN;!gzy73kz>)6*B!Y?AVTZfi1U3@NZ?t!M zcj;Etw8S%ZM8p%qw?W>s0~5f+9&5S+P3PxA!5ik=fp}{na*~0VD~B|hQif)`Z6O0# zZz{A9(tM}mkE4-GGqBM-=Z3^?Etr8w3{Eb9ZX-MbNEDes$GrDPuwK(*_#ufWY<(4; zCGJBLPk6ruAvvA_kQ~ndNRDR!B*!xVlH(Zw$?*(;He;cR)F*jT&!cs$@}5_Igg z3A4nH=KA8`m2=f$;>}s@Co{2psX9EVMEyRP7S}4&sw`Is?i3L+fY;rac&jMho>C(J zKcSomo)ycLVNR+cjw58iT+ieUSIZ?t(<=xn7Xhsj`S`ILSjJC_MmOuQ68}s_9@*RC;{3Ub5N-$ zVD7Ib7r%i^oEh4;N0rw<((#%frZLzqL#zEtEc*3z+PszlgV8XuRpnx5hLxZjjJ8c1 zH74a`7w^XqB*!xVlH(Zw$?*(;JNRCt{2npbR{ERjSlRvTu7` zwg0943H>uwZqr*=YARK#Qnhugf@0UyoP)dUE{AZ~&NncaIAC^RsT9pV5@KP8@B7|& zW@mvJFC@n?0FqJ4~2?t?#%j(^0GSVn$J26Q^z z!*D40Msh;DR#fefJ-M(XmXY7I0XsWsgOXndou_u0OxAW2mX+U>0qO13cQ7tr(~!G5 z1V{`_0VHNS5&Nd&bz{Zve>>@rPNRXYrr@Mlu~mF3vGFCvt+GdS z^Y+yI)%^LW{b{lM#7t~c2JEEMMmn{H?CBW-Or$Vj91^d0``G>HV|asSMkZ_DWk6zf zHeyg-x3J14I|{ry7QJl@I$m$J5Pr{xOxc`x!rUdm#FOJnwFGZG3B9f%FdPj+xYy(6 z=c_k^ygf4jcEQ9OBtGEtf!zgYwnyvAP^b6lyuwVN_L*|UR0qs7;NjkbeR`(hMG3mP z26wxIc4UnkLBidNg6`@HKTqxG`lQeOcJyN5TOt#~^Ha}~IMCx7sGay6Ght@_nFf%E zdacT@JrYOaeSrXK`8>RV8))fGMAoD1SqD7e?T-KWo#p{sz7LQHCgy-09&!`dNGSiS zzSX-Mw?c*x&p0q6o-lnIeKq{);rRLikV z8NhneMH3-i?{s`O6nx_fY_yu(knpWF!y634&IxeYm>vNnicFwm-uq*S*EAWvOX3Mj zUxjChd)LGh&aXj8j$;5M$1wns;}`(RaSVXuI0is+90MRZjscJy#{fuhb05O&vjXVSSr7IYzM;VY4K^P zTxB&yHxg*{t!)vpWWae{b9wqjBbrE{TF3*;1Yvbs9~AVeR6sZuNBaFO=(US|v#Yez zpk?mlojb_>eFmjc!g@S8%0-Y|mDNJxFN#H+YufVW00AX}dyu%}o{&#b;BGdtsCa^6 z+-I>UCP4;|voh>)Ueg>{HlXWqJ@)pDpVro6XnQ>TJ=z%}*t>TRL7yMF^8!A5u)F{B zi^cX0QjC9CtPj#@Xsrg0UcMZiqxpzf?e$QvRCsMx<6AZ$uc*&JlZ>X}_RXLnMnHrO zO_~!5xjf%MK`bg>#CVuWA(t=kO&FVrB){fsY$TBJGy*bpZSLFcLSKaqm+LXR?>?jZ zFBL>vWKJp-7g%p>#n!)qO`Kyn-dAUTc!kQ~PVNRDFwB*!rTlH(Wv$&ucG{{RxD VZwEyzp!NU&002ovPDHLkV1npHQRV;u literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png new file mode 100644 index 0000000000000000000000000000000000000000..dce1ff1268fdc39e063d636d4703ee8b6734e930 GIT binary patch literal 1321 zcmV+^1=jkBP)zwaQ(k{!i&a3sjP+F;;YoetuG5DGPOlBPKnnF@a4v5+yQ#ONa0>ffw!xoo0#W95OJ?8qZgdx_o*EvD0=So?jJY) zCLj`w%oaP`;Ucg|sQuTxFuIF(Vwxb&uw{lk;aUNR#7U#hlMj(2@}WosjdB_O$SrhQ zr${U$*}et%z}xM;`Hd2xZ68EBnJYt@M5&=Uao?tsARk#>1TeCPO~r$z!taGcx3u>< zd69`{1*QaGqv@eUNbfrxe-w*;kb>HsQ!YsS&b;Q2#$jgyoHk5H0FfdQ=$McG2*f!h z!&xFvnCLs;I&!l{o-h+1LeqpR02~fi05}}30B|^50pM`B0>I&L1%Sih3IK=06#x#$ zjRko4)q}CsxR<}avi0AgY1z4v01wtb89HSwRtkr2>fk8xaRpKG;nm(>mTg!TfC>?# z=c5%{u@^#E6+w_Ut_Ls{M#-0P#S$~HBtRyWc+yu@{x9%otA#I z)G%EX6|f`#BflL_EjQ*?L&!3`r>8JWolv$Q4wQ-b?z5Dtec02~fi05}}30B|^50pM`B0>I&L1%Sih f3IK=0@dEr0G9{0-LkCMF00000NkvXXu0mjfi*IJq literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd1446e077d64c5d06f2f9c40de6289485d81a5 GIT binary patch literal 1250 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 c>AENW2H+|jQ(EtDd literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json b/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json new file mode 100644 index 0000000000..fa249acc50 --- /dev/null +++ b/Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/BlueMoon-Labs/MOLOT-BlueMoon-Station/commit/befbde4d72e7b7ed609209f77afb083b1bbf1aa5 | Edited by PuroSlavKing (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon", + "delays": [ + [ + 0.6, + 0.3 + ] + ] + } + ] +} From 689754770b4dd0f1ad37d93d113dff867acb3242 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 11:27:27 +0300 Subject: [PATCH 02/38] huh --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 6334919bc2..08fdc2b43f 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -15,8 +15,6 @@ public sealed partial class HeadcrabComponent : Component [DataField("jumpAction", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] public string JumpAction = "ActionHeadcrabJump"; - public EntityUid? WormJumpAction; - [DataField("paralyzeTime"), ViewVariables(VVAccess.ReadWrite)] public float ParalyzeTime = 3f; From b9cb9526fac3a0524b42c76e078a84aa1017d39d Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 11:59:22 +0300 Subject: [PATCH 03/38] guidebook --- .../Locale/ru-RU/_white/guidbook/main.ftl | 3 +++ .../_White/Entities/Mobs/NPCs/headcrab.yml | 3 +-- .../_White/Guidebook/Antags/Headcrabs.yml | 14 -------------- .../_White/Guidebook/Antags/headcrab.yml | 14 ++++++++++++++ .../Prototypes/_White/Guidebook/WWDP.yml | 6 ++++++ .../_White/Guidebook/WhiteAntagonist.yml | 19 +++++++++++++++++++ .../{Antagonist => }/Antagonist.xml | 0 .../Antagonist => Headcrab}/Headcrabs.xml | 0 .../Headcrabs/Headcrab.xml | 5 ----- .../Headcrabs/HeadcrabFast.xml | 5 ----- .../Headcrabs/HeadcrabPoison.xml | 7 +------ .../ServerInfo/_White/Guidebook/WWDP.xml | 11 +++++++++++ 12 files changed, 55 insertions(+), 32 deletions(-) create mode 100644 Resources/Locale/ru-RU/_white/guidbook/main.ftl delete mode 100644 Resources/Prototypes/_White/Guidebook/Antags/Headcrabs.yml create mode 100644 Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml create mode 100644 Resources/Prototypes/_White/Guidebook/WWDP.yml create mode 100644 Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml rename Resources/ServerInfo/_White/Guidebook/Antagonist/{Antagonist => }/Antagonist.xml (100%) rename Resources/ServerInfo/_White/Guidebook/Antagonist/{Antagonist/Antagonist => Headcrab}/Headcrabs.xml (100%) rename Resources/ServerInfo/_White/Guidebook/Antagonist/{Antagonist/Antagonist => Headcrab}/Headcrabs/Headcrab.xml (96%) rename Resources/ServerInfo/_White/Guidebook/Antagonist/{Antagonist/Antagonist => Headcrab}/Headcrabs/HeadcrabFast.xml (94%) rename Resources/ServerInfo/_White/Guidebook/Antagonist/{Antagonist/Antagonist => Headcrab}/Headcrabs/HeadcrabPoison.xml (90%) create mode 100644 Resources/ServerInfo/_White/Guidebook/WWDP.xml diff --git a/Resources/Locale/ru-RU/_white/guidbook/main.ftl b/Resources/Locale/ru-RU/_white/guidbook/main.ftl new file mode 100644 index 0000000000..fa1f25acf7 --- /dev/null +++ b/Resources/Locale/ru-RU/_white/guidbook/main.ftl @@ -0,0 +1,3 @@ +guide-entry-wwdp = WWDP + +guide-entry-antagonist = Антагонисты diff --git a/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml index ac815ba92f..9ec75e5558 100644 --- a/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml +++ b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml @@ -79,7 +79,6 @@ - type: NpcFactionMember factions: - Zombie - - SimpleHostile - type: HTN rootTask: task: SimpleHostileCompound @@ -149,7 +148,7 @@ - type: MeleeWeapon damage: types: - Poison: 1.2 + Poison: 2 - type: MovementSpeedModifier baseWalkSpeed: 2.6 baseSprintSpeed: 3.6 diff --git a/Resources/Prototypes/_White/Guidebook/Antags/Headcrabs.yml b/Resources/Prototypes/_White/Guidebook/Antags/Headcrabs.yml deleted file mode 100644 index 2608c7f799..0000000000 --- a/Resources/Prototypes/_White/Guidebook/Antags/Headcrabs.yml +++ /dev/null @@ -1,14 +0,0 @@ -- type: guideEntry - id: Headcrab - name: antagonist-name-headcrab - text: "/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Headcrabs/Headcrab.xml" - -- type: guideEntry - id: HeadcrabFast - name: antagonist-name-headcrab-fast - text: "/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml" - -- type: guideEntry - id: HeadcrabPoison - name: antagonist-name-headcrab-poison - text: "/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml" diff --git a/Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml b/Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml new file mode 100644 index 0000000000..d713fc4307 --- /dev/null +++ b/Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml @@ -0,0 +1,14 @@ +- type: guideEntry + id: Headcrab + name: antagonist-name-headcrab + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml" + +- type: guideEntry + id: HeadcrabFast + name: antagonist-name-headcrab-fast + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml" + +- type: guideEntry + id: HeadcrabPoison + name: antagonist-name-headcrab-poison + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml" diff --git a/Resources/Prototypes/_White/Guidebook/WWDP.yml b/Resources/Prototypes/_White/Guidebook/WWDP.yml new file mode 100644 index 0000000000..63e5e20f46 --- /dev/null +++ b/Resources/Prototypes/_White/Guidebook/WWDP.yml @@ -0,0 +1,6 @@ +- type: guideEntry + id: WWDP + name: guide-entry-wwdp + text: "/ServerInfo/_White/Guidebook/WWDP.xml" + children: + - WhiteAntagonist diff --git a/Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml b/Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml new file mode 100644 index 0000000000..cfec4c5fe1 --- /dev/null +++ b/Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml @@ -0,0 +1,19 @@ +# ANTAGONIST + +- type: guideEntry + id: WhiteAntagonist + name: guide-entry-antagonist + text: "/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml" + children: + - Headcrabs + +# Headcrab + +- type: guideEntry + id: Headcrabs + name: antagonist-name-headcrabs + text: "/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml" + children: + - Headcrab + - HeadcrabFast + - HeadcrabPoison diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml similarity index 100% rename from Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist.xml rename to Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml similarity index 100% rename from Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs.xml rename to Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/Headcrab.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml similarity index 96% rename from Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/Headcrab.xml rename to Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml index 815649b226..74e11049b4 100644 --- a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/Headcrab.xml +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml @@ -16,9 +16,4 @@ - Имеет 50 ХП. - Передвигается на 10% медленее. - Способности: - - - - diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml similarity index 94% rename from Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml rename to Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml index b935b734d4..4ce86a8e42 100644 --- a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabFast.xml +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml @@ -16,9 +16,4 @@ - Имеет 50 ХП. - Передвигается на 20% быстрее. - Способности: - - - - diff --git a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml similarity index 90% rename from Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml rename to Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml index c055ef8be4..26311305d5 100644 --- a/Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist/Antagonist/Headcrabs/HeadcrabPoison.xml +++ b/Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml @@ -12,13 +12,8 @@ ## Особенности - - Наносит [color=#46A446]1.2 яда[/color] своими челюстями, в том числе при закреплении. + - Наносит [color=#46A446]2 яда[/color] своими челюстями, в том числе при закреплении. - Имеет 50 ХП. - Передвигается на 40% медленее. - Способности: - - - - diff --git a/Resources/ServerInfo/_White/Guidebook/WWDP.xml b/Resources/ServerInfo/_White/Guidebook/WWDP.xml new file mode 100644 index 0000000000..0fc478bc05 --- /dev/null +++ b/Resources/ServerInfo/_White/Guidebook/WWDP.xml @@ -0,0 +1,11 @@ + + # WWDP + + Добро пожаловать в руководства [color=#DC143C]WWDP[/color]. + + ## Сервер + [color=#DC143C]WWDP[/color] - форк [color=#7B68EE]Einstein Engines[/color], представляющего из себя хард-форк репозитория [color=#2F4F4F]Space Wizards[/color], построенный на идеалах и дизайнерском вдохновении семейства серверов BayStation 12 от Space Station 13 с упором на модульный код, который каждый может использовать для создания RP-сервера своей мечты. + + [color=#DC143C]WWDP[/color] - один из основных серверов русского коммьюнити, который выступает за идеалы свободы отыгрыша, свободы слова и настоящей классической атмосферы Space Station 13 - хаос, веселье, возможности. + + From 6ef26789587611c25888769d5a5315db367628b7 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 12:17:14 +0300 Subject: [PATCH 04/38] ftl work --- Resources/Locale/en-US/_white/popups/headcrab.ftl | 11 +++++++++++ .../Locale/en-US/_white/prototypes/actions/types.ftl | 2 +- Resources/Locale/ru-RU/_white/popups/headcrab.ftl | 5 ++++- .../Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml | 6 +++--- 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 Resources/Locale/en-US/_white/popups/headcrab.ftl diff --git a/Resources/Locale/en-US/_white/popups/headcrab.ftl b/Resources/Locale/en-US/_white/popups/headcrab.ftl new file mode 100644 index 0000000000..cd8cc9a183 --- /dev/null +++ b/Resources/Locale/en-US/_white/popups/headcrab.ftl @@ -0,0 +1,11 @@ +ghost-role-information-headcrab-name = Headcrab +ghost-role-information-headcrab-description = Ride the carrier, bite off its head and protect your nest. + +headcrab-eat-entity-face = Headcrab is eating your head! +headcrab-eat-other-entity-face = Headcrab is eating { CAPITALIZE($entity) } head! + +headcrab-hit-entity-head = You got { CAPITALIZE($entity) } head! + +headcrab-entity-bite = Headcrab bit your hand! + +headcrab-try-unequip = You cant take headcrab off your head. diff --git a/Resources/Locale/en-US/_white/prototypes/actions/types.ftl b/Resources/Locale/en-US/_white/prototypes/actions/types.ftl index 91789d9add..42dc30a911 100644 --- a/Resources/Locale/en-US/_white/prototypes/actions/types.ftl +++ b/Resources/Locale/en-US/_white/prototypes/actions/types.ftl @@ -1,2 +1,2 @@ jump-action-name = Jump -jump-action-description = Super jump. +jump-action-description = Do super jump. diff --git a/Resources/Locale/ru-RU/_white/popups/headcrab.ftl b/Resources/Locale/ru-RU/_white/popups/headcrab.ftl index 83d292f452..6d19540cdc 100644 --- a/Resources/Locale/ru-RU/_white/popups/headcrab.ftl +++ b/Resources/Locale/ru-RU/_white/popups/headcrab.ftl @@ -1,3 +1,6 @@ +ghost-role-information-headcrab-name = Хедкраб +ghost-role-information-headcrab-description = Оседлай носителя, откуси ему голову и защити своё гнездо. + headcrab-eat-entity-face = Хедкраб пожирает твою голову! headcrab-eat-other-entity-face = Хедкраб ест голову { CAPITALIZE($entity) }! @@ -5,4 +8,4 @@ headcrab-hit-entity-head = Вы ухватились за голову { CAPITAL headcrab-entity-bite = Хедкраб укусил вас за руку! -headcrab-try-unequip = Вы не можете удалить хедкраба со своей головы. +headcrab-try-unequip = Вы не можете снять хедкраба со своей головы. diff --git a/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml index 9ec75e5558..ef71085b84 100644 --- a/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml +++ b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml @@ -16,10 +16,10 @@ - type: GhostTakeoverAvailable - type: GhostRole allowSpeech: false - name: Хедкраб - description: Оседлай носителя, откуси ему голову, а главное защити гнездо. + name: ghost-role-information-headcrab-name + description: ghost-role-information-headcrab-description raffle: - settings: default + settings: short - type: Sprite drawdepth: SmallMobs layers: From 50e0a8c10ba9b4595e0cf7345388a43aff080783 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 12:21:11 +0300 Subject: [PATCH 05/38] fix rsi --- .../Interface/Actions/headcrab.rsi/meta.json | 2 +- .../headcrab.rsi/equipped-HELMET-reptilian.png | Bin 1028 -> 0 bytes .../headcrab.rsi/equipped-MASK-reptilian.png | Bin 1028 -> 0 bytes .../_White/Mobs/Animals/headcrab.rsi/meta.json | 8 ++++++++ .../equipped-HELMET-reptilian.png | Bin 1497 -> 0 bytes .../equipped-MASK-reptilian.png | Bin 1497 -> 0 bytes .../Mobs/Animals/headcrab_fast.rsi/meta.json | 8 ++++++++ .../equipped-HELMET-reptilian.png | Bin 1259 -> 0 bytes .../equipped-MASK-reptilian.png | Bin 1259 -> 0 bytes .../Mobs/Animals/headcrab_poison.rsi/meta.json | 8 ++++++++ 10 files changed, 25 insertions(+), 1 deletion(-) delete mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-reptilian.png delete mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-reptilian.png delete mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-reptilian.png delete mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-reptilian.png delete mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-reptilian.png delete mode 100644 Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-reptilian.png diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json index 3ea3560fb7..feb69eb835 100644 --- a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json +++ b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json @@ -1,5 +1,5 @@ { - "license": "CC BY-NC-SA 4.0", + "license": "CC-BY-NC-SA-4.0", "copyright": "Sprited by PuroSlavKing (Github)", "version": 1, "size": { "y": 32, "x": 32 }, diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-reptilian.png b/Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-reptilian.png deleted file mode 100644 index c1a8d048b448f4f4b416afc11ceebea75f546cf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1028 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 diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-reptilian.png b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-reptilian.png deleted file mode 100644 index a24be284240086a36f5ef69b49d0638681fe8893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1497 zcmajf`9ISS0LSr<<(|z|!uDn6E?1fKb%Z%b53*3Ys2rPGIp>zm!&HtOUko`%bL9Fq zG-6T6F-Lr<6pAD-{mfAD^A&e0YkDlZBE00d)ag*~YGZ^D8HTZs>t zJcx+DoqG@fKwtmHmw6lt0|0?UjFp8;*yE+#yEvFPyqlHXr%K4x!n9Q5ORMs=^6!1y zLo`o+RE$=-znWaMbpsKpBuu_1xt6>bPuAll=t*cwr;$#lL9K@|Avd45&gHV#oqY11 zxa(r_P(7;5wZNYI!5}=12#tK-X&5>swY(gjGPTK#E@ zyFiG;DWTCy(a1;`{LWGHkE4Fon!?R@Nl{4&+QR5bi+*FqNo(g}KUJMQ=)inzHKK$) zO-^p0VWo;)yhcam0~0}b>8kc2n!zF2cg>J5(jyn0Hb$NW*p&!7=>fL3#!R8U^27Gj zq<$QS&r%P|xS+cirXV&S9hv}6FF}M|7QbCulgdVF3rpN`eWMk3tYReS$WytOJRVZ? zh={$Kcx^YN;v%{N;kj$h%8DYMp#Sr1)`WJXO`_{?A#$8)A5qY0nsTNN46e)YD$6B5 zzS2I5mOpm*Q~kJ@dF#MUT(Ib%!n+i1j*5{Xk%Zx-Y9tqbpFJnFA}bI5@-xNQlktSB z(zPXax+{gvCywNq7`6UUm*G%wo$y@7p%|MfaaDt+B@@zlO&{o{=q!r3{@Sgjg#}MR z&HsXhWcH@JwW$ZU5DSJQHWya=VNO5J>!w5RgHJYwRoeMrHGBlNKv&C8G}x>dH*L%; z=~9vv`4!EK-k7j9?+_R}No#BEY*XPh=TPLp7dlRgFVNCvpW42l-e$lP`RVPEDt9Zi zqbb0Y`Ig^G9}3_3hJMBANocG>af#V5c=!Cn>IF@I-bYt0jxjW4TZkKa-tcV4TeO-fH z?YbLV_td6D-4!kMm|DR9%N5iM-`>p|xDSO#Fje<82=Tt>0XO-XiJ_p82%6Fm)o`^> zTP1g66!Mw#$ir_9Wbh=gj*z+{u(e}|?`9O+pfBb}oiYN`$K&h?^OQzYUWZV%JHo>H zD8>scfRKsndk-bbS^uey({Fn30@7h!nBdHH2*g=kAgic%@li-rwq=$If%U1W=9&{$ zrtBncVyy-{EZ}L<7<|^C3?~D;ya3e&!graY)3^YWgNP#wJa|9 zQsbCRPra{$F2yX$+Vtm4WK%F~NH*zJP3L0WM0+ah)_6uNHqLep&+&JJ^+I7t>3~na z)^*b`-jYfa=^Dk!U%8&na5h?DV592_$fZs0+t z>Xy*YZH7t@GSTk0@|q@UkGJUng?oCvw|^{QEz9FRKVGlE4SbC)aR~_b5?g9nwu zy{jL7optXpRv(nzP%u||!R=SBWEsX<&W3JhOR`r*3khMU43kWy+K%H8X5fn0B~@k8 k-qo=t;H(b#ztx!Wee}$p#z(N#4!#<|SUXzPpgqa|0)U{eL;wH) diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json index 772b4d67fe..4b92e8e92c 100644 --- a/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json @@ -18,9 +18,17 @@ "name": "equipped-MASK", "directions": 4 }, + { + "name": "equipped-MASK-vox", + "directions": 4 + }, { "name": "equipped-HELMET", "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 } ] } diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-reptilian.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-reptilian.png deleted file mode 100644 index e3f12f33fe9331cb0cb5f33cb4f31ed45bf7ca65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1259 zcmVJNRCt{2npbR{ERjSlRvTu7` zwg0943H>uwZqr*=YARK#Qnhugf@0UyoP)dUE{AZ~&NncaIAC^RsT9pV5@KP8@B7|& zW@mvJFC@n?0FqJ4~2?t?#%j(^0GSVn$J26Q^z z!*D40Msh;DR#fefJ-M(XmXY7I0XsWsgOXndou_u0OxAW2mX+U>0qO13cQ7tr(~!G5 z1V{`_0VHNS5&Nd&bz{Zve>>@rPNRXYrr@Mlu~mF3vGFCvt+GdS z^Y+yI)%^LW{b{lM#7t~c2JEEMMmn{H?CBW-Or$Vj91^d0``G>HV|asSMkZ_DWk6zf zHeyg-x3J14I|{ry7QJl@I$m$J5Pr{xOxc`x!rUdm#FOJnwFGZG3B9f%FdPj+xYy(6 z=c_k^ygf4jcEQ9OBtGEtf!zgYwnyvAP^b6lyuwVN_L*|UR0qs7;NjkbeR`(hMG3mP z26wxIc4UnkLBidNg6`@HKTqxG`lQeOcJyN5TOt#~^Ha}~IMCx7sGay6Ght@_nFf%E zdacT@JrYOaeSrXK`8>RV8))fGMAoD1SqD7e?T-KWo#p{sz7LQHCgy-09&!`dNGSiS zzSX-Mw?c*x&p0q6o-lnIeKq{);rRLikV z8NhneMH3-i?{s`O6nx_fY_yu(knpWF!y634&IxeYm>vNnicFwm-uq*S*EAWvOX3Mj zUxjChd)LGh&aXj8j$;5M$1wns;}`(RaSVXuI0is+90MRZjscJy#{fuhb05O&vjXVSSr7IYzM;VY4K^P zTxB&yHxg*{t!)vpWWae{b9wqjBbrE{TF3*;1Yvbs9~AVeR6sZuNBaFO=(US|v#Yez zpk?mlojb_>eFmjc!g@S8%0-Y|mDNJxFN#H+YufVW00AX}dyu%}o{&#b;BGdtsCa^6 z+-I>UCP4;|voh>)Ueg>{HlXWqJ@)pDpVro6XnQ>TJ=z%}*t>TRL7yMF^8!A5u)F{B zi^cX0QjC9CtPj#@Xsrg0UcMZiqxpzf?e$QvRCsMx<6AZ$uc*&JlZ>X}_RXLnMnHrO zO_~!5xjf%MK`bg>#CVuWA(t=kO&FVrB){fsY$TBJGy*bpZSLFcLSKaqm+LXR?>?jZ zFBL>vWKJp-7g%p>#n!)qO`Kyn-dAUTc!kQ~PVNRDFwB*!rTlH(Wv$&ucG{{RxD VZwEyzp!NU&002ovPDHLkV1npHQRV;u diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-reptilian.png b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-reptilian.png deleted file mode 100644 index e3f12f33fe9331cb0cb5f33cb4f31ed45bf7ca65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1259 zcmVJNRCt{2npbR{ERjSlRvTu7` zwg0943H>uwZqr*=YARK#Qnhugf@0UyoP)dUE{AZ~&NncaIAC^RsT9pV5@KP8@B7|& zW@mvJFC@n?0FqJ4~2?t?#%j(^0GSVn$J26Q^z z!*D40Msh;DR#fefJ-M(XmXY7I0XsWsgOXndou_u0OxAW2mX+U>0qO13cQ7tr(~!G5 z1V{`_0VHNS5&Nd&bz{Zve>>@rPNRXYrr@Mlu~mF3vGFCvt+GdS z^Y+yI)%^LW{b{lM#7t~c2JEEMMmn{H?CBW-Or$Vj91^d0``G>HV|asSMkZ_DWk6zf zHeyg-x3J14I|{ry7QJl@I$m$J5Pr{xOxc`x!rUdm#FOJnwFGZG3B9f%FdPj+xYy(6 z=c_k^ygf4jcEQ9OBtGEtf!zgYwnyvAP^b6lyuwVN_L*|UR0qs7;NjkbeR`(hMG3mP z26wxIc4UnkLBidNg6`@HKTqxG`lQeOcJyN5TOt#~^Ha}~IMCx7sGay6Ght@_nFf%E zdacT@JrYOaeSrXK`8>RV8))fGMAoD1SqD7e?T-KWo#p{sz7LQHCgy-09&!`dNGSiS zzSX-Mw?c*x&p0q6o-lnIeKq{);rRLikV z8NhneMH3-i?{s`O6nx_fY_yu(knpWF!y634&IxeYm>vNnicFwm-uq*S*EAWvOX3Mj zUxjChd)LGh&aXj8j$;5M$1wns;}`(RaSVXuI0is+90MRZjscJy#{fuhb05O&vjXVSSr7IYzM;VY4K^P zTxB&yHxg*{t!)vpWWae{b9wqjBbrE{TF3*;1Yvbs9~AVeR6sZuNBaFO=(US|v#Yez zpk?mlojb_>eFmjc!g@S8%0-Y|mDNJxFN#H+YufVW00AX}dyu%}o{&#b;BGdtsCa^6 z+-I>UCP4;|voh>)Ueg>{HlXWqJ@)pDpVro6XnQ>TJ=z%}*t>TRL7yMF^8!A5u)F{B zi^cX0QjC9CtPj#@Xsrg0UcMZiqxpzf?e$QvRCsMx<6AZ$uc*&JlZ>X}_RXLnMnHrO zO_~!5xjf%MK`bg>#CVuWA(t=kO&FVrB){fsY$TBJGy*bpZSLFcLSKaqm+LXR?>?jZ zFBL>vWKJp-7g%p>#n!)qO`Kyn-dAUTc!kQ~PVNRDFwB*!rTlH(Wv$&ucG{{RxD VZwEyzp!NU&002ovPDHLkV1npHQRV;u diff --git a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json index 772b4d67fe..4b92e8e92c 100644 --- a/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json +++ b/Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json @@ -18,9 +18,17 @@ "name": "equipped-MASK", "directions": 4 }, + { + "name": "equipped-MASK-vox", + "directions": 4 + }, { "name": "equipped-HELMET", "directions": 4 + }, + { + "name": "equipped-HELMET-vox", + "directions": 4 } ] } From ef5c81d76c8aa8c7300147463daa0f9db5b0057c Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 12:43:09 +0300 Subject: [PATCH 06/38] fixes --- .../_White/Headcrab/HeadcrabComponent.cs | 8 +++--- .../_White/Headcrab/HeadcrabSystem.cs | 24 ++++++++--------- .../_White/Entities/Mobs/NPCs/headcrab.yml | 26 +++++++++---------- .../Structures/Other/headcrab_nest.yml | 10 +++---- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 08fdc2b43f..15ae2924ad 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -18,16 +18,16 @@ public sealed partial class HeadcrabComponent : Component [DataField("paralyzeTime"), ViewVariables(VVAccess.ReadWrite)] public float ParalyzeTime = 3f; - [DataField("chansePounce"), ViewVariables(VVAccess.ReadWrite)] - public int ChansePounce = 33; + [DataField("chancePounce"), ViewVariables(VVAccess.ReadWrite)] + public int ChancePounce = 33; [DataField("damage", required: true)] [ViewVariables(VVAccess.ReadWrite)] public DamageSpecifier Damage = default!; - public bool IsDeath = false; + public bool IsDead = false; - public EntityUid EquipedOn; + public EntityUid EquippedOn; [ViewVariables] public float Accumulator = 0; diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 5223cf534c..8c1cf95079 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -64,7 +64,7 @@ private void OnStartup(EntityUid uid, HeadcrabComponent component, ComponentStar private void OnHeadcrabDoHit(EntityUid uid, HeadcrabComponent component, ThrowDoHitEvent args) { - if (component.IsDeath) + if (component.IsDead) return; if (HasComp(args.Target)) return; @@ -85,7 +85,7 @@ private void OnHeadcrabDoHit(EntityUid uid, HeadcrabComponent component, ThrowDo if (!_inventory.TryEquip(args.Target, uid, "mask", true)) return; - component.EquipedOn = args.Target; + component.EquippedOn = args.Target; _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head"), args.Target, args.Target, PopupType.LargeCaution); @@ -106,7 +106,7 @@ private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquipp { if (args.Slot != "mask") return; - component.EquipedOn = args.Equipee; + component.EquippedOn = args.Equipee; EnsureComp(uid); _npcFaction.AddFaction(uid, "Zombie"); } @@ -115,7 +115,7 @@ private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingU { if (args.Slot != "mask") return; - if (component.EquipedOn != args.Unequipee) + if (component.EquippedOn != args.Unequipee) return; if (HasComp(args.Unequipee)) return; @@ -128,7 +128,7 @@ private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEq { if (HasComp(args.User)) return; - if (component.IsDeath) + if (component.IsDead) return; // _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); _damageableSystem.TryChangeDamage(args.User, component.Damage); @@ -140,7 +140,7 @@ private void OnGotUnequipped(EntityUid uid, HeadcrabComponent component, GotUneq { if (args.Slot != "mask") return; - component.EquipedOn = EntityUid.Invalid; + component.EquippedOn = EntityUid.Invalid; RemCompDeferred(uid); var combatMode = EnsureComp(uid); _combat.SetInCombatMode(uid, true, combatMode); @@ -170,7 +170,7 @@ private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEven if (HasComp(headItem)) return; - var shouldEquip = _random.Next(1, 101) <= component.ChansePounce; + var shouldEquip = _random.Next(1, 101) <= component.ChancePounce; if (!shouldEquip) return; @@ -178,7 +178,7 @@ private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEven if (!equipped) return; - component.EquipedOn = entity; + component.EquippedOn = entity; _popup.PopupEntity(Loc.GetString("headcrab-eat-entity-face"), entity, entity, PopupType.LargeCaution); @@ -200,7 +200,7 @@ private static void OnMobStateChanged(EntityUid uid, HeadcrabComponent component { if (args.NewMobState == MobState.Dead) { - component.IsDeath = true; + component.IsDead = true; } } private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent args) @@ -233,16 +233,16 @@ public override void Update(float frameTime) comp.Accumulator = 0; - if (comp.EquipedOn is not { Valid: true } targetId) + if (comp.EquippedOn is not { Valid: true } targetId) continue; - if (HasComp(comp.EquipedOn)) + if (HasComp(comp.EquippedOn)) return; if (TryComp(targetId, out MobStateComponent? mobState)) { if (mobState.CurrentState is not MobState.Alive) { _inventory.TryUnequip(targetId, "mask", true, true); - comp.EquipedOn = EntityUid.Invalid; + comp.EquippedOn = EntityUid.Invalid; return; } } diff --git a/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml index ef71085b84..590aaf752f 100644 --- a/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml +++ b/Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml @@ -31,7 +31,7 @@ 50: Dead - type: Headcrab paralyzeTime: 3 - chansePounce: 33 + chancePounce: 33 damage: types: Piercing: 2 @@ -98,9 +98,9 @@ - Hissing - Draconic - TauCetiBasic -# - type: GuideHelp -# guides: -# - Headcrabs + - type: GuideHelp + guides: + - Headcrabs # HEADCRABS @@ -112,9 +112,9 @@ sprite: _White/Mobs/Animals/headcrab.rsi - type: Clothing sprite: _White/Mobs/Animals/headcrab.rsi -# - type: GuideHelp -# guides: -# - Headcrab + - type: GuideHelp + guides: + - Headcrab - type: entity parent: BaseMobHeadcrab @@ -128,9 +128,9 @@ - type: MovementSpeedModifier baseWalkSpeed: 3.2 baseSprintSpeed: 4.2 -# - type: GuideHelp -# guides: -# - HeadcrabFast + - type: GuideHelp + guides: + - HeadcrabFast - type: entity parent: BaseMobHeadcrab @@ -152,6 +152,6 @@ - type: MovementSpeedModifier baseWalkSpeed: 2.6 baseSprintSpeed: 3.6 -# - type: GuideHelp -# guides: -# - HeadcrabPoison + - type: GuideHelp + guides: + - HeadcrabPoison diff --git a/Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml b/Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml index 5a958b9608..c548967cb3 100644 --- a/Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml +++ b/Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml @@ -19,7 +19,7 @@ thresholds: - trigger: !type:DamageTrigger - damage: 180 + damage: 250 behaviors: - !type:PlaySoundBehavior sound: @@ -45,7 +45,7 @@ - MobHeadcrabPoison intervalSeconds: 60 minimumEntitiesSpawned: 1 - maximumEntitiesSpawned: 1 -# - type: GuideHelp -# guides: -# - Headcrabs + maximumEntitiesSpawned: 2 + - type: GuideHelp + guides: + - Headcrabs From 74433ae02b15526ed0b4a3eef44870a2535d348e Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 12:57:56 +0300 Subject: [PATCH 07/38] remove SVO --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 2 +- Content.Shared/_White/Headcrab/SharedHeadcrab.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 8c1cf95079..291d01903e 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -15,7 +15,7 @@ using Content.Shared.Hands; using Content.Shared.Humanoid; using Content.Shared.Nutrition.Components; -using Content.Shared.SVO; +using Content.Shared._White.Headcrab; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Mobs; diff --git a/Content.Shared/_White/Headcrab/SharedHeadcrab.cs b/Content.Shared/_White/Headcrab/SharedHeadcrab.cs index 3e716e33ab..521b70293c 100644 --- a/Content.Shared/_White/Headcrab/SharedHeadcrab.cs +++ b/Content.Shared/_White/Headcrab/SharedHeadcrab.cs @@ -2,7 +2,7 @@ using Content.Shared.DoAfter; using Robust.Shared.Serialization; -namespace Content.Shared.SVO; +namespace Content.Shared._White.Headcrab; public sealed partial class JumpActionEvent : WorldTargetActionEvent { From 9ec3408194d78e43eb384efb9b18914b47be5684 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Tue, 24 Dec 2024 13:16:21 +0300 Subject: [PATCH 08/38] event announcement --- Resources/Locale/en-US/_white/station-events/events/events.ftl | 2 ++ Resources/Locale/ru-RU/_white/station-events/events/events.ftl | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Resources/Locale/en-US/_white/station-events/events/events.ftl b/Resources/Locale/en-US/_white/station-events/events/events.ftl index 2e3cf6311c..c959643c9c 100644 --- a/Resources/Locale/en-US/_white/station-events/events/events.ftl +++ b/Resources/Locale/en-US/_white/station-events/events/events.ftl @@ -1,2 +1,4 @@ station-event-stray-supply-pod-announcement = Stray capsule with goods was found on long-range scanners. The approximate landing location is unknown. station-event-stray-supply-pod-syndicate-announcement = Stray capsule with goods was found on long-range scanners. The approximate landing location is unknown. + +station-event-headcrab-invasion-announcement = Confirmed sightings of hostile wildlife on the station. Personnel are advised to arm themselves, barricade doors, and defend themselves if necessary. Security is advised to eradicate the threat as soon as possible. diff --git a/Resources/Locale/ru-RU/_white/station-events/events/events.ftl b/Resources/Locale/ru-RU/_white/station-events/events/events.ftl index 5424e0c09a..42cbd3613d 100644 --- a/Resources/Locale/ru-RU/_white/station-events/events/events.ftl +++ b/Resources/Locale/ru-RU/_white/station-events/events/events.ftl @@ -1,2 +1,4 @@ station-event-stray-supply-pod-announcement = На сканерах дальнего действия обнаружена бродячая капсула с товарами. Примерное место приземления неизвестно. station-event-stray-supply-pod-syndicate-announcement = На сканерах дальнего действия обнаружена бродячая капсула с товарами. Примерное место приземления неизвестно. + +station-event-headcrab-invasion-announcement = Подтверждено наличие на станции враждебной фауны. Персоналу рекомендуется вооружиться, забаррикадировать двери и защищаться в случае необходимости. Службе безопасности следует как можно скорее ликвидировать угрозу. From fb48ed10cabbbe5f7cd9a795c89993f3c8b81008 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:22:31 +0300 Subject: [PATCH 09/38] Update Content.Server/_White/Headcrab/HeadcrabComponent.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 15ae2924ad..788399111d 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -12,7 +12,7 @@ public sealed partial class HeadcrabComponent : Component ///

/// WorldTargetAction /// - [DataField("jumpAction", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] + [DataField(required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] public string JumpAction = "ActionHeadcrabJump"; [DataField("paralyzeTime"), ViewVariables(VVAccess.ReadWrite)] From 9e2e03bfa020a714c68f4ac4714a59af531dc4e0 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:22:43 +0300 Subject: [PATCH 10/38] Update Content.Server/_White/Headcrab/HeadcrabComponent.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 788399111d..459d315d92 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -15,7 +15,7 @@ public sealed partial class HeadcrabComponent : Component [DataField(required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] public string JumpAction = "ActionHeadcrabJump"; - [DataField("paralyzeTime"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float ParalyzeTime = 3f; [DataField("chancePounce"), ViewVariables(VVAccess.ReadWrite)] From 23a2a3c2ad69b3416e39015c9c77701f2a247a4e Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:22:56 +0300 Subject: [PATCH 11/38] Update Content.Server/_White/Headcrab/HeadcrabComponent.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 459d315d92..ae02579463 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -21,8 +21,7 @@ public sealed partial class HeadcrabComponent : Component [DataField("chancePounce"), ViewVariables(VVAccess.ReadWrite)] public int ChancePounce = 33; - [DataField("damage", required: true)] - [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true)] public DamageSpecifier Damage = default!; public bool IsDead = false; From 93dc9bb6621c52bc7d3ee33547512055a92f3083 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:23:04 +0300 Subject: [PATCH 12/38] Update Content.Server/_White/Headcrab/HeadcrabComponent.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index ae02579463..92b537a46f 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -28,7 +28,8 @@ public sealed partial class HeadcrabComponent : Component public EntityUid EquippedOn; - [ViewVariables] public float Accumulator = 0; + [ViewVariables] + public float Accumulator = 0; [DataField("damageFrequency"), ViewVariables(VVAccess.ReadWrite)] public float DamageFrequency = 5; From af74dbc598220a9587962ac083e854446cf4c6ed Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:23:20 +0300 Subject: [PATCH 13/38] Update Content.Server/_White/Headcrab/HeadcrabComponent.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 92b537a46f..a137707bd0 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -31,7 +31,7 @@ public sealed partial class HeadcrabComponent : Component [ViewVariables] public float Accumulator = 0; - [DataField("damageFrequency"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public float DamageFrequency = 5; [ViewVariables(VVAccess.ReadWrite), DataField("jumpSound")] From c8a708fd2d30cd263d1c0a4c9f80ff5d9ecedb1f Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:23:31 +0300 Subject: [PATCH 14/38] Update Content.Server/_White/Headcrab/HeadcrabComponent.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index a137707bd0..82dee42dba 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -18,7 +18,7 @@ public sealed partial class HeadcrabComponent : Component [DataField] public float ParalyzeTime = 3f; - [DataField("chancePounce"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public int ChancePounce = 33; [DataField(required: true)] From 5df19a60254bea7c12a8196bf88b59807f2ed88b Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:24:04 +0300 Subject: [PATCH 15/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 291d01903e..97eeaaa06f 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -234,9 +234,9 @@ public override void Update(float frameTime) comp.Accumulator = 0; if (comp.EquippedOn is not { Valid: true } targetId) + || HasComp(comp.EquippedOn) + || _mobstate.IsDead(uid)) continue; - if (HasComp(comp.EquippedOn)) - return; if (TryComp(targetId, out MobStateComponent? mobState)) { if (mobState.CurrentState is not MobState.Alive) From 92ea58992c059967185401a8c8c065e74bf200a6 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:24:18 +0300 Subject: [PATCH 16/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 97eeaaa06f..812861d5ee 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -224,7 +224,8 @@ public override void Update(float frameTime) { base.Update(frameTime); - foreach (var comp in EntityQuery()) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) { comp.Accumulator += frameTime; From eb7063e158a6464c5d12c5e4c2db1f0593926b99 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:24:53 +0300 Subject: [PATCH 17/38] Update Content.Server/_White/Headcrab/HeadcrabComponent.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabComponent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 82dee42dba..4e70bb9611 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -34,7 +34,7 @@ public sealed partial class HeadcrabComponent : Component [DataField] public float DamageFrequency = 5; - [ViewVariables(VVAccess.ReadWrite), DataField("jumpSound")] - public SoundSpecifier? HeadcrabJumpSound = new SoundPathSpecifier("/Audio/_White/Misc/Headcrab/headcrab_jump.ogg"); + [DataField] + public SoundSpecifier? JumpSound = new SoundPathSpecifier("/Audio/_White/Misc/Headcrab/headcrab_jump.ogg"); } From 5b904f9b28b806eab3c7e26f0e22707ed5f99e62 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:25:25 +0300 Subject: [PATCH 18/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 812861d5ee..fcf25adcf9 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -64,19 +64,11 @@ private void OnStartup(EntityUid uid, HeadcrabComponent component, ComponentStar private void OnHeadcrabDoHit(EntityUid uid, HeadcrabComponent component, ThrowDoHitEvent args) { - if (component.IsDead) - return; - if (HasComp(args.Target)) - return; - if (!HasComp(args.Target)) - return; - if (TryComp(args.Target, out MobStateComponent? mobState)) - { - if (mobState.CurrentState is not MobState.Alive) - { + if (_mobState.IsDead(uid) + || HasComp(args.Target) + || !HasComp(args.Target) + || !_mobState.IsAlive(args.Target) return; - } - } _inventory.TryGetSlotEntity(args.Target, "head", out var headItem); if (HasComp(headItem)) From 6287c35efe0318462adf0b6f7135f31529b7d9c1 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:25:40 +0300 Subject: [PATCH 19/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index fcf25adcf9..16bbc070cc 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -71,10 +71,8 @@ private void OnHeadcrabDoHit(EntityUid uid, HeadcrabComponent component, ThrowDo return; _inventory.TryGetSlotEntity(args.Target, "head", out var headItem); - if (HasComp(headItem)) - return; - - if (!_inventory.TryEquip(args.Target, uid, "mask", true)) + if (HasComp(headItem) + || !_inventory.TryEquip(args.Target, uid, "mask", true)) return; component.EquippedOn = args.Target; From 7ed51e3d503b11ed97f81526ea89273ea4f94aab Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:26:01 +0300 Subject: [PATCH 20/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 16bbc070cc..178266ddbf 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -104,10 +104,9 @@ private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquipp private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingUnequippedAttemptEvent args) { if (args.Slot != "mask") - return; - if (component.EquippedOn != args.Unequipee) - return; - if (HasComp(args.Unequipee)) + || component.EquippedOn != args.Unequipee) + || HasComp(args.Unequipee) + || _mobState.IsDead(uid)) return; _popup.PopupEntity(Loc.GetString("headcrab-try-unequip"), args.Unequipee, args.Unequipee, PopupType.Large); From 1d811f68b6a0154431fb6fe2cb96e1cedd3d41a8 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:26:32 +0300 Subject: [PATCH 21/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 178266ddbf..0b75fa20b4 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -115,11 +115,11 @@ private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingU private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEquippedHandEvent args) { - if (HasComp(args.User)) - return; - if (component.IsDead) + if (_mobState.IsDead(uid) + || HasComp(args.User)) return; - // _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); + + _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); _damageableSystem.TryChangeDamage(args.User, component.Damage); _popup.PopupEntity(Loc.GetString("headcrab-entity-bite"), args.User, args.User); From 26b73b2a890ba15379dd2ecd99cf56a17902d105 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:27:01 +0300 Subject: [PATCH 22/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 0b75fa20b4..c31a877ebf 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -194,7 +194,8 @@ private static void OnMobStateChanged(EntityUid uid, HeadcrabComponent component } private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent args) { - if (args.Handled) + if (args.Handled + || comp.EquippedOn is { Valid: true }) return; args.Handled = true; From 144fd112bd330d02229546a3ec0ec3eb799079ad Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:27:26 +0300 Subject: [PATCH 23/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index c31a877ebf..b4c65c2f0f 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -205,9 +205,7 @@ private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent _throwing.TryThrow(uid, direction, 7F, uid, 10F); if (component.HeadcrabJumpSound != null) - { _audioSystem.PlayPvs(component.HeadcrabJumpSound, uid, component.HeadcrabJumpSound.Params); - } } public override void Update(float frameTime) From 31b79351ed3e67b646e963016af19037c59ba220 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:28:16 +0300 Subject: [PATCH 24/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index b4c65c2f0f..8478ed47f3 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -226,14 +226,11 @@ public override void Update(float frameTime) || HasComp(comp.EquippedOn) || _mobstate.IsDead(uid)) continue; - if (TryComp(targetId, out MobStateComponent? mobState)) + if (!_mobState.IsAlive(targetId)) { - if (mobState.CurrentState is not MobState.Alive) - { - _inventory.TryUnequip(targetId, "mask", true, true); + _inventory.TryUnequip(targetId, "mask", true, true); comp.EquippedOn = EntityUid.Invalid; return; - } } _damageableSystem.TryChangeDamage(targetId, comp.Damage); _popup.PopupEntity(Loc.GetString("headcrab-eat-entity-face"), From b1bf8bd85cb1670dd3ce59960fde0a4b6b4d5e09 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:52:13 +0300 Subject: [PATCH 25/38] ok --- .../_White/Headcrab/HeadcrabComponent.cs | 2 - .../_White/Headcrab/HeadcrabSystem.cs | 63 +++++-------------- 2 files changed, 15 insertions(+), 50 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabComponent.cs b/Content.Server/_White/Headcrab/HeadcrabComponent.cs index 4e70bb9611..b4f6f8d11e 100644 --- a/Content.Server/_White/Headcrab/HeadcrabComponent.cs +++ b/Content.Server/_White/Headcrab/HeadcrabComponent.cs @@ -24,8 +24,6 @@ public sealed partial class HeadcrabComponent : Component [DataField(required: true)] public DamageSpecifier Damage = default!; - public bool IsDead = false; - public EntityUid EquippedOn; [ViewVariables] diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 8478ed47f3..5931dfffed 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -62,36 +62,6 @@ private void OnStartup(EntityUid uid, HeadcrabComponent component, ComponentStar _action.AddAction(uid, component.JumpAction); } - private void OnHeadcrabDoHit(EntityUid uid, HeadcrabComponent component, ThrowDoHitEvent args) - { - if (_mobState.IsDead(uid) - || HasComp(args.Target) - || !HasComp(args.Target) - || !_mobState.IsAlive(args.Target) - return; - - _inventory.TryGetSlotEntity(args.Target, "head", out var headItem); - if (HasComp(headItem) - || !_inventory.TryEquip(args.Target, uid, "mask", true)) - return; - - component.EquippedOn = args.Target; - - _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head"), - args.Target, args.Target, PopupType.LargeCaution); - - _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", - ("entity", args.Target)), - uid, uid, PopupType.LargeCaution); - - _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", - ("entity", args.Target)), args.Target, Filter.PvsExcept(uid), true, PopupType.Large); - - EnsureComp(uid); - _stunSystem.TryParalyze(args.Target, TimeSpan.FromSeconds(component.ParalyzeTime), true); - _damageableSystem.TryChangeDamage(args.Target, component.Damage); - } - private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquippedEvent args) { if (args.Slot != "mask") @@ -108,6 +78,7 @@ private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingU || HasComp(args.Unequipee) || _mobState.IsDead(uid)) return; + _popup.PopupEntity(Loc.GetString("headcrab-try-unequip"), args.Unequipee, args.Unequipee, PopupType.Large); args.Cancel(); @@ -118,7 +89,7 @@ private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEq if (_mobState.IsDead(uid) || HasComp(args.User)) return; - + _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); _damageableSystem.TryChangeDamage(args.User, component.Damage); _popup.PopupEntity(Loc.GetString("headcrab-entity-bite"), @@ -167,16 +138,18 @@ private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEven if (!equipped) return; - component.EquippedOn = entity; - - _popup.PopupEntity(Loc.GetString("headcrab-eat-entity-face"), - entity, entity, PopupType.LargeCaution); + if (_mobState.IsDead(uid) + || HasComp(entity) + || !HasComp(entity) + || !_mobState.IsAlive(entity) + return; - _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", ("entity", entity)), - uid, uid, PopupType.LargeCaution); + _inventory.TryGetSlotEntity(entity, "head", out var headItem); + if (HasComp(headItem) + || !_inventory.TryEquip(entity, uid, "mask", true)) + return; - _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", - ("entity", entity)), entity, Filter.PvsExcept(entity), true, PopupType.Large); + component.EquippedOn = entity; EnsureComp(uid); _stunSystem.TryParalyze(entity, TimeSpan.FromSeconds(component.ParalyzeTime), true); @@ -185,13 +158,6 @@ private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEven } } - private static void OnMobStateChanged(EntityUid uid, HeadcrabComponent component, MobStateChangedEvent args) - { - if (args.NewMobState == MobState.Dead) - { - component.IsDead = true; - } - } private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent args) { if (args.Handled @@ -204,8 +170,8 @@ private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent var direction = mapCoords.Position - _transform.GetMapCoordinates(xform).Position; _throwing.TryThrow(uid, direction, 7F, uid, 10F); - if (component.HeadcrabJumpSound != null) - _audioSystem.PlayPvs(component.HeadcrabJumpSound, uid, component.HeadcrabJumpSound.Params); + if (component.JumpSound != null) + _audioSystem.PlayPvs(component.JumpSound, uid, component.JumpSound.Params); } public override void Update(float frameTime) @@ -226,6 +192,7 @@ public override void Update(float frameTime) || HasComp(comp.EquippedOn) || _mobstate.IsDead(uid)) continue; + if (!_mobState.IsAlive(targetId)) { _inventory.TryUnequip(targetId, "mask", true, true); From d9c8d7b3ce22953b1634752deb20d03ab50deb67 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 14:23:23 +0300 Subject: [PATCH 26/38] fixiki --- .../_White/Headcrab/HeadcrabSystem.cs | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 5931dfffed..e982390a29 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -1,10 +1,10 @@ -using System.Linq; +using System; +using System.Linq; using Content.Server.Actions; using Content.Server.NPC.Components; using Content.Server.Nutrition.Components; using Content.Server.Nutrition.EntitySystems; using Content.Server.Popups; -using Content.Server.NPC.Components; using Content.Server.NPC.Systems; using Content.Server._White.Headcrab; using Content.Server.Zombies; @@ -13,12 +13,14 @@ using Content.Shared.Damage; using Content.Shared.CombatMode.Pacification; using Content.Shared.Hands; +using Content.Shared.Hands.EntitySystems; using Content.Shared.Humanoid; using Content.Shared.Nutrition.Components; using Content.Shared._White.Headcrab; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Content.Shared.Mobs; +using Content.Shared.Mobs.Systems; using Content.Shared.Mobs.Components; using Content.Shared.Popups; using Content.Shared.Stunnable; @@ -38,6 +40,8 @@ public sealed partial class HeadcrabSystem : EntitySystem [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly NpcFactionSystem _npcFaction = default!; [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedCombatModeSystem _combat = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; [Dependency] private readonly SharedAudioSystem _audioSystem = default!; @@ -48,11 +52,9 @@ public override void Initialize() { SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnHeadcrabDoHit); SubscribeLocalEvent(OnGotEquipped); SubscribeLocalEvent(OnGotUnequipped); SubscribeLocalEvent(OnGotEquippedHand); - SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnUnequipAttempt); SubscribeLocalEvent(OnJump); } @@ -66,17 +68,17 @@ private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquipp { if (args.Slot != "mask") return; + component.EquippedOn = args.Equipee; EnsureComp(uid); - _npcFaction.AddFaction(uid, "Zombie"); } private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingUnequippedAttemptEvent args) { - if (args.Slot != "mask") - || component.EquippedOn != args.Unequipee) - || HasComp(args.Unequipee) - || _mobState.IsDead(uid)) + if (args.Slot != "mask" || + component.EquippedOn != args.Unequipee || + HasComp(args.Unequipee) || + _mobState.IsDead(uid)) return; _popup.PopupEntity(Loc.GetString("headcrab-try-unequip"), @@ -86,8 +88,7 @@ private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingU private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEquippedHandEvent args) { - if (_mobState.IsDead(uid) - || HasComp(args.User)) + if (_mobState.IsDead(uid) || HasComp(args.User)) return; _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); @@ -100,12 +101,12 @@ private void OnGotUnequipped(EntityUid uid, HeadcrabComponent component, GotUneq { if (args.Slot != "mask") return; + component.EquippedOn = EntityUid.Invalid; RemCompDeferred(uid); var combatMode = EnsureComp(uid); _combat.SetInCombatMode(uid, true, combatMode); EnsureComp(uid); - _npcFaction.RemoveFaction(uid, "Zombie"); } private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEvent args) @@ -138,15 +139,15 @@ private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEven if (!equipped) return; - if (_mobState.IsDead(uid) - || HasComp(entity) - || !HasComp(entity) - || !_mobState.IsAlive(entity) - return; + if (_mobState.IsDead(uid) || + HasComp(entity) || + !HasComp(entity) || + !_mobState.IsAlive(entity)) + return; _inventory.TryGetSlotEntity(entity, "head", out var headItem); - if (HasComp(headItem) - || !_inventory.TryEquip(entity, uid, "mask", true)) + if (HasComp(headItem) || + !_inventory.TryEquip(entity, uid, "mask", true)) return; component.EquippedOn = entity; @@ -160,8 +161,7 @@ private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEven private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent args) { - if (args.Handled - || comp.EquippedOn is { Valid: true }) + if (args.Handled || component.EquippedOn is { Valid: true }) return; args.Handled = true; @@ -188,17 +188,18 @@ public override void Update(float frameTime) comp.Accumulator = 0; - if (comp.EquippedOn is not { Valid: true } targetId) - || HasComp(comp.EquippedOn) - || _mobstate.IsDead(uid)) + if (comp.EquippedOn is not { Valid: true } targetId || + HasComp(comp.EquippedOn) || + _mobState.IsDead(uid)) continue; if (!_mobState.IsAlive(targetId)) { - _inventory.TryUnequip(targetId, "mask", true, true); - comp.EquippedOn = EntityUid.Invalid; - return; + _inventory.TryUnequip(targetId, "mask", true, true); + comp.EquippedOn = EntityUid.Invalid; + return; } + _damageableSystem.TryChangeDamage(targetId, comp.Damage); _popup.PopupEntity(Loc.GetString("headcrab-eat-entity-face"), targetId, targetId, PopupType.LargeCaution); From d054e4a0ef28975a7465d3a50b5cc71110bf3fec Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 14:25:09 +0300 Subject: [PATCH 27/38] edit action --- Resources/Locale/en-US/_white/prototypes/actions/types.ftl | 2 -- Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl | 4 ++-- Resources/Prototypes/_White/Actions/types.yml | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 Resources/Locale/en-US/_white/prototypes/actions/types.ftl diff --git a/Resources/Locale/en-US/_white/prototypes/actions/types.ftl b/Resources/Locale/en-US/_white/prototypes/actions/types.ftl deleted file mode 100644 index 42dc30a911..0000000000 --- a/Resources/Locale/en-US/_white/prototypes/actions/types.ftl +++ /dev/null @@ -1,2 +0,0 @@ -jump-action-name = Jump -jump-action-description = Do super jump. diff --git a/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl b/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl index c180518800..82a9b83cf4 100644 --- a/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl +++ b/Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl @@ -10,5 +10,5 @@ ent-ToggleNightVision = Переключить ночное зрение ent-ToggleThermalVision = Переключить термальное зрение .desc = Переключает термальное зрение. -jump-action-name = Прыгнуть -jump-action-description = Сделать крутой прыжок. +ent-ActionHeadcrabJump = Прыгнуть + .desc = Сделать крутой прыжок. diff --git a/Resources/Prototypes/_White/Actions/types.yml b/Resources/Prototypes/_White/Actions/types.yml index 822eeaf377..13eefb49ff 100644 --- a/Resources/Prototypes/_White/Actions/types.yml +++ b/Resources/Prototypes/_White/Actions/types.yml @@ -58,8 +58,8 @@ - type: entity id: ActionHeadcrabJump - name: jump-action-name - description: jump-action-description + name: Jump + description: Do super jump. categories: [ HideSpawnMenu ] components: - type: WorldTargetAction From af4a2afc5f96be9a5ecf4fe6f5222df92284f5e6 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 14:39:19 +0300 Subject: [PATCH 28/38] aghost safe --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index e982390a29..4691fd87d1 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -10,6 +10,7 @@ using Content.Server.Zombies; using Content.Shared.Zombies; using Content.Shared.CombatMode; +using Content.Shared.Ghost; using Content.Shared.Damage; using Content.Shared.CombatMode.Pacification; using Content.Shared.Hands; @@ -91,6 +92,11 @@ private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEq if (_mobState.IsDead(uid) || HasComp(args.User)) return; + if (_mobState.IsDead(uid) || + HasComp(args.User) || + HasComp(args.User)) + return; + _handsSystem.TryDrop(args.User, uid, checkActionBlocker: false); _damageableSystem.TryChangeDamage(args.User, component.Damage); _popup.PopupEntity(Loc.GetString("headcrab-entity-bite"), @@ -145,8 +151,8 @@ private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEven !_mobState.IsAlive(entity)) return; - _inventory.TryGetSlotEntity(entity, "head", out var headItem); - if (HasComp(headItem) || + _inventory.TryGetSlotEntity(entity, "head", out var headItem2); + if (HasComp(headItem2) || !_inventory.TryEquip(entity, uid, "mask", true)) return; From 0d6f7aea43940ecf374d5fcd3b6d258ec0a0b5ed Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 14:54:38 +0300 Subject: [PATCH 29/38] better action --- Resources/Prototypes/_White/Actions/types.yml | 5 ++++- .../Interface/Actions/headcrab.rsi/jump-off.png | Bin 0 -> 550 bytes .../Interface/Actions/headcrab.rsi/jump-on.png | Bin 0 -> 645 bytes .../Interface/Actions/headcrab.rsi/jump.png | Bin 642 -> 0 bytes .../Interface/Actions/headcrab.rsi/meta.json | 5 ++++- 5 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-off.png create mode 100644 Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-on.png delete mode 100644 Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump.png diff --git a/Resources/Prototypes/_White/Actions/types.yml b/Resources/Prototypes/_White/Actions/types.yml index 13eefb49ff..e90d6bb477 100644 --- a/Resources/Prototypes/_White/Actions/types.yml +++ b/Resources/Prototypes/_White/Actions/types.yml @@ -65,7 +65,10 @@ - type: WorldTargetAction icon: sprite: _White/Interface/Actions/headcrab.rsi - state: jump + state: jump-off + iconOn: + sprite: _White/Interface/Actions/headcrab.rsi + state: jump-on event: !type:JumpActionEvent useDelay: 6 range: 160 diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-off.png b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-off.png new file mode 100644 index 0000000000000000000000000000000000000000..84c62a308301b4e629ab2ce4c4e59be03933ef21 GIT binary patch literal 550 zcmV+>0@?kEP)Jyh#E=CG%3a+x69@}=c1An890`mc{}rNXLfc45n+-t zH__DH<(m@bl(Ns@iEI4Pk0To&cs+=$YN#5lq}1-;HET1LYY(=r-p8I3@@z&-_+ z56>v?c-Zfs000Zo5Dtn!n(3ESgaBxJIf7ClqZF}N3;?jcv8nRkYa2K`zecH$!QR~q zz$ivGfqWv2wd^7Qp#J`$45>&M@njMU(GY5HU${6f;_T)Tm1dtsfSrO=Bs>zl+8x+1 z`NRxy^MaR=v~cv|jgPOM$gBx^zl* z`}FIyzBM3U#QNN-BO;~qdl74P!6HCJBMzOM>p^ugZvH$|;6_{z7DW8;*4vQGVAfH$ o>!jT9`sjrZd>#L}OuP~O04*QOq#oTy_y7O^07*qoM6N<$g4TuZ7XSbN literal 0 HcmV?d00001 diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-on.png b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump-on.png new file mode 100644 index 0000000000000000000000000000000000000000..09bf1929d992af26153a9c49d99424b6b353f338 GIT binary patch literal 645 zcmV;00($+4P)1*_sAfE3r+|W8G=xe&%Ibo434h* zQUoWW#(bdW91kZ65xy}%TdPY6G7c#!5=oN0_jv~gn;TZcJ}#hl^%~mEdaTnVfWulYBnSM1kk(%o@L{d0I!dJy0N~Z@H_HE`>poh0U(j56iq7dBKAl`S$ukLP z%m-MmJqG}sU)`vIN+G~pxr~M441WIpqxyZw0lNzl_qkFCV&u`$y5NxehrBgTU(!>R-4u`g*1J19@9oU& z+*(Ltp3;~r`u{-S#y{-w#Y}1;ATqH_k~rFTEAG9e#L6nSG~oilU=QTL+jol!!wcYO zA0$%}0Jyo7VMb%pCJ~eaB-wl1%7fXGkcvqp;D6;TL_*4X5eLTbKUH5wL z!|8?SJ-y1AqipLUx)B9BgNKaO>u60KkJsTUq>v7wEj`<6ygm_h-NH?)=gV zJ{5t@CBeqM3F!IvU+F??S+KgciuIKReEBv?=Rb}9RDuKU5EQOUYguyOv1@%2R+LEE zjZqXa7LcS_1kEC7N!i}1o9zMTu@VmipDa*xA>v>#DASQ>%;1<_hd?UE7{p`}k4PQh z017#v)5+;K#Le-3SlwE6mG~YJy7sM-5ziiqTI=iF_`J8mG~;5_aQMW@#a8X zpjzx}NYz|pTfeF=+n?IW6(SKq(p+P0#GWtf%l2zKg+gTKgeytQCQB77zP6Qb!t8yS zjqN#->70moLDjkh5lHT<9(#=D$hhozL*OE=!KRTaeY*}MW!CQXx+dk)*S$|a_(@iq c%>B>lUmt*ui2wiq diff --git a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json index feb69eb835..46526b2e82 100644 --- a/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json +++ b/Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json @@ -5,7 +5,10 @@ "size": { "y": 32, "x": 32 }, "states": [ { - "name": "jump" + "name": "jump-on" + }, + { + "name": "jump-off" } ] } From 36daeff1c87655cc72faae4893ad41afb602d2f0 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 14:59:15 +0300 Subject: [PATCH 30/38] remove duplicate --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 4691fd87d1..9a4e21b43b 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -89,9 +89,6 @@ private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingU private void OnGotEquippedHand(EntityUid uid, HeadcrabComponent component, GotEquippedHandEvent args) { - if (_mobState.IsDead(uid) || HasComp(args.User)) - return; - if (_mobState.IsDead(uid) || HasComp(args.User) || HasComp(args.User)) From 9161ac3b8f15afd0a8f6378b1a532cf07899c3a2 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:33:12 +0300 Subject: [PATCH 31/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 9a4e21b43b..ab6162901a 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -200,7 +200,7 @@ public override void Update(float frameTime) { _inventory.TryUnequip(targetId, "mask", true, true); comp.EquippedOn = EntityUid.Invalid; - return; + continue; } _damageableSystem.TryChangeDamage(targetId, comp.Damage); From 55b0b4918913a5d714e4976e73797e2f76fd552b Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:33:30 +0300 Subject: [PATCH 32/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index ab6162901a..a605f11714 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -1,13 +1,8 @@ -using System; using System.Linq; using Content.Server.Actions; using Content.Server.NPC.Components; -using Content.Server.Nutrition.Components; -using Content.Server.Nutrition.EntitySystems; using Content.Server.Popups; using Content.Server.NPC.Systems; -using Content.Server._White.Headcrab; -using Content.Server.Zombies; using Content.Shared.Zombies; using Content.Shared.CombatMode; using Content.Shared.Ghost; @@ -20,9 +15,7 @@ using Content.Shared._White.Headcrab; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; -using Content.Shared.Mobs; using Content.Shared.Mobs.Systems; -using Content.Shared.Mobs.Components; using Content.Shared.Popups; using Content.Shared.Stunnable; using Content.Shared.Throwing; From 84104ee931260ebfec266e1b67f96c848a8cbebb Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:35:56 +0300 Subject: [PATCH 33/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index a605f11714..e79eede433 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -65,6 +65,21 @@ private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquipp component.EquippedOn = args.Equipee; EnsureComp(uid); + RemComp(uid); + _npcFaction.AddFaction(args.Equipee, "Zombie"); + + if (_mobState.IsDead(uid)) + return; + + _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", + ("entity", args.Equipee)), + uid, uid, PopupType.LargeCaution); + + _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", + ("entity", args.Equipee)), args.Equipee, Filter.PvsExcept(uid), true, PopupType.Large); + + _stunSystem.TryParalyze(args.Equipee, TimeSpan.FromSeconds(component.ParalyzeTime), true); + _damageableSystem.TryChangeDamage(args.Equipee, component.Damage, origin: uid); } private void OnUnequipAttempt(EntityUid uid, HeadcrabComponent component, BeingUnequippedAttemptEvent args) From 83924e668658832632883bdc1ca8773caeecca8d Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:36:10 +0300 Subject: [PATCH 34/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index e79eede433..8bf6d68b0f 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -46,6 +46,7 @@ public override void Initialize() { SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); + SubscribeLocalEvent(OnThrowDoHit); SubscribeLocalEvent(OnGotEquipped); SubscribeLocalEvent(OnGotUnequipped); SubscribeLocalEvent(OnGotEquippedHand); From 2a8bc4f215c7fcc68ef8fe62c878838848bd1ce8 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:36:29 +0300 Subject: [PATCH 35/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- .../_White/Headcrab/HeadcrabSystem.cs | 47 ++----------------- 1 file changed, 3 insertions(+), 44 deletions(-) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 8bf6d68b0f..b53912e53a 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -123,52 +123,11 @@ private void OnGotUnequipped(EntityUid uid, HeadcrabComponent component, GotUneq private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEvent args) { - if (!args.HitEntities.Any()) + if (!args.HitEntities.Any() + || _random.Next(1, 101) <= component.ChancePounce) return; - foreach (var entity in args.HitEntities) - { - if (!HasComp(entity)) - return; - - if (TryComp(entity, out MobStateComponent? mobState)) - { - if (mobState.CurrentState is not MobState.Alive) - { - return; - } - } - - _inventory.TryGetSlotEntity(entity, "head", out var headItem); - if (HasComp(headItem)) - return; - - var shouldEquip = _random.Next(1, 101) <= component.ChancePounce; - if (!shouldEquip) - return; - - var equipped = _inventory.TryEquip(entity, uid, "mask", true); - if (!equipped) - return; - - if (_mobState.IsDead(uid) || - HasComp(entity) || - !HasComp(entity) || - !_mobState.IsAlive(entity)) - return; - - _inventory.TryGetSlotEntity(entity, "head", out var headItem2); - if (HasComp(headItem2) || - !_inventory.TryEquip(entity, uid, "mask", true)) - return; - - component.EquippedOn = entity; - - EnsureComp(uid); - _stunSystem.TryParalyze(entity, TimeSpan.FromSeconds(component.ParalyzeTime), true); - _damageableSystem.TryChangeDamage(entity, component.Damage, origin: entity); - break; - } + TryEquipHeadcrab(uid, args.HitEntities.First(), component); } private void OnJump(EntityUid uid, HeadcrabComponent component, JumpActionEvent args) From 6f82c7e357efb92cdb16d5c230fabf61afb68bc4 Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:36:51 +0300 Subject: [PATCH 36/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index b53912e53a..596b40c1b5 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -178,4 +178,17 @@ public override void Update(float frameTime) ("entity", targetId)), targetId, Filter.PvsExcept(targetId), true); } } + + private bool TryEquipHeadcrab(EntityUid uid, EntityUid target, HeadcrabComponent component) + { + if (_mobState.IsDead(uid) + || !_mobState.IsAlive(target) + || !HasComp(target) + || HasComp(target)) + return false; + + _inventory.TryGetSlotEntity(target, "head", out var headItem); + return !HasComp(headItem) + && !_inventory.TryEquip(target, uid, "mask", true); + } } From ceadd97aebf57e390252aae84a842c36a312a26d Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:37:04 +0300 Subject: [PATCH 37/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 596b40c1b5..1b1b69f57c 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -59,6 +59,11 @@ private void OnStartup(EntityUid uid, HeadcrabComponent component, ComponentStar _action.AddAction(uid, component.JumpAction); } + private void OnThrowDoHit(EntityUid uid, HeadcrabComponent component, ThrowDoHitEvent args) + { + TryEquipHeadcrab(uid, args.Target, component); + } + private void OnGotEquipped(EntityUid uid, HeadcrabComponent component, GotEquippedEvent args) { if (args.Slot != "mask") From c0dab278fda521f52d4016a95e9a5080c6e22c4e Mon Sep 17 00:00:00 2001 From: PuroSlavKing <103608145+PuroSlavKing@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:37:22 +0300 Subject: [PATCH 38/38] Update Content.Server/_White/Headcrab/HeadcrabSystem.cs Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- Content.Server/_White/Headcrab/HeadcrabSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Server/_White/Headcrab/HeadcrabSystem.cs b/Content.Server/_White/Headcrab/HeadcrabSystem.cs index 1b1b69f57c..b8a3971561 100644 --- a/Content.Server/_White/Headcrab/HeadcrabSystem.cs +++ b/Content.Server/_White/Headcrab/HeadcrabSystem.cs @@ -124,6 +124,7 @@ private void OnGotUnequipped(EntityUid uid, HeadcrabComponent component, GotUneq var combatMode = EnsureComp(uid); _combat.SetInCombatMode(uid, true, combatMode); EnsureComp(uid); + _npcFaction.RemoveFaction(args.Equipee, "Zombie"); } private void OnMeleeHit(EntityUid uid, HeadcrabComponent component, MeleeHitEvent args)