Browse Source

[ScrapYard] [2.0.3.5] finished basic system

Zariteis 4 years ago
parent
commit
1a03d773e3
36 changed files with 513 additions and 17 deletions
  1. 101 0
      ScrapYard/API/ShopPlatform.cs
  2. 24 0
      ScrapYard/API/ShopPlatformEntry.cs
  3. BIN
      ScrapYard/Assets/bgScrapYard.pdn
  4. BIN
      ScrapYard/Assets/bgScrapYard.png
  5. BIN
      ScrapYard/Assets/bgScrapYard2.pdn
  6. BIN
      ScrapYard/Assets/bgScrapYardExtension.png
  7. BIN
      ScrapYard/Assets/bgScrapYardTop.png
  8. BIN
      ScrapYard/Assets/iScrapTrophy.png
  9. BIN
      ScrapYard/Assets/kylockeBody.png
  10. BIN
      ScrapYard/Assets/kylockeHead.png
  11. BIN
      ScrapYard/Assets/kylockeStand.png
  12. BIN
      ScrapYard/Assets/merchantBody.png
  13. BIN
      ScrapYard/Assets/merchantHead.png
  14. BIN
      ScrapYard/Assets/merchantPortrait.png
  15. BIN
      ScrapYard/Assets/metalPlatform.png
  16. BIN
      ScrapYard/Assets/metalPlatformClean.png
  17. BIN
      ScrapYard/Assets/midScrapYardChunk0.png
  18. BIN
      ScrapYard/Assets/midScrapYardChunk1.png
  19. BIN
      ScrapYard/Assets/planetScrapYard.png
  20. BIN
      ScrapYard/Assets/planetScrapYardPrev.png
  21. BIN
      ScrapYard/Assets/planetScrapYard_old.png
  22. BIN
      ScrapYard/Assets/platform
  23. BIN
      ScrapYard/Assets/portraitPerceval.png
  24. BIN
      ScrapYard/Assets/rockPlatform.png
  25. BIN
      ScrapYard/Assets/scrapYardStand.png
  26. BIN
      ScrapYard/Assets/scrapYardStandInfo.png
  27. BIN
      ScrapYard/Assets/scrapyardstand
  28. BIN
      ScrapYard/Assets/shopStand.png
  29. BIN
      ScrapYard/Assets/sideBigScrapYard.png
  30. BIN
      ScrapYard/Assets/sideSmallScrapYard.png
  31. BIN
      ScrapYard/Assets/signScrapYard.png
  32. 23 0
      ScrapYard/Patches/Patch_GameScript_Talk.cs
  33. 142 8
      ScrapYard/ScrapYard.cs
  34. 21 3
      ScrapYard/ScrapYard.csproj
  35. 61 6
      ScrapYard/ScrapYardGenerator.cs
  36. 141 0
      ScrapYard/ScrapYardShopStandScript.cs

+ 101 - 0
ScrapYard/API/ShopPlatform.cs

