Фиксы+приколы#575
Hidden character warning
Conversation
BlindFoldened
commented
Mar 29, 2026
- Исправлен баг, позволяющий раскладывать телескопический щит в сумках, из-за чего он начинал занимать в сумке больше места, чем надо. Это также исправлено с энергощитами, зажигалками, энергетическими/игрушечными мечами/ручками.
- Исправлен визуальный баг кастомизации вульп "Носки на лапах"
- Добавлен заказ на прожектор, стоимостью 1250 кредитов (для облегчения работы в космосе при постройке цели/утилизаторстве).
- Постеры теперь можно демонтировать с помощью alt+лкм в скрученные постеры. Добавлен заказ на постеры стоимостью 1250 кредитов, содержащий 8 случайных легальных постеров. В аплинк в категорию "безделушки" добавлен ящик, содержащий 6 случайных нелегальных постеров, стоимостью 2 тк.
aristophanivan
left a comment
There was a problem hiding this comment.
В целом еще что хочу сказать. У тебя код взаимодействует по факту с клиентом через DoAfter и достаточно рационально будет обрабатывать его не на сервере, а на shared-е, с учетом того, что все твои методы используют Shared системы. Это будет соответствовать гайдлайнам виззардов по Predict-у.
| public sealed partial class PosterComponent : Component | ||
| { | ||
| [DataField("prototype", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))] | ||
| public string? Prototype { get; private set; } |
There was a problem hiding this comment.
По текущим гайдлайнам правильно будет использование EntProtoId вместо всей этой конструкции. То есть выглядеть будет как:
[DataField]
public EntProtoId Prototype { get; private set; }В прототипах датафилды по дефолту обозначаются как название датафилда с маленькой буквы, так что уточнений в виде "prototype" при объявлении DataField не нужно. То же самое относится к остальным датафилдам этого компонента.
There was a problem hiding this comment.
Кстати давно не видел { get; private set; } конструкции в компонентах, в принципе оно уместно в твоём случае, но я удивлен, что кто-то всё же пишет с ними.
| SubscribeLocalEvent<PosterComponent, AfterInteractEvent>(HandleAfterInteract); | ||
| } | ||
|
|
||
| private async void HandleAfterInteract(EntityUid uid, PosterComponent component, AfterInteractEvent args) |
There was a problem hiding this comment.
Не советую использовать асинхронные функции в EntitySystem-ах сосаки. Их есть смысл использовать только при взаимодействии с БД. А ну еще если ты делаешь систему, которая подразумевает асинхронное выполнение.
| { | ||
| BreakOnMove = true, | ||
| }; | ||
| var result = await _doAfterSystem.WaitDoAfter(doAfterArgs); |
There was a problem hiding this comment.
Опять же асинхронность можно убрать, если просто подписаться на завершение DoAfter-а. Для этого нужно конечно этот ивент создать, но это нетрудно, 3 секунды занимает. Но это избавляет от проблем с асинхронностью. Я честно с этим не работаю, так как хрен его знает что может случиться.
There was a problem hiding this comment.
Пока что 3 секунды занимает у меня 3 часа. В голове не убирается, как это сделать правильно. Время продолжать смотреть гайды хд
| if (component.Deleted) | ||
| return; | ||
|
|
||
| if (TryComp<StackComponent>(uid, out var stackComp) |
There was a problem hiding this comment.
Метод TryUse подразумевает уже проверку на наличие компонента Stack у uid, так что еще раз смотреть бессмысленно, старайся оптимизировать код.
| return; | ||
|
|
||
| if (TryComp<StackComponent>(uid, out var stackComp) | ||
| && component.RemoveOnInteract && !_stackSystem.TryUse((uid, stackComp), 1)) |
There was a problem hiding this comment.
Я не знаю зачем тут RemoveOnInteract, можешь объяснить? И в принципе начиная с этого if-а объяснить логику...
There was a problem hiding this comment.
Это всё копия системы постановки надувных стен. При взаимодействии и постановке стены, айтем удалялся в руках, поэтому RemoveOnInteract тут нужен.
А ещё надувные стены как айтем стакаются, поэтому нужно убедиться, что удаляется только один айтем.
Поскольку постеры не будут стакаться, это нада убирать....