public void OnPlayerUseWorldItemSecondary(object secondaryResult) { WIListResult dialogResult = secondaryResult as WIListResult; switch (dialogResult.SecondaryResult) { case "RemovePowerSource": WIStackError error = WIStackError.None; if (Player.Local.Inventory.AddItems(PowerSourceDopplegangerProps.ToStackItem(), ref error)) { HasPowerSource = false; OnPowerSourceRemoved.SafeInvoke(); FXManager.Get.SpawnFX(worlditem.tr.position, FXOnPowerSourceRemoved); } break; case "AddPowerSource": if (Player.Local.Tool.IsEquipped && Stacks.Can.Stack(Player.Local.Tool.worlditem, PowerSourceDopplegangerProps)) { //PowerSourceDopplegangerProps.CopyFrom (Player.Local.Tool.worlditem); Player.Local.Tool.worlditem.RemoveFromGame(); HasPowerSource = true; Refresh(); } break; default: break; } }
public bool DateShard() { if (Player.Local.Tool.IsEquipped) { ArtifactShard shard = null; if (Player.Local.Tool.worlditem.Is <ArtifactShard>(out shard)) { if (shard.DateShard()) { //once the shard is dated //swap it out with a new shard //use the generic world item as a base //set the state so the shard shape is the same GenericWorldItem newShard = null; switch (shard.State.Age) { case ArtifactAge.Modern: default: newShard = ModernShard; break; case ArtifactAge.Old: newShard = OldShard; break; case ArtifactAge.Antiquated: newShard = AntiquatedShard; break; case ArtifactAge.Ancient: newShard = AncientShard; break; case ArtifactAge.Prehistoric: newShard = PrehistoricShard; break; } //now turn it into a stack item //this will allow us to prevent it from randomizing itself StackItem newShardStackItem = newShard.ToStackItem(); ArtifactShardState shardState = null; newShardStackItem.State = shard.worlditem.State; newShardStackItem.StackName = shard.worlditem.StackName; if (newShardStackItem.GetStateData <ArtifactShardState>(out shardState)) { shardState.HasChosenFragment = true; } WorldItems.ReplaceWorldItem(shard.worlditem, newShardStackItem); FXManager.Get.SpawnFX(transform.position, FXOnDate); } } } return(false); }
IEnumerator FillContainerOverTime(bool immediately) { if (!immediately) { yield return(null); //wait for a tick to let recepticles etc. update properties } State.LastFillTime = WorldClock.AdjustedRealTime; //fill container WIStackError error = WIStackError.None; WIStackContainer container = worlditem.StackContainer; int numDesired = State.NumberOfItems; int numAdded = 0; int lastItemIndex = 0; int maxDuplicates = 3; bool continueFilling = true; int hashCode = Mathf.Abs((worlditem.Group.Props.UniqueID + worlditem.FileName).GetHashCode()); int numDuplicates = 0; bool belowDuplicateThreshold = true; GenericWorldItem genericItem = null; WICategory category = null; IBank bank = null; if (State.FillBank) { Character character = null; if (worlditem.Is <Character> (out character) && character.HasBank) { bank = character.InventoryBank; Bank.FillWithRandomCurrency(bank, character.State.Flags.Wealth); } } switch (State.NumberOfItemsRandomness) { case ContainerFillRandomness.Slight: default: numDesired = Mathf.Max(1, numDesired + UnityEngine.Random.Range(-1, 1)); break; case ContainerFillRandomness.Moderate: numDesired = Mathf.Max(1, numDesired + UnityEngine.Random.Range(-5, 5)); break; case ContainerFillRandomness.Extreme: numDesired = Mathf.Max(1, numDesired + UnityEngine.Random.Range(-10, 10)); break; } yield return(null); switch (State.FillMethod) { case ContainerFillMethod.AllRandomItemsFromCategory: default: if (WorldItems.Get.Category(State.WICategoryName, out category)) { Dictionary <string, int> itemsSoFar = new Dictionary <string, int> (); if (category.HasMinInstanceItems) { gMinInstanceItems.Clear(); category.GetMinInstanceItems(gMinInstanceItems); for (int i = 0; i < gMinInstanceItems.Count; i++) { if (itemsSoFar.TryGetValue(gMinInstanceItems [i].PrefabName, out numDuplicates)) { numDuplicates++; itemsSoFar [gMinInstanceItems [i].PrefabName] = numDuplicates; } else { itemsSoFar.Add(gMinInstanceItems [i].PrefabName, 1); } StackItem item = gMinInstanceItems [i].ToStackItem(); if (item != null) { if (State.AddCurrencyToBank && bank != null && item.Is("Currency")) { bank.Add(Mathf.FloorToInt(item.BaseCurrencyValue), item.CurrencyType); item.Clear(); } else { //add the generic item to the container as a stack item if (!Stacks.Add.Items(item, container, ref error)) { continueFilling = false; } else { numAdded++; } } } } gMinInstanceItems.Clear(); } yield return(null); while (continueFilling && category.GetItem(State.Flags, hashCode, ref lastItemIndex, out genericItem)) { //make sure we don't have a duplicate if (itemsSoFar.TryGetValue(genericItem.PrefabName, out numDuplicates)) { numDuplicates++; if (numDuplicates < maxDuplicates) { itemsSoFar [genericItem.PrefabName] = numDuplicates; } else { belowDuplicateThreshold = false; } } else { itemsSoFar.Add(genericItem.PrefabName, 1); } yield return(null); if (belowDuplicateThreshold) { //this might be a currency item - if it is, add it to the bank StackItem item = genericItem.ToStackItem(); if (State.AddCurrencyToBank && bank != null && item.Is("Currency")) { bank.Add(Mathf.FloorToInt(item.BaseCurrencyValue), item.CurrencyType); item.Clear(); } else { //add the generic item to the container as a stack item if (!Stacks.Add.Items(item, container, ref error)) { continueFilling = false; } else { numAdded++; } } } //are we done yet? if (numAdded >= numDesired || container.IsFull || !belowDuplicateThreshold) { continueFilling = false; } //wait a tick unless we need to finish this immediately //if (!immediately) { yield return(null); //} } } break; case ContainerFillMethod.OneRandomItemFromCategory: if (WorldItems.Get.Category(State.WICategoryName, out category)) { if (category.GetItem(State.Flags, hashCode, ref lastItemIndex, out genericItem)) { for (int i = 0; i < numDesired; i++) { if (!Stacks.Add.Items(genericItem.ToStackItem(), container, ref error)) { break; } else { numAdded++; } if (container.IsFull) { break; } } } } break; case ContainerFillMethod.SpecificItems: if (WorldItems.Get.Category(State.WICategoryName, out category)) { for (int i = 0; i < State.SpecificItems.Count; i++) { GenericWorldItem specificItem = State.SpecificItems [i]; Stacks.Add.Items(specificItem.ToStackItem(), container, ref error); } } break; } State.NumTimesFilled++; mIsFilling = false; yield return(null); if (worlditem.Is <Stolen> ()) { //the goods in a stolen container are also marked as stolen Stacks.Add.ScriptToItems(container, "Stolen"); } yield break; }