public bool PreBuild(MapAsset asset)
        {
            if (asset.type != "util-player")
            {
                return(true);
            }
            GameObject dummy = new GameObject("Dummy");

            dummy.transform.SetParent(polus.gameObject.transform);
            dummy.transform.position = new Vector2(asset.x, -asset.y - PolusHandler.Y_OFFSET);

            polus.shipStatus.DummyLocations = AssetHelper.AddToArr(polus.shipStatus.DummyLocations, dummy.transform);
            return(true);
        }
Exemple #2
0
        public bool PreBuild(MapAsset asset)
        {
            if (asset.type != "util-cam")
            {
                return(true);
            }
            UtilData utilData = AssetDB.utils[asset.type];

            // Object
            GameObject obj = new GameObject(asset.type);

            // Sprite Renderer
            SpriteRenderer spriteRenderer = obj.AddComponent <SpriteRenderer>();

            spriteRenderer.sprite   = utilData.SpriteRenderer.sprite;
            spriteRenderer.material = utilData.SpriteRenderer.material;
            obj.layer = (int)Layer.ShortObjects;

            // Camera
            SurvCamera camClone = utilData.GameObj.GetComponent <SurvCamera>();
            SurvCamera camera   = obj.AddComponent <SurvCamera>();

            camera.CamName              = asset.name;
            camera.camNameString        = camClone.camNameString;
            camera.NewName              = camClone.NewName;
            camera.OffAnim              = camClone.OffAnim;
            camera.CamSize              = camClone.CamSize;
            camera.CamAspect            = camClone.CamAspect;
            camera.Offset               = camClone.Offset;
            camera.OnAnim               = camClone.OnAnim;
            camera.Images               = camClone.Images;
            polus.shipStatus.AllCameras = AssetHelper.AddToArr(polus.shipStatus.AllCameras, camera);

            // Colliders
            AssetHelper.BuildColliders(asset, obj);

            // Add to Polus
            polus.Add(obj, asset);

            return(true);
        }
        public bool PreBuild(MapAsset asset)
        {
            if (asset.type != "custom" && asset.spriteType != "custom")
            {
                return(true);
            }

            GameObject obj = new GameObject("Custom Asset");

            SpriteRenderer render = obj.AddComponent <SpriteRenderer>();

            render.sprite = AssetHelper.SpriteFromBase64(asset.type);
            obj.layer     = (int)Layer.Ship;

            // Colliders
            AssetHelper.BuildColliders(asset, obj);

            // Polus
            polus.Add(obj, asset);
            return(true);
        }
        public bool PreBuild(MapAsset asset)
        {
            if (!asset.type.StartsWith("util-vent"))
            {
                return(true);
            }
            UtilData utilData = AssetDB.utils[asset.type];

            // Object
            GameObject obj = new GameObject(asset.type);

            // Sprite Renderer
            SpriteRenderer spriteRenderer = obj.AddComponent <SpriteRenderer>();

            spriteRenderer.sprite   = utilData.SpriteRenderer.sprite;
            spriteRenderer.material = utilData.SpriteRenderer.material;
            obj.layer = (int)Layer.ShortObjects;

            // Animator (If Applicable)
            if (asset.type == "util-vent1")
            {
                SpriteAnim spriteAnimClone = utilData.GameObj.GetComponent <SpriteAnim>();
                SpriteAnim spriteAnim      = obj.AddComponent <SpriteAnim>();

                spriteAnim.Play(spriteAnimClone.m_defaultAnim, spriteAnimClone.Speed);
                //spriteAnim.m_clipPairList = spriteAnimClone.m_clipPairList;
            }


            // Vent
            Vent ventData = utilData.GameObj.GetComponent <Vent>();
            Vent vent     = obj.AddComponent <Vent>();

            vent.EnterVentAnim = ventData.EnterVentAnim;
            vent.ExitVentAnim  = ventData.ExitVentAnim;
            vent.spreadAmount  = ventData.spreadAmount;
            vent.spreadShift   = ventData.spreadShift;
            vent.Offset        = ventData.Offset;
            vent.myRend        = spriteRenderer;
            vent.Buttons       = new UnhollowerBaseLib.Il2CppReferenceArray <ButtonBehavior>(0);
            vent.Id            = this.id;
            this.id++;

            // Arrow Buttons
            GameObject     arrowClone       = utilData.GameObj.transform.FindChild("Arrow").gameObject;
            SpriteRenderer arrowCloneSprite = arrowClone.GetComponent <SpriteRenderer>();
            BoxCollider2D  arrowCloneBox    = arrowClone.GetComponent <BoxCollider2D>();

            for (int i = 0; i < asset.targetIds.Length && i < 3; i++)
            {
                long targetId = asset.targetIds[i];
                if (targetId < 0)
                {
                    continue;
                }
                if (MapHandler.GetById(targetId) == null)
                {
                    continue;
                }

                GameObject arrowObj = new GameObject("Arrow" + targetId);

                // Sprite
                SpriteRenderer arrowSprite = arrowObj.AddComponent <SpriteRenderer>();
                arrowSprite.sprite   = arrowCloneSprite.sprite;
                arrowSprite.material = arrowCloneSprite.material;
                arrowObj.layer       = (int)Layer.UI;

                // Box Collider
                BoxCollider2D arrowBox = arrowObj.AddComponent <BoxCollider2D>();
                arrowBox.size      = arrowCloneBox.size;
                arrowBox.offset    = arrowCloneBox.offset;
                arrowBox.isTrigger = true;

                // Button
                ButtonBehavior arrowBtn = arrowObj.AddComponent <ButtonBehavior>();
                arrowBtn.OnMouseOver = new UnityEvent();
                arrowBtn.OnMouseOut  = new UnityEvent();
                Action action;
                if (i == 0)
                {
                    action = vent.ClickRight;
                }
                else if (i == 1)
                {
                    action = vent.ClickLeft;
                }
                else
                {
                    action = vent.ClickCenter;
                }
                arrowBtn.OnClick.AddListener(action);

                // Transform
                vent.Buttons = AssetHelper.AddToArr(vent.Buttons, arrowBtn);
                arrowObj.transform.SetParent(obj.transform);
                arrowObj.transform.localScale = new Vector3(0.4f, 0.4f, 1.0f);
                arrowObj.active = false;
            }

            // Box Collider
            BoxCollider2D origBox = utilData.GameObj.GetComponent <BoxCollider2D>();
            BoxCollider2D box     = obj.AddComponent <BoxCollider2D>();

            box.size      = origBox.size;
            box.offset    = origBox.offset;
            box.isTrigger = true;

            // Colliders
            AssetHelper.BuildColliders(asset, obj);

            // Polus
            ventDb.Add(asset.id, vent);
            targetDb.Add(asset.id, asset.targetIds);
            polus.shipStatus.AllVents = AssetHelper.AddToArr(polus.shipStatus.AllVents, vent);
            polus.Add(obj, asset);

            // Sounds
            if (!hasSounds)
            {
                polus.shipStatus.VentEnterSound = AssetDB.ss["ss-skeld"].ShipStatus.VentEnterSound;
                polus.shipStatus.VentMoveSounds = AssetDB.ss["ss-skeld"].ShipStatus.VentMoveSounds;
                hasSounds = true;
            }

            return(true);
        }
        public bool PreBuild(MapAsset asset)
        {
            if (!asset.type.StartsWith("task-"))
            {
                return(true);
            }
            TaskData taskData = AssetDB.tasks[asset.type];

            // Object
            GameObject obj = new GameObject(asset.type);

            // Sprite Renderer
            SpriteRenderer spriteRenderer = obj.AddComponent <SpriteRenderer>();

            spriteRenderer.sprite   = taskData.SpriteRenderer.sprite;
            spriteRenderer.material = taskData.SpriteRenderer.material;
            obj.layer = (int)Layer.ShortObjects;

            // Target Room
            SystemTypes target = 0;

            if (asset.targetIds.Length > 0)
            {
                if (asset.targetIds[0] > 0)
                {
                    if (ShipRoomBuilder.db.ContainsKey(asset.targetIds[0]))
                    {
                        target = ShipRoomBuilder.db[asset.targetIds[0]];
                    }
                }
            }

            // Divert Power
            if (asset.type == "task-divert2")
            {
                if (divertId >= DIVERT_SYSTEMS.Length)
                {
                    LILogger.LogError("Hit Divert Power's Max System Limit");
                    return(false);
                }

                target = DIVERT_SYSTEMS[divertId];
                divertId++;
            }

            // Console
            Console console;
            Console origConsole = taskData.GameObj.GetComponent <Console>();

            if (asset.type == "task-pistols1" || asset.type == "task-rifles1")
            {
                console = obj.AddComponent <StoreArmsTaskConsole>();
                StoreArmsTaskConsole specialConsole     = console.Cast <StoreArmsTaskConsole>();
                StoreArmsTaskConsole origSpecialConsole = origConsole.Cast <StoreArmsTaskConsole>();

                specialConsole.timesUsed   = origSpecialConsole.timesUsed;
                specialConsole.Images      = origSpecialConsole.Images;
                specialConsole.useSound    = origSpecialConsole.useSound;
                specialConsole.usesPerStep = origSpecialConsole.usesPerStep;
            }
            else if (asset.type.StartsWith("task-towels") && asset.type != "task-towels1")
            {
                console = obj.AddComponent <TowelTaskConsole>();
                TowelTaskConsole specialConsole     = console.Cast <TowelTaskConsole>();
                TowelTaskConsole origSpecialConsole = origConsole.Cast <TowelTaskConsole>();

                specialConsole.useSound = origSpecialConsole.useSound;
            }
            else
            {
                console = obj.AddComponent <Console>();
            }
            console.ConsoleId      = origConsole.ConsoleId;
            console.AllowImpostor  = false;
            console.checkWalls     = false;
            console.GhostsIgnored  = false;
            console.Image          = spriteRenderer;
            console.onlyFromBelow  = asset.onlyFromBottom;
            console.onlySameRoom   = false;
            console.usableDistance = 1;
            console.Room           = target;
            console.TaskTypes      = origConsole.TaskTypes;
            console.ValidTasks     = origConsole.ValidTasks;

            // Box Collider
            if (taskData.GameObj.GetComponent <CircleCollider2D>() != null)
            {
                CircleCollider2D origBox = taskData.GameObj.GetComponent <CircleCollider2D>();
                CircleCollider2D box     = obj.AddComponent <CircleCollider2D>();
                box.radius    = origBox.radius;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }
            else if (taskData.GameObj.GetComponent <BoxCollider2D>() != null)
            {
                BoxCollider2D origBox = taskData.GameObj.GetComponent <BoxCollider2D>();
                BoxCollider2D box     = obj.AddComponent <BoxCollider2D>();
                box.size      = origBox.size;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }
            else if (taskData.GameObj.GetComponent <PolygonCollider2D>() != null)
            {
                PolygonCollider2D origBox = taskData.GameObj.GetComponent <PolygonCollider2D>();
                PolygonCollider2D box     = obj.AddComponent <PolygonCollider2D>();
                box.points    = origBox.points;
                box.pathCount = origBox.pathCount;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }

            // Button
            PassiveButton origBtn = taskData.GameObj.GetComponent <PassiveButton>();

            if (origBtn != null)
            {
                PassiveButton btn = obj.AddComponent <PassiveButton>();
                btn.ClickMask   = origBtn.ClickMask;
                btn.OnMouseOver = new UnityEvent();
                btn.OnMouseOut  = new UnityEvent();
                Action action = console.Use;
                btn.OnClick.AddListener(action);
            }

            // Medscan
            if (asset.type == "task-medscan")
            {
                MedScannerBehaviour medscan  = obj.AddComponent <MedScannerBehaviour>();
                MedScannerBehaviour origscan = taskData.GameObj.GetComponent <MedScannerBehaviour>();

                medscan.Offset = origscan.Offset;

                polus.shipStatus.MedScanner = medscan;
            }

            // Multipart Tasks
            if (asset.type.StartsWith("task-waterwheel"))
            {
                int id = int.Parse(asset.type.Substring(15));
                if (1 <= id && id <= 3)
                {
                    console.ConsoleId = id - 1;
                }
            }
            else if (asset.type.StartsWith("task-waterjug"))
            {
                int id = int.Parse(asset.type.Substring(13));
                if (1 <= id && id <= 2)
                {
                    console.ValidTasks             = new UnhollowerBaseLib.Il2CppReferenceArray <TaskSet>(1);
                    console.ValidTasks[0]          = new TaskSet();
                    console.ValidTasks[0].taskType = TaskTypes.ReplaceWaterJug;
                    console.ValidTasks[0].taskStep = new IntRange(id - 1, id - 1);
                }
            }
            else if (asset.type == "task-node")
            {
                if (nodeId >= 6)
                {
                    LILogger.LogError("Hit Weather Node's Max System Limit");
                    return(false);
                }

                console.ConsoleId = nodeId;
            }
            else if (asset.type == "task-records2")
            {
                if (recordsId >= 9)
                {
                    LILogger.LogError("Hit Records's Max System Limit");
                    return(false);
                }

                console.ConsoleId = recordsId;
                recordsId++;
            }
            else if (asset.type == "task-toilet")
            {
                if (toiletId >= 4)
                {
                    LILogger.LogError("Hit Toilet's Max System Limit");
                    return(false);
                }

                console.ConsoleId = toiletId;
                toiletId++;
            }
            else if (asset.type == "task-breakers")
            {
                if (breakersId >= 7)
                {
                    LILogger.LogError("Hit Breakers's Max System Limit");
                    return(false);
                }

                console.ConsoleId = breakersId;
                breakersId++;
            }
            else if (asset.type.StartsWith("task-towels") && asset.type != "task-towels1")
            {
                if (towelsId >= 14)
                {
                    LILogger.LogError("Hit Towels's Max System Limit");
                    return(false);
                }

                console.ConsoleId = towelsId;
                towelsId++;
            }

            // Task
            if (!string.IsNullOrEmpty(taskData.BehaviorName))
            {
                GameObject taskHolder = new GameObject(asset.id.ToString());
                taskHolder.transform.SetParent(taskMgr.transform);

                NormalPlayerTask origTask = taskData.Behavior;
                NormalPlayerTask task;
                if (asset.type.StartsWith("task-divert"))
                {
                    task = taskHolder.AddComponent <DivertPowerTask>();

                    DivertPowerTask taskNode = task.Cast <DivertPowerTask>();
                    DivertPowerTask origNode = origTask.Cast <DivertPowerTask>();

                    taskNode.TargetSystem = target;
                }
                else if (asset.type == "task-node")
                {
                    task = taskHolder.AddComponent <WeatherNodeTask>();

                    WeatherNodeTask taskNode = task.Cast <WeatherNodeTask>();
                    WeatherNodeTask origNode = origTask.Cast <WeatherNodeTask>();

                    taskNode.Stage2Prefab = origNode.Stage2Prefab;
                    taskNode.NodeId       = nodeId;
                    nodeId++;
                }
                else if (asset.type.StartsWith("task-waterwheel"))
                {
                    task = taskHolder.AddComponent <WaterWayTask>();
                }
                else if (asset.type == "task-towels1")
                {
                    task = taskHolder.AddComponent <TowelTask>();
                }
                else
                {
                    task = taskHolder.AddComponent <NormalPlayerTask>();
                }
                task.StartAt        = target;
                task.taskStep       = origTask.taskStep;
                task.MaxStep        = origTask.MaxStep;
                task.arrowSuspended = origTask.arrowSuspended;
                task.ShowTaskTimer  = origTask.ShowTaskTimer;
                task.ShowTaskStep   = origTask.ShowTaskStep;
                task.TaskTimer      = origTask.TaskTimer;
                task.TimerStarted   = origTask.TimerStarted;
                task.TaskType       = origTask.TaskType;
                task.MinigamePrefab = origTask.MinigamePrefab;
                task.HasLocation    = origTask.HasLocation;
                task.LocationDirty  = origTask.LocationDirty;

                if (taskData.TaskType == TaskType.Common)
                {
                    polus.shipStatus.CommonTasks = AssetHelper.AddToArr(polus.shipStatus.CommonTasks, task);
                }
                if (taskData.TaskType == TaskType.Short)
                {
                    polus.shipStatus.NormalTasks = AssetHelper.AddToArr(polus.shipStatus.NormalTasks, task);
                }
                if (taskData.TaskType == TaskType.Long)
                {
                    polus.shipStatus.LongTasks = AssetHelper.AddToArr(polus.shipStatus.LongTasks, task);
                }
            }

            // Colliders
            AssetHelper.BuildColliders(asset, obj, taskData.Scale);

            // Add to Polus
            polus.shipStatus.AllConsoles = AssetHelper.AddToArr(polus.shipStatus.AllConsoles, console);
            polus.Add(obj, asset, taskData.Scale);
            return(true);
        }
Exemple #6
0
        public bool PreBuild(MapAsset asset)
        {
            if (!asset.type.StartsWith("util-") ||
                asset.type.StartsWith("util-vent") ||
                asset.type.StartsWith("util-spawn") ||
                asset.type == "util-room" ||
                asset.type == "util-player" ||
                asset.type == "util-cam")
            {
                return(true);
            }

            UtilData utilData = AssetDB.utils[asset.type];

            // Object
            GameObject obj = new GameObject(asset.type);

            // Sprite Renderer
            SpriteRenderer spriteRenderer = obj.AddComponent <SpriteRenderer>();

            spriteRenderer.sprite   = utilData.SpriteRenderer.sprite;
            spriteRenderer.material = utilData.SpriteRenderer.material;
            obj.layer = (int)Layer.ShortObjects;

            // Console
            Action action;

            if (utilData.GameObj.GetComponent <SystemConsole>() != null)
            {
                SystemConsole origConsole = utilData.GameObj.GetComponent <SystemConsole>();
                SystemConsole console     = obj.AddComponent <SystemConsole>();
                console.Image          = spriteRenderer;
                console.FreeplayOnly   = origConsole.FreeplayOnly;
                console.onlyFromBelow  = asset.onlyFromBottom;
                console.usableDistance = origConsole.usableDistance;
                console.MinigamePrefab = origConsole.MinigamePrefab;
                if (asset.type == "util-cams2") // Convert Skeld Cams -> Polus/Airship Cams
                {
                    console.MinigamePrefab = AssetDB.utils["util-cams"].GameObj.GetComponent <SystemConsole>().MinigamePrefab;
                }
                console.useIcon = origConsole.useIcon;
                action          = console.Use;
            }
            else
            {
                MapConsole origConsole = utilData.GameObj.GetComponent <MapConsole>();
                MapConsole console     = obj.AddComponent <MapConsole>();
                console.Image          = spriteRenderer;
                console.useIcon        = origConsole.useIcon;
                console.usableDistance = origConsole.usableDistance;
                console.useIcon        = origConsole.useIcon;
                action = console.Use;
            }

            // Box Collider
            if (utilData.GameObj.GetComponent <CircleCollider2D>() != null)
            {
                CircleCollider2D origBox = utilData.GameObj.GetComponent <CircleCollider2D>();
                CircleCollider2D box     = obj.AddComponent <CircleCollider2D>();
                box.radius    = origBox.radius;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }
            else if (utilData.GameObj.GetComponent <BoxCollider2D>() != null)
            {
                BoxCollider2D origBox = utilData.GameObj.GetComponent <BoxCollider2D>();
                BoxCollider2D box     = obj.AddComponent <BoxCollider2D>();
                box.size      = origBox.size;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }
            else if (utilData.GameObj.GetComponent <PolygonCollider2D>() != null)
            {
                PolygonCollider2D origBox = utilData.GameObj.GetComponent <PolygonCollider2D>();
                PolygonCollider2D box     = obj.AddComponent <PolygonCollider2D>();
                box.points    = origBox.points;
                box.pathCount = origBox.pathCount;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }

            // Button
            PassiveButton origBtn = utilData.GameObj.GetComponent <PassiveButton>();
            PassiveButton btn     = obj.AddComponent <PassiveButton>();

            btn.ClickMask   = origBtn.ClickMask;
            btn.OnMouseOver = new UnityEvent();
            btn.OnMouseOut  = new UnityEvent();
            btn.OnClick.AddListener(action);

            // Colliders
            AssetHelper.BuildColliders(asset, obj);

            polus.Add(obj, asset);

            return(true);
        }
        public bool PreBuild(MapAsset asset)
        {
            if (!SAB_SYSTEMS.ContainsKey(asset.type))
            {
                return(true);
            }
            SystemTypes sys = SAB_SYSTEMS[asset.type];

            // GameObject
            SabData    sabData = AssetDB.sabs[asset.type];
            GameObject obj     = new GameObject(asset.type);

            // Sprite Renderer
            SpriteRenderer spriteRenderer = obj.AddComponent <SpriteRenderer>();

            spriteRenderer.sprite   = sabData.SpriteRenderer.sprite;
            spriteRenderer.material = sabData.SpriteRenderer.material;
            obj.layer = (int)Layer.ShortObjects;

            // Console
            Console origConsole = sabData.GameObj.GetComponent <Console>();
            Console console     = obj.AddComponent <Console>();

            console.ConsoleId      = origConsole.ConsoleId;
            console.AllowImpostor  = true;
            console.checkWalls     = false;
            console.GhostsIgnored  = true;
            console.Image          = spriteRenderer;
            console.onlyFromBelow  = false;
            console.onlySameRoom   = false;
            console.usableDistance = 1;
            console.Room           = sys;
            console.TaskTypes      = origConsole.TaskTypes;
            console.ValidTasks     = origConsole.ValidTasks;

            polus.shipStatus.AllConsoles = AssetHelper.AddToArr(polus.shipStatus.AllConsoles, console);

            // Box Collider
            if (sabData.GameObj.GetComponent <CircleCollider2D>() != null)
            {
                CircleCollider2D origBox = sabData.GameObj.GetComponent <CircleCollider2D>();
                CircleCollider2D box     = obj.AddComponent <CircleCollider2D>();
                box.radius    = origBox.radius;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }
            else if (sabData.GameObj.GetComponent <BoxCollider2D>() != null)
            {
                BoxCollider2D origBox = sabData.GameObj.GetComponent <BoxCollider2D>();
                BoxCollider2D box     = obj.AddComponent <BoxCollider2D>();
                box.size      = origBox.size;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }
            else if (sabData.GameObj.GetComponent <PolygonCollider2D>() != null)
            {
                PolygonCollider2D origBox = sabData.GameObj.GetComponent <PolygonCollider2D>();
                PolygonCollider2D box     = obj.AddComponent <PolygonCollider2D>();
                box.points    = origBox.points;
                box.pathCount = origBox.pathCount;
                box.offset    = origBox.offset;
                box.isTrigger = true;
            }

            // Task
            SabotageTask task      = null;
            StringNames  name      = StringNames.ExitButton;
            GameObject   sabHolder = new GameObject(asset.id.ToString());

            sabHolder.transform.SetParent(sabMgr.transform);
            if (asset.type == "sab-comms")
            {
                task = sabHolder.AddComponent <HudOverrideTask>();
                HudOverrideTask castTask  = task.Cast <HudOverrideTask>();
                HudOverrideTask taskClone = sabData.Behavior.Cast <HudOverrideTask>();

                castTask.even       = taskClone.even;
                castTask.isComplete = taskClone.isComplete;
                castTask.system     = polus.shipStatus.Systems[sys].Cast <HudOverrideSystemType>();

                name = StringNames.FixComms;
            }
            else if (asset.type == "sab-electric")
            {
                task = sabHolder.AddComponent <ElectricTask>();
                ElectricTask castTask  = task.Cast <ElectricTask>();
                ElectricTask taskClone = sabData.Behavior.Cast <ElectricTask>();

                castTask.even       = taskClone.even;
                castTask.isComplete = taskClone.isComplete;
                castTask.system     = polus.shipStatus.Systems[sys].Cast <SwitchSystem>();

                name = StringNames.FixLights;
            }
            else if (asset.type == "sab-reactorleft")
            {
                task = sabHolder.AddComponent <ReactorTask>();
                ReactorTask castTask  = task.Cast <ReactorTask>();
                ReactorTask taskClone = sabData.Behavior.Cast <ReactorTask>();

                castTask.even       = taskClone.even;
                castTask.isComplete = taskClone.isComplete;
                castTask.reactor    = polus.shipStatus.Systems[sys].Cast <ICriticalSabotage>();

                name = StringNames.Laboratory;
            }
            if (name != StringNames.ExitButton)
            {
                SabotageTask origTask = sabData.Behavior.Cast <SabotageTask>();
                task.Arrows         = new UnhollowerBaseLib.Il2CppReferenceArray <ArrowBehaviour>(2);
                task.Arrows[0]      = sabArrow1;
                task.Arrows[1]      = sabArrow2;
                task.didContribute  = origTask.didContribute;
                task.Id             = origTask.Id;
                task.Index          = origTask.Index;
                task.LocationDirty  = origTask.LocationDirty;
                task.HasLocation    = origTask.HasLocation;
                task.MinigamePrefab = origTask.MinigamePrefab;
                task.StartAt        = sys;
                task.TaskType       = origTask.TaskType;
                task.Owner          = PlayerControl.LocalPlayer;

                polus.shipStatus.SpecialTasks = AssetHelper.AddToArr(polus.shipStatus.SpecialTasks, task);
                List <StringNames> list = new List <StringNames>(polus.shipStatus.SystemNames);
                list.Add(name);
                polus.shipStatus.SystemNames = list.ToArray();
                SabGenerator.AddSabotage(asset);
            }

            // Add to Polus
            AssetHelper.BuildColliders(asset, obj);
            polus.Add(obj, asset);

            return(true);
        }