/// <summary> /// Gets the number of objects in this area matching a given description. /// </summary> /// <param name="type">The type of objects to count.</param> /// <param name="tag">Only objects with this tag will be counted. /// Pass null to ignore this criterion.</param> /// <returns>The objects matching the given description.</returns> /// <remarks>This method will throw an InvalidOperationException if /// the area is not open.</remarks> public override NWN2InstanceCollection GetObjects(NWN2ObjectType type, string tag) { bool loaded = nwn2Area.Loaded; if (!loaded) { throw new InvalidOperationException("Area must be open in the toolset " + "before the method can run."); } NWN2InstanceCollection all = nwn2Area.AllInstances[(int)type]; if (tag == null || tag == String.Empty) { return(all); } else { NWN2InstanceCollection selected = new NWN2InstanceCollection(); foreach (INWN2Instance i in all) { if (((INWN2Object)i).Tag == tag) { selected.Add(i); } } return(selected); } }
public ObjectBlock GetBlock(Nwn2Address address) { if (address == null) { throw new ArgumentNullException("address"); } if (session.GetModule() == null) { throw new InvalidOperationException("No module is open."); } if (address.TargetType == Nwn2Type.Module) { return(blocks.CreateModuleBlock()); } else if (address.TargetType == Nwn2Type.Area) { NWN2GameArea area = session.GetArea(address.AreaTag); if (area == null) { throw new ArgumentException("No such area in the current module.", "area"); } else { return(blocks.CreateAreaBlock(area)); } } else { NWN2ObjectType type = Nwn2ScriptSlot.GetObjectType(address.TargetType).Value; INWN2Blueprint blueprint = session.GetBlueprint(address.InstanceTag, type); if (blueprint != null) { return(blocks.CreateInstanceBlockFromBlueprint(blueprint)); } foreach (NWN2AreaViewer viewer in NWN2Toolset.NWN2ToolsetMainForm.App.GetAllAreaViewers()) { NWN2InstanceCollection instances = session.GetObjectsByAddressInArea(address, viewer.Area.Tag); if (instances.Count > 0) { INWN2Instance instance = instances[0]; return(blocks.CreateInstanceBlock(instance)); } } return(null); } }
/// <summary> /// Gets whether a given Moveable represents a blueprint of a particular type. /// </summary> /// <param name="moveable">The Moveable to check.</param> /// <param name="type">The type of blueprint we're looking for.</param> /// <returns>True if the Moveable represents a blueprint of the given type; /// false otherwise.</returns> public static bool IsBlueprint(Moveable moveable, NWN2ObjectType type) { if (moveable == null) { throw new ArgumentNullException("moveable"); } ObjectBlock block = moveable as ObjectBlock; string desc = String.Format(SubtypeFormat, BlueprintDescription, type.ToString()); return(block != null && block.GetDescriptionOfObjectType() == desc); }
public InstancePlayerFitter(NWN2ObjectType type, string description) { if (description == null) { throw new ArgumentException("description"); } this.types = new List <NWN2ObjectType> { type }; this.description = description; }
private Type GetInstanceType(NWN2ObjectType type) { switch (type) { case NWN2ObjectType.Creature: return(typeof(NWN2CreatureInstance)); case NWN2ObjectType.Door: return(typeof(NWN2DoorInstance)); case NWN2ObjectType.Encounter: return(typeof(NWN2EncounterInstance)); case NWN2ObjectType.Environment: return(typeof(NWN2EnvironmentInstance)); case NWN2ObjectType.Item: return(typeof(NWN2ItemInstance)); case NWN2ObjectType.Light: return(typeof(NWN2LightInstance)); case NWN2ObjectType.Placeable: return(typeof(NWN2PlaceableInstance)); case NWN2ObjectType.PlacedEffect: return(typeof(NWN2PlacedEffectInstance)); case NWN2ObjectType.Prefab: return(null); case NWN2ObjectType.Sound: return(typeof(NWN2SoundInstance)); case NWN2ObjectType.StaticCamera: return(typeof(NWN2StaticCameraInstance)); case NWN2ObjectType.Store: return(typeof(NWN2StoreInstance)); case NWN2ObjectType.Tree: return(typeof(NWN2TreeInstance)); case NWN2ObjectType.Trigger: return(typeof(NWN2TriggerInstance)); case NWN2ObjectType.Waypoint: return(typeof(NWN2WaypointInstance)); default: return(null); } }
/// <summary> /// Creates an instance of a blueprint and adds it to the area. /// </summary> /// <param name="type">The type of object to add.</param> /// <param name="resref">The resref of the blueprint to create the object from.</param> /// <param name="tag">The tag to give the newly-created object. /// Pass null to use the default tag.</param> /// <param name="position">The position within the area to place /// the object.</param> /// <returns>The newly-created game object.</returns> public override INWN2Instance AddGameObject(NWN2ObjectType type, string resref, string tag, Vector3?position) { if (resref == null) { throw new ArgumentNullException("resref"); } if (resref == String.Empty) { throw new ArgumentException("resref cannot be an empty string.", "resref"); } INWN2Blueprint blueprint = NWN2GlobalBlueprintManager.FindBlueprint(type, new OEIResRef(resref), true, true, true); if (blueprint == null) { throw new ArgumentException("No blueprint with the given type and ResRef was found.", "resref"); } return(AddGameObject(blueprint, tag, position)); }
/// <summary> /// Gets an object in this area with a given ObjectID. /// </summary> /// <param name="type">The type of the object.</param> /// <param name="guid">The unique ID of the object.</param> /// <returns>The object matching the given description, /// or null if none was found.</returns> /// <remarks>This method will throw an InvalidOperationException if /// the area is not open.</remarks> public override INWN2Instance GetObject(NWN2ObjectType type, Guid guid) { bool loaded = nwn2Area.Loaded; if (!loaded) { throw new InvalidOperationException("Area must be open in the toolset " + "before the method can run."); } NWN2InstanceCollection all = nwn2Area.AllInstances[(int)type]; INWN2Instance unique = null; foreach (INWN2Instance instance in all) { if (instance.ObjectID == guid) { unique = instance; break; } } return(unique); }
/// <summary> /// Gets a list of script slot names that are defined on a game /// object of the given type. /// </summary> /// <param name="type">The type of game object.</param> /// <returns>A list of names of script slots defined on an object /// of this type, which may be empty.</returns> public static IList <string> GetScriptSlotNames(NWN2ObjectType type) { Nwn2Type nwn2Type = GetNwn2Type(type); return(GetScriptSlotNames(nwn2Type)); }
/// <summary> /// Create a new blueprint /// </summary> /// <param name="objectType">The type of the blueprint that is about to be created</param> /// <param name="locationType">The location where the blueprint will be placed</param> /// <returns>The new blueprint</returns> private static INWN2Blueprint createNewBlueprint(NWN2ObjectType objectType, NWN2BlueprintLocationType locationType) { INWN2Blueprint cBlueprint = null; IResourceRepository userOverrideDirectory = null; NWN2Campaign activeCampaign = NWN2CampaignManager.Instance.ActiveCampaign; INWN2BlueprintSet instance = null; switch (locationType) { case NWN2BlueprintLocationType.Global: userOverrideDirectory = NWN2ResourceManager.Instance.UserOverrideDirectory; if (userOverrideDirectory != null) { userOverrideDirectory = NWN2ResourceManager.Instance.OverrideDirectory; } instance = NWN2GlobalBlueprintManager.Instance; break; case NWN2BlueprintLocationType.Module: instance = NWN2Toolset.NWN2ToolsetMainForm.App.Module; userOverrideDirectory = NWN2Toolset.NWN2ToolsetMainForm.App.Module.Repository; break; case NWN2BlueprintLocationType.Campaign: userOverrideDirectory = (activeCampaign != null) ? activeCampaign.Repository : null; instance = activeCampaign; break; default: throw new Exception("Unknown object type in CreateNewBlueprint()" + locationType.ToString()); } if ((userOverrideDirectory == null) || (instance == null)) { return null; } switch (objectType) { case NWN2ObjectType.Creature: cBlueprint = new NWN2CreatureBlueprint(); createHelp(cBlueprint, NWN2GlobalBlueprintManager.GetTemporaryBlueprintName(NWN2ObjectType.Creature, locationType), userOverrideDirectory, BWResourceTypes.GetResourceType("UTC")); break; case NWN2ObjectType.Door: cBlueprint = new NWN2DoorBlueprint(); createHelp(cBlueprint, NWN2GlobalBlueprintManager.GetTemporaryBlueprintName(NWN2ObjectType.Door, locationType), userOverrideDirectory, BWResourceTypes.GetResourceType("UTD")); break; case NWN2ObjectType.Item: cBlueprint = new NWN2ItemBlueprint(); createHelp(cBlueprint, NWN2GlobalBlueprintManager.GetTemporaryBlueprintName(NWN2ObjectType.Item, locationType), userOverrideDirectory, BWResourceTypes.GetResourceType("UTI")); break; case NWN2ObjectType.Placeable: cBlueprint = new NWN2PlaceableBlueprint(); createHelp(cBlueprint, NWN2GlobalBlueprintManager.GetTemporaryBlueprintName(NWN2ObjectType.Placeable, locationType), userOverrideDirectory, BWResourceTypes.GetResourceType("UTP")); break; case NWN2ObjectType.Trigger: cBlueprint = new NWN2TriggerBlueprint(); createHelp(cBlueprint, NWN2GlobalBlueprintManager.GetTemporaryBlueprintName(NWN2ObjectType.Trigger, locationType), userOverrideDirectory, BWResourceTypes.GetResourceType("UTT")); break; default: throw new Exception("Unknown object type in CreateNewBlueprint()"); } NWN2BlueprintCollection blueprintCollectionForType = instance.GetBlueprintCollectionForType(objectType); INWN2Object obj2 = cBlueprint as INWN2Object; obj2.Tag = cBlueprint.ResourceName.Value; obj2.LocalizedName[BWLanguages.CurrentLanguage] = cBlueprint.ResourceName.Value; cBlueprint.BlueprintLocation = instance.BlueprintLocation; blueprintCollectionForType.Add(cBlueprint); GFFFile file = new GFFFile(); file.FileHeader.FileType = BWResourceTypes.GetFileExtension(cBlueprint.Resource.ResourceType); cBlueprint.SaveEverythingIntoGFFStruct(file.TopLevelStruct, true); using (Stream stream = cBlueprint.Resource.GetStream(true)) { file.Save(stream); cBlueprint.Resource.Release(); } return cBlueprint; }
public BlueprintBehaviour(string resRef, string displayName, string baseResRef, string iconName, NWN2ObjectType type) : this(resRef, displayName, baseResRef, iconName, Nwn2ScriptSlot.GetNwn2Type(type)) { }
public static NWScriptObjectType?GetNWScriptConstant(NWN2ObjectType type) { Nwn2Type nwn2Type = Nwn2ScriptSlot.GetNwn2Type(type); return(GetNWScriptConstant(nwn2Type)); }
/// <summary> /// Notifies the client when an object is removed from an area. /// </summary> /// <param name="type">The type of object.</param> /// <param name="tag">The tag of the object.</param> /// <param name="id">The unique ID of the object.</param> /// <param name="area">The name of the area the object was removed from.</param> public void NotifyObjectRemoved(NWN2ObjectType type, string tag, Guid id, string area) { context.NotifyObjectRemoved(type, tag, id, area); }
/// <summary> /// Notifies the client when a blueprint is removed from the module. /// </summary> /// <param name="type">The type of blueprint.</param> /// <param name="resourceName">The unique resource name of the blueprint. /// <remarks>There appears to be a bug in the toolset or plugin which causes this event /// to fire again at a later point.</remarks> public void NotifyBlueprintRemoved(NWN2ObjectType type, string resourceName) { context.NotifyBlueprintRemoved(type, resourceName); }
/// <summary> /// Notifies the client when a different script is attached to a script slot /// on a game object. /// </summary> /// <param name="type">The type of the object.</param> /// <param name="id">The unique ID of the object.</param> /// <param name="area">The name of the area in which this object resides.</param> /// <param name="slot">The name of the script slot property.</param> /// <param name="oldValue">The name of the previously attached script.</param> /// <param name="newValue">The name of the newly attached script.</param> public void NotifyScriptSlotChangedOnObject(NWN2ObjectType type, Guid id, string area, string slot, string oldValue, string newValue) { Callbacks.Push(slot + " script on " + type + " with ID " + id + " changed to '" + newValue + "' (was '" + oldValue + "')"); }
/// <summary> /// /// </summary> /// <param name="script"></param> /// <param name="attachment">Only return a script if it is attached /// in the manner indicated by this parameter.</param> /// <returns></returns> /// <remarks>This method expects that the NWN2GameScript is already Loaded /// (that is, the responsibility for calling Demand() falls to the client.)</remarks> public FlipScript GetFlipScript(NWN2GameScript script, Attachment attachment) { if (script == null) { throw new ArgumentNullException("script"); } string code, address, naturalLanguage; ScriptWriter.ParseNWScript(script.Data, out code, out address, out naturalLanguage); ScriptType scriptType = GetScriptType(script); if (attachment == Attachment.Ignore) { return(new FlipScript(code, scriptType, script.Name)); } NWN2GameModule mod = session.GetModule(); if (mod == null) { throw new InvalidOperationException("No module is open."); } Nwn2Address nwn2Address; Nwn2ConversationAddress nwn2ConversationAddress; switch (attachment) { case Attachment.Attached: nwn2Address = Nwn2Address.TryCreate(address); nwn2ConversationAddress = Nwn2ConversationAddress.TryCreate(address); break; case Attachment.AttachedToConversation: nwn2Address = null; nwn2ConversationAddress = Nwn2ConversationAddress.TryCreate(address); break; case Attachment.AttachedToScriptSlot: nwn2Address = Nwn2Address.TryCreate(address); nwn2ConversationAddress = null; break; default: nwn2Address = null; nwn2ConversationAddress = null; break; } if (nwn2Address != null) { try { if (nwn2Address.TargetType == Nwn2Type.Module) { IResourceEntry resource = typeof(NWN2ModuleInformation).GetProperty(nwn2Address.TargetSlot).GetValue(mod.ModuleInfo, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { return(new FlipScript(code, scriptType, script.Name)); } } else if (nwn2Address.TargetType == Nwn2Type.Area) { NWN2GameArea area = session.GetArea(nwn2Address.AreaTag); if (area != null) { IResourceEntry resource = typeof(NWN2GameArea).GetProperty(nwn2Address.TargetSlot).GetValue(area, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { return(new FlipScript(code, scriptType, script.Name)); } } } else { /* * The script might be attached to a Narrative Threads blueprint: */ // First check that if a blueprint which uses this tag as resref exists, it was created by Narrative Threads: if (nt.CreatedByNarrativeThreads(nwn2Address.TargetType, nwn2Address.InstanceTag)) { NWN2ObjectType objectType = Nwn2ScriptSlot.GetObjectType(nwn2Address.TargetType).Value; INWN2Blueprint blueprint = session.GetBlueprint(nwn2Address.InstanceTag.ToLower(), objectType); if (blueprint != null) { IResourceEntry resource = blueprint.GetType().GetProperty(nwn2Address.TargetSlot).GetValue(blueprint, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { return(new FlipScript(code, scriptType, script.Name)); } } } // Check through all OPEN areas. foreach (NWN2GameArea area in mod.Areas.Values) { if (!session.AreaIsOpen(area)) { continue; } NWN2InstanceCollection instances = session.GetObjectsByAddressInArea(nwn2Address, area.Tag); if (instances != null) { // Check the script is still attached to the target object in the slot it claims to be, // in at least one instance, and if so add it to the set of scripts to be opened: foreach (INWN2Instance instance in instances) { IResourceEntry resource = instance.GetType().GetProperty(nwn2Address.TargetSlot).GetValue(instance, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { return(new FlipScript(code, scriptType, script.Name)); } } } } } } catch (Exception x) { throw new ApplicationException(String.Format("Failed to handle script + '{0}' properly.", script.Name), x); } } else if (nwn2ConversationAddress != null) // Check through all conversations, regardless of whether they're open. { NWN2GameConversation conversation = session.GetConversation(nwn2ConversationAddress.Conversation); if (conversation == null) { return(null); } if (NWN2Toolset.NWN2ToolsetMainForm.App.GetViewerForResource(conversation) == null) { conversation.Demand(); } NWN2ConversationLine line = conversation.GetLineFromGUID(nwn2ConversationAddress.LineID); if (line == null) { return(null); } if (line.Actions.Count == 0) { return(null); } IResourceEntry resource = line.Actions[0].Script; if (resource != null && resource.ResRef.Value == script.Name) { return(new FlipScript(code, scriptType, script.Name)); } } return(null); }
/// <summary> /// Gets an object in this area with a given ObjectID. /// </summary> /// <param name="type">The type of the object.</param> /// <param name="guid">The unique ID of the object.</param> /// <returns>The object matching the given description, /// or null if none was found.</returns> /// <remarks>This method will throw an InvalidOperationException if /// the area is not open.</remarks> public abstract INWN2Instance GetObject(NWN2ObjectType type, Guid guid);
/// <summary> /// Creates an instance of a blueprint and adds it to the area. /// </summary> /// <param name="type">The type of object to add.</param> /// <param name="resref">The resref of the blueprint to create the object from.</param> /// <param name="tag">The tag to give the newly-created object. /// Pass null to use the default tag.</param> /// <param name="position">The position within the area to place /// the object.</param> /// <returns>The newly-created game object.</returns> public abstract INWN2Instance AddGameObject(NWN2ObjectType type, string resref, string tag, Vector3?position);
/// <summary> /// Creates an instance of a blueprint and adds it to the area. /// </summary> /// <param name="type">The type of object to add.</param> /// <param name="resref">The resref of the blueprint to create the object from.</param> /// <param name="tag">The tag to give the newly-created object. /// Pass null to use the default tag.</param> /// <returns>The newly-created game object.</returns> public override INWN2Instance AddGameObject(NWN2ObjectType type, string resref, string tag) { return(AddGameObject(type, resref, tag, null)); }
/// <summary> /// Translates Flip source into NWScript, compiles it, /// and attaches the results to a Neverwinter Nights 2 module. /// </summary> /// <param name="source">The Flip source to be compiled.</param> /// <param name="address">An address representing the location /// to attach this script to.</param> /// <returns>The name the script was saved under.</returns> public override string Attach(FlipScript source, string address) { if (source == null) { throw new ArgumentNullException("source"); } if (address == null) { throw new ArgumentNullException("address"); } if (address == String.Empty) { throw new ArgumentException("Must provide a valid address for attaching script.", "address"); } if (!Nwn2ToolsetFunctions.ToolsetIsOpen()) { throw new InvalidOperationException("Toolset must be open to attach scripts."); } NWN2GameModule module = session.GetModule(); if (module == null) { throw new InvalidOperationException("No module is currently open in the toolset."); } string name = GetUnusedName(); try { if (name.Length > 32) { throw new ApplicationException("Cannot attach script under the generated name ('" + name + "') " + "because it is of length " + name.Length + ", and the maximum " + "valid length of a resource name for NWN2 is 32."); } NWN2GameScript script = session.AddScript(name, source.Code); session.CompileScript(script); if (address.StartsWith("Conversation")) { Nwn2ConversationAddress convAddress = new Nwn2ConversationAddress(address); NWN2GameConversation conversation = session.GetConversation(convAddress.Conversation); if (conversation == null) { throw new ArgumentException("Conversation '" + convAddress.Conversation + "' was not found in current module.", "address"); } // foreach (NWN2Toolset.NWN2.Views.INWN2Viewer v in NWN2Toolset.NWN2ToolsetMainForm.App.GetAllViewers()) { // NWN2Toolset.NWN2.Views.NWN2ConversationViewer cv = v as NWN2Toolset.NWN2.Views.NWN2ConversationViewer; // if (cv != null) { // System.Windows.MessageBox.Show("From viewer...\n" + cv.Conversation.Name + // "\nConnectors: " + cv.Conversation.AllConnectors.Count + "\n" + // "Entries: " + cv.Conversation.Entries.Count + "\n" + // "Replies: " + cv.Conversation.Replies.Count + "\n" + // "Loaded: " + conversation.Loaded); // } // } // // // System.Windows.MessageBox.Show("From module, before insisting on load...\n" + conversation.Name + // "\nConnectors: " + conversation.AllConnectors.Count + "\n" + // "Entries: " + conversation.Entries.Count + "\n" + // "Replies: " + conversation.Replies.Count + "\n" + // "Loaded: " + conversation.Loaded); // // // // if (!conversation.Loaded) conversation.Demand(); // // // System.Windows.MessageBox.Show("From module, after insisting on load...\n" + conversation.Name + // "\nConnectors: " + conversation.AllConnectors.Count + "\n" + // "Entries: " + conversation.Entries.Count + "\n" + // "Replies: " + conversation.Replies.Count + "\n" + // "Loaded: " + conversation.Loaded); NWN2ConversationLine line = session.GetConversationLine(conversation, convAddress.LineID); if (line == null) { throw new ArgumentException("Line with ID " + convAddress.LineID + " was not found in current module.", "address"); } if (convAddress.AttachedAs == ScriptType.Conditional) { session.AttachScriptToConversationAsCondition(script, line, conversation); } else { session.AttachScriptToConversation(script, line, conversation); } } else { Nwn2Address nwn2Address = new Nwn2Address(address); if (!Scripts.IsEventRaiser(nwn2Address.TargetType)) { throw new ArgumentException("Cannot attach scripts to a " + nwn2Address.TargetType + "."); } if (nwn2Address.TargetType == Nwn2Type.Module) { session.AttachScriptToModule(script, nwn2Address.TargetSlot); } else if (nwn2Address.TargetType == Nwn2Type.Area) { NWN2GameArea area = session.GetArea(nwn2Address.AreaTag); if (area == null) { throw new ArgumentException("Area '" + nwn2Address.AreaTag + "' was not found in current module.", "address"); } session.AttachScriptToArea(script, area, nwn2Address.TargetSlot); } else { /* * We want to attach to ALL instances matching the address in ALL OPEN areas, ignoring AreaTag and UseIndex. */ NWN2ObjectType nwn2ObjectType = Nwn2ScriptSlot.GetObjectType(nwn2Address.TargetType).Value; bool attached = false; foreach (NWN2GameArea a in module.Areas.Values) { if (!session.AreaIsOpen(a)) { continue; } NWN2InstanceCollection instances = session.GetObjectsByTag(a, nwn2ObjectType, nwn2Address.InstanceTag); foreach (INWN2Instance instance in instances) { session.AttachScriptToObject(script, instance, nwn2Address.TargetSlot); attached = true; } } /* * We also want to attach to any blueprints which use this tag as their resref. */ // First check that if a blueprint which uses this tag as resref exists, it was created by Narrative Threads: if (nt.CreatedByNarrativeThreads(Nwn2ScriptSlot.GetNwn2Type(nwn2ObjectType), nwn2Address.InstanceTag)) { INWN2Blueprint blueprint = session.GetBlueprint(nwn2Address.InstanceTag.ToLower(), nwn2ObjectType); if (blueprint != null) { session.AttachScriptToBlueprint(script, blueprint, nwn2Address.TargetSlot); attached = true; } } if (!attached) { string error; if (nt.IsLoaded) { error = String.Format("There isn't a {0} with tag '{1}' in any of the areas that are open, or " + "in the blueprints collection.", nwn2Address.TargetType, nwn2Address.InstanceTag); } else { error = String.Format("There isn't a {0} with tag '{1}' in any of the areas that are open.", nwn2Address.TargetType, nwn2Address.InstanceTag); } throw new MatchingInstanceNotFoundException(error, nwn2Address); } } } } catch (MatchingInstanceNotFoundException x) { throw x; } catch (Exception x) { throw new ApplicationException("Something went wrong while saving and attaching script.", x); } if (backups != null) { if (!Directory.Exists(backups)) { try { Directory.CreateDirectory(backups); } catch (Exception) { return(name); } } string saveTo; if (createFoldersForUsers) { try { saveTo = Path.Combine(backups, Environment.UserName); if (!Directory.Exists(saveTo)) { Directory.CreateDirectory(saveTo); } saveTo = Path.Combine(saveTo, module.Name); if (!Directory.Exists(saveTo)) { Directory.CreateDirectory(saveTo); } } catch (Exception) { saveTo = backups; } } else { saveTo = backups; } try { WriteBackup(name, saveTo, source.Code); } catch (Exception) { } } return(name); }
/// <summary> /// Notifies the client when a different script is attached to a script slot /// on a game object. /// </summary> /// <param name="type">The type of the object.</param> /// <param name="id">The unique ID of the object.</param> /// <param name="area">The name of the area in which this object resides.</param> /// <param name="slot">The name of the script slot property.</param> /// <param name="oldValue">The name of the previously attached script.</param> /// <param name="newValue">The name of the newly attached script.</param> public void NotifyScriptSlotChangedOnObject(NWN2ObjectType type, Guid id, string area, string slot, string oldValue, string newValue) { context.NotifyScriptSlotChangedOnObject(type, id, area, slot, oldValue, newValue); }
/// <summary> /// Notifies the client when an object is added to an area. /// </summary> /// <param name="type">The type of object.</param> /// <param name="tag">The tag of the object.</param> /// <param name="id">The unique ID of the object.</param> /// <param name="area">The name of the area the object was added to.</param> public void NotifyObjectAdded(NWN2ObjectType type, string tag, Guid id, string area) { Callbacks.Push("added object... Type: " + type + ", Tag: " + tag + ", ID: " + id + ", Area: " + area); }
/// <summary> /// Gets the Nwn2Type value which corresponds to the /// given NWN2ObjectType value. /// </summary> /// <param name="type">The type to return a corresponding type for.</param> /// <returns>A Nwn2Type value.</returns> public static Nwn2Type GetNwn2Type(NWN2ObjectType type) { return((Nwn2Type)Enum.Parse(typeof(Nwn2Type), Enum.GetName(typeof(NWN2ObjectType), type))); }
/// <summary> /// Creates an instance of a blueprint and adds it to the area. /// </summary> /// <param name="type">The type of object to add.</param> /// <param name="resref">The resref of the blueprint to create the object from.</param> /// <param name="tag">The tag to give the newly-created object. /// Pass null to use the default tag.</param> /// <returns>The newly-created game object.</returns> public abstract INWN2Instance AddGameObject(NWN2ObjectType type, string resref, string tag);
/// <summary> /// Notifies the client when a blueprint is removed from the module. /// </summary> /// <param name="type">The type of blueprint.</param> /// <param name="resourceName">The unique resource name of the blueprint. /// <remarks>There appears to be a bug in the toolset or plugin which causes this event /// to fire again at a later point.</remarks> public void NotifyBlueprintRemoved(NWN2ObjectType type, string resourceName) { Callbacks.Push("removed " + type + " blueprint with resource name " + resourceName); }
/// <summary> /// Gets the number of objects in this area matching a given description. /// </summary> /// <param name="type">The type of objects to count.</param> /// <param name="tag">Only objects with this tag will be counted. /// Pass null to ignore this criterion.</param> /// <returns>The objects matching the given description.</returns> /// <remarks>This method will throw an InvalidOperationException if /// the area is not open.</remarks> public abstract NWN2InstanceCollection GetObjects(NWN2ObjectType type, string tag);
/// <summary> /// Gets the number of objects in this area matching a given description. /// </summary> /// <param name="type">The type of objects to count.</param> /// <returns>The objects matching the given description.</returns> /// <remarks>This method will throw an InvalidOperationException if /// the area is not open.</remarks> public override NWN2InstanceCollection GetObjects(NWN2ObjectType type) { return(GetObjects(type, null)); }
public InstanceBehaviour(string tag, string displayName, NWN2ObjectType type, string areaTag, string resRef, string iconName) : this(tag, displayName, Nwn2ScriptSlot.GetNwn2Type(type), areaTag, resRef, iconName) { }
/// <summary> /// /// </summary> /// <param name="dict"></param> /// <param name="attachment"></param> /// <returns></returns> /// <remarks>Note that this automatically opens and closes areas/conversations etc. - it is only /// for use with analysis methods, not for users.</remarks> public List <ScriptTriggerTuple> GetAllScriptsFromModule(Attachment attachment) { NWN2GameModule mod = session.GetModule(); if (mod == null) { throw new InvalidOperationException("No module is open."); } NWN2GameScriptDictionary dict = mod.Scripts; if (attachment == Attachment.Ignore) { return(GetTuples(dict)); } Dictionary <Nwn2Address, FlipScript> moduleScripts = new Dictionary <Nwn2Address, FlipScript>(); Dictionary <Nwn2Address, FlipScript> areaScripts = new Dictionary <Nwn2Address, FlipScript>(); Dictionary <Nwn2ConversationAddress, FlipScript> conversationScripts = new Dictionary <Nwn2ConversationAddress, FlipScript>(); foreach (NWN2GameScript nwn2Script in dict.Values) { try { nwn2Script.Demand(); string code, address, naturalLanguage; ScriptWriter.ParseNWScript(nwn2Script.Data, out code, out address, out naturalLanguage); ScriptType scriptType = GetScriptType(nwn2Script); FlipScript script = new FlipScript(code, scriptType, nwn2Script.Name); Nwn2ConversationAddress ca = Nwn2ConversationAddress.TryCreate(address); if (ca != null) { conversationScripts.Add(ca, script); } else { Nwn2Address a = Nwn2Address.TryCreate(address); if (a != null) { if (a.TargetType == Nwn2Type.Module) { moduleScripts.Add(a, script); } else { areaScripts.Add(a, script); } } } nwn2Script.Release(); } catch (Exception) {} } List <ScriptTriggerTuple> scripts = new List <ScriptTriggerTuple>(dict.Count); // this is what we'll return if (attachment == Attachment.AttachedToConversation || attachment == Attachment.Attached) { // Index by conversation name, so we can check all the scripts for a conversation in one go. Dictionary <string, List <Nwn2ConversationAddress> > convNameIndex = new Dictionary <string, List <Nwn2ConversationAddress> >(); foreach (Nwn2ConversationAddress address in conversationScripts.Keys) { if (!convNameIndex.ContainsKey(address.Conversation)) { convNameIndex.Add(address.Conversation, new List <Nwn2ConversationAddress>()); } convNameIndex[address.Conversation].Add(address); } foreach (string convName in convNameIndex.Keys) { NWN2GameConversation conv = mod.Conversations[convName]; if (conv == null) { continue; } conv.Demand(); foreach (Nwn2ConversationAddress address in convNameIndex[convName]) { FlipScript script = conversationScripts[address]; NWN2ConversationLine line = conv.GetLineFromGUID(address.LineID); if (line == null) { continue; } if (address.AttachedAs == ScriptType.Standard && line.Actions.Count > 0) { IResourceEntry resource = line.Actions[0].Script; if (resource != null && resource.ResRef.Value == script.Name) { scripts.Add(new ScriptTriggerTuple(script, triggerFactory.GetTriggerFromAddress(address))); } } else if (address.AttachedAs == ScriptType.Conditional && line.OwningConnector.Conditions.Count > 0) { IResourceEntry resource = line.OwningConnector.Conditions[0].Script; if (resource != null && resource.ResRef.Value == script.Name) { scripts.Add(new ScriptTriggerTuple(script, triggerFactory.GetTriggerFromAddress(address))); } } } conv.Release(); } } if (attachment == Attachment.AttachedToScriptSlot || attachment == Attachment.Attached) { // First, just check for scripts attached to the module - easy: foreach (Nwn2Address address in moduleScripts.Keys) { FlipScript script = moduleScripts[address]; IResourceEntry resource = typeof(NWN2ModuleInformation).GetProperty(address.TargetSlot).GetValue(mod.ModuleInfo, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { scripts.Add(new ScriptTriggerTuple(script, triggerFactory.GetTriggerFromAddress(address))); } } // Next, check whether any script is attached to a Narrative Threads blueprint, and // if you find one, add it to the collection and remove it from consideration: List <Nwn2Address> processed = new List <Nwn2Address>(); foreach (Nwn2Address address in areaScripts.Keys) { if (Nwn2ScriptSlot.GetObjectType(address.TargetType) == null) { continue; // ignore area, module etc. } FlipScript script = areaScripts[address]; // First check that if a blueprint which uses this tag as resref exists, it was created by Narrative Threads: if (nt.CreatedByNarrativeThreads(address.TargetType, address.InstanceTag)) { NWN2ObjectType objectType = Nwn2ScriptSlot.GetObjectType(address.TargetType).Value; INWN2Blueprint blueprint = session.GetBlueprint(address.InstanceTag.ToLower(), objectType); if (blueprint != null) { IResourceEntry resource = blueprint.GetType().GetProperty(address.TargetSlot).GetValue(blueprint, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { scripts.Add(new ScriptTriggerTuple(script, triggerFactory.GetTriggerFromAddress(address))); processed.Add(address); } } } } foreach (Nwn2Address p in processed) { areaScripts.Remove(p); // has been added, so don't check for it more than once } // Then, open each area in turn, and see whether a script is attached to it. If it is, add // it to the collection and remove it from consideration: foreach (NWN2GameArea area in mod.Areas.Values) { if (areaScripts.Count == 0) { break; } session.OpenArea(area); processed = new List <Nwn2Address>(); foreach (Nwn2Address address in areaScripts.Keys) { FlipScript script = areaScripts[address]; if (address.TargetType == Nwn2Type.Area) { IResourceEntry resource = typeof(NWN2GameArea).GetProperty(address.TargetSlot).GetValue(area, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { scripts.Add(new ScriptTriggerTuple(script, triggerFactory.GetTriggerFromAddress(address))); processed.Add(address); // don't check whether to add it more than once } } else { NWN2InstanceCollection instances = session.GetObjectsByAddressInArea(address, area.Tag); if (instances != null) { // Check the script is still attached to the target object in the slot it claims to be, // in at least one instance, and if so add it to the set of scripts to be opened: foreach (INWN2Instance instance in instances) { IResourceEntry resource = instance.GetType().GetProperty(address.TargetSlot).GetValue(instance, null) as IResourceEntry; if (resource != null && resource.ResRef.Value == script.Name) { scripts.Add(new ScriptTriggerTuple(script, triggerFactory.GetTriggerFromAddress(address))); processed.Add(address); break; } } } } } foreach (Nwn2Address p in processed) { areaScripts.Remove(p); // has been added, so don't check for it more than once } session.CloseArea(area); } } return(scripts); }