121 lines
4.5 KiB
C#
121 lines
4.5 KiB
C#
using UnityEngine;
|
|
|
|
namespace NecromancerTome
|
|
{
|
|
/// <summary>
|
|
/// «Содержимое» урны-цинерария - ячейка черепа (решение 16.10: «урна как транспорт»; переименовано из «Багажника»).
|
|
/// Окно - родное окно хранилища игры (XUiC_BagStorageWindowGroup, как сумка транспорта и сумка волка) с сумкой на одну
|
|
/// ячейку: перетаскивание, Shift+клик и правый клик - кодом игры (16.10: «Сумки, ящики в игре есть» - своё окно с
|
|
/// ячейкой коллектора не принимало череп ни перетаскиванием, ни Shift+кликом). Своё здесь одно: после каждого изменения
|
|
/// в ячейке остаётся один череп, всё остальное (лишние черепа, чужие предметы) - назад в рюкзак, и урна узнаёт, есть ли
|
|
/// в ней череп. Череп - обычный предмет (ItemClass): он уже в сейвах, менять ему класс на модификацию нельзя.
|
|
/// </summary>
|
|
public static class CinerariumContents
|
|
{
|
|
public const string LootTemplate = "roboticDrone"; // звуки и время открытия, как у сумки волка
|
|
|
|
static TEFeatureCinerarium _urn;
|
|
/// <summary>Урна, чьё «Содержимое» сейчас открыто (окно фильтра логиста), или null.</summary>
|
|
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 ? "есть" : "нет"));
|
|
}
|
|
|
|
/// <summary>Оставить в ячейке один череп, остальное - игроку; отметить в урне.</summary>
|
|
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);
|
|
}
|
|
|
|
/// <summary>Урна убрана или выгружена, пока открыто её «Содержимое», - закрыть окно (череп из ячейки не потеряется:
|
|
/// Check успеет отметить его в урне, а урна при разрушении роняет череп).</summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|