Пример #1
0
 public void SelectItem(InvItem item, SelectItemMode _mode)
 {
     if (selectedItem == item)
     {
         selectedItem = null;
         KickStarter.playerCursor.ResetSelectedCursor();
     }
     else
     {
         SetSelectItemMode(_mode);
         selectedItem = item;
     }
     PlayerMenus.ResetInventoryBoxes();
 }
Пример #2
0
        /**
         * <summary>Deletes a set number of inventory item instances</summary>
         * <param name="itemID">The ID of the inventory item to delete</param>
         * <param name="amount">The amount to delete</param>
         */
        public void Delete(int itemID, int amount)
        {
            if (KickStarter.inventoryManager == null)
            {
                return;
            }

            InvItem itemToRemove = KickStarter.inventoryManager.GetItem(itemID);

            if (itemToRemove == null)
            {
                return;
            }

            for (int i = 0; i < invInstances.Count; i++)
            {
                if (InvInstance.IsValid(invInstances[i]) && invInstances[i].ItemID == itemID)
                {
                    // Count check
                    if (itemToRemove.canCarryMultiple)
                    {
                        int diff = invInstances[i].Count - amount;
                        if (diff >= 0)
                        {
                            invInstances[i].Clear(amount);
                            amount = 0;
                        }
                        else
                        {
                            amount -= invInstances[i].Count;
                            invInstances[i].Clear();
                        }
                    }

                    if (!itemToRemove.canCarryMultiple || invInstances[i].Count <= 0)
                    {
                        invInstances[i].Clear();
                    }

                    if (!itemToRemove.canCarryMultiple || amount <= 0)
                    {
                        break;
                    }
                }
            }

            Clean();
            PlayerMenus.ResetInventoryBoxes();
        }
Пример #3
0
        override public float Run()
        {
            if (container == null)
            {
                return(0f);
            }

            if (!setAmount)
            {
                amount = 1;
            }

            if (containerAction == ContainerAction.Add)
            {
                container.Add(invID, amount);
            }
            else if (containerAction == ContainerAction.Remove)
            {
                if (transferToPlayer)
                {
                    KickStarter.runtimeInventory.Add(invID, amount, false, -1);
                }

                container.Remove(invID, amount);
            }
            else if (containerAction == ContainerAction.RemoveAll)
            {
                if (transferToPlayer)
                {
                    foreach (ContainerItem item in container.items)
                    {
                        KickStarter.runtimeInventory.Add(item.linkedID, item.count, false, -1);
                    }
                }

                container.items.Clear();
            }

            PlayerMenus.ResetInventoryBoxes();

            return(0f);
        }
Пример #4
0
        /**
         * <summary>Removes an inventory item from the Container's contents.</summary>
         * <param name = "_id">The ID number of the InvItem to remove</param>
         * <param name = "amount">How many instances of the inventory item to remove</param>
         */
        public void Remove(int _id, int amount)
        {
            // Reduce "count" by 1 for appropriate ID

            foreach (ContainerItem item in items)
            {
                if (item.linkedID == _id)
                {
                    if (item.count > 0)
                    {
                        item.count -= amount;
                    }
                    if (item.count < 1)
                    {
                        items.Remove(item);
                    }
                    PlayerMenus.ResetInventoryBoxes();
                    return;
                }
            }
        }
        /**
         * <summary>Adds an inventory item to the Container's contents.</summary>
         * <param name = "_id">The ID number of the InvItem to add</param>
         * <param name = "amount">How many instances of the inventory item to add</param>
         * <returns>True if the addition was succesful</returns>
         */
        public bool Add(int _id, int amount)
        {
            // Raise "count" by amount for appropriate ID
            foreach (ContainerItem containerItem in items)
            {
                if (containerItem.linkedID == _id)
                {
                    InvItem linkedItem = KickStarter.inventoryManager.GetItem(_id);
                    if (linkedItem != null && linkedItem.canCarryMultiple && !linkedItem.useSeparateSlots)
                    {
                        containerItem.count += amount;
                    }
                    PlayerMenus.ResetInventoryBoxes();
                    return(false);
                }
            }

            // Not already carrying the item
            InvItem itemToAdd = KickStarter.inventoryManager.GetItem(_id);

            if (itemToAdd != null)
            {
                if (limitToCategory && !categoryIDs.Contains(itemToAdd.binID))
                {
                    return(false);
                }

                if (!itemToAdd.canCarryMultiple)
                {
                    amount = 1;
                }

                items.Add(new ContainerItem(_id, amount, GetIDArray()));
                PlayerMenus.ResetInventoryBoxes();
                return(true);
            }

            PlayerMenus.ResetInventoryBoxes();
            return(true);
        }
Пример #6
0
        public void SelectItemByID(int _id, SelectItemMode _mode)
        {
            if (_id == -1)
            {
                SetNull();
                return;
            }

            foreach (InvItem item in localItems)
            {
                if (item != null && item.id == _id)
                {
                    SetSelectItemMode(_mode);
                    selectedItem = item;
                    PlayerMenus.ResetInventoryBoxes();
                    return;
                }
            }

            SetNull();
            Debug.LogWarning("Want to select inventory item " + KickStarter.inventoryManager.GetLabel(_id) + " but player is not carrying it.");
        }
