public CraftingStore(string _name, string _tag) { Resource = Globals.repository.CreateResource(new OEIShared.Utils.OEIResRef(_tag), storeResourceType); BuyFromPlayerPricePercent = 0; SellToPlayerPricePercent = 50; TemplateResRef = new OEIShared.Utils.OEIResRef(_tag); Tag = _tag; ResourceName = new OEIShared.Utils.OEIResRef(_tag); LocalizedName = new OEIShared.Utils.OEIExoLocString(); LocalizedName[OEIShared.Utils.BWLanguages.BWLanguage.English] = _name; Globals.AddBlueprint(this); }
public void CreateBlocksWhenAreaIsReady(object area) { NWN2Toolset.NWN2.Data.NWN2GameArea nwn2Area = area as NWN2Toolset.NWN2.Data.NWN2GameArea; if (nwn2Area == null) { throw new ArgumentException("Parameter was not of type NWN2Toolset.NWN2.Data.NWN2GameArea.", "area"); } int wait = 3000; int interval = 100; while (wait >= 0 && nwn2Area.Tag == null) { Thread.Sleep(interval); wait -= interval; } if (nwn2Area.Tag == null) { throw new ApplicationException("The last-opened area took too long to load, and could not be shown as a Flip block."); } // Once loaded, ensure that area always has the same resource name and tag: if (nwn2Area.Tag != nwn2Area.Name) { nwn2Area.Tag = nwn2Area.Name; } OEIShared.Utils.OEIExoLocString oeiStr = Nwn2Strings.GetOEIStringFromString(nwn2Area.Name); if (nwn2Area.DisplayName != oeiStr) { nwn2Area.DisplayName = oeiStr; } // Create area block: Action action = new Action ( delegate() { ObjectBlock areaBlock = blocks.CreateAreaBlock(nwn2Area); manager.AddMoveable(AreasBagName, areaBlock); foreach (NWN2InstanceCollection instanceCollection in nwn2Area.AllInstances) { if (instanceCollection.Count == 0) { continue; } string bag = String.Format(InstanceBagNamingFormat, instanceCollection[0].ObjectType); if (!manager.HasBag(bag)) { continue; } foreach (INWN2Instance instance in instanceCollection) { ObjectBlock instanceBlock = blocks.CreateInstanceBlock(instance, nwn2Area); manager.AddMoveable(bag, instanceBlock); } } } ); uiThreadAccess.Dispatcher.Invoke(DispatcherPriority.Normal, action); }
protected void TrackToolsetChanges(ToolsetEventReporter reporter) { if (!reporter.IsRunning) { reporter.Start(); } reporter.ModuleChanged += delegate(object oSender, ModuleChangedEventArgs eArgs) { /* Fires when a module closes, but that doesn't mean that the new module has * been fully opened yet... usually takes a while! */ Action action = new Action ( delegate() { if (manager != null) { manager.EmptyBag(AreasBagName); foreach (NWN2ObjectType type in Enum.GetValues(typeof(NWN2ObjectType))) { string bag = String.Format(InstanceBagNamingFormat, type); if (manager.HasBag(bag)) { manager.EmptyBag(bag); } } manager.AddMoveable("Creatures", blocks.CreatePlayerBlock()); } } ); uiThreadAccess.Dispatcher.Invoke(DispatcherPriority.Normal, action); }; reporter.InstanceAdded += delegate(object sender, InstanceEventArgs e) { if (manager == null) { return; } string bag = String.Format(InstanceBagNamingFormat, e.Instance.ObjectType.ToString()); if (!manager.HasBag(bag)) { return; } ObjectBlock block = blocks.CreateInstanceBlock(e.Instance, e.Area); manager.AddMoveable(bag, block); }; reporter.InstanceRemoved += delegate(object sender, InstanceEventArgs e) { if (manager == null || e.Instance == null) { return; } string bag = String.Format(InstanceBagNamingFormat, Nwn2ScriptSlot.GetNwn2Type(e.Instance.ObjectType)); if (!manager.HasBag(bag)) { return; } try { UIElementCollection collection = manager.GetMoveables(bag); ObjectBlock lost = blocks.CreateInstanceBlock(e.Instance, e.Area); foreach (ObjectBlock block in collection) { if (block.Equals(lost)) { manager.RemoveMoveable(bag, block); return; } } } catch (Exception) {} }; reporter.BlueprintAdded += delegate(object sender, BlueprintEventArgs e) { if (manager == null || e.Blueprint == null) { return; } if (nt.CreatedByNarrativeThreads(e.Blueprint)) { Thread thread = new Thread(new ParameterizedThreadStart(CreateNarrativeThreadsBlock)); thread.IsBackground = true; thread.Start(e.Blueprint); } if (loadBlueprints) { Action action = new Action ( delegate() { string bag = String.Format(BlueprintBagNamingFormat, e.Blueprint.ObjectType.ToString()); if (manager.HasBag(bag)) { ObjectBlock block = blocks.CreateBlueprintBlock(e.Blueprint); manager.AddMoveable(bag, block); } } ); uiThreadAccess.Dispatcher.Invoke(DispatcherPriority.Normal, action); } }; reporter.BlueprintRemoved += delegate(object sender, BlueprintEventArgs e) { if (manager == null || e.Blueprint == null) { return; } if (nt.CreatedByNarrativeThreads(e.Blueprint)) { Action action = new Action ( delegate() { string bag = String.Format(InstanceBagNamingFormat, e.Blueprint.ObjectType.ToString()); if (manager.HasBag(bag)) { ObjectBlock lost = blocks.CreateInstanceBlockFromBlueprint(e.Blueprint); ObjectBlock removing = null; foreach (ObjectBlock block in manager.GetMoveables(bag)) { if (block.Equals(lost)) { removing = block; break; } } if (removing != null) { manager.RemoveMoveable(bag, removing); } } } ); uiThreadAccess.Dispatcher.Invoke(DispatcherPriority.Normal, action); } if (loadBlueprints) { Action action = new Action ( delegate() { string bag = String.Format(BlueprintBagNamingFormat, e.Blueprint.ObjectType.ToString()); if (manager.HasBag(bag)) { ObjectBlock lost = blocks.CreateBlueprintBlock(e.Blueprint); ObjectBlock removing = null; foreach (ObjectBlock block in manager.GetMoveables(bag)) { if (block.Equals(lost)) { removing = block; break; } } if (removing != null) { manager.RemoveMoveable(bag, removing); } } } ); uiThreadAccess.Dispatcher.Invoke(DispatcherPriority.Normal, action); } }; reporter.AreaOpened += delegate(object sender, AreaEventArgs e) { if (manager == null) { return; } Thread thread = new Thread(new ParameterizedThreadStart(CreateBlocksWhenAreaIsReady)); thread.IsBackground = true; thread.Start(e.Area); }; reporter.ResourceViewerClosed += delegate(object sender, ResourceViewerClosedEventArgs e) { if (manager == null) { return; } foreach (Moveable moveable in manager.GetMoveables(AreasBagName)) { ObjectBlock block = moveable as ObjectBlock; if (block == null) { continue; } AreaBehaviour area = block.Behaviour as AreaBehaviour; if (area == null) { continue; } // Assumes that there are no conversations or scripts with the same name as an // area, but there's no immediately apparent way around this: // (TODO: Could check that module doesn't have a script or conversation of the same name.) if (area.Identifier == e.ResourceName) { manager.RemoveMoveable(AreasBagName, moveable); break; } } if (NWN2ToolsetMainForm.App.Module != null && NWN2ToolsetMainForm.App.Module.Areas.ContainsCaseInsensitive(e.ResourceName)) { // At this point we think it's an area that's been closed, so remove // any instances associated with that area: foreach (NWN2ObjectType type in Enum.GetValues(typeof(NWN2ObjectType))) { string bag = String.Format(InstanceBagNamingFormat, type); if (manager.HasBag(bag)) { List <Moveable> removing = new List <Moveable>(); foreach (Moveable moveable in manager.GetMoveables(bag)) { ObjectBlock block = moveable as ObjectBlock; if (block == null) { continue; } InstanceBehaviour instance = block.Behaviour as InstanceBehaviour; if (instance == null) { continue; } if (instance.AreaTag.ToLower() == e.ResourceName.ToLower()) { removing.Add(moveable); } } foreach (Moveable moveable in removing) { manager.RemoveMoveable(bag, moveable); } } } } }; // Ensure that an area always has the same resource name and tag: reporter.AreaNameChanged += delegate(object oObject, NameChangedEventArgs eArgs) { NWN2GameArea area = eArgs.Item as NWN2GameArea; if (area == null) { return; } string blockHasTag = area.Tag; if (area.Tag != area.Name) { area.Tag = area.Name; } OEIShared.Utils.OEIExoLocString oeiStr = Nwn2Strings.GetOEIStringFromString(area.Name); if (area.DisplayName != oeiStr) { area.DisplayName = oeiStr; } // Note that this will only work for areas that are currently open... // we'll deal with changing the name of closed areas when they open. // Update the area block, if the area is open: bool open = false; foreach (NWN2AreaViewer av in NWN2ToolsetMainForm.App.GetAllAreaViewers()) { if (av.Area == area) { open = true; break; } } if (!open) { return; } AreaBehaviour behaviour = blocks.CreateAreaBehaviour(area); if (manager.HasBag(AreasBagName)) { UIElementCollection existingBlocks = manager.GetMoveables(AreasBagName); bool updated = false; foreach (UIElement u in existingBlocks) { ObjectBlock existing = u as ObjectBlock; if (existing == null) { continue; } AreaBehaviour existingBehaviour = existing.Behaviour as AreaBehaviour; if (existingBehaviour == null) { continue; } // If you find an area with the same tag, replace its behaviour to update it: if (existingBehaviour.Tag == blockHasTag) { existing.Behaviour = behaviour; updated = true; break; } } if (!updated) { ObjectBlock block = blocks.CreateAreaBlock(behaviour); manager.AddMoveable(AreasBagName, block, false); } } }; // If a script has its name changed, change it back: reporter.ScriptNameChanged += delegate(object oObject, NameChangedEventArgs eArgs) { Thread thread = new Thread(new ParameterizedThreadStart(ReverseScriptNameChange)); thread.IsBackground = false; thread.Start(eArgs); }; }
public void SetOEIExoLocString(string key, string value) { OEIShared.Utils.OEIExoLocString str = new OEIShared.Utils.OEIExoLocString(); str[OEIShared.Utils.BWLanguages.BWLanguage.English] = value; Set(OEIShared.IO.GFF.GFFField.CreateGFFField(key, str)); }