public void LoadLandblock(uint landblockID, uint radius = 1) { if (PlayerMode) { ExitPlayerMode(); InitPlayerMode = true; } Render.Buffer.ClearBuffer(); Server.Init(); TextureCache.Init(); LScape.unload_landblocks_all(); var landblock = LScape.get_landblock(landblockID); if (landblock.HasDungeon) { radius = 0; } DungeonMode = landblock.HasDungeon; var center_lbx = landblockID >> 24; var center_lby = landblockID >> 16 & 0xFF; //Landblocks = new Dictionary<uint, R_Landblock>(); R_Landblock r_landblock = null; R_Landblock centerBlock = null; for (var lbx = (int)(center_lbx - radius); lbx <= center_lbx + radius; lbx++) { if (lbx < 0 || lbx > 254) { continue; } for (var lby = (int)(center_lby - radius); lby <= center_lby + radius; lby++) { if (lby < 0 || lby > 254) { continue; } var lbid = (uint)(lbx << 24 | lby << 16 | 0xFFFF); var timer = Stopwatch.StartNew(); landblock = LScape.get_landblock(lbid); timer.Stop(); r_landblock = new R_Landblock(landblock); //LScape.unload_landblock(lbid); if (landblockID == lbid) { centerBlock = r_landblock; } MainWindow.Status.WriteLine($"Loaded {lbid:X8} in {timer.Elapsed.TotalMilliseconds}ms"); //Landblocks.Add(lbid, new R_Landblock(landblock)); } } Render.Buffer.BuildBuffers(); Render.InitEmitters(); if (FileExplorer.Instance.TeleportMode) { var zBump = DungeonMode ? 1.775f : 2.775f; if (InitPlayerMode) { zBump = 0.0f; } Camera.InitTeleport(centerBlock, zBump); FileExplorer.Instance.TeleportMode = false; } else if (DungeonMode) { BoundingBox = new Model.BoundingBox(Render.Buffer.RB_EnvCell); Camera.InitDungeon(r_landblock, BoundingBox); } else { Camera.InitLandblock(r_landblock); } SingleBlock = landblock.ID; FreeResources(); Server.OnLoadWorld(); }
public void LoadModel(uint wcid) { Server.Initting = true; Buffer.ClearBuffer(); TextureCache.Init(); LScape.unload_landblocks_all(); Console.WriteLine($"Loading {wcid}"); GfxObjMode = false; var wo = WorldObjectFactory.CreateNewWorldObject(wcid); if (wo == null) { return; } wo.InitPhysicsObj(); var location = new Position(); location.ObjCellID = 0x00000001; location.Frame.Origin = new System.Numerics.Vector3(12, 12, 0); var success = wo.PhysicsObj.enter_world(location); if (!success || wo.PhysicsObj.CurCell == null) { wo.PhysicsObj.DestroyObject(); wo.PhysicsObj = null; Console.WriteLine($"WorldObjectViewer.LoadModel({wcid}).AddPhysicsObj({wo.Name}, {location}) - failed to spawn"); return; } Console.WriteLine($"Spawned {wcid} - {wo.Name} @ {location}"); var objDesc = new ObjDesc(wo.SetupTableId, wo.ClothingBase ?? 0, (PaletteTemplate)(wo.PaletteTemplate ?? 0), (float)(wo.Shade ?? 0.0)); if (wo is Creature creature) { objDesc.AddBaseModelData(wo); var equippedObjects = creature.EquippedObjects.Values.OrderBy(i => (int)(i.ClothingPriority ?? 0)).ToList(); foreach (var equippedObject in equippedObjects) { if ((equippedObject.CurrentWieldedLocation & EquipMask.Selectable) != 0) { continue; } objDesc.Add(equippedObject.ClothingBase ?? 0, (PaletteTemplate)(equippedObject.PaletteTemplate ?? 0), (float)(equippedObject.Shade ?? 0.0)); } } wo.PhysicsObj.UpdateObjDesc(objDesc); var r_PhysicsObj = new R_PhysicsObj(wo.PhysicsObj); Buffer.AddInstance(r_PhysicsObj, objDesc); if (!LoadedOnce) { //Camera.Position = Vector3.Zero; //Camera.Dir = Vector3.Normalize(new Vector3(1, 1, 0)); Camera.Position = new Vector3(11.782367f, 12.763985f, 1.6514041f); Camera.Dir = new Vector3(0.30761153f, -0.94673103f, 0.093334414f); Camera.Up = Vector3.UnitZ; Camera.CreateLookAt(); Camera.Speed = Camera.Model_Speed; } Buffer.BuildTextureAtlases(Buffer.InstanceTextureAtlasChains); Buffer.BuildBuffer(Buffer.RB_Instances); Server.InstancesLoaded = true; Server.Initting = false; LoadedOnce = true; }
public async void LoadLandblocks(Vector2 startBlock, Vector2 endBlock) { //Console.WriteLine($"LoadLandblocks({startBlock}, {endBlock})"); if (PlayerMode) { ExitPlayerMode(); InitPlayerMode = true; } Render.Buffer.ClearBuffer(); Server.Init(); TextureCache.Init(); LScape.unload_landblocks_all(); DungeonMode = false; var dx = (int)(endBlock.X - startBlock.X) + 1; var dy = (int)(startBlock.Y - endBlock.Y) + 1; var numBlocks = dx * dy; var size = endBlock - startBlock; var center = startBlock + size / 2; var centerX = (uint)Math.Round(center.X); var centerY = (uint)Math.Round(center.Y); var landblockID = centerX << 24 | centerY << 16 | 0xFFFF; MainWindow.Status.WriteLine($"Loading {numBlocks} landblocks"); await Task.Delay(1); //Landblocks = new Dictionary<uint, R_Landblock>(); R_Landblock r_landblock = null; R_Landblock centerBlock = null; for (var lbx = (uint)startBlock.X; lbx <= endBlock.X; lbx++) { if (lbx < 0 || lbx > 254) { continue; } for (var lby = (uint)endBlock.Y; lby <= startBlock.Y; lby++) { if (lby < 0 || lby > 254) { continue; } var lbid = lbx << 24 | lby << 16 | 0xFFFF; var timer = Stopwatch.StartNew(); var landblock = LScape.get_landblock(lbid); timer.Stop(); r_landblock = new R_Landblock(landblock); //LScape.unload_landblock(lbid); if (lbid == landblockID) { centerBlock = r_landblock; } MainWindow.Status.WriteLine($"Loaded {lbid:X8} in {timer.Elapsed.TotalMilliseconds}ms"); //Landblocks.Add(lbid, new R_Landblock(landblock)); } } Render.Buffer.BuildBuffers(); Render.InitEmitters(); Camera.InitLandblock(centerBlock); GameView.ViewMode = ViewMode.World; SingleBlock = uint.MaxValue; FreeResources(); Server.OnLoadWorld(); }