Пример #7
0
        /**
         * <summary>Adds an inventory item to the Container's contents, at a particular index.</summary>
         * <param name = "_item">The InvItem to place within the Container</param>
         * <param name = "_index">The index number within the Container's current contents to insert the new item</param>
         * <param name = "count">If >0, the quantity of the item to be added. Otherwise, the same quantity as _item will be added</param>
         * <returns>The ContainerItem instance of the added item</returns>
         */
        public ContainerItem InsertAt(InvItem _item, int _index, int count = 0)
        {
            if (limitToCategory && !categoryIDs.Contains(_item.binID))
            {
                return(null);
            }

            ContainerItem newContainerItem = new ContainerItem(_item.id, GetIDArray());

            if (count > 0)
            {
                newContainerItem.count = count;
            }
            else
            {
                newContainerItem.count = _item.count;
            }
            if (_index < items.Count)
            {
                if (items[_index] != null && items[_index].linkedID == _item.id)
                {
                    // Same item in the slot, so just add instead
                    newContainerItem.count += items[_index].count;
                    items[_index]           = newContainerItem;
                }
                else
                {
                    items.Insert(_index, newContainerItem);
                }
            }
            else
            {
                items.Add(newContainerItem);
            }

            PlayerMenus.ResetInventoryBoxes();
            return(newContainerItem);
        }
Пример #8
0
        /**
         * <summary>Adds an inventory item to the Container's contents, at a particular index.</summary>
         * <param name = "_item">The InvItem to place within the Container</param>
         * <param name = "_index">The index number within the Container's current contents to insert the new item</param>
         * <returns>The ContainerItem instance of the added item</returns>
         */
        public ContainerItem InsertAt(InvItem _item, int _index)
        {
            if (limitToCategory && !categoryIDs.Contains(_item.binID))
            {
                return(null);
            }

            ContainerItem newContainerItem = new ContainerItem(_item.id, GetIDArray());

            newContainerItem.count = _item.count;

            if (items.Count <= _index)
            {
                items.Add(newContainerItem);
            }
            else
            {
                items.Insert(_index, newContainerItem);
            }

            PlayerMenus.ResetInventoryBoxes();
            return(newContainerItem);
        }
Пример #9
0
        override public float Run()
        {
            if (KickStarter.runtimeInventory)
            {
                if (!setAmount)
                {
                    amount = 1;
                }

                if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow && !KickStarter.settingsManager.shareInventory && setPlayer)
                {
                    if (invAction == InvAction.Add)
                    {
                        KickStarter.runtimeInventory.Add(invID, amount, false, playerID);
                    }
                    else
                    {
                        KickStarter.runtimeInventory.Remove(invID, amount, setAmount, playerID);
                    }
                }
                else
                {
                    if (invAction == InvAction.Add)
                    {
                        KickStarter.runtimeInventory.Add(invID, amount, false, -1);
                    }
                    else
                    {
                        KickStarter.runtimeInventory.Remove(invID, amount, setAmount, -1);
                    }
                }

                PlayerMenus.ResetInventoryBoxes();
            }

            return(0f);
        }
