public virtual Level GetLevel(Player player, string name) { Level level = Levels.FirstOrDefault(l => l.LevelId.Equals(name, StringComparison.InvariantCultureIgnoreCase)); if (level == null) { GameMode gameMode = Config.GetProperty("GameMode", GameMode.Survival); Difficulty difficulty = Config.GetProperty("Difficulty", Difficulty.Normal); int viewDistance = Config.GetProperty("ViewDistance", 11); bool enableBlockTicking = Config.GetProperty("EnableBlockTicking", false); bool enableChunkTicking = Config.GetProperty("EnableChunkTicking", false); bool isWorldTimeStarted = Config.GetProperty("IsWorldTimeStarted", false); IWorldProvider worldProvider = null; switch (Config.GetProperty("WorldProvider", "flat").ToLower().Trim()) { case "flat": case "flatland": worldProvider = new FlatlandWorldProvider(); break; case "cool": worldProvider = new CoolWorldProvider(); break; case "experimental": worldProvider = new ExperimentalWorldProvider(); break; case "anvil": worldProvider = new AnvilWorldProvider() { MissingChunkProvider = new FlatlandWorldProvider() }; break; default: worldProvider = new FlatlandWorldProvider(); break; } level = new Level(name, worldProvider, EntityManager, gameMode, difficulty, viewDistance) { EnableBlockTicking = enableBlockTicking, EnableChunkTicking = enableChunkTicking, IsWorldTimeStarted = isWorldTimeStarted }; level.Initialize(); if (Config.GetProperty("CalculateLights", false)) { { AnvilWorldProvider wp = level._worldProvider as AnvilWorldProvider; if (wp != null) { //wp.PruneAir(); //wp.MakeAirChunksAroundWorldToCompensateForBadRendering(); SkyLightCalculations.Calculate(level); Stopwatch sw = new Stopwatch(); int count = wp.LightSources.Count; sw.Restart(); RecalculateLight(level, wp); var chunkCount = wp._chunkCache.Where(chunk => chunk.Value != null).ToArray().Length; Log.Debug($"Recalc light for {chunkCount} chunks, {chunkCount*16*16*256} blocks and {count} light sources. Time {sw.ElapsedMilliseconds}ms"); } } { FlatlandWorldProvider wp = level._worldProvider as FlatlandWorldProvider; if (wp != null) { SkyLightCalculations.Calculate(level); } } } Levels.Add(level); OnLevelCreated(new LevelEventArgs(null, level)); } return(level); }
public void Paste(Player player, bool skipAir = false, bool selectAfter = true, bool pastAtOrigin = false) { try { RegionSelector selector = RegionSelector.GetSelector(player); Clipboard clipboard = selector.Clipboard; if (clipboard == null) { player.SendMessage("Nothing in clipboard"); return; } Vector3 to = pastAtOrigin ? clipboard.Origin : (BlockCoordinates)player.KnownPosition; var rotateY = clipboard.Transform; var clipOffset = clipboard.GetMin() - clipboard.Origin; var realTo = to + Vector3.Transform(clipOffset, rotateY); var max = realTo + Vector3.Transform(clipboard.GetMax() - clipboard.GetMin(), rotateY); var blocks = clipboard.GetBuffer(); foreach (Block block in blocks) { if (skipAir && block is Air) { continue; } if (rotateY != Matrix4x4.Identity) { Vector3 vec = Vector3.Transform(block.Coordinates - clipboard.Origin, rotateY); block.Coordinates = vec + to; } else { //Vector3 vec = (block.Coordinates - clipboard.Origin); Vector3 vec = new Vector3( block.Coordinates.X - clipboard.Origin.X + to.X, block.Coordinates.Y - clipboard.Origin.Y + to.Y, block.Coordinates.Z - clipboard.Origin.Z + to.Z); block.Coordinates = vec; } EditSession.SetBlock(block); } if (selectAfter) { selector.Select(realTo, max); } Task.Run(() => { SkyLightCalculations.Calculate(player.Level); player.CleanCache(); player.ForcedSendChunks(() => { player.SendMessage("Calculated skylights and resent chunks."); }); }); } catch (Exception e) { Log.Error("Paste", e); } }