private static void ParseTrapWaypoint(GFFFile trapGff, string resRef)
        {
            if (ALFA.Shared.Modules.InfoStore.ModuleTraps.Keys.Contains(resRef))
            {
                // We've already got one of those. We'll crash if we try to
                // add another.
                return;
            }
            ALFA.Shared.TrapResource addingTrap = new ALFA.Shared.TrapResource()
                {
                    AttackBonus = -1,
                    ChallengeRating = -1.0f,
                    Classification = "",
                    DamageType = -1,
                    DetectDC = -1,
                    DiceNumber = -1,
                    DiceType = -1,
                    DisarmDC = -1,
                    DisplayName = "",
                    EffectArea = -1,
                    EffectSize = -1.0f,
                    MinimumToTrigger = 1,
                    NumberOfShots = 1,
                    ResRef = resRef,
                    SaveDC = -1,
                    SpellId = -1,
                    SpellTrap = false,
                    Tag = "",
                    TargetAlignment = CLRScriptBase.ALIGNMENT_ALL,
                    TargetRace = CLRScriptBase.RACIAL_TYPE_ALL,
                    TrapOrigin = CLRScriptBase.OBJECT_INVALID,
                };


            try
            {
                addingTrap.DisplayName = trapGff.TopLevelStruct["LocalizedName"].Value.ToString().Split('"')[1];
            }
            catch
            {
                addingTrap.DisplayName = trapGff.TopLevelStruct["LocalizedName"].Value.ToString();
            }
            if (addingTrap.DisplayName == "")
            {
                addingTrap.DisplayName = GetTlkEntry(trapGff.TopLevelStruct["LocalizedName"].ValueCExoLocString.StringRef);
            }

            addingTrap.Classification = ParseClassification(trapGff.TopLevelStruct["Classification"].Value.ToString());
            addingTrap.Tag = trapGff.TopLevelStruct["Tag"].Value.ToString();

            GFFStructCollection variables = trapGff.TopLevelStruct["VarTable"].ValueList.StructList;
            // Waypoints can be a lot of things. Let's see if we can figure anything out about this one.
            foreach (GFFStruct var in variables)
            {
                string varName = var["Name"].Value.ToString();
                if (varName == "ACR_TRAP_TRIGGER_AREA")
                {
                    addingTrap.TriggerArea = var["Value"].ValueInt;
                    continue;
                }
                if (varName == "ACR_TRAP_ATTACK_BONUS")
                {
                    addingTrap.AttackBonus = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_DAMAGE_TYPE")
                {
                    addingTrap.DamageType = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_DETECT_DC")
                {
                    addingTrap.DetectDC = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_DICE_NUMBER")
                {
                    addingTrap.DiceNumber = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_DICE_TYPE")
                {
                    addingTrap.DiceType = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_DISARM_DC")
                {
                    addingTrap.DisarmDC = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_EFFECT_AREA")
                {
                    addingTrap.EffectArea = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_EFFECT_SIZE")
                {
                    addingTrap.EffectSize = var["Value"].ValueFloat;
                    continue;
                }
                else if (varName == "ACR_TRAP_MINIMUM_TO_TRIGGER")
                {
                    addingTrap.MinimumToTrigger = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_NUMBER_OF_SHOTS")
                {
                    addingTrap.NumberOfShots = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_SAVE_DC")
                {
                    addingTrap.SaveDC = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_SPELL_ID")
                {
                    addingTrap.SpellId = var["Value"].ValueInt;
                    if (addingTrap.SpellId >= 0)
                    {
                        addingTrap.SpellTrap = true;
                    }
                    else
                    {
                        addingTrap.SpellTrap = false;
                    }
                    continue;
                }
                else if (varName == "ACR_TRAP_TARGET_ALIGNMENT")
                {
                    addingTrap.TargetAlignment = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_TARGET_RACE")
                {
                    addingTrap.TargetRace = var["Value"].ValueInt;
                    continue;
                }
                else if (varName == "ACR_TRAP_DESCRIPTION")
                {
                    addingTrap.Description = var["Value"].Value.ToString();
                    continue;
                }
            }

            addingTrap.CalculateCR();

            ALFA.Shared.Modules.InfoStore.ModuleTraps.Add(addingTrap.ResRef, addingTrap);
        }
Example #2
0
        public Int32 ScriptMain([In] object[] ScriptParameters, [In] Int32 DefaultReturnCode)
        {
            int Value = (int)ScriptParameters[0]; // ScriptParameterTypes[0] is typeof(int)

            TrapEvent currentEvent = (TrapEvent)ScriptParameters[0];

            switch (currentEvent)
            {
            case TrapEvent.CreateGeneric:
            {
                NWLocation loc    = Location((uint)ScriptParameters[4], Vector((float)ScriptParameters[1], (float)ScriptParameters[2], (float)ScriptParameters[3]), 0.0f);
                string     resRef = (string)ScriptParameters[20];
                if (resRef == "")
                {
                    TriggerArea triggerArea      = (TriggerArea)ScriptParameters[5];
                    int         effectArea       = (int)ScriptParameters[6];
                    float       effectSize       = (float)ScriptParameters[7];
                    int         damageType       = (int)ScriptParameters[8];
                    int         diceNumber       = (int)ScriptParameters[9];
                    int         diceType         = (int)ScriptParameters[10];
                    int         saveDC           = (int)ScriptParameters[11];
                    int         attackBonus      = (int)ScriptParameters[12];
                    int         numberOfShots    = (int)ScriptParameters[13];
                    uint        trapOrigin       = (uint)ScriptParameters[14];
                    int         targetAlignment  = (int)ScriptParameters[15];
                    int         targetRace       = (int)ScriptParameters[16];
                    int         minimumToTrigger = (int)ScriptParameters[17];
                    int         detectDC         = (int)ScriptParameters[18];
                    int         disarmDC         = (int)ScriptParameters[19];
                    CreateTraps.GenericDamage(this, loc, triggerArea, effectArea, effectSize, damageType, diceNumber, diceType, saveDC, attackBonus, numberOfShots, trapOrigin, targetAlignment, targetRace, minimumToTrigger, detectDC, disarmDC, "");
                    break;
                }
                else
                {
                    ALFA.Shared.TrapResource trapToSpawn = ALFA.Shared.Modules.InfoStore.ModuleTraps[(string)ScriptParameters[20]];
                    if (trapToSpawn.SpellTrap)
                    {
                        CreateTraps.Spell(this, loc, (TriggerArea)trapToSpawn.TriggerArea, trapToSpawn.SpellId, trapToSpawn.NumberOfShots, trapToSpawn.TrapOrigin, trapToSpawn.TargetAlignment, trapToSpawn.TargetRace, trapToSpawn.MinimumToTrigger, trapToSpawn.DetectDC, trapToSpawn.DisarmDC, trapToSpawn.Description);
                    }
                    else
                    {
                        CreateTraps.GenericDamage(this, loc, (TriggerArea)trapToSpawn.TriggerArea, trapToSpawn.EffectArea, trapToSpawn.EffectSize, trapToSpawn.DamageType, trapToSpawn.DiceNumber, trapToSpawn.DiceType, trapToSpawn.SaveDC, trapToSpawn.AttackBonus, trapToSpawn.NumberOfShots, trapToSpawn.TrapOrigin, trapToSpawn.TargetAlignment, trapToSpawn.TargetRace, trapToSpawn.MinimumToTrigger, trapToSpawn.DetectDC, trapToSpawn.DisarmDC, trapToSpawn.Description);
                    }
                }
                break;
            }

            case TrapEvent.CreateSpell:
            {
                NWLocation  loc              = Location((uint)ScriptParameters[4], Vector((float)ScriptParameters[1], (float)ScriptParameters[2], (float)ScriptParameters[3]), 0.0f);
                TriggerArea triggerArea      = (TriggerArea)ScriptParameters[5];
                int         spellId          = (int)ScriptParameters[8];
                int         numberOfShots    = (int)ScriptParameters[13];
                uint        trapOrigin       = (uint)ScriptParameters[14];
                int         targetAlignment  = (int)ScriptParameters[15];
                int         targetRace       = (int)ScriptParameters[16];
                int         minimumToTrigger = (int)ScriptParameters[17];
                int         detectDC         = (int)ScriptParameters[18];
                int         disarmDC         = (int)ScriptParameters[19];
                CreateTraps.Spell(this, loc, triggerArea, spellId, numberOfShots, trapOrigin, targetAlignment, targetRace, minimumToTrigger, detectDC, disarmDC, "");
                break;
            }

            case TrapEvent.DetectEnter:
            {
                string trapTag = GetTag(OBJECT_SELF);
                if (ALFA.Shared.Modules.InfoStore.SpawnedTrapDetect.Keys.Contains(trapTag))
                {
                    TrapDetect.Enter(this, ALFA.Shared.Modules.InfoStore.SpawnedTrapDetect[trapTag]);
                }
                else
                {
                    uint enteringObject = GetEnteringObject();
                    SendMessageToPC(enteringObject, String.Format("Error: This appears to be a trap detection trigger, but I can not find any trap named {0}", trapTag));
                }
                break;
            }

            case TrapEvent.DetectExit:
            {
                string trapTag        = GetTag(OBJECT_SELF);
                uint   enteringObject = GetEnteringObject();
                if (ALFA.Shared.Modules.InfoStore.SpawnedTrapDetect.Keys.Contains(trapTag))
                {
                    TrapDetect.Exit(this, ALFA.Shared.Modules.InfoStore.SpawnedTrapDetect[trapTag]);
                }
                break;
            }

            case TrapEvent.TriggerEnter:
            {
                string trapTag = GetTag(OBJECT_SELF);
                if (ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers.Keys.Contains(trapTag))
                {
                    TrapTrigger.Enter(this, ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers[trapTag]);
                }
                else
                {
                    uint enteringObject = GetEnteringObject();
                    SendMessageToPC(enteringObject, String.Format("Error: This appears to be a trap firing trigger, but I can not find any trap named {0}", trapTag));
                }
                break;
            }

            case TrapEvent.TriggerExit:
            {
                string trapTag        = GetTag(OBJECT_SELF);
                uint   enteringObject = GetEnteringObject();
                if (ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers.Keys.Contains(trapTag))
                {
                    TrapTrigger.Exit(this, ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers[trapTag]);
                }
                break;
            }

            case TrapEvent.TrapDisarm:
            {
                string trapTag = GetTag(OBJECT_SELF);
                trapTag = trapTag.Substring(0, trapTag.Length - 1);
                uint disabler = GetLastUsedBy();
                if (ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers.Keys.Contains(trapTag))
                {
                    TrapDisable.Disable(this, ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers[trapTag], disabler);
                }
                break;
            }

            case TrapEvent.TrapDespawn:
            {
                string trapTag = GetTag(OBJECT_SELF);
                if (ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers.Keys.Contains(trapTag))
                {
                    TrapDisable.RemoveTrap(this, ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers[trapTag]);
                }
                if (ALFA.Shared.Modules.InfoStore.SpawnedTrapDetect.Keys.Contains(trapTag))
                {
                    TrapDisable.RemoveTrap(this, ALFA.Shared.Modules.InfoStore.SpawnedTrapDetect[trapTag]);
                }
                break;
            }
            }

            return(0);
        }