コード例 #1
0
        public override void CalculateUnspawnPosition(ushort buildingID, ref Building data, ref Randomizer randomizer, CitizenInfo info, ushort ignoreInstance, out Vector3 position, out Vector3 target, out Vector2 direction, out CitizenInstance.Flags specialFlags)
        {
            float localMeshOffset = Building.CalculateLocalMeshOffset(this.m_info, data.Length);
            bool  flag1           = this.m_info.m_specialPlaces != null && this.m_info.m_specialPlaces.Length != 0;
            bool  flag2           = this.m_info.m_enterDoors != null && this.m_info.m_enterDoors.Length != 0;

            if (flag1 && (!flag2 || randomizer.Int32(4U) == 0))
            {
                BuildingInfo.Prop prop = this.m_info.m_specialPlaces[randomizer.Int32((uint)this.m_info.m_specialPlaces.Length)];
                if (new Randomizer((int)buildingID << 6 | prop.m_index).Int32(100U) < prop.m_probability && data.Length >= prop.m_requiredLength)
                {
                    Vector3 offset = prop.m_position;
                    offset.z = localMeshOffset - offset.z;
                    position = data.CalculatePosition(offset);
                    int index = randomizer.Int32((uint)prop.m_finalProp.m_specialPlaces.Length);
                    PropInfo.SpecialPlace specialPlace = prop.m_finalProp.m_specialPlaces[index];
                    float f    = data.m_angle + prop.m_radAngle;
                    float num1 = Mathf.Cos(f);
                    float num2 = Mathf.Sin(f);
                    if (!prop.m_fixedHeight)
                    {
                        position.y = Singleton <TerrainManager> .instance.SampleDetailHeight(position);
                    }
                    else if (this.m_info.m_requireHeightMap)
                    {
                        position.y = Singleton <TerrainManager> .instance.SampleDetailHeight(position) + offset.y;
                    }
                    position.x += (float)((double)specialPlace.m_position.x * (double)num1 + (double)specialPlace.m_position.z * (double)num2);
                    position.y += specialPlace.m_position.y;
                    position.z += (float)((double)specialPlace.m_position.x * (double)num2 - (double)specialPlace.m_position.z * (double)num1);
                    if (!this.IsSomeBodyThere(position, ignoreInstance))
                    {
                        direction.x = (float)((double)specialPlace.m_direction.x * (double)num1 + (double)specialPlace.m_direction.z * (double)num2);
                        direction.y = (float)((double)specialPlace.m_direction.x * (double)num2 - (double)specialPlace.m_direction.z * (double)num1);
                        //specialFlags = hangaround _ specialPlace.specialFlags
                        specialFlags = CitizenInstance.Flags.HangAround | specialPlace.m_specialFlags;
                        Debug.Log("SF: " + specialFlags.ToString().PadRight(25, ' ') + "; SP: " + specialPlace.m_specialFlags.ToString().PadRight(25, ' ') + "; Layer: " + data.Info.m_class.m_layer.ToString().PadRight(15, ' ') + "; Level: " + data.Info.m_class.m_level.ToString().PadRight(5, ' ') + "; Service: " + data.Info.m_class.m_service.ToString().PadRight(20, ' ') + "; Subservice: " + data.Info.m_class.m_subService.ToString().PadRight(25, ' ') + ";");
                        if (this.m_info.m_hasPedestrianPaths)
                        {
                            target = position;
                            return;
                        }
                        target = data.CalculateSidewalkPosition(offset.x, 0.0f);
                        return;
                    }
                }
            }
            if (flag2)
            {
                BuildingInfo.Prop prop = this.m_info.m_enterDoors[randomizer.Int32((uint)this.m_info.m_enterDoors.Length)];
                if (new Randomizer((int)buildingID << 6 | prop.m_index).Int32(100U) < prop.m_probability && data.Length >= prop.m_requiredLength)
                {
                    Vector3 offset = prop.m_position;
                    offset.z = localMeshOffset - offset.z;
                    float num1 = prop.m_finalProp.m_generatedInfo.m_size.x * 0.5f - info.m_radius;
                    if ((double)num1 >= 0.100000001490116)
                    {
                        float num2 = num1 * Mathf.Sqrt((float)randomizer.Int32(1000U) * (1f / 1000f));
                        float f    = (float)randomizer.Int32(1000U) * ((float)System.Math.PI / 500f);
                        offset.x += Mathf.Cos(f) * num2;
                        offset.z += Mathf.Sin(f) * num2;
                    }
                    position = data.CalculatePosition(offset);
                    if (!prop.m_fixedHeight)
                    {
                        position.y = Singleton <TerrainManager> .instance.SampleDetailHeight(position);
                    }
                    else if (this.m_info.m_requireHeightMap)
                    {
                        position.y = Singleton <TerrainManager> .instance.SampleDetailHeight(position) + offset.y;
                    }
                    direction    = Vector2.zero;
                    specialFlags = (prop.m_finalProp.m_doorType & PropInfo.DoorType.HangAround) != PropInfo.DoorType.HangAround ? CitizenInstance.Flags.None : CitizenInstance.Flags.HangAround;
                    if (this.m_info.m_hasPedestrianPaths)
                    {
                        target = position;
                        return;
                    }
                    target = data.CalculateSidewalkPosition(offset.x, 0.0f);
                    return;
                }
            }
            Vector3 offset1 = new Vector3(0.0f, 0.0f, localMeshOffset);

            position   = data.CalculatePosition(offset1);
            position.y = Singleton <TerrainManager> .instance.SampleDetailHeight(position);

            direction    = Vector2.zero;
            specialFlags = CitizenInstance.Flags.None;
            if (this.m_info.m_hasPedestrianPaths)
            {
                target = position;
            }
            else
            {
                target = data.CalculateSidewalkPosition(offset1.x, 0.0f);
            }
        }