public void LoadMap(string name) { if (String.IsNullOrEmpty(name) || !HasMap(name)) return; name = name.ToLower(); Level oldMap = null; if (active && map != null) oldMap = map; Command.all.Find("load").Use(null, name); map = Level.Find(name); if (map != null) { mapSettings = LoadMapSettings(name); mapData = GenerateMapData(mapSettings); map.setPhysics(mapData.destroy ? 2 : 1); map.motd = "Lava Survival: " + map.name.Capitalize(); map.overload = 1000000; map.unload = false; map.loadOnGoto = false; Level.SaveSettings(map); } if (active && map != null) { sendingPlayers = true; try { Player.players.ForEach(delegate(Player pl) { if (pl.level == oldMap) { if (sendAfkMain && Server.afkset.Contains(pl.name)) Command.all.Find("main").Use(pl, ""); else Command.all.Find("goto").Use(pl, map.name); } }); if (OnMapChange != null) OnMapChange(oldMap, map); oldMap.Unload(true, false); } catch { } sendingPlayers = false; StartRound(); } }
public override void Use(Player p, string message) { string path; if (message.Split(' ').Length == 1) path = "levels/" + message + ".lvl"; else if (message.Split(' ').Length == 2) try { path = @Server.backupLocation + "/" + message.Split(' ')[0] + "/" + int.Parse(message.Split(' ')[1]) + "/" + message.Split(' ')[0] + ".lvl"; } catch { Help(p); return; } else { Help(p); return; } if (File.Exists(path)) { FileStream fs = File.OpenRead(path); try { GZipStream gs = new GZipStream(fs, CompressionMode.Decompress); byte[] ver = new byte[2]; gs.Read(ver, 0, ver.Length); ushort version = BitConverter.ToUInt16(ver, 0); ushort[] vars = new ushort[6]; byte[] rot = new byte[2]; if (version == 1874) { byte[] header = new byte[16]; gs.Read(header, 0, header.Length); vars[0] = BitConverter.ToUInt16(header, 0); vars[1] = BitConverter.ToUInt16(header, 2); vars[2] = BitConverter.ToUInt16(header, 4); vars[3] = BitConverter.ToUInt16(header, 6); vars[4] = BitConverter.ToUInt16(header, 8); vars[5] = BitConverter.ToUInt16(header, 10); rot[0] = header[12]; rot[1] = header[13]; //level.permissionvisit = (LevelPermission)header[14]; //level.permissionbuild = (LevelPermission)header[15]; } else { byte[] header = new byte[12]; gs.Read(header, 0, header.Length); vars[0] = version; vars[1] = BitConverter.ToUInt16(header, 0); vars[2] = BitConverter.ToUInt16(header, 2); vars[3] = BitConverter.ToUInt16(header, 4); vars[4] = BitConverter.ToUInt16(header, 6); vars[5] = BitConverter.ToUInt16(header, 8); rot[0] = header[10]; rot[1] = header[11]; } Level level = new Level(name, vars[0], vars[2], vars[1], "empty"); level.setPhysics(0); level.spawnx = vars[3]; level.spawnz = vars[4]; level.spawny = vars[5]; level.rotx = rot[0]; level.roty = rot[1]; byte[] blocks = new byte[level.width * level.height * level.depth]; gs.Read(blocks, 0, blocks.Length); level.blocks = blocks; gs.Close(); level.backedup = true; level.permissionbuild = LevelPermission.Admin; level.jailx = (ushort)(level.spawnx * 32); level.jaily = (ushort)(level.spawny * 32); level.jailz = (ushort)(level.spawnz * 32); level.jailrotx = level.rotx; level.jailroty = level.roty; p.Loading = true; foreach (Player pl in Player.players) if (p.level == pl.level && p != pl) p.SendDie(pl.id); foreach (PlayerBot b in PlayerBot.playerbots) if (p.level == b.level) p.SendDie(b.id); Player.GlobalDie(p, true); p.level = level; p.SendMotd(); p.SendRaw(2); byte[] buffer = new byte[level.blocks.Length + 4]; BitConverter.GetBytes(IPAddress.HostToNetworkOrder(level.blocks.Length)).CopyTo(buffer, 0); //ushort xx; ushort yy; ushort zz; for (int i = 0; i < level.blocks.Length; ++i) buffer[4 + i] = Block.Convert(level.blocks[i]); buffer = buffer.GZip(); int number = (int)Math.Ceiling(((double)buffer.Length) / 1024); for (int i = 1; buffer.Length > 0; ++i) { short length = (short)Math.Min(buffer.Length, 1024); byte[] send = new byte[1027]; Player.HTNO(length).CopyTo(send, 0); Buffer.BlockCopy(buffer, 0, send, 2, length); byte[] tempbuffer = new byte[buffer.Length - length]; Buffer.BlockCopy(buffer, length, tempbuffer, 0, buffer.Length - length); buffer = tempbuffer; send[1026] = (byte)(i * 100 / number); p.SendRaw(3, send); Thread.Sleep(10); } buffer = new byte[6]; Player.HTNO((short)level.width).CopyTo(buffer, 0); Player.HTNO((short)level.depth).CopyTo(buffer, 2); Player.HTNO((short)level.height).CopyTo(buffer, 4); p.SendRaw(4, buffer); ushort x = (ushort)((0.5 + level.spawnx) * 32); ushort y = (ushort)((1 + level.spawny) * 32); ushort z = (ushort)((0.5 + level.spawnz) * 32); p.aiming = false; Player.GlobalSpawn(p, x, y, z, level.rotx, level.roty, true); p.ClearBlockchange(); p.Loading = false; if (message.IndexOf(' ') == -1) level.name = "&cMuseum " + Server.DefaultColor + "(" + message.Split(' ')[0] + ")"; else level.name = "&cMuseum " + Server.DefaultColor + "(" + message.Split(' ')[0] + " " + message.Split(' ')[1] + ")"; if (!p.hidden) { Player.GlobalMessage(p.color + p.prefix + p.name + Server.DefaultColor + " went to the " + level.name); } } catch (Exception ex) { Player.SendMessage(p, "Error loading level."); Server.ErrorLog(ex); return; } finally { fs.Close(); } } else { Player.SendMessage(p, "Level or backup could not be found."); return; } }