示例#1
0
    public static GreebleDefinition ProceduralGreebleType(GreebleDefinition[] greebleDefinitions, float timeSinceDespawn = 0f)
    {
        if (greebleDefinitions == null)
        {
            return(null);
        }
        int num = 0;

        for (int i = 0; i < greebleDefinitions.Length; i++)
        {
            GreebleDefinition greebleDefinition = greebleDefinitions[i];
            num += greebleDefinition.Chance;
        }
        int num2 = GreebleUtility_Networked.ProceduralValue(0, num);

        num = 0;
        for (int j = 0; j < greebleDefinitions.Length; j++)
        {
            GreebleDefinition greebleDefinition2 = greebleDefinitions[j];
            num += greebleDefinition2.Chance;
            if (num2 < num)
            {
                return(greebleDefinition2);
            }
        }
        return(null);
    }
示例#2
0
    private void InstantiateGreeble(int localX, int localY, int localZ)
    {
        int seed   = UnityEngine.Random.Range(0, 6060842);
        int worldX = localX + this.worldOffsetX;
        int worldY = localY + this.worldOffsetY;
        int worldZ = localZ + this.worldOffsetZ;

        this.ProceduralSeed(worldX, worldY, worldZ);
        GreebleDefinition greebleDefinition = GreebleUtility.ProceduralGreebleType(this.GreebleDefinitions, false, 0f);

        if (greebleDefinition == null)
        {
            UnityEngine.Random.seed = seed;
            return;
        }
        Vector3 world = this.GetWorld(worldX, worldY, worldZ);
        Vector3 b     = this.ProceduralPositionOffset();

        b.y = 0f;
        Quaternion rotation = (!greebleDefinition.RandomizeRotation) ? Quaternion.identity : GreebleUtility.ProceduralRotation();

        this.greebles[localX, localY, localZ].Instance   = GreebleUtility.Spawn(greebleDefinition, new Ray(world + b + new Vector3(0f, this.Dimensions.y * 0.5f, 0f), Vector3.down), this.Dimensions.y, rotation, 0.5f);
        this.greebles[localX, localY, localZ].IsSpawning = false;
        UnityEngine.Random.seed = seed;
    }
示例#3
0
    private void Start()
    {
        switch (this.RandomSelection)
        {
        case GreebleSelection.RandomizeChances:
        {
            GreebleDefinition[] greebleDefinitions = this.GreebleDefinitions;
            for (int i = 0; i < greebleDefinitions.Length; i++)
            {
                GreebleDefinition greebleDefinition = greebleDefinitions[i];
                greebleDefinition.Chance = GreebleUtility.ProceduralValue(1, 100);
            }
            break;
        }

        case GreebleSelection.SelectOne:
        {
            int num = GreebleUtility.ProceduralValue(0, this.GreebleDefinitions.Length);
            for (int j = 0; j < this.GreebleDefinitions.Length; j++)
            {
                this.GreebleDefinitions[j].Chance = ((j != num) ? 0 : 1);
            }
            break;
        }
        }
    }
示例#4
0
    public static GreebleDefinition ProceduralGreebleType(GreebleDefinition[] greebleDefinitions, float ageInMinutes = 0f)
    {
        if (greebleDefinitions == null)
        {
            return(null);
        }
        int num = 0;

        for (int i = 0; i < greebleDefinitions.Length; i++)
        {
            GreebleDefinition greebleDefinition = greebleDefinitions[i];
            if (greebleDefinition.Prefab && greebleDefinition.IsAgeAppropriate(ageInMinutes))
            {
                num += greebleDefinition.Chance;
            }
        }
        int num2 = GreebleUtility.ProceduralValue(0, num);

        num = 0;
        for (int j = 0; j < greebleDefinitions.Length; j++)
        {
            GreebleDefinition greebleDefinition2 = greebleDefinitions[j];
            if (greebleDefinition2.Prefab && greebleDefinition2.IsAgeAppropriate(ageInMinutes))
            {
                num += greebleDefinition2.Chance;
                if (num2 < num)
                {
                    return(greebleDefinition2);
                }
            }
        }
        return(null);
    }
示例#5
0
    public static GameObject Spawn(GreebleDefinition greebleDefinition, Ray ray, float distance, Quaternion rotation, float maxSlope = 0.5f)
    {
        if (distance <= 0f)
        {
            return(null);
        }
        Vector3    vector = ray.origin;
        RaycastHit raycastHit;

        if (!Physics.Raycast(ray, out raycastHit, distance, greebleDefinition.SurfaceMask | greebleDefinition.KillMask))
        {
            return(null);
        }
        if ((greebleDefinition.KillMask.value & 1 << raycastHit.collider.gameObject.layer) > 0)
        {
            return(null);
        }
        if (Vector3.Dot(ray.direction, raycastHit.normal) > -maxSlope)
        {
            return(null);
        }
        bool flag = greebleDefinition.TerrainTextureMask != null && greebleDefinition.TerrainTextureMask.Length > 0;

        if (flag)
        {
            Terrain component = raycastHit.collider.GetComponent <Terrain>();
            if (component)
            {
                Debug.Log("We have terrain");
                Vector3     position           = component.GetPosition();
                TerrainData terrainData        = component.terrainData;
                int         alphamapResolution = terrainData.alphamapResolution;
                int         num   = (int)((raycastHit.point.x - position.x) / terrainData.size.x * (float)alphamapResolution);
                int         num2  = (int)((raycastHit.point.z - position.z) / terrainData.size.z * (float)alphamapResolution);
                bool        flag2 = false;
                if (num >= 0 && num2 >= 0 && num < alphamapResolution && num2 < alphamapResolution)
                {
                    float[,,] alphamaps = component.terrainData.GetAlphamaps(num, num2, 1, 1);
                    float num3 = 0f;
                    int   num4 = -1;
                    for (int i = terrainData.alphamapLayers - 1; i >= 0; i--)
                    {
                        if (alphamaps[0, 0, i] > num3)
                        {
                            num3 = alphamaps[0, 0, i];
                            num4 = i;
                        }
                    }
                    if (num4 >= 0)
                    {
                        int[] terrainTextureMask = greebleDefinition.TerrainTextureMask;
                        for (int j = 0; j < terrainTextureMask.Length; j++)
                        {
                            int num5 = terrainTextureMask[j];
                            if (num5 == num4)
                            {
                                flag2 = true;
                                break;
                            }
                        }
                    }
                }
                if (!flag2)
                {
                    return(null);
                }
            }
        }
        vector = raycastHit.point;
        if (greebleDefinition.MatchSurfaceNormal)
        {
            Vector3    lhs        = Vector3.Cross(Vector3.forward, raycastHit.normal);
            Vector3    forward    = Vector3.Cross(lhs, raycastHit.normal);
            Quaternion quaternion = Quaternion.LookRotation(forward, raycastHit.normal);
            if (greebleDefinition.RandomizeRotation)
            {
                rotation = quaternion * rotation;
            }
            else
            {
                rotation = quaternion;
            }
        }
        vector   += rotation * greebleDefinition.Prefab.transform.position;
        rotation *= greebleDefinition.Prefab.transform.rotation;
        return(GreeblePlugin.Instantiate(greebleDefinition.Prefab, vector, rotation));
    }