Пример #10
0
 /**
  * <summary>Removes all inventory items from the Container's contents.</summary>
  */
 public void RemoveAll()
 {
     items.Clear();
     PlayerMenus.ResetInventoryBoxes();
 }
        override public float Run()
        {
            if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow)
            {
                if (KickStarter.sceneChanger.GetSubScenes().Length > 0)
                {
                    //	ACDebug.LogWarning ("Cannot switch players while multiple scenes are open!");
                    //	return 0f;
                }

                if (KickStarter.settingsManager.players.Count > 0 && KickStarter.settingsManager.players.Count > playerNumber && playerNumber > -1)
                {
                    if (KickStarter.player != null && KickStarter.player.ID == playerID)
                    {
                        ACDebug.Log("Cannot switch player - already controlling the desired prefab.");
                        return(0f);
                    }

                    if (KickStarter.settingsManager.players[playerNumber].playerOb != null)
                    {
                        KickStarter.saveSystem.SaveCurrentPlayerData();

                        Vector3    oldPlayerPosition = Vector3.zero;
                        Quaternion oldPlayerRotation = new Quaternion();
                        Vector3    oldPlayerScale    = Vector3.one;

                        if (KickStarter.player != null)
                        {
                            oldPlayerPosition = KickStarter.player.transform.position;
                            oldPlayerRotation = KickStarter.player.TransformRotation;
                            oldPlayerScale    = KickStarter.player.transform.localScale;
                        }

                        if (newPlayerPosition != NewPlayerPosition.ReplaceCurrentPlayer)
                        {
                            if (oldPlayer == OldPlayer.ReplaceWithAssociatedNPC && (oldPlayerNPC == null || !oldPlayerNPC.gameObject.activeInHierarchy) && KickStarter.player.associatedNPCPrefab != null)
                            {
                                GameObject newObject = (GameObject)Instantiate(KickStarter.player.associatedNPCPrefab.gameObject);
                                newObject.name = KickStarter.player.associatedNPCPrefab.gameObject.name;
                                oldPlayerNPC   = newObject.GetComponent <NPC>();
                            }

                            if ((oldPlayer == OldPlayer.ReplaceWithNPC || oldPlayer == OldPlayer.ReplaceWithAssociatedNPC) &&
                                oldPlayerNPC != null && oldPlayerNPC.gameObject.activeInHierarchy)
                            {
                                oldPlayerNPC.transform.position   = oldPlayerPosition;
                                oldPlayerNPC.TransformRotation    = oldPlayerRotation;
                                oldPlayerNPC.transform.localScale = oldPlayerScale;

                                // Force the rotation / sprite child to update
                                oldPlayerNPC._Update();
                            }
                        }

                        if (newPlayerNPC == null || newPlayerPosition == NewPlayerPosition.ReplaceAssociatedNPC)
                        {
                            // Try to find from associated NPC prefab

                            if (KickStarter.settingsManager.players[playerNumber].playerOb.associatedNPCPrefab != null)
                            {
                                ConstantID prefabID = KickStarter.settingsManager.players[playerNumber].playerOb.associatedNPCPrefab.GetComponent <ConstantID>();
                                if (prefabID != null && prefabID.constantID != 0)
                                {
                                    newPlayerNPC_ID = prefabID.constantID;
                                    newPlayerNPC    = AssignFile <NPC> (prefabID.constantID, null);
                                }
                            }
                        }

                        Quaternion newRotation = Quaternion.identity;
                        if (newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer)
                        {
                            newRotation = oldPlayerRotation;
                        }
                        else if (newPlayerPosition == NewPlayerPosition.ReplaceNPC && newPlayerNPC)
                        {
                            newRotation = newPlayerNPC.TransformRotation;
                        }
                        else if (newPlayerPosition == NewPlayerPosition.AppearAtMarker && newPlayerMarker)
                        {
                            newRotation = newPlayerMarker.transform.rotation;
                        }

                        bool replacesOldPlayer = newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer &&
                                                 (!restorePreviousData || !KickStarter.saveSystem.DoesPlayerDataExist(playerID, true));

                        KickStarter.ResetPlayer(KickStarter.settingsManager.players[playerNumber].playerOb, playerID, true, newRotation, keepInventory, false, replacesOldPlayer);
                        Player newPlayer = KickStarter.player;
                        PlayerMenus.ResetInventoryBoxes();

                        if (restorePreviousData && KickStarter.saveSystem.DoesPlayerDataExist(playerID, true))
                        {
                            if (newPlayerNPC)
                            {
                                newPlayerNPC.transform.position += new Vector3(100f, -100f, 100f);
                            }

                            int sceneToLoad = KickStarter.saveSystem.GetPlayerScene(playerID);
                            if (sceneToLoad >= 0 && sceneToLoad != UnityVersionHandler.GetCurrentSceneNumber())
                            {
                                KickStarter.saveSystem.loadingGame = LoadingGame.JustSwitchingPlayer;
                                KickStarter.sceneChanger.ChangeScene(new SceneInfo("", sceneToLoad), true, false, newPlayerNPC_ID);
                            }
                            else
                            {
                                string sceneToLoadName = KickStarter.saveSystem.GetPlayerSceneName(playerID);
                                if (sceneToLoadName != "" && sceneToLoadName != UnityVersionHandler.GetCurrentSceneName())
                                {
                                    KickStarter.saveSystem.loadingGame = LoadingGame.JustSwitchingPlayer;
                                    KickStarter.sceneChanger.ChangeScene(new SceneInfo(sceneToLoadName, -1), true, false, newPlayerNPC_ID);
                                }
                            }
                        }
                        else
                        {
                            // No data to restore

                            if (newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer)
                            {
                                newPlayer.Teleport(oldPlayerPosition);
                                newPlayer.SetRotation(oldPlayerRotation);
                                newPlayer.transform.localScale = oldPlayerScale;
                            }
                            else if (newPlayerPosition == NewPlayerPosition.ReplaceNPC || newPlayerPosition == NewPlayerPosition.ReplaceAssociatedNPC)
                            {
                                if (newPlayerNPC)
                                {
                                    newPlayer.Teleport(newPlayerNPC.transform.position);
                                    newPlayer.SetRotation(newPlayerNPC.TransformRotation);
                                    newPlayer.transform.localScale = newPlayerNPC.transform.localScale;

                                    newPlayerNPC.transform.position += new Vector3(100f, -100f, 100f);
                                }
                            }
                            else if (newPlayerPosition == NewPlayerPosition.AppearAtMarker)
                            {
                                if (newPlayerMarker)
                                {
                                    newPlayer.Teleport(newPlayerMarker.transform.position);
                                    newPlayer.SetRotation(newPlayerMarker.transform.rotation);
                                    newPlayer.transform.localScale = newPlayerMarker.transform.localScale;
                                }
                            }
                            else if (newPlayerPosition == NewPlayerPosition.AppearInOtherScene)
                            {
                                if (chooseNewSceneBy == ChooseSceneBy.Name && newPlayerSceneName == UnityVersionHandler.GetCurrentSceneName() ||
                                    (chooseNewSceneBy == ChooseSceneBy.Number && newPlayerScene == UnityVersionHandler.GetCurrentSceneNumber()))
                                {
                                    // Already in correct scene
                                    if (newPlayerNPC && newPlayerNPC.gameObject.activeInHierarchy)
                                    {
                                        newPlayer.Teleport(newPlayerNPC.transform.position);
                                        newPlayer.SetRotation(newPlayerNPC.TransformRotation);
                                        newPlayer.transform.localScale = newPlayerNPC.transform.localScale;

                                        newPlayerNPC.transform.position += new Vector3(100f, -100f, 100f);
                                    }
                                }
                                else
                                {
                                    if (newPlayerNPC && newPlayerNPC.gameObject.activeInHierarchy)
                                    {
                                        newPlayerNPC.transform.position += new Vector3(100f, -100f, 100f);
                                    }

                                    //KickStarter.saveSystem.loadingGame = LoadingGame.JustSwitchingPlayer;
                                    KickStarter.sceneChanger.ChangeScene(new SceneInfo(chooseNewSceneBy, newPlayerSceneName, newPlayerScene), true, false, newPlayerNPC_ID, true);
                                }
                            }
                        }

                        if (KickStarter.mainCamera.attachedCamera)
                        {
                            KickStarter.mainCamera.attachedCamera.MoveCameraInstant();
                        }

                        AssetLoader.UnloadAssets();
                    }
                    else
                    {
                        ACDebug.LogWarning("Cannot switch player - no player prefabs is defined.");
                    }
                }
            }

            return(0f);
        }
