Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Alt-Z #135

Merged
merged 2 commits into from
Dec 4, 2024
Merged

Alt-Z #135

merged 2 commits into from
Dec 4, 2024

Conversation

RedFoxIV
Copy link
Contributor

@RedFoxIV RedFoxIV commented Dec 3, 2024

Описание PR

Альт-клик по предмету в активной руке теперь отличается от альт-клика по предмету в неактивной руке или на полу.

Медиа

ass.webm

Взаимодействие с предметом в мире у меня назначено на F, если что. (дефолт E)


Матчасть

  • В AlternativeVerb теперь есть флажок InActiveHandOnly, дефолт false. Если он выставлен на true, то данный верб можно прокнуть только через контекстное меню (как и все альтвербы), либо через альт. использование в руке, см. описание ПРа.

    • Альт-З по-прежднему может прокать все альтвербы, просто в итоге приоритет уходит альвербам с InActiveHandOnly==true.
  • В WieldableComponent теперь есть флажок AltUseInHand, дефолт false. Если он выставлен на true, то чтобы взять предмет в обе руки, нужно нажать альт-z. Если он false, то всё работает, как раньше. Для топоров и прочего можно оставить, как есть, для огнестрела фичу лучше включить.

В прототипах:

  components:
   ...
    Wieldable:
      AltUseInHand = true

Зачем

Мне не понравилось, что у оружия два разных действия (дёрнуть затвор и взять в две руки) были назначены на одну кнопку. Настолько сильно, что мне сказали это фиксить.

Изменения

🆑

  • tweak: Альтернативное использование предметов в активной руке теперь может быть отличным от альтернативного использования предмета на полу/в неактивной руке. Ключевое слово - (может).

Copy link
Contributor

coderabbitai bot commented Dec 3, 2024

Walkthrough

В данном пулл-запросе внесены изменения в несколько классов, связанных с системой взаимодействия и использования предметов в игре. Основные изменения включают добавление новых методов и свойств, которые позволяют различать взаимодействия с активной рукой и другими руками. В частности, в классе SharedInteractionSystem добавлен метод ActiveHandAltInteract, а в классе WieldableComponent — свойство AltUseInHand. Эти изменения обеспечивают более тонкое управление взаимодействиями и использованием предметов в зависимости от состояния рук игрока.

Changes

Файл Изменения
Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs Изменен метод TryUseItemInHand: добавлена проверка для различия взаимодействий с активной и другими руками при altInteract.
Content.Shared/Interaction/SharedInteractionSystem.cs Добавлен метод ActiveHandAltInteract для взаимодействий с предметами в активной руке; изменен метод AltInteract, исключены вербы, требующие активную руку.
Content.Shared/Verbs/Verb.cs Добавлено поле InActiveHandOnly в класс AlternativeVerb, определяющее, может ли верба быть активирована только при использовании в активной руке.
Content.Shared/Wieldable/Components/WieldableComponent.cs Добавлено свойство AltUseInHand в класс WieldableComponent, указывающее на необходимость альтернативного использования предмета в активной руке.
Content.Shared/Wieldable/WieldableSystem.cs Добавлен метод AddAltWieldVerb для обработки альтернативных вербов; обновлены методы OnUseInHand и TryUnwield для проверки новых условий.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (6)
Content.Shared/Wieldable/Components/WieldableComponent.cs (1)

40-46: Хорошее добавление, предлагаю улучшить документацию.

Добавление флага AltUseInHand логично реализовано. Для улучшения документации предлагаю добавить пример использования.

 /// <summary>
 /// Requires item to be alt-used in hand (alt-Z / alt-click in active hand) to be wielded.
 /// </summary>
+/// <example>
+/// This is typically enabled for firearms while being disabled for melee weapons.
+/// </example>
 [DataField]
 public bool AltUseInHand = false;
Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs (1)

152-155: Предлагаю улучшить структуру условий.

Текущая структура условий может быть упрощена для лучшей читаемости.

-            if(hand == handsComp.ActiveHand)    // WD EDIT START
-                return _interactionSystem.ActiveHandAltInteract(uid, held) || _interactionSystem.AltInteract(uid, held); // todo: should these be merged into one method?
-            else                                // WD EDIT END
-                return _interactionSystem.AltInteract(uid, held);
+            return hand == handsComp.ActiveHand
+                ? _interactionSystem.ActiveHandAltInteract(uid, held) || _interactionSystem.AltInteract(uid, held)
+                : _interactionSystem.AltInteract(uid, held);
Content.Shared/Wieldable/WieldableSystem.cs (2)