@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+
+namespace ScrapYard.API
+{
+  public class ShopPlatform
+  {
+    public readonly ShopPlatformSpacingType Type;
+
+    public readonly string Title;
+
+    internal List<ShopPlatformEntry> Entries = new List<ShopPlatformEntry>();
+
+    internal static List<ShopPlatform> ShopPlatforms = new List<ShopPlatform>();
+
+    public static ShopPlatform DefaultObjects
+    {
+      get => ShopPlatforms[0];
+    }
+
+    public static ShopPlatform DefaultBlocks
+    {
+      get => ShopPlatforms[1];
+    }
+
+    public static ShopPlatform DefaultWalls
+    {
+      get => ShopPlatforms[2];
+    }
+
+    public ShopPlatform(string title, ShopPlatformSpacingType spacingType = ShopPlatformSpacingType.Normal)
+    {
+      this.Type = spacingType;
+      this.Title = title;
+    }
+
+    public virtual ShopPlatform Register()
+    {
+      ShopPlatforms.Add(this);
+      return this;
+    }
+
+    public ShopPlatformSpacingType GetShopPlatformSpacingType()
+    {
+      return Type;
+    }
+
+    public void AddShopPlatformEntry(ShopPlatformEntry row)
+    {
+      Entries.Add(row);
+    }
+
+    public void RemoveShopPlatformEntry(ShopPlatformEntry row)
+    {
+      Entries.Remove(row);
+    }
+
+    public ShopPlatformEntry[] GetShopPlatformEntries()
+    {
+      return Entries.ToArray();
+    }
+
+    public static ShopPlatform[] GetShopPlatforms()
+    {
+      return ShopPlatforms.ToArray();
+    }
+
+    internal int GetSpacesPerRow()
+    {
+      int spaces = 0;
+      switch (Type)
+      {
+        case ShopPlatformSpacingType.Normal:
+          spaces = 7;
+          break;
+        case ShopPlatformSpacingType.Near:
+          spaces = 13;
+          break;
+        case ShopPlatformSpacingType.Far:
+          spaces = 3;
+          break;
+      }
+      return spaces;
+    }
+
+    internal int GetRowsNeeded()
+    {
+      return ((Entries.Count - 1) / GetSpacesPerRow()) + 1;
+    }
+  }
+
+  public enum ShopPlatformSpacingType
+  {
+    Normal,
+    Near,
+    Far
+  }
+}

+ 24 - 0
ScrapYard/API/ShopPlatformEntry.cs

@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+
+namespace ScrapYard.API
+{
+  public class ShopPlatformEntry
+  {
+    public int ItemID { get; protected set; }
+    public int Price { get; protected set; }
+    public int Quantity { get; protected set; }
+    public int CurrencyItemID { get; protected set; }
+
+    public ShopPlatformEntry(int itemID, int price, int quantity = 1, int currencyItemID = 57)
+    {
+      this.ItemID = itemID;
+      this.Price = price;
+      this.CurrencyItemID = currencyItemID;
+      this.Quantity = quantity;
+    }
+  }
+}

BIN
ScrapYard/Assets/bgScrapYard.pdn


BIN
ScrapYard/Assets/bgScrapYard.png


BIN
ScrapYard/Assets/bgScrapYard2.pdn


BIN
ScrapYard/Assets/bgScrapYardExtension.png


BIN
ScrapYard/Assets/bgScrapYardTop.png


BIN
ScrapYard/Assets/iScrapTrophy.png


BIN
ScrapYard/Assets/kylockeBody.png


BIN
ScrapYard/Assets/kylockeHead.png


BIN
ScrapYard/Assets/kylockeStand.png


BIN
ScrapYard/Assets/merchantBody.png


BIN
ScrapYard/Assets/merchantHead.png


BIN
ScrapYard/Assets/merchantPortrait.png


BIN
ScrapYard/Assets/metalPlatform.png


BIN
ScrapYard/Assets/metalPlatformClean.png


BIN
ScrapYard/Assets/midScrapYardChunk0.png


BIN
ScrapYard/Assets/midScrapYardChunk1.png


BIN
ScrapYard/Assets/planetScrapYard.png


BIN
ScrapYard/Assets/planetScrapYardPrev.png


BIN
ScrapYard/Assets/planetScrapYard_old.png


BIN
ScrapYard/Assets/platform


BIN
ScrapYard/Assets/portraitPerceval.png


BIN
ScrapYard/Assets/rockPlatform.png


BIN
ScrapYard/Assets/scrapYardStand.png


BIN
ScrapYard/Assets/scrapYardStandInfo.png


BIN
ScrapYard/Assets/scrapyardstand


BIN
ScrapYard/Assets/shopStand.png


BIN
ScrapYard/Assets/sideBigScrapYard.png


BIN
ScrapYard/Assets/sideSmallScrapYard.png


BIN
ScrapYard/Assets/signScrapYard.png


+ 23 - 0
ScrapYard/Patches/Patch_GameScript_Talk.cs