Пример #12
0
 /**
  * <summary>Removes all Documents from the Player's own collection</summary>
  */
 public void ClearCollection()
 {
     collectedDocuments.Clear();
     PlayerMenus.ResetInventoryBoxes();
 }
Пример #13
0
        /**
         * <summary>Inserts an inventory item instance into a specific index in the collection.  If the item exists in another collection, it will be removed from there automatically.</summary>
         * <param name="addInstance">The inventory item instance to add</param>
         * <param name="index">The index to insert the item at</param>
         * <param name="occupiedSlotBehaviour">How to react if the intended index is already occupied by another item instance.</param>
         * <returns>The new instance of the added item</returns>
         */
        public InvInstance Insert(InvInstance addInstance, int index, OccupiedSlotBehaviour occupiedSlotBehaviour = OccupiedSlotBehaviour.ShiftItems)
        {
            // Adds to a specific index, or the end/first empty slot if -1
            if (!CanAccept(addInstance, index, occupiedSlotBehaviour))
            {
                if (InvInstance.IsValid(addInstance))
                {
                    if (KickStarter.eventManager)
                    {
                        KickStarter.eventManager.Call_OnUseContainerFail(addInstance.GetSourceContainer(), addInstance);
                    }
                }
                return(null);
            }

            InvInstance addedInstance = null;

            if (Contains(addInstance))
            {
                if (!CanReorder())
                {
                    return(addInstance);
                }

                if (MaxSlots > 0 && index >= MaxSlots)
                {
                    return(addInstance);
                }

                occupiedSlotBehaviour = OccupiedSlotBehaviour.SwapItems;
            }

            int numAdded = -1;

            InvCollection fromCollection = (Contains(addInstance)) ? this : addInstance.GetSource();

            if (index >= 0 && index < invInstances.Count)
            {
                // Inside
                InvInstance existingInstance = invInstances[index];

                if (!InvInstance.IsValid(existingInstance))
                {
                    // Empty slot
                    addedInstance = addInstance.CreateTransferInstance();

                    if (InvInstance.IsValid(addedInstance))
                    {
                        numAdded            = addedInstance.Count;
                        invInstances[index] = addedInstance;
                    }
                }
                else
                {
                    if (existingInstance == addInstance)
                    {
                        // Same
                        return(existingInstance);
                    }
                    else if (existingInstance.InvItem == addInstance.InvItem && addInstance.InvItem.canCarryMultiple && existingInstance.Capacity > 0)
                    {
                        // Merge
                        if (addInstance.TransferCount > existingInstance.Capacity)
                        {
                            addInstance.TransferCount = existingInstance.Capacity;
                        }
                        numAdded = Mathf.Min(addInstance.CreateTransferInstance().Count, existingInstance.Capacity);
                        existingInstance.Count += numAdded;
                        addedInstance           = existingInstance;
                    }
                    else
                    {
                        switch (occupiedSlotBehaviour)
                        {
                        case OccupiedSlotBehaviour.ShiftItems:
                            invInstances.Insert(index, addInstance.CreateTransferInstance());
                            addedInstance = invInstances[index];
                            break;

                        case OccupiedSlotBehaviour.FailTransfer:
                            if (InvInstance.IsValid(addInstance))
                            {
                                if (KickStarter.eventManager)
                                {
                                    KickStarter.eventManager.Call_OnUseContainerFail(addInstance.GetSourceContainer(), addInstance);
                                }
                                return(null);
                            }
                            break;

                        case OccupiedSlotBehaviour.SwapItems:
                            if (fromCollection != null)
                            {
                                if (addInstance.IsPartialTransform())
                                {
                                    if (KickStarter.eventManager)
                                    {
                                        KickStarter.eventManager.Call_OnUseContainerFail(addInstance.GetSourceContainer(), addInstance);
                                    }
                                    return(null);
                                }

                                fromCollection.invInstances[fromCollection.IndexOf(addInstance)] = existingInstance;
                                invInstances[index] = addInstance;
                                addedInstance       = invInstances[index];

                                if (KickStarter.runtimeInventory.SelectedInstance == addInstance)
                                {
                                    KickStarter.runtimeInventory.SelectItem(existingInstance);
                                }
                            }
                            break;

                        case OccupiedSlotBehaviour.Overwrite:
                            if (KickStarter.eventManager)
                            {
                                KickStarter.eventManager.Call_OnChangeInventory(this, existingInstance, InventoryEventType.Remove);
                            }
                            invInstances[index] = addInstance.CreateTransferInstance();
                            addedInstance       = invInstances[index];
                            break;

                        default:
                            break;
                        }
                    }
                }
            }
            else
            {
                // Add to first empty slot, or end
                bool addedInside = false;

                if (index < 0)
                {
                    // Find first empty slot
                    for (int i = 0; i < invInstances.Count; i++)
                    {
                        if (!InvInstance.IsValid(invInstances[i]))
                        {
                            invInstances[i] = addInstance.CreateTransferInstance();
                            addedInstance   = invInstances[i];
                            index           = i;
                            addedInside     = true;
                            break;
                        }
                        else if (invInstances[i] == addInstance)
                        {
                            return(addInstance);
                        }
                    }
                }

                if (!addedInside)
                {
                    if (maxSlots > 0 && invInstances.Count >= maxSlots)
                    {
                        return(null);
                    }

                    if (index > 0 && CanReorder())
                    {
                        while (invInstances.Count < index)
                        {
                            invInstances.Add(null);
                        }
                    }

                    invInstances.Add(addInstance.CreateTransferInstance());
                    addedInstance = invInstances[invInstances.Count - 1];
                }
            }

            if (fromCollection != null && fromCollection != this)
            {
                fromCollection.Clean();
            }

            Clean();
            PlayerMenus.ResetInventoryBoxes();

            if (KickStarter.eventManager)
            {
                if (numAdded >= 0)
                {
                    KickStarter.eventManager.Call_OnChangeInventory(this, addedInstance, InventoryEventType.Add, numAdded);
                }
                else
                {
                    KickStarter.eventManager.Call_OnChangeInventory(this, addedInstance, InventoryEventType.Add);
                }
            }
            return(addedInstance);
        }
Пример #14
0
 public void SetNull()
 {
     selectedItem  = null;
     highlightItem = null;
     PlayerMenus.ResetInventoryBoxes();
 }
Пример #15
0
 /** Deletes all item instances in the collection */
 public void DeleteAll()
 {
     invInstances.Clear();
     Clean();
     PlayerMenus.ResetInventoryBoxes();
 }
Пример #16
0
        override public float Run()
        {
            if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow)
            {
                if (KickStarter.sceneChanger.GetSubScenes().Length > 0)
                {
                    //	ACDebug.LogWarning ("Cannot switch players while multiple scenes are open!");
                    //	return 0f;
                }

                if (KickStarter.settingsManager.players.Count > 0 && KickStarter.settingsManager.players.Count > playerNumber && playerNumber > -1)
                {
                    if (KickStarter.player != null && KickStarter.player.ID == playerID)
                    {
                        ACDebug.Log("Cannot switch player - already controlling the desired prefab.");
                        return(0f);
                    }

                    if (KickStarter.settingsManager.players[playerNumber].playerOb != null)
                    {
                        KickStarter.saveSystem.SaveCurrentPlayerData();

                        Vector3    oldPlayerPosition = Vector3.zero;
                        Quaternion oldPlayerRotation = new Quaternion();
                        Vector3    oldPlayerScale    = Vector3.one;

                        if (KickStarter.player != null)
                        {
                            oldPlayerPosition = KickStarter.player.transform.position;
                            oldPlayerRotation = KickStarter.player.transform.rotation;
                            oldPlayerScale    = KickStarter.player.transform.localScale;
                        }

                        if (oldPlayer == OldPlayer.ReplaceWithNPC && oldPlayerNPC != null &&
                            (newPlayerPosition == NewPlayerPosition.ReplaceNPC || newPlayerPosition == NewPlayerPosition.AppearAtMarker))
                        {
                            oldPlayerNPC.transform.position   = oldPlayerPosition;
                            oldPlayerNPC.transform.rotation   = oldPlayerRotation;
                            oldPlayerNPC.transform.localScale = oldPlayerScale;
                        }

                        Quaternion newRotation = Quaternion.identity;
                        if (newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer)
                        {
                            newRotation = oldPlayerRotation;
                        }
                        else if (newPlayerPosition == NewPlayerPosition.ReplaceNPC && newPlayerNPC)
                        {
                            newRotation = newPlayerNPC.transform.rotation;
                        }
                        else if (newPlayerPosition == NewPlayerPosition.AppearAtMarker && newPlayerMarker)
                        {
                            newRotation = newPlayerMarker.transform.rotation;
                        }

                        KickStarter.ResetPlayer(KickStarter.settingsManager.players[playerNumber].playerOb, playerID, true, newRotation, keepInventory);
                        Player newPlayer = KickStarter.player;
                        PlayerMenus.ResetInventoryBoxes();

                        int sceneToLoad = UnityVersionHandler.GetCurrentSceneNumber();
                        if (restorePreviousData && KickStarter.saveSystem.DoesPlayerDataExist(playerID, true))
                        {
                            sceneToLoad = KickStarter.saveSystem.GetPlayerScene(playerID);

                            if (sceneToLoad != UnityVersionHandler.GetCurrentSceneNumber())
                            {
                                KickStarter.saveSystem.loadingGame = LoadingGame.JustSwitchingPlayer;
                                KickStarter.sceneChanger.ChangeScene(new SceneInfo("", sceneToLoad), true);
                            }
                        }
                        else
                        {
                            if (newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer)
                            {
                                newPlayer.Teleport(oldPlayerPosition);
                                newPlayer.SetRotation(oldPlayerRotation);
                                newPlayer.transform.localScale = oldPlayerScale;
                            }
                            else if (newPlayerPosition == NewPlayerPosition.ReplaceNPC)
                            {
                                if (newPlayerNPC)
                                {
                                    newPlayer.Teleport(newPlayerNPC.transform.position);
                                    newPlayer.SetRotation(newPlayerNPC.transform.rotation);
                                    newPlayer.transform.localScale = newPlayerNPC.transform.localScale;

                                    newPlayerNPC.transform.position += new Vector3(100f, -100f, 100f);
                                }
                            }
                            else if (newPlayerPosition == NewPlayerPosition.AppearAtMarker)
                            {
                                if (newPlayerMarker)
                                {
                                    newPlayer.Teleport(newPlayerMarker.transform.position);
                                    newPlayer.SetRotation(newPlayerMarker.transform.rotation);
                                    newPlayer.transform.localScale = newPlayerMarker.transform.localScale;
                                }
                            }
                            else if (newPlayerPosition == NewPlayerPosition.AppearInOtherScene)
                            {
                                if (chooseNewSceneBy == ChooseSceneBy.Name && newPlayerSceneName == UnityVersionHandler.GetCurrentSceneName())
                                {
                                }
                                else if (chooseNewSceneBy == ChooseSceneBy.Number && newPlayerScene == UnityVersionHandler.GetCurrentSceneNumber())
                                {
                                }
                                else
                                {
                                    KickStarter.sceneChanger.ChangeScene(new SceneInfo(chooseNewSceneBy, newPlayerSceneName, newPlayerScene), true);
                                }
                            }
                        }

                        if (KickStarter.mainCamera.attachedCamera)
                        {
                            KickStarter.mainCamera.attachedCamera.MoveCameraInstant();
                        }

                        AssetLoader.UnloadAssets();
                    }
                    else
                    {
                        ACDebug.LogWarning("Cannot switch player - no player prefabs is defined.");
                    }
                }
            }

            return(0f);
        }
        override public float Run()
        {
            if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow)
            {
                PlayerPrefab newPlayerPrefab = KickStarter.settingsManager.GetPlayerPrefab(playerID);

                if (newPlayerPrefab != null)
                {
                    if (KickStarter.player != null && KickStarter.player.ID == playerID)
                    {
                        Log("Cannot switch player - already controlling the desired prefab.");
                        return(0f);
                    }

                    if (newPlayerPrefab.playerOb != null)
                    {
                        KickStarter.saveSystem.SaveCurrentPlayerData();

                        Vector3    oldPlayerPosition = Vector3.zero;
                        Quaternion oldPlayerRotation = new Quaternion();
                        Vector3    oldPlayerScale    = Vector3.one;

                        PlayerData oldPlayerData         = new PlayerData();
                        NPCData    oldNPCData            = new NPCData();
                        bool       recordedOldPlayerData = false;
                        bool       recordedOldNPCData    = false;

                        if (KickStarter.player != null)
                        {
                            oldPlayerPosition = KickStarter.player.transform.position;
                            oldPlayerRotation = KickStarter.player.TransformRotation;
                            oldPlayerScale    = KickStarter.player.transform.localScale;

                            oldPlayerData         = KickStarter.player.SavePlayerData(oldPlayerData);
                            recordedOldPlayerData = true;
                        }

                        if (newPlayerPosition != NewPlayerPosition.ReplaceCurrentPlayer)
                        {
                            if (oldPlayer == OldPlayer.ReplaceWithAssociatedNPC &&
                                (runtimeOldPlayerNPC == null || !runtimeOldPlayerNPC.gameObject.activeInHierarchy) &&
                                KickStarter.player.associatedNPCPrefab != null)
                            {
                                GameObject newObject = (GameObject)Instantiate(KickStarter.player.associatedNPCPrefab.gameObject);
                                newObject.name      = KickStarter.player.associatedNPCPrefab.gameObject.name;
                                runtimeOldPlayerNPC = newObject.GetComponent <NPC>();
                            }

                            if ((oldPlayer == OldPlayer.ReplaceWithNPC || oldPlayer == OldPlayer.ReplaceWithAssociatedNPC) &&
                                runtimeOldPlayerNPC != null && runtimeOldPlayerNPC.gameObject.activeInHierarchy)
                            {
                                runtimeOldPlayerNPC.Teleport(oldPlayerPosition);
                                runtimeOldPlayerNPC.TransformRotation    = oldPlayerRotation;
                                runtimeOldPlayerNPC.transform.localScale = oldPlayerScale;

                                if (recordedOldPlayerData)
                                {
                                    ApplyRenderData(runtimeOldPlayerNPC, oldPlayerData);
                                }

                                // Force the rotation / sprite child to update
                                runtimeOldPlayerNPC._Update();
                            }
                        }

                        if (runtimeNewPlayerNPC == null || newPlayerPosition == NewPlayerPosition.ReplaceAssociatedNPC)
                        {
                            // Try to find from associated NPC prefab

                            if (newPlayerPrefab.playerOb.associatedNPCPrefab != null)
                            {
                                ConstantID prefabID = newPlayerPrefab.playerOb.associatedNPCPrefab.GetComponent <ConstantID>();
                                if (prefabID != null && prefabID.constantID != 0)
                                {
                                    newPlayerNPC_ID     = prefabID.constantID;
                                    runtimeNewPlayerNPC = AssignFile <NPC> (prefabID.constantID, null);
                                }
                            }
                        }

                        Quaternion newRotation = Quaternion.identity;
                        if (newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer)
                        {
                            newRotation = oldPlayerRotation;
                        }
                        else if (newPlayerPosition == NewPlayerPosition.ReplaceNPC && runtimeNewPlayerNPC != null)
                        {
                            newRotation = runtimeNewPlayerNPC.TransformRotation;
                        }
                        else if (newPlayerPosition == NewPlayerPosition.AppearAtMarker && runtimeNewPlayerMarker != null)
                        {
                            newRotation = runtimeNewPlayerMarker.transform.rotation;
                        }

                        if (runtimeNewPlayerNPC != null)
                        {
                            oldNPCData = runtimeNewPlayerNPC.SaveData(oldNPCData);
                        }

                        bool replacesOldPlayer = newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer &&
                                                 (!restorePreviousData || !KickStarter.saveSystem.DoesPlayerDataExist(playerID, true));
                        KickStarter.ResetPlayer(newPlayerPrefab.playerOb, playerID, true, newRotation, keepInventory, false, replacesOldPlayer, alwaysSnapCamera);
                        Player newPlayer = KickStarter.player;
                        PlayerMenus.ResetInventoryBoxes();

                        if (replacesOldPlayer && recordedOldPlayerData)
                        {
                            ApplyRenderData(newPlayer, oldPlayerData);
                        }

                        if (restorePreviousData && KickStarter.saveSystem.DoesPlayerDataExist(playerID, true))
                        {
                            int    sceneToLoad     = KickStarter.saveSystem.GetPlayerScene(playerID);
                            string sceneToLoadName = KickStarter.saveSystem.GetPlayerSceneName(playerID);

                            if (sceneToLoad >= 0 && sceneToLoad != UnityVersionHandler.GetCurrentSceneNumber())
                            {
                                KickStarter.saveSystem.loadingGame = LoadingGame.JustSwitchingPlayer;
                                KickStarter.sceneChanger.ChangeScene(new SceneInfo(string.Empty, sceneToLoad), true, false);
                            }
                            else if (!string.IsNullOrEmpty(sceneToLoadName) && sceneToLoadName != UnityVersionHandler.GetCurrentSceneName())
                            {
                                KickStarter.saveSystem.loadingGame = LoadingGame.JustSwitchingPlayer;
                                KickStarter.sceneChanger.ChangeScene(new SceneInfo(sceneToLoadName, -1), true, false);
                            }
                            else
                            {
                                // Same scene
                                if (runtimeNewPlayerNPC != null)
                                {
                                    newPlayer.RepositionToTransform(runtimeNewPlayerNPC.transform);
                                    runtimeNewPlayerNPC.HideFromView(newPlayer);
                                }
                            }
                        }
                        else
                        {
                            // No data to restore

                            if (newPlayerPosition == NewPlayerPosition.ReplaceCurrentPlayer)
                            {
                                newPlayer.Teleport(oldPlayerPosition);
                                newPlayer.SetRotation(oldPlayerRotation);
                                newPlayer.transform.localScale = oldPlayerScale;
                            }
                            else if (newPlayerPosition == NewPlayerPosition.ReplaceNPC || newPlayerPosition == NewPlayerPosition.ReplaceAssociatedNPC)
                            {
                                if (runtimeNewPlayerNPC != null)
                                {
                                    newPlayer.RepositionToTransform(runtimeNewPlayerNPC.transform);
                                    runtimeNewPlayerNPC.HideFromView(newPlayer);

                                    if (recordedOldNPCData)
                                    {
                                        ApplyRenderData(newPlayer, oldNPCData);
                                    }
                                }
                            }
                            else if (newPlayerPosition == NewPlayerPosition.AppearAtMarker)
                            {
                                if (runtimeNewPlayerMarker)
                                {
                                    newPlayer.RepositionToTransform(runtimeNewPlayerMarker.transform);
                                }
                            }
                            else if (newPlayerPosition == NewPlayerPosition.AppearInOtherScene)
                            {
                                if (chooseNewSceneBy == ChooseSceneBy.Name && newPlayerSceneName == UnityVersionHandler.GetCurrentSceneName() ||
                                    (chooseNewSceneBy == ChooseSceneBy.Number && newPlayerScene == UnityVersionHandler.GetCurrentSceneNumber()))
                                {
                                    // Already in correct scene
                                    if (runtimeNewPlayerNPC && runtimeNewPlayerNPC.gameObject.activeInHierarchy)
                                    {
                                        newPlayer.RepositionToTransform(runtimeNewPlayerNPC.transform);
                                        runtimeNewPlayerNPC.HideFromView(newPlayer);
                                    }
                                }
                                else
                                {
                                    KickStarter.sceneChanger.ChangeScene(new SceneInfo(chooseNewSceneBy, newPlayerSceneName, newPlayerScene), true, false, true);
                                }
                            }
                        }

                        if (KickStarter.mainCamera.attachedCamera && alwaysSnapCamera)
                        {
                            KickStarter.mainCamera.attachedCamera.MoveCameraInstant();
                        }

                        AssetLoader.UnloadAssets();
                    }
                    else
                    {
                        LogWarning("Cannot switch player - no player prefabs is defined.");
                    }
                }
            }

            return(0f);
        }
Пример #18
0
        /**
         * <summary>Adds an inventory item instance to the collection.  If the item exists in another collection, it will be removed from there automatically.</summary>
         * <param name="addInstance">The inventory item instance to add</param>
         */
        public void Add(InvInstance addInstance)
        {
            // Add to the first-available slot, or a filled slot if the same item

            if (!CanAccept(addInstance))
            {
                if (InvInstance.IsValid(addInstance))
                {
                    if (KickStarter.eventManager)
                    {
                        KickStarter.eventManager.Call_OnUseContainerFail(addInstance.GetSourceContainer(), addInstance);
                    }
                }
                return;
            }

            InvCollection fromCollection = addInstance.GetSource();

            bool added = false;

            for (int i = 0; i < invInstances.Count; i++)
            {
                // Inside

                if (!InvInstance.IsValid(invInstances[i]))
                {
                    // Empty slot
                    invInstances[i] = addInstance.CreateTransferInstance();
                    if (KickStarter.eventManager)
                    {
                        KickStarter.eventManager.Call_OnChangeInventory(this, invInstances[i], InventoryEventType.Add);
                    }
                    added = true;
                    break;
                }
                else if (invInstances[i] == addInstance)
                {
                    // Same
                }
                else if (invInstances[i].InvItem == addInstance.InvItem && addInstance.InvItem.canCarryMultiple && invInstances[i].Capacity > 0)
                {
                    // Merge
                    if (addInstance.TransferCount > invInstances[i].Capacity)
                    {
                        addInstance.TransferCount = invInstances[i].Capacity;
                    }
                    int numAdded = Mathf.Min(addInstance.CreateTransferInstance().Count, invInstances[i].Capacity);
                    invInstances[i].Count += numAdded;
                    if (KickStarter.eventManager)
                    {
                        KickStarter.eventManager.Call_OnChangeInventory(this, invInstances[i], InventoryEventType.Add, numAdded);
                    }
                    added = true;
                    break;
                }
            }

            if (!added)
            {
                AddToEnd(addInstance);
                return;
            }

            if (fromCollection != null)
            {
                fromCollection.Clean();
            }
            Clean();
            PlayerMenus.ResetInventoryBoxes();
        }