示例#6
0
    private void SpawnIndex(int index)
    {
        if (this.InstanceData[index].Destroyed)
        {
            return;
        }
        UnityEngine.Random.seed = this.GetRandomSeed() + index;
        GreebleDefinition greebleDefinition = GreebleUtility.ProceduralGreebleType(this.GreebleDefinitions, (Time.timeSinceLevelLoad - this.InstanceData[index].CreationTime) / 60f);

        if (greebleDefinition == null)
        {
            UnityEngine.Random.seed = this.GetRandomSeed();
            return;
        }
        Vector3      vector   = Vector3.zero;
        Vector3      vector2  = Vector3.down;
        float        distance = this.Radius;
        GreebleShape shape    = this.Shape;

        if (shape != GreebleShape.Sphere)
        {
            if (shape == GreebleShape.Box)
            {
                Vector3 vector3 = this.Size * 0.5f;
                Vector3 b       = new Vector3(GreebleUtility.ProceduralValue(-vector3.x, vector3.x), GreebleUtility.ProceduralValue(-vector3.y, vector3.y), GreebleUtility.ProceduralValue(-vector3.z, vector3.z));
                int     num     = 0;
                switch (this.Direction)
                {
                case GreebleRayDirection.Floor:
                    num = 4;
                    break;

                case GreebleRayDirection.Ceiling:
                    num = 5;
                    break;

                case GreebleRayDirection.Walls:
                    num = GreebleUtility.ProceduralValue(0, 4);
                    break;

                case GreebleRayDirection.AllDirections:
                    num = GreebleUtility.ProceduralValue(0, 6);
                    break;
                }
                switch (num)
                {
                case 0:
                    vector2  = Vector3.left;
                    b.x      = vector3.x;
                    distance = this.Size.x;
                    break;

                case 1:
                    vector2  = Vector3.right;
                    b.x      = -vector3.x;
                    distance = this.Size.x;
                    break;

                case 2:
                    vector2  = Vector3.back;
                    b.z      = vector3.z;
                    distance = this.Size.z;
                    break;

                case 3:
                    vector2  = Vector3.forward;
                    b.z      = -vector3.z;
                    distance = this.Size.z;
                    break;

                case 4:
                    vector2  = Vector3.down;
                    b.y      = vector3.y;
                    distance = this.Size.y;
                    break;

                case 5:
                    vector2  = Vector3.up;
                    b.y      = -vector3.y;
                    distance = this.Size.y;
                    break;
                }
                vector += b;
            }
        }
        else
        {
            distance = this.Radius;
            Vector3 zero = Vector3.zero;
            do
            {
                zero = new Vector3(GreebleUtility.ProceduralValue(-this.Radius, this.Radius), GreebleUtility.ProceduralValue(-this.Radius, this.Radius), GreebleUtility.ProceduralValue(-this.Radius, this.Radius));
            }while (zero.magnitude > this.Radius);
            switch (this.Direction)
            {
            case GreebleRayDirection.Floor:
                vector += new Vector3(zero.x, 0f, zero.y);
                vector2 = Vector3.down;
                break;

            case GreebleRayDirection.Ceiling:
                vector += new Vector3(zero.x, 0f, zero.y);
                vector2 = Vector3.up;
                break;

            case GreebleRayDirection.Walls:
                vector2   = GreebleUtility.ProceduralDirectionFast();
                vector2.y = 0f;
                vector2.Normalize();
                vector += zero - Vector3.Project(zero, vector2);
                break;

            case GreebleRayDirection.AllDirections:
                vector2 = GreebleUtility.ProceduralDirection();
                break;
            }
        }
        Quaternion rotation = Quaternion.identity;

        if (greebleDefinition.RandomizeRotation)
        {
            rotation = Quaternion.Euler((!greebleDefinition.AllowRotationX) ? 0f : GreebleUtility.ProceduralAngle(), (!greebleDefinition.AllowRotationY) ? 0f : GreebleUtility.ProceduralAngle(), (!greebleDefinition.AllowRotationZ) ? 0f : GreebleUtility.ProceduralAngle());
        }
        this.instances[index] = GreebleUtility.Spawn(greebleDefinition, new Ray(base.transform.TransformPoint(vector), base.transform.TransformDirection(vector2)), distance, rotation, 0.5f);
        if (this.Data != null && this.instances[index] != null && Application.isPlaying)
        {
            try
            {
                if (greebleDefinition.HasCustomActiveValue)
                {
                    CustomActiveValueGreeble component = this.instances[index].GetComponent <CustomActiveValueGreeble>();
                    component.Data  = this.Data;
                    component.Index = index;
                    if (this.Data._instancesState[index] > 252)
                    {
                        this.Data._instancesState[index] = 252;
                    }
                }
                else
                {
                    this.Data._instancesState[index] = 253;
                }
            }
            catch (Exception message)
            {
                Debug.Log(message);
            }
        }
        if (this.instances[index])
        {
            if (this.MpSync && BoltNetwork.isServer)
            {
                BoltNetwork.Attach(this.instances[index]);
            }
            this.InstanceData[index].Spawned = true;
            if (this.OnSpawned != null)
            {
                this.OnSpawned(index, this.instances[index]);
            }
        }
        UnityEngine.Random.seed = this.GetRandomSeed();
    }