@@ -0,0 +1,23 @@
+using GadgetCore.API;
+using HarmonyLib;
+
+namespace ScrapYard.Patches
+{
+
+  [HarmonyPatch(typeof(GameScript))]
+  [HarmonyPatch("Talk")]
+  [HarmonyGadget("ScrapYard")]
+  public static class Patch_GameScript_Talk
+  {
+    [HarmonyPrefix]
+    public static bool Prefix(GameScript __instance, int a)
+    {
+      if (a < 0)
+      {
+        __instance.StartCoroutine(__instance.ExitTalking());
+        return false;
+      }
+      return true;
+    }
+  }
+}

+ 142 - 8
ScrapYard/ScrapYard.cs

@@ -1,6 +1,9 @@
 using UnityEngine;
 using GadgetCore.API;
 using System.Collections.Generic;
+using ScrapYard.API;
+using System.Collections;
+using System.Reflection;
 
 namespace ScrapYard
 {
@@ -56,19 +59,20 @@ namespace ScrapYard
       Texture2D textureMid0 = GadgetCoreAPI.LoadTexture2D("midScrapYardChunk0.png");
       Texture2D textureMid1 = GadgetCoreAPI.LoadTexture2D("midScrapYardChunk1.png");
 
+      Texture2D textureScrapTrophy = GadgetCoreAPI.LoadTexture2D("iScrapTrophy.png");
+
       PlanetInfo scrapYardPlanet = new PlanetInfo(PlanetType.SPECIAL, "Scrap Yard", new GadgetCore.Util.Tuple<int, int>[] { new GadgetCore.Util.Tuple<int, int>(1, 100) });
       scrapYardPlanet.SetPortalInfo(texturePortalSign, texturePlanetPrevIcon, texturePlanetIcon);
       scrapYardPlanet.SetBackgroundInfo(textureParalex, textureParalex0, textureParalex1, textureParalex2, textureParalex3);
       scrapYardPlanet.SetTerrainInfo(textureEntrance, textureBG, textureMid0, textureMid1, textureBigSide, textureSmallSide);
 
-      //scrapYardPlanet.OnGenerateInsideTown += GenerateTown;
       scrapYardPlanet.PortalUses = 300;
-
       scrapYardPlanet.OnGenerateWorld += ScrapYardGenerator.GenarateTown;
-
       scrapYardPlanet.Register("Scrap Yard");
 
-      {
+      new ItemInfo(ItemType.GENERIC, "Scrap Trophy", "", textureScrapTrophy).Register("Scrap Trophy");
+
+      { // Scrap Yard Bulding
         var scrapYardShopBuilding = Object.Instantiate((GameObject)Resources.Load("prop/2501"));
         scrapYardShopBuilding.transform.localScale *= 8;
         Texture2D texture = GadgetCoreAPI.LoadTexture2D("shopStand.png");
@@ -80,7 +84,7 @@ namespace ScrapYard
         GadgetCoreAPI.AddCustomResource("prop/ScrapYard/scrapYardShopBuilding", scrapYardShopBuilding);
       }
 
-      {
+      { // Scrap Yard Shop Owner
         var scrapYardMerchant = Object.Instantiate((GameObject)Resources.Load("npc/perceval"));
         Texture2D textureBody = GadgetCoreAPI.LoadTexture2D("merchantBody.png");
         Texture2D textureHead = GadgetCoreAPI.LoadTexture2D("merchantHead.png");
@@ -99,13 +103,26 @@ namespace ScrapYard
           mainTexture = textureHead
         };
 
+        //scrapYardMerchant.layer = 0;
+
         scrapYardMerchant.transform.Find("e").rotation = Quaternion.Euler(0f, 180f, 0f);
 
+        scrapYardMerchant.name = "scrapyardmerchant";
+
         Component.DestroyImmediate(scrapYardMerchant.GetComponent<npcTurnScript>());
         GadgetCoreAPI.AddCustomResource("prop/ScrapYard/scrapYardMerchant", scrapYardMerchant);
+
+        TileInfo tile = new TileInfo(TileType.INTERACTIVE, null as Texture2D, new GameObject("scrapyardmerchant")).Register("scrapyardmerchant");
+        tile.OnInteract += OnInteractMerchant;
       }
 
-      {
+      { // Part Semicolider Platform
+        var asset = GadgetCoreAPI.LoadAssetBundle("platform");
+        var platform = UnityEngine.Object.Instantiate((GameObject)asset.LoadAsset("assets/resources/platform.prefab"));
+        GadgetCoreAPI.AddCustomResource("prop/ScrapYard/component/platform", platform);
+      }
+
+      { // Bottom Chunk
         var gameObject = Object.Instantiate((GameObject)Resources.Load("z/chunk"));
 
         var rendererBody = gameObject.GetComponentInChildren<Renderer>();
@@ -124,10 +141,17 @@ namespace ScrapYard
         GameObject.DestroyImmediate(gameObject.transform.GetChild(0).GetChild(1).gameObject);
 
         Component.DestroyImmediate(gameObject.GetComponent<Chunk>());
+
+        var platformComponent = Object.Instantiate((GameObject)Resources.Load("prop/ScrapYard/component/platform"));
+        platformComponent.transform.SetParent(gameObject.transform);
+        platformComponent.transform.localScale = new Vector3(0.5625f, 10, 1);
+        platformComponent.transform.localPosition = new Vector3(0, 0.25f, 0);
+        platformComponent.transform.localRotation = Quaternion.Euler(90, 0, 0);
+
         GadgetCoreAPI.AddCustomResource("z/ScrapYard/chunkBase", gameObject);
       }
 
-      {
+      { // Extension Chunk
         var gameObject = Object.Instantiate((GameObject)Resources.Load("z/chunk"));
 
         var rendererBody = gameObject.GetComponentInChildren<Renderer>();
@@ -154,7 +178,7 @@ namespace ScrapYard
         GadgetCoreAPI.AddCustomResource("z/ScrapYard/chunkExtension", gameObject);
       }
 
-      {
+      { // Top Chunk
         var gameObject = Object.Instantiate((GameObject)Resources.Load("z/chunk"));
 
         var rendererBody = gameObject.GetComponentInChildren<Renderer>();
@@ -183,6 +207,116 @@ namespace ScrapYard
         Component.DestroyImmediate(gameObject.GetComponent<Chunk>());
         GadgetCoreAPI.AddCustomResource("z/ScrapYard/chunkTop", gameObject);
       }
+
+      { // Platform
+        var gameObject = Object.Instantiate((GameObject)Resources.Load("prop/2501"));
+        gameObject.transform.localScale = new Vector3(12, 2, 1);
+        Texture2D texture = GadgetCoreAPI.LoadTexture2D("metalPlatform.png");
+        var renderer = gameObject.GetComponentInChildren<Renderer>();
+        renderer.material = new Material(Shader.Find("Unlit/Transparent"))
+        {
+          mainTexture = texture
+        };
+        var platformComponent = Object.Instantiate((GameObject)Resources.Load("prop/ScrapYard/component/platform"));
+        platformComponent.transform.SetParent(gameObject.transform);
+        platformComponent.transform.localScale = new Vector3(2, 2, 1);
+        platformComponent.transform.localPosition = new Vector3(0, 0, 0);
+        GadgetCoreAPI.AddCustomResource("prop/ScrapYard/metalPlatform", gameObject);
+      }
+
+      { // Shop Stand
+        var asset = GadgetCoreAPI.LoadAssetBundle("scrapyardstand");
+        var scrapYardStand = UnityEngine.Object.Instantiate((GameObject)asset.LoadAsset("assets/resources/scrapyardstand.prefab"));
+        scrapYardStand.SetActive(false);
+        scrapYardStand.AddComponent<ScrapYardShopStandScript>();
+        scrapYardStand.name = "scrapyardstand";
+        GadgetCoreAPI.AddCustomResource("prop/ScrapYard/stand", scrapYardStand);
+
+        scrapYardStand.transform.GetChild(0).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
+        {
+          mainTexture = GadgetCoreAPI.LoadTexture2D("scrapYardStand.png")
+        };
+
+        scrapYardStand.transform.GetChild(2).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
+        {
+          mainTexture = GadgetCoreAPI.LoadTexture2D("scrapYardStandInfo.png")
+        };
+
+        TileInfo tile = new TileInfo(TileType.INTERACTIVE, null as Texture2D, new GameObject("scrapyardstand")).Register("scrapyardstand");
+        tile.OnInteract += OnInteractStand;
+      }
+
+      // Setting up default shop platforms
+      new ShopPlatform("Default Objects", ShopPlatformSpacingType.Near).Register();
+      new ShopPlatform("Default Blocks", ShopPlatformSpacingType.Near).Register();
+      new ShopPlatform("Default Walls", ShopPlatformSpacingType.Near).Register();
+
+      ShopPlatform.DefaultBlocks.AddShopPlatformEntry(new ShopPlatformEntry(2000, 100));
+      ShopPlatform.DefaultBlocks.AddShopPlatformEntry(new ShopPlatformEntry(2001, 100));
+      ShopPlatform.DefaultBlocks.AddShopPlatformEntry(new ShopPlatformEntry(2002, 500));
+      ShopPlatform.DefaultBlocks.AddShopPlatformEntry(new ShopPlatformEntry(2400, 7000));
+
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2100, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2101, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2102, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2103, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2104, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2105, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2106, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2107, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2108, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2403, 10));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2401, 1000));
+      ShopPlatform.DefaultObjects.AddShopPlatformEntry(new ShopPlatformEntry(2402, 1000));
+
+      ShopPlatform.DefaultWalls.AddShopPlatformEntry(new ShopPlatformEntry(2200, 50));
+
+    }
+
+    public static readonly FieldInfo canInteractField = typeof(PlayerScript).GetField("canInteract", BindingFlags.NonPublic | BindingFlags.Instance);
+    public static readonly FieldInfo interactingField = typeof(PlayerScript).GetField("interacting", BindingFlags.NonPublic | BindingFlags.Instance);
+
+    private IEnumerator OnInteractStand()
+    {
+      PlayerScript.curInteractObj.SendMessage("Request");
+      canInteractField.SetValue(InstanceTracker.PlayerScript, true);
+      interactingField.SetValue(InstanceTracker.PlayerScript, false);
+      InstanceTracker.PlayerScript.w.SetActive(true);
+      yield break;
+    }
+
+    public static readonly Material merchantPortraitMaterial = new Material(Shader.Find("Unlit/Transparent"))
+    {
+      mainTexture = GadgetCoreAPI.LoadTexture2D("merchantPortrait.png"),
+      mainTextureScale = new Vector2(0.5f, 1)
+    };
+
+    public static readonly FieldInfo curAField = typeof(GameScript).GetField("curA", BindingFlags.NonPublic | BindingFlags.Instance);
+    public static readonly FieldInfo curBField = typeof(GameScript).GetField("curB", BindingFlags.NonPublic | BindingFlags.Instance);
+    public static readonly FieldInfo curCField = typeof(GameScript).GetField("curC", BindingFlags.NonPublic | BindingFlags.Instance);
+
+    private IEnumerator OnInteractMerchant()
+    {
+      InstanceTracker.GameScript.hoverItem.SetActive(false);
+
+      if (GameScript.inventoryOpen)
+      {
+        InstanceTracker.GameScript.inventoryMain.SetActive(false);
+        GameScript.inventoryOpen = false;
+      }
+
+      InstanceTracker.GameScript.talkingPortrait.GetComponent<Renderer>().material = merchantPortraitMaterial;
+      InstanceTracker.GameScript.txtTalkingName[0].text = "Ito";
+      InstanceTracker.GameScript.txtTalkingName[1].text = InstanceTracker.GameScript.txtTalkingName[0].text;
+      InstanceTracker.GameScript.StartCoroutine(InstanceTracker.GameScript.EnterTalking2());
+      InstanceTracker.GameScript.menuTalking.SendMessage("Set", "Haz a look at my warez!!!");
+
+      canInteractField.SetValue(InstanceTracker.PlayerScript, false);
+      interactingField.SetValue(InstanceTracker.PlayerScript, false);
+      curAField.SetValue(InstanceTracker.GameScript, -1);
+      curBField.SetValue(InstanceTracker.GameScript, -1);
+      curCField.SetValue(InstanceTracker.GameScript, -1);
+      yield break;
     }
   }
 }

