Копьё: урон и встревание от скорости движения (Momentum Melee)#950
Копьё: урон и встревание от скорости движения (Momentum Melee)#950Grom1halo wants to merge 1 commit into
Conversation
Добавляет переиспользуемый компонент MomentumMelee: пока предмет держат в руке и владелец движется быстрее порога, набегание остриём вперёд наносит цели урон, пропорциональный скорости (учитывается движение на движущейся платформе через GetMapLinearVelocity). На достаточной скорости копьё втыкается в цель. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
бля а можно буковки циферки в плане баланаса? вот тоже копье телескпическое и прыжок ниана. |
Формула урон = base × speedDamageFactor × (скорость / minimumSpeed) Что получается по скорости ┌────────────────────────────┬──────────┬──────────────┬──────────────────────────────┐ Для сравнения на базовом копье: обычный удар 12 (в две руки 17), бросок 24. При скорости спринта момент-урон = 12 — честно |
|
вайбкодик |
|
This project does not accept low-effort or wholesale AI-generated contributions. Examples include, but are not limited to:
Exceptions to this are simple tools like Rider's single-line completion feature. |
NazrinNya
left a comment
There was a problem hiding this comment.
ты даже код в неймспейс корвуха не занёс, извини братан но fraude braple 5 не справился с задачей
| base.Update(frameTime); | ||
|
|
||
| var now = _timing.CurTime; | ||
| var query = AllEntityQuery<MomentumMeleeComponent, TransformComponent>(); |
There was a problem hiding this comment.
зачем AllEntityQuery
тут впринципе через апдейт делать это хуйня - в идеале юзай ивенты коллизии (а значит код дальше не имеет никакого смысла), ты слишком много ресурсов тратишь на хуйню.
There was a problem hiding this comment.
кароч, я понял, завтра перевайбую
| var damageScale = comp.SpeedDamageFactor * speed / comp.MinimumSpeed; | ||
| _damageable.TryChangeDamage(target.Owner, comp.Damage * damageScale, origin: holder); | ||
|
|
||
| if (comp.SoundHit != null && _timing.IsFirstTimePredicted) | ||
| _audio.PlayPvs(comp.SoundHit, target.Owner, AudioParams.Default.WithVariation(0.125f)); | ||
|
|
||
| _color.RaiseEffect(Color.Red, new List<EntityUid> { target.Owner }, Filter.Pvs(target.Owner, entityManager: EntityManager)); |
There was a problem hiding this comment.
эмбедсистема уже всё это делает, в итоге у тебя копьё дважды дамажит цель.
обрабатывай случай с EmbeddableProjectile и обычной милишкой отдельной от друг-друга
| - type: MomentumMelee | ||
| damage: | ||
| types: | ||
| Piercing: 12 | ||
| minimumSpeed: 4.5 | ||
| speedDamageFactor: 1.0 | ||
| embedOnHit: true | ||
| soundHit: | ||
| path: /Audio/Weapons/bladeslice.ogg |
| } | ||
|
|
||
| private void EmbedAttach(EntityUid uid, EntityUid target, EntityUid? user, EmbeddableProjectileComponent component) | ||
| public void EmbedAttach(EntityUid uid, EntityUid target, EntityUid? user, EmbeddableProjectileComponent component) |
| _damageable.TryChangeDamage(target.Owner, comp.Damage * damageScale, origin: holder); | ||
|
|
||
| if (comp.SoundHit != null && _timing.IsFirstTimePredicted) | ||
| _audio.PlayPvs(comp.SoundHit, target.Owner, AudioParams.Default.WithVariation(0.125f)); |
|
Назрин по приколу ревьювит код который даже создатель пра не видел |
Описание
Добавляет копью (и любому оружию через новый переиспользуемый компонент) механику урона от скорости в духе Minecraft: пока предмет держат в руке и владелец движется быстрее порога, набегание остриём вперёд наносит цели урон, пропорциональный скорости. На достаточной скорости копьё втыкается в цель.
Как это работает
Предмет в руке лежит в контейнере руки — у него нет активного физического тела, поэтому событий коллизии он не генерирует. К тому же обычные мобы проходят друг сквозь друга (жёсткие фикстуры не пересекаются, расталкивание — отдельная «мягкая» система). Поэтому механика реализована проактивной проверкой на стороне владельца:
MomentumMelee, которые реально держат в руке (IsHolding), берём скорость владельца в мировых координатах черезGetMapLinearVelocity— она суммирует скорость по цепочке родителей, так что механика корректно работает и когда игрок движется на транспорте / стоит на движущейся платформе (запарентен к ней).minimumSpeed, ищем живых мобов в радиусеrangeв конусе по направлению движения (ArcDegrees) и наносим урон по формулеdamage * speedDamageFactor * speed / minimumSpeed(та же логика, что в существующемDamageOnHighSpeedImpactSystem) — с покадровым эффектом (красная вспышка + звук) и кулдауном на цель.embedOnHitи наличииEmbeddableProjectileуспешный удар роняет предмет из руки и втыкает его в цель через существующийEmbedAttach(вытаскивается как обычное воткнутое копьё).Формула, эффекты и вытаскивание переиспользуют уже имеющиеся системы (
DamageableSystem,SharedColorFlashEffectSystem,SharedProjectileSystem), новой «магии» не вводится.Изменения
MomentumMeleeComponent(Content.Shared/Weapons/Melee/) — переиспользуемый, настраивается в YAML.MomentumMeleeSystem(shared).EmbedAttachвSharedProjectileSystemсделанpublic, чтобы встревание можно было вызвать из других систем.MomentumMeleeдобавлен на базовыйSpear(варианты наследуют).Медиа
Проверка
🆑 Grom1halo