public override void Initialize() { bool hasAllResources = true; if (Resources != null) { foreach (Quantitiy <Resource.ResourceTags> resource in Resources) { if (!Creature.Inventory.HasResource(resource, AllowHeterogenous)) { hasAllResources = false; } } } else if (ResourcesToStash != null) { foreach (ResourceAmount resource in ResourcesToStash) { if (!Creature.Inventory.HasResource(resource)) { hasAllResources = false; } } } else { Tree = null; return; } if (Faction == null) { Faction = Agent.Faction; } if (!hasAllResources) { Stockpile nearestStockpile = Faction.GetNearestStockpile(Agent.Position, (pile) => !(pile is Graveyard)); if (ResourcesToStash == null && Resources != null) { ResourcesToStash = Faction.GetResourcesWithTags(Resources, AllowHeterogenous); } if (nearestStockpile == null || (ResourcesToStash != null && ResourcesToStash.Count == 0)) { Tree = null; return; } else { Tree = new Sequence(new Domain(() => HasResources(Agent), new GoToZoneAct(Agent, nearestStockpile)), new Sequence(new Condition(() => HasResources(Agent)), new StashResourcesAct(Agent, ResourcesToStash) { Faction = Faction }), new SetBlackboardData <List <ResourceAmount> >(Agent, "ResourcesStashed", ResourcesToStash) ); } } else { Tree = new SetBlackboardData <List <ResourceAmount> >(Agent, "ResourcesStashed", ResourcesToStash); } base.Initialize(); }