Advertisement
Vlad-00003

[RUST] Custom save\load system

Nov 10th, 2021 (edited)
664
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.11 KB | None | 0 0
  1.         private class SavedItems
  2.         {
  3.             [JsonProperty("Пояс")]
  4.             public SavedItem[] Belt;
  5.             [JsonProperty("Основной инвентарь")]
  6.             public SavedItem[] Main;
  7.             [JsonProperty("Одежда")]
  8.             public SavedItem[] Wear;
  9.  
  10.             [JsonConstructor]
  11.             public SavedItems() { }
  12.  
  13.             public SavedItems(BasePlayer player)
  14.             {
  15.                 Belt = GetItems(player.inventory.containerBelt).ToArray();
  16.                 Main = GetItems(player.inventory.containerMain).ToArray();
  17.                 Wear = GetItems(player.inventory.containerWear).ToArray();
  18.             }
  19.  
  20.  
  21.             public void AddToMain(List<Item> items)
  22.             {
  23.                 if (Main == null)
  24.                 {
  25.                     Main = ToSaved(items).ToArray();
  26.                     return;
  27.                 }
  28.                 var n = ToSaved(items).ToArray();
  29.                 Array.Resize(ref Main, Main.Length + n.Length);
  30.                 n.CopyTo(Main,Main.Length);
  31.             }
  32.  
  33.             public int Restore(BasePlayer player)
  34.             {
  35.                 var items = Restore(player.inventory.containerBelt, Belt);
  36.                 items += Restore(player.inventory.containerMain, Main);
  37.                 items += Restore(player.inventory.containerWear, Wear);
  38.                 return items;
  39.             }
  40.  
  41.             private int Restore(ItemContainer container, SavedItem[] items)
  42.             {
  43.                 if (items == null)
  44.                 {
  45.                     return 0;
  46.                 }
  47.  
  48.                 int amount = 0;
  49.                 foreach (var savedItem in items)
  50.                 {
  51.                     var item = savedItem.Load();
  52.                     if (item == null)
  53.                     {
  54.                         continue;
  55.                     }
  56.                     amount++;
  57.                     var moveToContainer = container.Insert(item);
  58.                     if (moveToContainer)
  59.                         continue;
  60.                     item.Drop(container.dropPosition, container.dropVelocity);
  61.                 }
  62.  
  63.                 return amount;
  64.             }
  65.  
  66.             private IEnumerable<SavedItem> GetItems(ItemContainer container)
  67.             {
  68.                 return ToSaved(container.itemList);
  69.             }
  70.  
  71.             private IEnumerable<SavedItem> ToSaved(List<Item> items)
  72.             {
  73.                 var amount = items.Count;
  74.                 for (int i = 0; i < amount; i++)
  75.                 {
  76.                     var item = items.GetRandom();
  77.                     if (item != null)
  78.                     {
  79.                         yield return SavedItem.SaveItem(item);
  80.                         item.RemoveFromContainer();
  81.                         item.Remove();
  82.                     }
  83.                 }
  84.                 ItemManager.DoRemoves();
  85.             }
  86.         }
  87.  
  88.  
  89. ...
  90.  
  91.  #region Custom Save\Load System
  92.  
  93.         public class SavedItem
  94.         {
  95.             public byte[] Item;
  96.             public SavedEntity HeldEntity;
  97.             public SavedEntity WorldEntity;
  98.  
  99.             public Item Load()
  100.             {
  101.                 HeldEntity?.Load();
  102.  
  103.                 if (WorldEntity != null)
  104.                 {
  105.                     var worldEntity = WorldEntity.Load();
  106.                     return worldEntity.GetItem();
  107.                 }
  108.                 var protoItem = ProtoBuf.Item.Deserialize(Item);
  109.                 var load = ItemManager.Load(protoItem, null, true);
  110.                 return load;
  111.             }
  112.  
  113.             public static SavedItem SaveItem(Item item)
  114.             {
  115.                 var world = item.GetWorldEntity();
  116.                 var held = item.GetHeldEntity();
  117.                 var savedItem = new SavedItem
  118.                 {
  119.                     Item = world ? null : item.Save(true).ToProtoBytes(),
  120.                     HeldEntity = held ? SavedEntity.SaveEntityWithChilds(held) : null,
  121.                     WorldEntity = world ? SavedEntity.SaveEntityWithChilds(world) : null
  122.                 };
  123.                 return savedItem;
  124.             }
  125.         }
  126.  
  127.         public class SavedEntity
  128.         {
  129.             public byte[] Entity;
  130.             public List<byte[]> Childs = new List<byte[]>();
  131.  
  132.             public BaseEntity Load()
  133.             {
  134.                 var main = LoadEntity(Entity);
  135.                 Childs.ForEach(x => LoadEntity(x).SetParent(main));
  136.                 return main;
  137.             }
  138.  
  139.             public static SavedEntity SaveEntityWithChilds(BaseEntity entity)
  140.             {
  141.                 var savedData = new SavedEntity
  142.                 {
  143.                     Entity = SaveEntity(entity)
  144.                 };
  145.                 entity.children.ForEach(x => savedData.Childs.Add(SaveEntity(x)));
  146.                 return savedData;
  147.             }
  148.             public static byte[] SaveEntity(BaseEntity entity)
  149.             {
  150.                 var saveInfo = new BaseNetworkable.SaveInfo { forDisk = true };
  151.                 using (saveInfo.msg = Pool.Get<Entity>())
  152.                 {
  153.                     entity.Save(saveInfo);
  154.                     return saveInfo.msg.ToProtoBytes();
  155.                 }
  156.             }
  157.  
  158.             public static BaseEntity LoadEntity(byte[] protoBytes)
  159.             {
  160.                 var entData = ProtoBuf.Entity.Deserialize(protoBytes);
  161.                 var entity = GameManager.server.CreateEntity(StringPool.Get(entData.baseNetworkable.prefabID),
  162.                     entData.baseEntity.pos, Quaternion.Euler(entData.baseEntity.rot));
  163.                 if (!entity)
  164.                 {
  165.                     Interface.Oxide.LogWarning("[{0}] Failed to spawn entity {1}!", nameof(FallingPlatforms),
  166.                         entData.baseNetworkable.prefabID);
  167.                     return null;
  168.                 }
  169.  
  170.                 entity.InitLoad(entData.baseNetworkable.uid);
  171.  
  172.                 var info = new BaseNetworkable.LoadInfo { fromDisk = true, msg = entData };
  173.                 entity.Spawn();
  174.                 entity.Load(info);
  175.                 return entity;
  176.             }
  177.         }
  178.  
  179.  
  180.         #endregion
  181.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement