Esempio n. 1
0
    private Vector3 GetAllowedRandomPosition(Transform tf, SpawnOptions options)
    {
        if (options.allow.Count > 0)
        {
            Collider allowed = options.allow[Random.Range(0, options.allow.Count)];

            if (options.avoid.Count == 0)
            {
                tf.position = RandomPointWithinBounds(allowed.bounds);
                return(tf.position);
            }

            int  maxAttempts = 25;
            bool success     = false;

            for (var attempt = 0; attempt < maxAttempts; attempt++)
            {
                int forbiddenCollisions = 0;

                if (success)
                {
                    break;
                }
                tf.position = RandomPointWithinBounds(allowed.bounds);

                Collider[] collisions = Physics.OverlapBox(
                    tf.position,
                    tf.lossyScale,
                    tf.rotation
                    );

                foreach (var forbidden in options.avoid)
                {
                    foreach (var collision in collisions)
                    {
                        if (collision.Equals(forbidden))
                        {
                            forbiddenCollisions++;
                        }
                    }
                }

                if (forbiddenCollisions.Equals(0))
                {
                    success = true;
                    break;
                }
            }

            if (!success)
            {
                tf.gameObject.SetActive(false);
            }
        }


        return(tf.position);
    }
Esempio n. 2
0
    private Transform SetTransform(Transform tf, SpawnOptions options)
    {
        tf.rotation   = tf.rotation.Randomize(options.rotationRange);
        tf.localScale = RandomScale(
            tf.localScale,
            options.minScale,
            options.maxScale,
            options.scaleMethod
            );
        tf.position = GetAllowedRandomPosition(tf, options);

        return(tf);
    }
Esempio n. 3
0
    private void RandomizePoolObject(GameObject obj, SpawnOptions options)
    {
        SetTransform(obj.transform, options);

        // TODO: Move mass setup to initialization method and only run on start-up (or preferably on object added)
        if (!options.isStatic)
        {
            var rb = obj.GetComponent <Rigidbody>();
            if (rb != null)
            {
                rb.mass *= obj.transform.localScale.sqrMagnitude;
            }
        }
    }
Esempio n. 4
0
    private Transform SetTransform(Transform tf, SpawnOptions options, Bounds?bounds = null)
    {
        Quaternion randomRotation = tf.rotation.Randomize(options.rotationRange);
        Vector3    randomScale    = RandomScale(
            tf.localScale,
            options.minScale,
            options.maxScale,
            options.scaleMethod
            );

        tf.rotation   = randomRotation;
        tf.localScale = randomScale;
        tf.position   = GetAllowedRandomPosition(tf, options, bounds);

        return(tf);
    }
Esempio n. 5
0
        public void Create()
        {
            var options = SpawnOptions.Create();

            Assert.That(options.Arguments.Count, Is.Zero);
            Assert.That(options.WorkingDirectory, Is.EqualTo(Environment.CurrentDirectory));

            var env = Environment.GetEnvironmentVariables();

            Assert.That(options.Environment.Length, Is.EqualTo(env.Count));

            foreach (var e in options.Environment)
            {
                Assert.That(env[e.Key], Is.EqualTo(e.Value));
            }

            Assert.That(options.CreateNoWindow, Is.False);
        }
Esempio n. 6
0
        public void Update()
        {
            var psi = new ProcessStartInfo();

            Assert.That(psi.WorkingDirectory, Is.Empty);
            Assert.That(psi.ArgumentList, Is.Empty);

            var options = SpawnOptions.Create().AddArgument("foo", "bar", "baz");

            options.Update(psi);

            Assert.That(psi.WorkingDirectory, Is.EqualTo(options.WorkingDirectory));
            Assert.That(psi.ArgumentList, Is.EqualTo(options.Arguments));

            var env = psi.Environment;

            Assert.That(env.Count, Is.EqualTo(options.Environment.Length));

            foreach (var e in options.Environment)
            {
                Assert.That(env[e.Key], Is.EqualTo(e.Value));
            }
        }
