using UnityEngine; namespace NecromancerTome { /// /// «Содержимое» урны-цинерария - ячейка черепа (решение 16.10: «урна как транспорт»; переименовано из «Багажника»). /// Окно - родное окно хранилища игры (XUiC_BagStorageWindowGroup, как сумка транспорта и сумка волка) с сумкой на одну /// ячейку: перетаскивание, Shift+клик и правый клик - кодом игры (16.10: «Сумки, ящики в игре есть» - своё окно с /// ячейкой коллектора не принимало череп ни перетаскиванием, ни Shift+кликом). Своё здесь одно: после каждого изменения /// в ячейке остаётся один череп, всё остальное (лишние черепа, чужие предметы) - назад в рюкзак, и урна узнаёт, есть ли /// в ней череп. Череп - обычный предмет (ItemClass): он уже в сейвах, менять ему класс на модификацию нельзя. /// public static class CinerariumContents { public const string LootTemplate = "roboticDrone"; // звуки и время открытия, как у сумки волка static TEFeatureCinerarium _urn; /// Урна, чьё «Содержимое» сейчас открыто (окно фильтра логиста), или null. public static TEFeatureCinerarium Urn => _urn; static Bag _bag; static EntityPlayerLocal _player; public static void Open(EntityPlayerLocal _p, TEFeatureCinerarium _u) { LocalPlayerUI ui = _p != null ? LocalPlayerUI.GetUIForPlayer(_p) : null; ItemValue skull = ItemClass.GetItem(TEFeatureCinerarium.SkullItemName); if (ui == null || _u == null) { return; } _urn = _u; _player = _p; _bag = new Bag(new Vector2i(1, 1), XUiC_ItemStack.StackLocationTypes.LootContainer, null); if (_u.HasSkull && skull != null && skull.type > 0) { _bag.SetSlot(0, new ItemStack(skull, 1)); } XUiC_BagStorageWindowGroup.Open(ui.xui, _p, _bag, LootContainer.GetLootContainer(LootTemplate), Localization.Get("necroCinerariumTrunk"), Check, () => { Check(); _urn = null; _bag = null; _player = null; }); Debug.Log("[NecromancerTome] Cinerarium: «Содержимое» урны " + _u.ToWorldPos() + " открыто, череп " + (_u.HasSkull ? "есть" : "нет")); } /// Оставить в ячейке один череп, остальное - игроку; отметить в урне. static void Check() { if (_bag == null || _urn == null) { return; } ItemStack s = _bag.ItemGrid.items[0]; bool has = false; if (s != null && !s.IsEmpty()) { ItemStack back = null; if (s.itemValue.ItemClass?.GetItemName() != TEFeatureCinerarium.SkullItemName) { back = s.Clone(); _bag.SetSlot(0, ItemStack.Empty.Clone()); } else { has = true; if (s.count > 1) { back = s.Clone(); back.count = s.count - 1; ItemStack one = s.Clone(); one.count = 1; _bag.SetSlot(0, one); } } if (back != null) { GiveBack(back); } } _urn.SetSkull(has); } static void GiveBack(ItemStack _s) { if (_player == null) { return; } if (_player.bag != null && _player.bag.AddItem(_s)) { return; } if (_player.inventory != null && _player.inventory.AddItem(_s)) { return; } _player.world.gameManager.ItemDropServer(_s, _player.GetPosition(), Vector3.zero); } /// Урна убрана или выгружена, пока открыто её «Содержимое», - закрыть окно (череп из ячейки не потеряется: /// Check успеет отметить его в урне, а урна при разрушении роняет череп). public static void CloseIfShowing(TEFeatureCinerarium _u) { if (_urn == null || _urn != _u) { return; } Check(); LocalPlayerUI ui = _player != null ? LocalPlayerUI.GetUIForPlayer(_player) : null; _urn = null; if (ui != null && ui.windowManager.IsWindowOpen(XUiC_BagStorageWindowGroup.ID)) { ui.windowManager.Close(XUiC_BagStorageWindowGroup.ID); } } } }