public void setFocus(NWN2WaypointTemplate wp)
        {
            if (wp == null)
            {
                Text = "ACR Waypoint Editor";
                propBasic.SelectedObject = null;
                ACRSpawnWP.SetSelection(null);
                propBasic.Refresh();
                propSpawn.Refresh();
            }

            // Update main property sheet.
            if (wp.GetType() == typeof(NWN2WaypointBlueprint))
            {
                Text = "ACR Waypoint Editor: " + ((NWN2WaypointBlueprint)wp).ResourceName.Value;
                propBasic.SelectedObject = (NWN2WaypointBlueprint)wp;
            }
            else if (wp.GetType() == typeof(NWN2WaypointInstance))
            {
                Text = "ACR Creature Editor: " + ((NWN2WaypointInstance)wp).Template.ResRef.Value + " (instance)";
                propBasic.SelectedObject = (NWN2WaypointInstance)wp;
            }
            else
            {
                propBasic.SelectedObject = wp;
            }

            // Update ACR property sheet.
            ACRSpawnWP.SetSelection(wp);
            ACRQuestWP.SetSelection(wp);

            propBasic.Refresh();
            propSpawn.Refresh();
            propQuest.Refresh();
        }
 public void SetSelection(NWN2WaypointTemplate wp)
 {
     waypoint = wp;
 }
 /// <summary>
 /// Determines if a given variable on an object matches another.
 /// </summary>
 private bool GetAreVariablesEqual(NWN2WaypointTemplate waypoint, string variable1, string variable2)
 {
     if (waypoint == null) return true;
     if (waypoint.Variables.GetVariable(variable1) == null && waypoint.Variables.GetVariable(variable2) == null) return true;
     if (waypoint.Variables.GetVariable(variable1) == null || waypoint.Variables.GetVariable(variable2) == null) return false;
     if (waypoint.Variables.GetVariable(variable1).VariableType != waypoint.Variables.GetVariable(variable2).VariableType) return false;
     switch (waypoint.Variables.GetVariable(variable1).VariableType)
     {
         case NWN2ScriptVariableType.Float:
             return (waypoint.Variables.GetVariable(variable1).ValueFloat == waypoint.Variables.GetVariable(variable2).ValueFloat);
         case NWN2ScriptVariableType.Int:
             return (waypoint.Variables.GetVariable(variable1).ValueInt == waypoint.Variables.GetVariable(variable2).ValueInt);
         case NWN2ScriptVariableType.Location:
             return (waypoint.Variables.GetVariable(variable1).ValueLocation == waypoint.Variables.GetVariable(variable2).ValueLocation);
         case NWN2ScriptVariableType.String:
             return (waypoint.Variables.GetVariable(variable1).ValueString == waypoint.Variables.GetVariable(variable2).ValueString);
     }
     return false;
 }
 private void ValidateVariableBounds(string reference, NWN2WaypointTemplate waypoint, string variable, float min, float max)
 {
     if (waypoint == null) return;
     if (waypoint.Variables.GetVariable(variable) == null) return;
     if (waypoint.Variables.GetVariable(variable).VariableType != NWN2ScriptVariableType.Float) return;
     if (waypoint.Variables.GetVariable(variable).ValueFloat < min || waypoint.Variables.GetVariable(variable).ValueFloat > max)
     {
         log.WriteLine("ERROR: Waypoint blueprint \"{0}\" has variable \"{1}\" of value {2} outside of bounds [{3},{4}].", reference, variable, waypoint.Variables.GetVariable(variable).ValueFloat, min, max);
     }
 }
 /// <summary>
 /// Verifies that a given variable on an object is of the correct type.
 /// </summary>
 /// <param name="enforce">If true, this function will try to fix the variable's type.</param>
 private void ValidateVariableType(string reference, NWN2WaypointTemplate waypoint, string variable, NWN2ScriptVariableType type, bool enforce = true)
 {
     if (waypoint == null) return;
     if (waypoint.Variables.GetVariable(variable) == null) return;
     if (waypoint.Variables.GetVariable(variable).VariableType != type)
     {
         if (enforce)
         {
             waypoint.Variables.GetVariable(variable).VariableType = type;
             log.WriteLine("FIXED: Waypoint blueprint \"{0}\" has variable \"{1}\" not of type {2}.", reference, variable, type.ToString());
         }
         else
         {
             log.WriteLine("ERROR: Waypoint blueprint \"{0}\" has variable \"{1}\" not of type {2}.", reference, variable, type.ToString());
         }
     }
 }
        private void Validate(NWN2WaypointTemplate waypoint, string reference)
        {
            try
            {
                // Check for common errors in the ACR_Spawn system.
                if (waypoint.Variables.GetVariable("ACR_SPAWN_TYPE") != null)
                {
                    // Check variable types.
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_TYPE", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_RESNAMES_MIN", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_RESNAMES_MAX", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_RESPAWN_COUNT", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_RESPAWN_DELAY_MIN", NWN2ScriptVariableType.Float);
                    ValidateVariableType(reference, waypoint, "ACR_RESPAWN_DELAY_MAX", NWN2ScriptVariableType.Float);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_CHANCE", NWN2ScriptVariableType.Float);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_RANDOM_RADIUS", NWN2ScriptVariableType.Float);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_RANDOM_RANGE", NWN2ScriptVariableType.Float);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_VFX", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_VFX", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_SFX", NWN2ScriptVariableType.String);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_SFX", NWN2ScriptVariableType.String);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_ANIMATION", NWN2ScriptVariableType.String);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_HOUR", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_OUT_HOUR", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_DAY", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_OUT_DAY", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_MONTH", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_OUT_MONTH", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_PC_SIGHT", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_ONLY_WHEN_NO_PC_IN_AREA", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_WITH_ANIMATION", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IS_DISABLED", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_RANDOM_FACING", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_STEALTH", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_IN_DETECT", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_SPAWN_BUFFED", NWN2ScriptVariableType.Int);
                    ValidateVariableType(reference, waypoint, "ACR_COLOR_NAME", NWN2ScriptVariableType.String);

                    // Check variable bounds.
                    ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_TYPE", 0, 8);
                    ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_RESNAMES_MIN", 0, 31);
                    ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_RESNAMES_MAX", 0, 31);
                    ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_CHANCE", 0.0f, 100.0f);
                    if (!GetAreVariablesEqual(waypoint, "ACR_SPAWN_IN_HOUR", "ACR_SPAWN_OUT_HOUR"))
                    {
                        ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_IN_HOUR", 0, 23);
                        ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_OUT_HOUR", 0, 23);
                    }
                    if (!GetAreVariablesEqual(waypoint, "ACR_SPAWN_IN_DAY", "ACR_SPAWN_OUT_DAY"))
                    {
                        ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_IN_DAY", 0, 31);
                        ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_OUT_DAY", 0, 31);
                    }
                    if (!GetAreVariablesEqual(waypoint, "ACR_SPAWN_IN_MONTH", "ACR_SPAWN_OUT_MONTH"))
                    {
                        ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_IN_MONTH", 0, 12);
                        ValidateVariableBounds(reference, waypoint, "ACR_SPAWN_OUT_MONTH", 0, 12);
                    }
                }
            }
            catch (Exception exception)
            {
                log.WriteLine(String.Format("EXCEPTION: Error while handling \"{0}\":\n{1}", reference, exception.Message));
            }
        }