181-181: Улучшить читаемость условия.

Предлагаю переписать условие для лучшей читаемости.

-        if (args.Handled || component.AltUseInHand) // WD EDIT
+        if (args.Handled || component.AltUseInHand)
             return;

Line range hint 282-290: Рассмотреть выделение логики проверки патронов в отдельный компонент.

Текущая реализация добавляет специфичную для оружия логику в общий компонент WieldableComponent. Предлагаю создать отдельный компонент для этой функциональности.

Создайте новый компонент AmmoWieldableComponent и переместите в него логику проверки патронов:

[RegisterComponent]
public sealed class AmmoWieldableComponent : Component
{
    public bool CanUnwield(EntityUid uid)
    {
        if (!TryComp<BallisticAmmoProviderComponent>(uid, out var provider))
            return true;

        return provider.Entities.Count == 0 || 
               !TryComp<CartridgeAmmoComponent>(provider.Entities[^1], out var ammo) ||
               !ammo.Spent;
    }
}
Content.Shared/Verbs/Verb.cs (1)

313-323: Изменения в классе AlternativeVerb выглядят правильными!

Добавление флага InActiveHandOnly хорошо документировано и соответствует целям PR. Можно рассмотреть более описательное название для флага, например RequiresActiveHand или ActiveHandRestricted, но текущее название тоже приемлемо.

Content.Shared/Interaction/SharedInteractionSystem.cs (1)

1102-1118: Метод ActiveHandAltInteract реализован правильно, но нуждается в дополнительной документации!

Реализация логична и соответствует общей архитектуре, но стоит добавить документацию о том, когда этот метод должен вызываться и как он взаимодействует с существующей системой взаимодействия.

Предлагаю добавить следующую документацию:

 /// <summary>
 ///     Very alternative interactions on an entity.
 /// </summary>
+/// <remarks>
+/// This method should be called when processing alt-interactions specifically for items in the active hand.
+/// It complements the regular AltInteract method by handling verbs that require the item to be in the active hand.
+/// </remarks>
 /// <returns>True if the interaction was handled, false otherwise.</returns>
 public bool ActiveHandAltInteract(EntityUid user, EntityUid target)
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 5c6dd20 and 73a773b.

📒 Files selected for processing (5)
  • Content.Shared/Hands/EntitySystems/SharedHandsSystem.Interactions.cs (1 hunks)
  • Content.Shared/Interaction/SharedInteractionSystem.cs (1 hunks)
  • Content.Shared/Verbs/Verb.cs (1 hunks)
  • Content.Shared/Wieldable/Components/WieldableComponent.cs (1 hunks)
  • Content.Shared/Wieldable/WieldableSystem.cs (2 hunks)
🔇 Additional comments (1)
Content.Shared/Interaction/SharedInteractionSystem.cs (1)

1093-1093: Фильтрация альтернативных глаголов реализована корректно!

Изменение метода AltInteract для исключения глаголов с InActiveHandOnly = true логично и эффективно реализовано.

Comment on lines +147 to +177
// WD EDIT START
/// <summary>
/// Copypasted <see cref="AddToggleWieldVerb(EntityUid, WieldableComponent, GetVerbsEvent{InteractionVerb})"/>
/// </summary>
private void AddAltWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<AlternativeVerb> args)
{
if (!component.AltUseInHand)
return;

if (args.Hands == null || !args.CanAccess || !args.CanInteract)
return;

if (!_handsSystem.IsHolding(args.User, uid, out _, args.Hands))
return;

// TODO VERB TOOLTIPS Make CanWield or some other function return string, set as verb tooltip and disable
// verb. Or just don't add it to the list if the action is not executable.

// TODO VERBS ICON
AlternativeVerb verb = new()
{
Text = component.Wielded ? Loc.GetString("wieldable-verb-text-unwield") : Loc.GetString("wieldable-verb-text-wield"),
Act = component.Wielded
? () => TryUnwield(uid, component, args.User)
: () => TryWield(uid, component, args.User),
InActiveHandOnly = true
};

args.Verbs.Add(verb);
}
// WD EDIT END
Copy link
Contributor

@coderabbitai coderabbitai bot Dec 3, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Необходимо устранить дублирование кода.

Метод AddAltWieldVerb практически полностью дублирует AddToggleWieldVerb. Предлагаю выделить общую логику в отдельный приватный метод.