+ 21 - 3
ScrapYard/ScrapYard.csproj

@@ -175,6 +175,9 @@
     <None Update="Assets\iPurpleLamp.png">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="Assets\iScrapTrophy.png">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Update="Assets\iWaterCore.png">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
@@ -190,6 +193,12 @@
     <None Update="Assets\merchantHead.png">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="Assets\merchantPortrait.png">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Update="Assets\metalPlatform.png">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Update="Assets\midCoverChunk0.png">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
@@ -214,6 +223,18 @@
     <None Update="Assets\planetScrapYardPrev.png">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="Assets\platform">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Update="Assets\scrapyardstand">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Update="Assets\scrapYardStand.png">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Update="Assets\scrapYardStandInfo.png">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
     <None Update="Assets\shopStand.png">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
@@ -271,7 +292,4 @@
       <EmbedInteropTypes>false</EmbedInteropTypes>
     </Reference>
   </ItemGroup>
-  <ItemGroup>
-    <Folder Include="Patches\" />
-  </ItemGroup>
 </Project>

+ 61 - 6
ScrapYard/ScrapYardGenerator.cs

@@ -1,4 +1,6 @@
 using GadgetCore.API;
+using ScrapYard.API;
+using System;
 using System.Collections.Generic;
 using System.Reflection;
 using UnityEngine;
