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); } } }
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)); }
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(); } }
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); }