+private void AddWieldVerb<T>(EntityUid uid, WieldableComponent component, GetVerbsEvent<T> args, bool requireActiveHand = false) where T : BaseVerb
+{
+    if (requireActiveHand && !component.AltUseInHand)
+        return;
+
+    if (args.Hands == null || !args.CanAccess || !args.CanInteract)
+        return;
+
+    if (!_handsSystem.IsHolding(args.User, uid, out _, args.Hands))
+        return;
+
+    var verb = Activator.CreateInstance<T>();
+    verb.Text = component.Wielded ? Loc.GetString("wieldable-verb-text-unwield") : Loc.GetString("wieldable-verb-text-wield");
+    verb.Act = component.Wielded
+        ? () => TryUnwield(uid, component, args.User)
+        : () => TryWield(uid, component, args.User);
+    
+    if (verb is AlternativeVerb altVerb)
+        altVerb.InActiveHandOnly = true;
+
+    args.Verbs.Add(verb);
+}

Затем используйте этот метод:

-private void AddToggleWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<InteractionVerb> args)
-{
-    // ... existing implementation
-}
+private void AddToggleWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<InteractionVerb> args)
+{
+    AddWieldVerb(uid, component, args);
+}

-private void AddAltWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<AlternativeVerb> args)
-{
-    // ... existing implementation
-}
+private void AddAltWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<AlternativeVerb> args)
+{
+    AddWieldVerb(uid, component, args, true);
+}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// WD EDIT START
/// <summary>
/// Copypasted <see cref="AddToggleWieldVerb(EntityUid, WieldableComponent, GetVerbsEvent{InteractionVerb})"/>
/// </summary>
private void AddAltWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<AlternativeVerb> args)
{
if (!component.AltUseInHand)
return;
if (args.Hands == null || !args.CanAccess || !args.CanInteract)
return;
if (!_handsSystem.IsHolding(args.User, uid, out _, args.Hands))
return;
// TODO VERB TOOLTIPS Make CanWield or some other function return string, set as verb tooltip and disable
// verb. Or just don't add it to the list if the action is not executable.
// TODO VERBS ICON
AlternativeVerb verb = new()
{
Text = component.Wielded ? Loc.GetString("wieldable-verb-text-unwield") : Loc.GetString("wieldable-verb-text-wield"),
Act = component.Wielded
? () => TryUnwield(uid, component, args.User)
: () => TryWield(uid, component, args.User),
InActiveHandOnly = true
};
args.Verbs.Add(verb);
}
// WD EDIT END
// WD EDIT START
private void AddWieldVerb<T>(EntityUid uid, WieldableComponent component, GetVerbsEvent<T> args, bool requireActiveHand = false) where T : BaseVerb
{
if (requireActiveHand && !component.AltUseInHand)
return;
if (args.Hands == null || !args.CanAccess || !args.CanInteract)
return;
if (!_handsSystem.IsHolding(args.User, uid, out _, args.Hands))
return;
var verb = Activator.CreateInstance<T>();
verb.Text = component.Wielded ? Loc.GetString("wieldable-verb-text-unwield") : Loc.GetString("wieldable-verb-text-wield");
verb.Act = component.Wielded
? () => TryUnwield(uid, component, args.User)
: () => TryWield(uid, component, args.User);
if (verb is AlternativeVerb altVerb)
altVerb.InActiveHandOnly = true;
args.Verbs.Add(verb);
}
private void AddToggleWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<InteractionVerb> args)
{
AddWieldVerb(uid, component, args);
}
private void AddAltWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent<AlternativeVerb> args)
{
AddWieldVerb(uid, component, args, true);
}
// WD EDIT END

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Шило на мыло, тем более в там, куда почти не ходят и что (почти) никогда не лапают.
Не вижу смысла.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@RedFoxIV, понимаю. Спасибо за ваше мнение.

@RedFoxIV
Copy link
Contributor Author

RedFoxIV commented Dec 3, 2024

нихуя какие технологии

@RedFoxIV
Copy link
Contributor Author

RedFoxIV commented Dec 3, 2024

image

Copy link
Member

@Spatison Spatison left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну вроде по коду все чисто

@DVOniksWyvern
Copy link
Collaborator

ладно посмотрим

@DVOniksWyvern DVOniksWyvern merged commit 16981ed into WWhiteDreamProject:master Dec 4, 2024
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants