Skip to content

Commit

Permalink
Я же хотел просто починить генокрада... (#820)
Browse files Browse the repository at this point in the history
## Описание PR
<!-- Что вы изменили в этом пулл реквесте? -->
Вырезаны изменения в ActionContainerSystem, из-за которых ломалась
нарколепсия
В торгоматах теперь можно выбрать количество покупаемого товара

## Почему / Баланс
<!-- Почему оно было изменено? Ссылайтесь на любые обсуждения или
вопросы здесь. Пожалуйста, обсудите, как это повлияет на игровой баланс.
-->
Нарколепсия - баг
Торгоматы - да

**Ссылка на публикацию в Discord**
<!-- Укажите ссылки на соответствующие обсуждения, проблемы, баги,
заказы в разработку или предложения
- [Технические проблемы](ссылка)
- [Баги](ссылка)
- [Заказы-разработка](ссылка)
- [Предложения](ссылка)
- [Перенос контента](ссылка)-->
-
[Баги](https://discord.com/channels/901772674865455115/1307275441555378177)

## Техническая информация
<!-- Если речь идет об изменении кода, кратко изложите на высоком уровне
принцип работы нового кода. Это облегчает рецензирование.- -->
Класс `VendorItemsListData` теперь содержит в себе
`VendingMachineInventoryEntry`, используемый для класса
`GenerateButton()` в `VendingMachineMenu`
Использование Action `OnItemSelected` закомменчен в
`VendingMachineBoundUserInterface`. Поэтому класс
`VendingMachineEjectMessage` больше не используется. Вместо них
добавились Action `OnItemCountSelected` и
`VendingMachineEjectCountMessage` соответственно


## Медиа
<!--
Пулл реквесты, которые вносят внутриигровые изменения (добавление
одежды, предметов, новых возможностей и т.д.), должны содержать медиа,
демонстрирующие изменения.
Небольшие исправления/рефакторы не требуют медиа.

Если Вы не уверены в том, что Ваш пулл реквест требует медиа, спросите
мейнтейнера.
-->

![image](https://github.com/user-attachments/assets/8ceff456-b821-40d6-89a4-ebcc6d51719a)

## Требования
<!--
В связи с наплывом ПР'ов нам необходимо убедиться, что ПР'ы следуют
правильным рекомендациям.

Пожалуйста, уделите время прочтению, если делаете пулл реквест (ПР)
впервые.

Отметьте поля ниже, чтобы подтвердить, что Вы действительно видели их
(поставьте X в скобках, например [X]):
-->
- [ ] Я прочитал(а) и следую [Руководство по созданию пулл
реквестов](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html).
Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению
мейнтейнера.
- [ ] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие
его изменения в игре, **или** этот пулл реквест не требует демонстрации
в игре

## Критические изменения
<!--
Перечислите все критические изменения, включая изменения пространства
имён, публичных классов/методов/полей, переименования прототипов, и
предоставьте инструкции по их исправлению.
-->
Во многих функциях `VendingMachineSystem` была добавлена переменная
`count`, обозначающая число извлекаемых объектов.
Класс `VendingMachineEjectMessage`, и, следовательно, функция
`OnInventoryEjectMessage()` больше не используются. Используйте
`VendingMachineEjectCountMessage` и `OnInventoryEjectCountMessage()`
Файл VendingMachineItem.xaml был сильно видоизменён. В случае изменения
UI торгоматов от официалов тыкайте меня

**Чейнджлог**
<!--
Здесь Вы можете заполнить журнал изменений, который будет автоматически
добавлен в игру при мердже Вашего пулл реквест.

Чтобы игроки узнали о новых возможностях и изменениях, которые могут
повлиять на их игру, добавьте запись в журнал изменений.

Не считайте суффикс типа записи (например, add) "частью" предложения:
плохо: - add: новый инструмент для инженеров
хорошо: - add: добавлен новый инструмент для инженеров

Помещение имени после символа 🆑 изменит имя, которое будет
отображаться в журнале изменений (в противном случае будет
использоваться ваше имя пользователя GitHub).
Например: 🆑 AruMoon
-->
<!--
Чтобы шаблон Чейнджлога отображался, уберите его из блока комментариев. 
Чейнджлог должен содержать cl символ, 
чтобы бот распознал изменения и добавил их в журнал изменений игры. 
Используйте ключевые слова add, remove, tweak и fix.
-->

🆑 Котя
- add: Теперь в торгоматах можно купить несколько штук товара сразу
- fix: Злосчастный баг с нарколепсией исправлен. Доброе утро, сони
  • Loading branch information
FaDeOkno authored Nov 25, 2024
1 parent 1f8afa3 commit 564c22a
Show file tree
Hide file tree
Showing 11 changed files with 169 additions and 122 deletions.
35 changes: 23 additions & 12 deletions Content.Client/VendingMachines/UI/VendingMachineItem.xaml
Original file line number Diff line number Diff line change
@@ -1,16 +1,27 @@
<!--ADT - Короче, я слишком сильно перелопатил этот файл, чтобы оставлять комментарии. Вкратце, добавился BoxContainer с содержимым для выбора количества предметов и изменена ориентация основного контейнера на вертикальную.-->
<BoxContainer xmlns="https://spacestation14.io"
Orientation="Horizontal"
Orientation="Vertical"
HorizontalExpand="True"
SeparationOverride="4">
<EntityPrototypeView
Name="ItemPrototype"
Margin="4 0 0 0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
MinSize="32 32"
/>
<Label Name="NameLabel"
SizeFlagsStretchRatio="3"
HorizontalExpand="True"
ClipText="True"/>
<BoxContainer
Orientation="Horizontal"
HorizontalExpand="True">
<EntityPrototypeView
Name="ItemPrototype"
Margin="4 0 0 0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
MinSize="32 32"
/>
<Label Name="NameLabel"
SizeFlagsStretchRatio="3"
HorizontalExpand="True"
ClipText="True"/>
</BoxContainer>
<BoxContainer
Orientation="Horizontal"
HorizontalExpand="True">
<Button Name="BuyButton" Text="{Loc 'vending-machine-ui-buy-button-text'}" MinSize="45 25" Margin="4 4" Access="Public" HorizontalAlignment="Right" />
<OptionButton Name="Count" MinSize="45 20" Margin="4 4" Access="Public" HorizontalAlignment="Left" />
</BoxContainer>
</BoxContainer>
126 changes: 76 additions & 50 deletions Content.Client/VendingMachines/UI/VendingMachineMenu.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public sealed partial class VendingMachineMenu : FancyWindow

private readonly StyleBoxFlat _styleBox = new() { BackgroundColor = new Color(70, 73, 102) };
public Action<VendingMachineWithdrawMessage>? OnWithdraw; //ADT-Economy

public event Action<VendingMachineInventoryEntry, VendingMachineItem>? OnItemCountSelected; // ADT vending eject count
public double PriceMultiplier = 1; // ADT vending eject count
public VendingMachineMenu()
{
MinSize = new Vector2(250, 150); // Corvax-Resize
Expand Down Expand Up @@ -67,72 +68,95 @@ private bool DataFilterCondition(string filter, ListData data)

private void GenerateButton(ListData data, ListContainerButton button)
{
if (data is not VendorItemsListData { ItemProtoID: var protoID, ItemText: var text })
if (data is not VendorItemsListData { ItemProtoID: var protoID, ItemText: var text, Entry: var entry })
return;

button.AddChild(new VendingMachineItem(protoID, text));
// ADT vending eject count start
var item = new VendingMachineItem(protoID, text);
if (entry.Amount <= 0)
{
item.Count.AddItem("Нет", 0);
}
else
{
for (var i = 0; i < entry.Amount; i++)
{
var amount = i + 1;
var price = (int)(entry.Price * PriceMultiplier);
var priceStr = price > 0 ? $" [{price * amount}$]" : "";

item.Count.AddItem($"{amount} шт." + priceStr, i);
}
}
item.Count.Select(0);
item.Count.OnItemSelected += args => item.Count.Select(args.Id);
item.BuyButton.OnPressed += _ => OnItemCountSelected?.Invoke(entry, item);
// ADT vending eject count end

button.AddChild(item);

button.ToolTip = text;
button.StyleBoxOverride = _styleBox;
}

/// <summary>
/// Populates the list of available items on the vending machine interface
/// and sets icons based on their prototypes
/// </summary>
public void Populate(List<VendingMachineInventoryEntry> inventory)
{
if (inventory.Count == 0 && VendingContents.Visible)
{
SearchBar.Visible = false;
VendingContents.Visible = false;

var outOfStockLabel = new Label()
{
Text = Loc.GetString("vending-machine-component-try-eject-out-of-stock"),
Margin = new Thickness(4, 4),
HorizontalExpand = true,
VerticalAlignment = VAlignment.Stretch,
HorizontalAlignment = HAlignment.Center
};
// ADT Commented start
// /// <summary>
// /// Populates the list of available items on the vending machine interface
// /// and sets icons based on their prototypes
// /// </summary>
// public void Populate(List<VendingMachineInventoryEntry> inventory)
// {
// if (inventory.Count == 0 && VendingContents.Visible)
// {
// SearchBar.Visible = false;
// VendingContents.Visible = false;

MainContainer.AddChild(outOfStockLabel);
// var outOfStockLabel = new Label()
// {
// Text = Loc.GetString("vending-machine-component-try-eject-out-of-stock"),
// Margin = new Thickness(4, 4),
// HorizontalExpand = true,
// VerticalAlignment = VAlignment.Stretch,
// HorizontalAlignment = HAlignment.Center
// };

SetSizeAfterUpdate(outOfStockLabel.Text.Length, 0);
// MainContainer.AddChild(outOfStockLabel);

return;
}
// SetSizeAfterUpdate(outOfStockLabel.Text.Length, 0);

var longestEntry = string.Empty;
var listData = new List<VendorItemsListData>();
// return;
// }

for (var i = 0; i < inventory.Count; i++)
{
var entry = inventory[i];
// var longestEntry = string.Empty;
// var listData = new List<VendorItemsListData>();

if (!_prototypeManager.TryIndex(entry.ID, out var prototype))
continue;
// for (var i = 0; i < inventory.Count; i++)
// {
// var entry = inventory[i];

if (!_dummies.TryGetValue(entry.ID, out var dummy))
{
dummy = _entityManager.Spawn(entry.ID);
_dummies.Add(entry.ID, dummy);
}
// if (!_prototypeManager.TryIndex(entry.ID, out var prototype))
// continue;

var itemName = Identity.Name(dummy, _entityManager);
var itemText = $"{itemName} [{entry.Amount}]";
// if (!_dummies.TryGetValue(entry.ID, out var dummy))
// {
// dummy = _entityManager.Spawn(entry.ID);
// _dummies.Add(entry.ID, dummy);
// }

if (itemText.Length > longestEntry.Length)
longestEntry = itemText;
// var itemName = Identity.Name(dummy, _entityManager);
// var itemText = $"{itemName} [{entry.Amount}]";

listData.Add(new VendorItemsListData(prototype.ID, itemText, i));
}
// if (itemText.Length > longestEntry.Length)
// longestEntry = itemText;

VendingContents.PopulateList(listData);
// listData.Add(new VendorItemsListData(prototype.ID, itemText, i));
// }

SetSizeAfterUpdate(longestEntry.Length, inventory.Count);
}
// VendingContents.PopulateList(listData);

// SetSizeAfterUpdate(longestEntry.Length, inventory.Count);
// }
// ADT Commented end
#region START ADT TWEAK
/// <summary>
/// Populates the list of available items on the vending machine interface
Expand Down Expand Up @@ -188,10 +212,12 @@ public void Populate(EntityUid entityUid, List<VendingMachineInventoryEntry> inv
if (!vendComp.AllForFree)
{
price = (int)(entry.Price * priceMultiplier);
PriceMultiplier = priceMultiplier;
}
else
{
price = 0; // Это работает только если заспавненный вендомат уже был с этим значением. Спасибо визардам и их bounduserinterface емае.
PriceMultiplier = 0;
}
//ADT-Economy-Start

Expand All @@ -202,12 +228,12 @@ public void Populate(EntityUid entityUid, List<VendingMachineInventoryEntry> inv
}

var itemName = Identity.Name(dummy, _entityManager);
var itemText = $" [{price}$] {itemName} [{entry.Amount}]"; //ADT-Economy
var itemText = $" [{entry.Amount}] {itemName}"; //ADT-Economy

if (itemText.Length > longestEntry.Length)
longestEntry = itemText;

listData.Add(new VendorItemsListData(prototype.ID, itemText, i));
listData.Add(new VendorItemsListData(prototype.ID, itemText, i, entry)); // ADT vending eject count
}

VendingContents.PopulateList(listData);
Expand All @@ -224,4 +250,4 @@ private void SetSizeAfterUpdate(int longestEntryLength, int contentCount)
}
}

public record VendorItemsListData(EntProtoId ItemProtoID, string ItemText, int ItemIndex) : ListData;
public record VendorItemsListData(EntProtoId ItemProtoID, string ItemText, int ItemIndex, VendingMachineInventoryEntry Entry) : ListData; // ADT vending eject count tweaked
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ protected override void Open()
_menu.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;

_menu.OnClose += Close; //ADT-Economy
_menu.OnItemSelected += OnItemSelected;
_menu.OnItemCountSelected += OnItemSelected; // ADT vending eject count
_menu.OnWithdraw += SendMessage; //ADT-Economy
_menu.Populate(Owner, _cachedInventory, component.PriceMultiplier, component.Credits); //ADT-Economy-Tweak

Expand Down Expand Up @@ -61,6 +61,12 @@ protected override void UpdateState(BoundUserInterfaceState state)

_menu?.Populate(Owner, _cachedInventory, newState.PriceMultiplier, newState.Credits); //ADT-Economy-Tweak
}

private void OnItemSelected(VendingMachineInventoryEntry entry, VendingMachineItem item)
{
SendMessage(new VendingMachineEjectCountMessage(entry, item.Count.SelectedId + 1));
}

// END-ADT-TWEAK

private void OnItemSelected(GUIBoundKeyEventArgs args, ListData data)
Expand Down Expand Up @@ -91,7 +97,7 @@ protected override void Dispose(bool disposing)
if (_menu == null)
return;

_menu.OnItemSelected -= OnItemSelected;
_menu.OnItemCountSelected -= OnItemSelected; // ADT vending eject count
_menu.OnClose -= Close;
_menu.Dispose();
}
Expand Down
6 changes: 5 additions & 1 deletion Content.Server/ADT/Changeling/Systems/ChangelingSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ private void OnStartup(EntityUid uid, ChangelingComponent component, ComponentSt

private void OnMapInit(EntityUid uid, ChangelingComponent component, MapInitEvent args)
{
if (component.GainedActions)
return;
_action.AddAction(uid, ref component.ChangelingEvolutionMenuActionEntity, component.ChangelingEvolutionMenuAction);
_action.AddAction(uid, ref component.ChangelingRegenActionEntity, component.ChangelingRegenAction);
_action.AddAction(uid, ref component.ChangelingAbsorbActionEntity, component.ChangelingAbsorbAction);
Expand Down Expand Up @@ -326,7 +328,7 @@ public void CopyLing(EntityUid from, EntityUid to, ChangelingComponent? comp = n
if (HasComp<ChangelingComponent>(to))
RemComp<ChangelingComponent>(to);

var newLingComponent = EnsureComp<ChangelingComponent>(to);
var newLingComponent = new ChangelingComponent();
newLingComponent.Chemicals = comp.Chemicals;
newLingComponent.ChemicalsPerSecond = comp.ChemicalsPerSecond;
newLingComponent.StoredDNA = comp.StoredDNA;
Expand All @@ -340,7 +342,9 @@ public void CopyLing(EntityUid from, EntityUid to, ChangelingComponent? comp = n
newLingComponent.BasicTransferredActions = comp.BasicTransferredActions;
newLingComponent.BoughtActions = comp.BoughtActions;
newLingComponent.LastResortUsed = comp.LastResortUsed;
newLingComponent.GainedActions = true;
RemComp(from, comp);
AddComp(to, newLingComponent);

if (TryComp(from, out StoreComponent? storeComp))
{
Expand Down
Loading

0 comments on commit 564c22a

Please sign in to comment.