示例#1
0
        private static uint GetNearestTrapEmitter(CLRScriptBase script, NWLocation loc)
        {
            float   nearestDist   = -1.0f;
            uint    nearestObject = CLRScriptBase.OBJECT_INVALID;
            Vector3 trapPos       = script.GetPositionFromLocation(loc);

            foreach (uint obj in script.GetObjectsInArea(script.GetAreaFromLocation(loc)))
            {
                if (script.GetObjectType(obj) == OBJECT_TYPE_PLACEABLE &&
                    (script.GetTag(obj) == "TRAP_EMITTER" ||
                     script.GetTag(obj) == "TRAP_ORIGIN"))
                {
                    Vector3 emitterPos = script.GetPosition(obj);
                    float   newDist    = (trapPos.x - emitterPos.x) * (trapPos.x - emitterPos.x) + (trapPos.y - emitterPos.y) * (trapPos.y - emitterPos.y);
                    if (nearestDist < 0 || nearestDist > newDist)
                    {
                        nearestDist   = newDist;
                        nearestObject = obj;
                    }
                }
            }
            if (script.GetIsObjectValid(nearestObject) == CLRScriptBase.FALSE || nearestDist > 400.0f) // 20 meters; nearestDist is squared to be cheaper
            {
                nearestObject = CLRScriptBase.OBJECT_INVALID;
            }
            return(nearestObject);
        }
示例#2
0
        public static void GenericDamage(CLRScriptBase script, NWLocation location, TriggerArea triggerArea, int effectArea, float effectSize, int damageType, int diceNumber, int diceType, int saveDC, int attackBonus, int numberOfShots, uint trapOrigin, int targetAlignment, int targetRace, int minimumToTrigger, int detectDC, int disarmDC, string description)
        {
            string tag       = uniqueTrapTag();
            string detectTag = tag + detectSuffix();

            script.ApplyEffectAtLocation(DURATION_TYPE_PERMANENT,
                                         script.SupernaturalEffect(script.EffectAreaOfEffect(triggerAreaToAreaOfEffect(triggerArea), "acr_traponenter", "****", "acr_traponexit", tag)),
                                         location,
                                         0.0f);

            script.ApplyEffectAtLocation(DURATION_TYPE_PERMANENT,
                                         script.SupernaturalEffect(script.EffectAreaOfEffect(triggerAreaToDetectArea(triggerArea), "acr_trapdtctenter", "****", "acr_trapdtctexit", detectTag)),
                                         location,
                                         0.0f);

            ALFA.Shared.ActiveTrap createdTrap = new ALFA.Shared.ActiveTrap();
            createdTrap.AreaName         = script.GetName(script.GetAreaFromLocation(location));
            createdTrap.AttackBonus      = attackBonus;
            createdTrap.ChallengeRating  = 0.0f;
            createdTrap.DamageType       = damageType;
            createdTrap.DetectTag        = detectTag;
            createdTrap.DiceNumber       = diceNumber;
            createdTrap.DiceType         = diceType;
            createdTrap.EffectArea       = effectArea;
            createdTrap.EffectSize       = effectSize;
            createdTrap.Location         = location;
            createdTrap.MinimumToTrigger = minimumToTrigger;
            createdTrap.NumberOfShots    = numberOfShots;
            createdTrap.SaveDC           = saveDC;
            createdTrap.SpellTrap        = false;
            createdTrap.Tag             = tag;
            createdTrap.TargetAlignment = targetAlignment;
            createdTrap.TargetRace      = targetRace;
            createdTrap.TrapTriggerVFX  = triggerAreaToTrapVFX(triggerArea);
            createdTrap.DetectDC        = detectDC;
            createdTrap.DisarmDC        = disarmDC;
            createdTrap.Detected        = false;
            createdTrap.Disabler        = 0;
            createdTrap.Helpers         = new List <uint>();
            createdTrap.TotalHelp       = 0;
            createdTrap.IsFiring        = false;
            createdTrap.Description     = description;
            createdTrap.ConfigureDisplayName();
            createdTrap.CalculateCR();

            createdTrap.TrapOrigin = GetNearestTrapEmitter(script, location);

            ALFA.Shared.Modules.InfoStore.SpawnedTrapDetect.Add(detectTag, createdTrap);
            ALFA.Shared.Modules.InfoStore.SpawnedTrapTriggers.Add(tag, createdTrap);

            script.SetLocalString(script.GetModule(), "ACR_TRAPS_LAST_TAG", tag);
        }