Усиление зомби - #401
Open
JustGiveMeALaserSword4 wants to merge 6 commits into
Open
Conversation
Данный коммит усиливает зомби, добавляя им три новые способности: Чутьё - позволяет узнать есть ли не зомби в радиусе 15-ти тайлов Рывок - рывок на два тайла в направлении взгляда Спячка - усыпление на минуту с усилением регенерации Так же был добавлен видимый эффект от насильного усыпления
Теперь система добавления новых способностей зомби проверяет наличие CanHostGuardianComponent и ActionsComponent, исправлен баг при котором не добавлялась способность ZombieGravityJumpAction
Contributor
Contributor
|
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
# Conflicts: # Content.Server/Zombies/ZombieSystem.cs
MetalSage
reviewed
Jul 22, 2026
MetalSage
left a comment
Owner
There was a problem hiding this comment.
Комментарии принадлежности кода к даунстриму сториса написаны плохо, в коде есть лишние комментарии, незаконченные TODO, которые никогда видимо не будут закончены.
|
|
||
| _statusEffects.TrySetStatusEffectDuration(uid, ForcedSleepingStatusEffect, args.Duration); | ||
|
|
||
| Timer.Spawn(args.Duration, () => |
Owner
There was a problem hiding this comment.
Лучше использовать статус эффекты, ибо может быть много багов.
| } | ||
|
|
||
| // Stories-ZombieAbilities Start | ||
| private void OnLookUp(EntityUid uid, ZombieComponent component, ZombieLookUpActionEvent args) |
| _tag.AddTag(target, CannotSuicideTag); | ||
|
|
||
| // Stories-ZombieAbilities Start | ||
| if (HasComp<CanHostGuardianComponent>(target) && TryComp(target, out ActionsComponent? actionsComp)) // CanHostGuardianComponent is present on MobMonkey, MobKobold, STMobShadowling and BaseSpeciesMob (playable races) |
Owner
There was a problem hiding this comment.
Очень странная проверка на странный компонент.
| /// The basic action prototype is "ActionGravityJump". | ||
| /// </summary> | ||
| [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedJumpAbilitySystem))] | ||
| [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] // Removed "Access(typeof(SharedJumpAbilitySystem))" - Stories-ZombieAbilities |
Owner
There was a problem hiding this comment.
Редактировать компоненты в несвязных с ним напрямую системах является плохим тоном, используй методы системы JumpAbilitySystem.
MetalSage
requested changes
Jul 22, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



О PR
Данный ПР усиливает зомби, добавляя им три новые способности:
Чутьё - позволяет узнать есть ли не зомби в радиусе 15-ти тайлов
Рывок - рывок на два тайла в направлении взгляда
Спячка - усыпление на минуту с усилением регенерации
Так же был добавлен видимый эффект от насильного усыпления
Почему / Баланс
Реализация предложки https://discord.com/channels/1111698541841240164/1506183558899957851
Зомби - достаточно слабый антагонист (пару цитат из дискорда)
Новые способности должны сделать зомби более опасным врагом
Технические детали
Предисловие: я не силён в C#, поэтому написанный мною код может показаться вам странным/костыльным, и если вы так считаете - прошу указать это мне. Все имеют право учиться, ведь так?
Код проверяет наличие у цели CanHostGuardianComponent и ActionsComponent. Первым обозначаются сущности которые могут иметь эти способности, было бы странно если бы мышь могла прыгать на два тайла, второй компонент же отвечает за возможность хранить и использовать какие либо способности в принципе, не думаю что без проверки на его наличие что-нибудь сломалось бы, но я видел как другая система делала так же
При удовлетворении первых двух условий, добавляются способности ZombieLookUpAction и ZombieRegenerativeSleepAction - "Чутьё" и "Спячка" соответственно. Дальше идет проверка на наличие JumpAbilityComponent - отсеиваивание вульп, которые и без того могут прыгать, даже лучше. В случае отсутствия компонента - он добавляется с указанными сразу ниже значениями.
Отдельно хочу выделить взаимодействие с полем ActionEntity, при добавлении компонента JumpAbilityComponent, сразу же добавляется указанная в его поле Action способность и привязывается к полю ActionEntity. Я долго пытался изменить поле Action до добавления способности, но ничего не вышло, поэтому код удаляет способность указанную в поле ActionEntity, после чего добавляет и привязывает к нему новую способность из изменённого поля Action.
Код получает количество сущностей имеющих компонент MobThresholdsComponent (здесь это маркер всех сущностей, являющихся мобами), после чего получает количество сущностей имеющих уже компонент ZombieComponent (маркер зомбифицированных мобов), и вычитывает из первого второе, фактически получая количество всех ещё не зомбифицированных мобов. Затем, в зависимости количества не зомбифицированных мобов, выводит одно из попуп сообщений. На всякий случай указан вариант, когда переменная будет равна не предусмотренному значению, например, будет отрицательна, что бы игроку не казалось будто способность сломалась
Код получает значение поля Damage из текущего компонента PassiveDamageComponent применившей способность сущности и записывает его в переменную oldHeal. После чего код изменяет значение этого поля на значение, указанное в поле PassiveHeal в ZombieRegenerativeSleepEvent и добавляет эффект ForcedSleepingStatusEffect на время, указанное в поле Duration в том же ивенте. Через время, указанное в поле Duration (то есть фактически по истечению времени действия эффекта ForcedSleepingStatusEffect), проверяет не равен ли oldHeal null - компонент PassiveDamageComponent отсутствовал у сущности, и если это так, то убирает у сущности добавленный ранее компонент, в противном случае (если oldHeal не равен null) - задает значение его поля Damage переменной oldHeal, в которую он ранее записывал изначальное значение поля Damage
Добавлены все соответствующие прототипы способностей, текстуры для них и локализация
Медиа
Эффект усыпления:


Changelog
@JustGiveMeALaserSword4