@@ -37,7 +39,12 @@ namespace ScrapYard
         num++;
         chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/ScrapYard/chunkBase"), new Vector3((float)(300 + 0 * 128), 0f, 5f), Quaternion.Euler(0f, 180f, 180f));
         num++;
-        int extensionAmount = 0;
+        int rowsNeeded = 0;
+        foreach (var entry in ShopPlatform.ShopPlatforms)
+        {
+          rowsNeeded += entry.GetRowsNeeded();
+        }
+        int extensionAmount = System.Math.Max((rowsNeeded + 3) / 8, 0);
         for (int i = 0; i < extensionAmount; i++)
         {
           chunks[num] = (GameObject)UnityEngine.Object.Instantiate(Resources.Load("z/ScrapYard/chunkExtension"), new Vector3((float)(300 + 0 * 128), 64 * (i + 1), 5f), Quaternion.Euler(0f, 180f, 180f));
@@ -60,11 +67,59 @@ namespace ScrapYard
 
     public static void PopulateTown(Chunk chunk)
     {
-      GameObject[] networkStuff = (GameObject[])networkStuffField.GetValue(chunk);
-      int temp = (int)tempField.GetValue(chunk);
-      networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("prop/ScrapYard/scrapYardShopBuilding"), new Vector3(250f, -6f + 0.118f, 0.3f), Quaternion.identity, 0);
-      temp++;
-      networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("prop/ScrapYard/scrapYardMerchant"), new Vector3(255f, -6f - 0.118f * 12, 0.2f), Quaternion.identity, 0);
+      var networkStuff = (GameObject[])networkStuffField.GetValue(chunk);
+
+      GameObject[] newNetworkStuff = new GameObject[40];
+      Array.Copy(networkStuff, newNetworkStuff, networkStuff.Length);
+      networkStuff = newNetworkStuff;
+      networkStuffField.SetValue(chunk, networkStuff);
+
+      try
+      {
+
+        int temp = (int)tempField.GetValue(chunk);
+
+        networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("prop/ScrapYard/scrapYardShopBuilding"), new Vector3(250f, -6f + 0.118f, 0.3f), Quaternion.identity, 0);
+        temp++;
+        networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("prop/ScrapYard/scrapYardMerchant"), new Vector3(255f, -6f - 0.118f * 12, 0.2f), Quaternion.identity, 0);
+        temp++;
+        networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("npcStorage"), new Vector3(234.5f, -6.118f, 0.2f), Quaternion.identity, 0);
+        temp++;
+        networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("npcStorage"), new Vector3(362f, -6.118f, 0.2f), Quaternion.identity, 0);
+        temp++;
+        networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("npc2103"), new Vector3(366f, -6.118f, 0.2f), Quaternion.identity, 0);
+        temp++;
+
+        int rowNumber = -1;
+        foreach (var platform in ShopPlatform.ShopPlatforms)
+        {
+          for (int i = 0; i < platform.Entries.Count; i++)
+          {
+            ShopPlatformEntry entry = platform.Entries[i];
+            if ((i % platform.GetSpacesPerRow()) == 0)
+            {
+              rowNumber++;
+              networkStuff[temp] = (GameObject)Network.Instantiate(Resources.Load("prop/ScrapYard/metalPlatform"), new Vector3(300, rowNumber * 8f, 0.4f), Quaternion.identity, 0);
+              temp++;
+            }
+            var step = (i % platform.GetSpacesPerRow()) / (float)(platform.GetSpacesPerRow() - 1);
+            networkStuff[temp] = (GameObject)Network.Instantiate((GameObject)Resources.Load("prop/ScrapYard/stand"), new Vector3(300 - (40 / 2) + (step * 40), rowNumber * 8f + 0.5f - 0.05f, 0.2f), Quaternion.identity, 0);
+            networkStuff[temp].GetComponent<ScrapYardShopStandScript>().StartCallSet(entry.ItemID, entry.Price, entry.Quantity, entry.CurrencyItemID);
+            temp++;
+          }
+        }
+        networkStuff[temp] = (GameObject)Network.Instantiate((GameObject)Resources.Load("prop/ScrapYard/stand"), new Vector3(268.5f, -6.1175f - 1.45f, 0.2f), Quaternion.identity, 0);
+        networkStuff[temp].GetComponent<ScrapYardShopStandScript>().StartCallSet(ItemRegistry.GetItemIDByName("Scrap Trophy"), 9999, 1, 57);
+        temp++;
+        networkStuff[temp] = (GameObject)Network.Instantiate((GameObject)Resources.Load("prop/ScrapYard/stand"), new Vector3(272.5f, -6.1175f - 1.45f, 0.2f), Quaternion.identity, 0);
+        networkStuff[temp].GetComponent<ScrapYardShopStandScript>().StartCallSet(57, 1, 9999, ItemRegistry.GetItemIDByName("Scrap Trophy"));
+        temp++;
+      }
+      catch (Exception e) { Core.logger.LogError(e); }
+      GameScript.endPortal[3] = (GameObject)Network.Instantiate((GameObject)Resources.Load("portal"), new Vector3(226f, -6.118f, 0f), Quaternion.identity, 0);
+      GameScript.endPortalUA[3] = GameScript.endPortal[3].transform.GetChild(0).gameObject;
+      GameScript.endPortal[3].GetComponent<NetworkView>().RPC("Activate", RPCMode.All, new object[0]);
+      GameScript.endPortalUA[3].GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { 98, 0, 3 });
     }
   }
 }

