Волк: щелчок по сумке кладёт в ящик/мешок; Tab в волке открывает его сумку
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
3aeeae04ae
commit
d845fa1108
+86
-2
@@ -19,8 +19,9 @@ namespace NecromancerTome
|
||||
/// - мешки с зомби волк лутает так же, как ящики (RatLoot, TakeFrom(EntityLootContainer));
|
||||
/// - тест 10.10: «волк - это ещё одно пространственное хранилище: берёт игрок, но положить может только в эти
|
||||
/// 3 ячейки» - при обыске рядом с ящиком окно рюкзака показывает сумку волка (WolfBagBackpack: первые 3
|
||||
/// ячейки, остальные скрыты, ячейки заперты - перекладка щелчком по ящику), а E на предмет на земле
|
||||
/// кладёт его в сумку (TryPickup).
|
||||
/// ячейки, остальные скрыты, ячейки заперты - перекладка щелчком: по ящику - в сумку, по сумке - в ящик,
|
||||
/// PutTo), E на предмет на земле кладёт его в сумку (TryPickup), Tab в волке - окно сумки, не рюкзак
|
||||
/// персонажа (Possession: windowpaging закрывается).
|
||||
///
|
||||
/// ХРАНЕНИЕ. Сумку сущности игра не сохраняет (Entity.bag нет в Entity.Write), поэтому она своя.
|
||||
/// Упаковка - та же, что у пространственного хранилища (SpatialVaultPersistence.BuildPayload/ParsePayload,
|
||||
@@ -191,6 +192,89 @@ namespace NecromancerTome
|
||||
return rest.count > 0 ? rest : ItemStack.Empty.Clone();
|
||||
}
|
||||
|
||||
/// <summary>Ячейку сумки - в ящик (щелчок по сумке в окне рюкзака при обыске, тест 10.10: «выложить в ящик не
|
||||
/// получается - это неправильно»). Сперва в неполные стопки, остаток - в пустые ячейки; что не влезло -
|
||||
/// остаётся в сумке.</summary>
|
||||
public static bool PutTo(TEFeatureStorage _te, int _idx)
|
||||
{
|
||||
ItemStack[] g = _te.ItemGrid.items;
|
||||
List<int> changed = new List<int>();
|
||||
if (!Give(_idx, g, changed))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
foreach (int i in changed)
|
||||
{
|
||||
_te.UpdateSlot(i, g[i].Clone());
|
||||
}
|
||||
_te.SetModified();
|
||||
_te.Parent?.NotifyListeners();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>То же в мешок с зомби.</summary>
|
||||
public static bool PutTo(EntityLootContainer _dst, int _idx)
|
||||
{
|
||||
ItemStack[] g = _dst.bag.ItemGrid.items;
|
||||
List<int> changed = new List<int>();
|
||||
if (!Give(_idx, g, changed))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
foreach (int i in changed)
|
||||
{
|
||||
_dst.bag.SetSlot(i, g[i].Clone());
|
||||
}
|
||||
_dst.OnBagModified();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>Переложить ячейку сумки в массив ячеек контейнера (сами ячейки меняются, номера - в _changed).</summary>
|
||||
static bool Give(int _idx, ItemStack[] _g, List<int> _changed)
|
||||
{
|
||||
Bag b = Get();
|
||||
ItemStack src = _idx < b.SlotCount ? b.ItemGrid.items[_idx] : null;
|
||||
if (src == null || src.IsEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
int left = src.count;
|
||||
int max = src.itemValue.ItemClass?.Stacknumber.Value ?? 1;
|
||||
for (int i = 0; i < _g.Length && left > 0 && max > 1; i++)
|
||||
{
|
||||
if (_g[i] != null && !_g[i].IsEmpty() && _g[i].itemValue.type == src.itemValue.type && _g[i].count < max)
|
||||
{
|
||||
int n = Mathf.Min(left, max - _g[i].count);
|
||||
_g[i] = _g[i].Clone();
|
||||
_g[i].count += n;
|
||||
left -= n;
|
||||
_changed.Add(i);
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < _g.Length && left > 0; i++)
|
||||
{
|
||||
if (_g[i] == null || _g[i].IsEmpty())
|
||||
{
|
||||
_g[i] = new ItemStack(src.itemValue.Clone(), left);
|
||||
left = 0;
|
||||
_changed.Add(i);
|
||||
}
|
||||
}
|
||||
int moved = src.count - left;
|
||||
if (moved <= 0)
|
||||
{
|
||||
Audio.Manager.PlayInsidePlayerHead("ui_denied");
|
||||
return false;
|
||||
}
|
||||
ItemStack rest = src.Clone();
|
||||
rest.count = left;
|
||||
b.SetSlot(_idx, left > 0 ? rest : ItemStack.Empty.Clone());
|
||||
Save();
|
||||
Audio.Manager.PlayInsidePlayerHead("UseActions/takeall1");
|
||||
Debug.Log("[NecromancerTome] WolfBag: из сумки в контейнер " + src.itemValue.ItemClass.GetItemName() + " x" + moved + " - " + Describe());
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>E на предмет, лежащий на земле, - в сумку (как игрок подбирает: что не влезло, остаётся лежать).
|
||||
/// True - предмет перед волком был (взят или «сумка полна»).</summary>
|
||||
public static bool TryPickup(World _world, EntityPlayerLocal _player, EntityAlive _wolf)
|
||||
|
||||
Reference in New Issue
Block a user