Пример #1
0
        public void GenerateTerrain()
        {
            Terrain = new VMTSOSurroundingTerrain();
            var coords = MapCoordinates.Unpack(LotPersist.location);
            var map    = Realestate.GetMap();

            for (int y = 0; y < 3; y++)
            {
                for (int x = 0; x < 3; x++)
                {
                    Terrain.BlendN[x, y] = map.GetBlend((coords.X - 1) + x, (coords.Y - 1) + y);
                }
            }

            for (int y = 0; y < 3; y++)
            {
                for (int x = 0; x < 3; x++)
                {
                    Terrain.Roads[x, y] = map.GetRoad((coords.X - 1) + x, (coords.Y - 1) + y);
                }
            }

            for (int y = 0; y < 4; y++)
            {
                for (int x = 0; x < 4; x++)
                {
                    Terrain.Height[x, y] = map.GetElevation((coords.X - 1) + x, (coords.Y - 1) + y);
                }
            }
        }
Пример #2
0
        public static int GetBaseLevel(VM vm, VMTSOSurroundingTerrain terrain, int x, int y)
        {
            var sr = new float[4, 4];

            for (int oy = 0; oy < 4; oy++)
            {
                var srcY = Math.Min(3, Math.Max(0, oy + y - 1));
                for (int ox = 0; ox < 4; ox++)
                {
                    var srcX = Math.Min(3, Math.Max(0, ox + x - 1));
                    sr[3 - oy, ox] = terrain.Height[srcX, srcY];
                }
            }

            return((int)(((sr[1, 1] + sr[1, 2] + sr[2, 2] + sr[2, 1]) / 4) * 100));
        }
Пример #3
0
        public LotContainer(IDAFactory da, LotContext context, ILotHost host, IKernel kernel, LotServerConfiguration config, IRealestateDomain realestate)
        {
            VM.UseWorld = false;
            DAFactory   = da;
            Host        = host;
            Context     = context;
            Kernel      = kernel;
            Config      = config;

            JobLot = (context.Id & 0x40000000) > 0;
            if (JobLot)
            {
                var jobPacked = Context.DbId - 0x200;
                var jobLevel  = (short)((jobPacked - 1) & 0xF);
                var jobType   = (short)((jobPacked - 1) / 0xF);
                LotPersist = new DbLot
                {
                    lot_id     = Context.DbId,
                    location   = Context.Id,
                    category   = LotCategory.money,
                    name       = "{job:" + jobType + ":" + jobLevel + "}",
                    admit_mode = 4
                };
                LotAdj       = new List <DbLot>();
                LotRoommates = new List <DbRoommate>();
                Terrain      = new VMTSOSurroundingTerrain();

                for (int y = 0; y < 3; y++)
                {
                    for (int x = 0; x < 3; x++)
                    {
                        Terrain.Roads[x, y] = 0xF; //crossroads everywhere
                    }
                }
            }
            else
            {
                using (var db = DAFactory.Get())
                {
                    LotPersist   = db.Lots.Get(context.DbId);
                    LotAdj       = db.Lots.GetAdjToLocation(context.ShardId, LotPersist.location);
                    LotRoommates = db.Roommates.GetLotRoommates(context.DbId);
                }
                Realestate = realestate.GetByShard(LotPersist.shard_id);
                GenerateTerrain();
            }
        }
Пример #4
0
        public static int RestoreHeight(VM vm, VMTSOSurroundingTerrain terrain, int x, int y)
        {
            var sr = new float[4, 4];

            for (int oy = 0; oy < 4; oy++)
            {
                var srcY = Math.Min(3, Math.Max(0, oy + y - 1));
                for (int ox = 0; ox < 4; ox++)
                {
                    var srcX = Math.Min(3, Math.Max(0, ox + x - 1));
                    sr[3 - oy, ox] = terrain.Height[srcX, srcY];
                }
            }

            var baseLevel = (int)(((sr[1, 1] + sr[1, 2] + sr[2, 2] + sr[2, 1]) / 4) * 100);

            var target = vm.Context.Architecture.Terrain;
            var xn     = VMArchitectureTerrain.TerrainXNoise;
            var yn     = VMArchitectureTerrain.TerrainYNoise;

            for (int oy = 1; oy < target.Height; oy++)
            {
                for (int ox = 1; ox < target.Width; ox++)
                {
                    int index = (target.Height - oy) * target.Width + (target.Height - ox);

                    float fracy = (oy - 1f) / (target.Height - 2f);
                    fracy -= (yn[index] - 0.5f) / 5f;
                    float y1    = Cubic(sr[0, 0], sr[0, 1], sr[0, 2], sr[0, 3], fracy);
                    float y2    = Cubic(sr[1, 0], sr[1, 1], sr[1, 2], sr[1, 3], fracy);
                    float y3    = Cubic(sr[2, 0], sr[2, 1], sr[2, 2], sr[2, 3], fracy);
                    float y4    = Cubic(sr[3, 0], sr[3, 1], sr[3, 2], sr[3, 3], fracy);
                    float fracx = (ox - 1f) / (target.Width - 2f);
                    fracx -= (xn[index] - 0.5f) / 5f;

                    var h = Cubic(y1, y2, y3, y4, fracx);
                    target.Heights[index] = (short)(((h * 100f) - baseLevel));
                }
            }

            var lotSInfo = vm.TSOState.Size;

            if (vm.TSOState.OwnerID == 0)
            {
                lotSInfo = 10;
            }
            var ret = vm.Context.GetTSOBuildableArea(lotSInfo);

            var mailbox = vm.Entities.FirstOrDefault(m => (m.Object.OBJ.GUID == 0xEF121974 || m.Object.OBJ.GUID == 0x1D95C9B0));

            if (mailbox != null && mailbox.Position != LotTilePos.OUT_OF_WORLD)
            {
                var mailheight = target.Heights[mailbox.Position.TileY * target.Width + mailbox.Position.TileX];

                ret.Inflate(-1, -1);
                vm.Context.Architecture.DisableClip = true;
                VMArchitectureTools.RaiseTerrain(vm.Context.Architecture, ret, mailheight, false);
                vm.Context.Architecture.DisableClip = false;

                ret.Width--; ret.Height--;
                for (int oy = ret.Top; oy < ret.Bottom; oy++)
                {
                    for (int ox = ret.Left; ox < ret.Right; ox++)
                    {
                        int index = (oy) * target.Width + (ox);
                        target.GrassState[index] = 0;
                    }
                }
            }

            target.RegenerateCenters();
            if (VM.UseWorld)
            {
                vm.Context.Blueprint.Altitude        = target.Heights;
                vm.Context.Blueprint.AltitudeCenters = target.Centers;
            }

            foreach (var obj in vm.Entities)
            {
                obj.Position = obj.Position;
            }
            return(baseLevel);
        }