+ 141 - 0
ScrapYard/ScrapYardShopStandScript.cs

@@ -0,0 +1,141 @@
+using GadgetCore.API;
+using System.Collections;
+using System.Reflection;
+using UnityEngine;
+
+namespace ScrapYard
+{
+  public class ScrapYardShopStandScript : MonoBehaviour
+  {
+    public static readonly FieldInfo inventoryField = typeof(GameScript).GetField("inventory", BindingFlags.NonPublic | BindingFlags.Instance);
+
+    private void Awake()
+    {
+      UpdateUI();
+    }
+
+    [RPC]
+    private void Set(int itemID, int price, int quantity, int currencyItemID)
+    {
+      this.itemID = ItemRegistry.Singleton.ConvertIDToLocal(itemID);
+      this.currencyItemID = ItemRegistry.Singleton.ConvertIDToLocal(currencyItemID);
+      this.price = price;
+      this.quantity = quantity;
+      UpdateUI();
+    }
+
+    internal void StartCallSet(int itemID, int price, int quantity, int currencyItemID)
+    {
+      StartCoroutine(CallSet(itemID, price, quantity, currencyItemID));
+    }
+
+    private IEnumerator CallSet(int itemID, int price, int quantity, int currencyItemID)
+    {
+      yield return new WaitForSeconds(0.1f);
+      itemID = ItemRegistry.Singleton.ConvertIDToHost(itemID);
+      currencyItemID = ItemRegistry.Singleton.ConvertIDToHost(currencyItemID);
+      gameObject.GetComponent<NetworkView>().RPC("Set", RPCMode.AllBuffered, new object[] { itemID, price, quantity, currencyItemID });
+      yield break;
+    }
+
+    private void UpdateUI()
+    {
+      gameObject.transform.GetChild(1).GetComponent<Animation>().Play("animationStand");
+      gameObject.transform.GetChild(1).GetComponent<Renderer>().material = (Material)Resources.Load("i/i" + itemID);
+      gameObject.transform.GetChild(2).GetChild(1).GetComponent<Renderer>().material = (Material)Resources.Load("i/i" + currencyItemID);
+
+      ItemInfo info = ItemRegistry.GetItem(itemID);
+
+      string title = (quantity > 1 ? quantity + "x " : "") + info.Name;
+
+      gameObject.transform.GetChild(2).GetChild(0).GetComponent<TextMesh>().text = title;
+      gameObject.transform.GetChild(2).GetChild(0).GetChild(0).GetComponent<TextMesh>().text = title;
+      gameObject.transform.GetChild(2).GetChild(2).GetComponent<TextMesh>().text = "" + price;
+      gameObject.transform.GetChild(2).GetChild(2).GetChild(0).GetComponent<TextMesh>().text = "" + price;
+    }
+
+    private void OnTriggerEnter(Collider c)
+    {
+      if (c.gameObject.layer == 8)
+      {
+        gameObject.transform.GetChild(2).gameObject.SetActive(true);
+      }
+    }
+
+    private void OnTriggerExit(Collider c)
+    {
+      if (c.gameObject.layer == 8)
+      {
+        gameObject.transform.GetChild(2).gameObject.SetActive(false);
+      }
+    }
+
+    private int GetItemAmount(GameScript gameScript, int id)
+    {
+      int num = 0;
+      Item[] inventory = (Item[])inventoryField.GetValue(gameScript);
+      for (int i = 0; i < 45; i++)
+      {
+        if (inventory[i].id == id)
+        {
+          num += inventory[i].q;
+        }
+      }
+      return num;
+    }
+
+    private void RemoveItemAmount(GameScript gameScript, int id, int amount)
+    {
+      Item[] inventory = (Item[])inventoryField.GetValue(gameScript);
+      for (int i = 0; i < 45; i++)
+      {
+        if (inventory[i].id == id)
+        {
+          if (amount - inventory[i].q > 0)
+          {
+            amount -= inventory[i].q;
+            inventory[i] = gameScript.EmptyItem();
+            gameScript.RefreshSlot(i);
+          }
+          else
+          {
+            if (amount - inventory[i].q == 0)
+            {
+              inventory[i] = gameScript.EmptyItem();
+              gameScript.RefreshSlot(i);
+              break;
+            }
+            inventory[i].q -= amount;
+            gameScript.RefreshSlot(i);
+            break;
+          }
+        }
+      }
+    }
+
+    private void Request()
+    {
+      var gameScript = (GameScript)Camera.main.GetComponent("GameScript");
+      int num = GetItemAmount(gameScript, currencyItemID);
+
+      if (num >= price)
+      {
+        base.GetComponent<AudioSource>().PlayOneShot((AudioClip)Resources.Load("Au/purchase"), Menuu.soundLevel / 10f);
+        RemoveItemAmount(gameScript, currencyItemID, price);
+        Item item = new Item(itemID, quantity, 0, 0, 0, new int[3], new int[3]);
+        GadgetCoreAPI.SpawnItem(base.transform.position, item);
+      }
+      else if (itemID != 0)
+      {
+        ItemRegistry.GetItem(itemID);
+        GameObject gameObject = (GameObject)Object.Instantiate(Resources.Load("txtError"), MenuScript.player.transform.position, Quaternion.identity);
+        gameObject.SendMessage("InitError", "Insufficient Currency!");
+      }
+    }
+
+    public int itemID = 1;
+    public int price = 1;
+    public int quantity = 1;
+    public int currencyItemID = 1;
+  }
+}