Esempio n. 7
0
        TestSpawn <T>(SpawnOptions options,
                      ICollection <Notification <T> > notifications,
                      Func <string, T>?stdoutSelector,
                      Func <string, T>?stderrSelector,
                      params Action <TestProcess>[] processModifiers)
        {
            var observer =
                Observer.Create((T data) => notifications.Add(Notification.CreateOnNext(data)),
                                e => notifications.Add(Notification.CreateOnError <T>(e)),
                                () => notifications.Add(Notification.CreateOnCompleted <T>()));

            TestProcess?process = null;

            var subscription =
                Spawn("dummy", ProgramArguments.Empty, stdoutSelector,
                      stderrSelector)
                .WithOptions(options.WithProcessFactory(psi =>
            {
                process = new TestProcess(psi)
                {
                    Id             = 123,
                    StandardInput  = System.IO.StreamWriter.Null,
                    StartException = null,
                    BeginErrorReadLineException  = null,
                    BeginOutputReadLineException = null,
                    KillException = null,
                };
                foreach (var modifier in processModifiers)
                {
                    modifier(process);
                }
                return(process);
            }))
                .Subscribe(observer);

            Debug.Assert(process is {});
Esempio n. 8
0
    private Vector3 GetAllowedRandomPosition(Transform tf, SpawnOptions options, Bounds?bounds = null)
    {
        if (options.allow.Count > 0)
        {
            var allowed = options.allow[Random.Range(0, options.allow.Count)];

            if (options.avoid.Count == 0)
            {
                tf.position = RandomPointWithinBounds(allowed.bounds);
                return(tf.position);
            }

            var             maxAttempts        = 25;
            var             success            = false;
            Collider[]      colliders          = { };
            List <Collider> forbiddenColliders = new List <Collider>();

            for (var attempt = 0; attempt < maxAttempts; attempt++)
            {
                forbiddenColliders = new List <Collider>();
                var forbiddenCollisions = 0;

                if (success)
                {
                    break;
                }
                tf.position = RandomPointWithinBounds(allowed.bounds);

                if (bounds != null)
                {
                    colliders = Physics.OverlapBox(
                        tf.position,
                        ((Bounds)bounds).extents / 2
                        );
                }
                else
                {
                    colliders = Physics.OverlapBox(
                        tf.position,
                        tf.lossyScale / 2f,
                        tf.rotation
                        );
                }


                foreach (var forbidden in options.avoid)
                {
                    foreach (var collider in colliders)
                    {
                        if (collider.Equals(forbidden))
                        {
                            forbiddenCollisions++;
                            forbiddenColliders.Add(collider);
                        }
                    }
                }

                if (forbiddenCollisions.Equals(0))
                {
                    success = true;
                    break;
                }
            }

            if (!success)
            {
                var errorMessage = "Couldn't spawn object"
                                   + "\nPosition: " + tf.position.ToString()
                                   + "\nLossy Scale: " + tf.lossyScale.ToString()
                                   + "\nLossy Scale: " + tf.rotation.ToString()
                                   + "\nForbidden collisions: ";

                foreach (var collider in forbiddenColliders)
                {
                    errorMessage +=
                        "\n\t" + collider.name
                        + "\nCenter: " + collider.bounds.center.ToString()
                        + "\nExtents: " + collider.bounds.extents.ToString()
                    ;
                }

                Debug.LogError(errorMessage, tf.gameObject);
                tf.gameObject.SetActive(false);
            }
            ;
        }

        return(tf.position);
    }
Esempio n. 9
0
        public static void SpawnSosigWithTemplate(SosigEnemyTemplate template, SpawnOptions spawnOptions, Vector3 position,
                                                  Vector3 forward)
        {
            var sosigPrefab    = template.SosigPrefabs[Random.Range(0, template.SosigPrefabs.Count)];
            var configTemplate = template.ConfigTemplates[Random.Range(0, template.ConfigTemplates.Count)];
            var outfitConfig   = template.OutfitConfig[Random.Range(0, template.OutfitConfig.Count)];
            var sosig          = SpawnSosigAndConfigureSosig(sosigPrefab.GetGameObject(), position,
                                                             Quaternion.LookRotation(forward, Vector3.up), configTemplate, outfitConfig);

            sosig.InitHands();
            sosig.Inventory.Init();
            if (template.WeaponOptions.Count > 0)
            {
                var weapon = SpawnWeapon(template.WeaponOptions);
                weapon.SetAutoDestroy(true);
                sosig.ForceEquip(weapon);
                if (weapon.Type == SosigWeapon.SosigWeaponType.Gun && spawnOptions.SpawnWithFullAmmo)
                {
                    sosig.Inventory.FillAmmoWithType(weapon.AmmoType);
                }
            }

            var spawnWithSecondaryWeapon = spawnOptions.EquipmentMode == 0 || spawnOptions.EquipmentMode == 2 ||
                                           spawnOptions.EquipmentMode == 3 &&
                                           Random.Range(0.0f, 1f) >= template.SecondaryChance;

            if (template.WeaponOptions_Secondary.Count > 0 && spawnWithSecondaryWeapon)
            {
                var weapon = SpawnWeapon(template.WeaponOptions_Secondary);
                weapon.SetAutoDestroy(true);
                sosig.ForceEquip(weapon);
                if (weapon.Type == SosigWeapon.SosigWeaponType.Gun && spawnOptions.SpawnWithFullAmmo)
                {
                    sosig.Inventory.FillAmmoWithType(weapon.AmmoType);
                }
            }

            var spawnWithTertiaryWeapon = spawnOptions.EquipmentMode == 0 ||
                                          spawnOptions.EquipmentMode == 3 &&
                                          Random.Range(0.0f, 1f) >= template.TertiaryChance;

            if (template.WeaponOptions_Tertiary.Count > 0 && spawnWithTertiaryWeapon)
            {
                var w2 = SpawnWeapon(template.WeaponOptions_Tertiary);
                w2.SetAutoDestroy(true);
                sosig.ForceEquip(w2);
                if (w2.Type == SosigWeapon.SosigWeaponType.Gun && spawnOptions.SpawnWithFullAmmo)
                {
                    sosig.Inventory.FillAmmoWithType(w2.AmmoType);
                }
            }

            var sosigIFF = spawnOptions.IFF;

            if (sosigIFF >= 5)
            {
                sosigIFF = Random.Range(6, 10000);
            }
            sosig.E.IFFCode    = sosigIFF;
            sosig.CurrentOrder = Sosig.SosigOrder.Disabled;
            switch (spawnOptions.SpawnState)
            {
            case 0:
                sosig.FallbackOrder = Sosig.SosigOrder.Disabled;
                break;

            case 1:
                sosig.FallbackOrder = Sosig.SosigOrder.GuardPoint;
                break;

            case 2:
                sosig.FallbackOrder = Sosig.SosigOrder.Wander;
                break;

            case 3:
                sosig.FallbackOrder = Sosig.SosigOrder.Assault;
                break;
            }

            var targetPos = spawnOptions.SosigTargetPosition;
            var targetRot = spawnOptions.SosigTargetRotation;

            sosig.UpdateGuardPoint(targetPos);
            sosig.SetDominantGuardDirection(targetRot);
            sosig.UpdateAssaultPoint(targetPos);
            if (!spawnOptions.SpawnActivated)
            {
                return;
            }
            sosig.SetCurrentOrder(sosig.FallbackOrder);
        }