protected WorldDescription LoadFromFile(string fileName) { WorldDescription desc = WorldIO.Load(fileName); SetTerrain(desc.Terrain); return(desc); }
public void LoadWorld(string name) { World.UnloadTerrain(); WorldDescription desc = WorldIO.Load(name, false); World.SetTerrain(desc.Terrain); WorldEditor.TerrainEditor.ClearUndoRedo(); Window.UpdateTitle(name); CurrentFile = name; var commandposts = desc.GetObjectsByTag("CommandPost"); foreach (WorldObjectDescription ob in commandposts) { Vector3 position = ob.GetVector3("Position"); CommandPostObject editorCommandPost = new CommandPostObject(position); Team team = (Team)(ob.GetField <byte>("Team") ?? 0); editorCommandPost.Team = team; World.AddGameObject(editorCommandPost); } var intels = desc.GetObjectsByTag("Intel"); foreach (WorldObjectDescription ob in intels) { Vector3 position = ob.GetVector3("Position"); IntelObject editorIntel = new IntelObject(position); Team team = (Team)(ob.GetField <byte>("Team") ?? 0); editorIntel.Team = team; World.AddGameObject(editorIntel); } }
public void Save() { if (!isServer) { return; } // Save all tile layers to file. TileMap.SaveAll(); // Save the player inventory: // This will only save the host's inventory. TODO support other clients saving inventory data. InventoryIO.SaveInventory(RealityName); // Save current gear held and worn by local player. TODO see above. InventoryIO.SaveGear(RealityName, Player.Local); // Save currently held item. TODO see above. InventoryIO.SaveHolding(RealityName, Player.Local); // Save player state (position, health, etc.) PlayerIO.SavePlayerState(RealityName, Player.Local); // Save all world items to file. ItemIO.ItemsToFile(RealityName, GameObject.FindObjectsOfType <Item>()); // Save placed furniture... FurnitureIO.SaveFurniture(RealityName, Furniture.GetAllFurniture()); // Save the building inventory... BuildingIO.SaveBuildingInventory(RealityName, Player.Local); // Save the world state to file. WorldIO.SaveWorldState(this); }
/// <summary> /// Start /// </summary> private void Start() { InputControllerScript input_controller = GetComponent <InputControllerScript>(); if (input_controller) { input_controller.OnAnyKeyPressed += ShowMainMenu; } WorldIO.CreateClearCacheTask(); }
public static BackupIOReturn LoadWorld(string Name) { WorldIO.LoadWorld(Statics.WorldPath + Path.DirectorySeparatorChar + Name); if (WorldModify.loadFailed && !WorldModify.loadSuccess) { return(BackupIOReturn.LOAD_FAIL); } return(BackupIOReturn.SUCCESS); }
public void SaveWorld(string filePath) { if (World.Terrain != null) { CurrentFile = filePath; Window.UpdateTitle(filePath); WorldDescription desc = World.CreateDescription(); WorldIO.Save(filePath, desc, false); } }
public void SaveWorld() { if (CurrentFile == null) { throw new InvalidOperationException("File has not yet been saved!"); } if (World.Terrain != null) { WorldIO.Save(CurrentFile, World.CreateDescription(), false); } }
public static BackupIOReturn SaveWorld(string Name) { if (WorldModify.saveLock) { return(BackupIOReturn.SAVE_LOCK); } //Please wait for the current operation to finish. if (WorldIO.saveWorld(Statics.WorldPath + Path.DirectorySeparatorChar + Name)) { return(BackupIOReturn.SUCCESS); } else { return(BackupIOReturn.SAVE_FAIL); } }
public static void SetSpawn(ISender sender, ArgumentList args) { if (sender is Player) { var player = sender as Player; var saveWorld = args.TryPop("-save"); Main.spawnTileX = (int)(player.Position.X / 16); Main.spawnTileY = (int)(player.Position.Y / 16); if (saveWorld) { WorldIO.SaveWorld(World.SavePath); } Server.notifyOps(String.Format("{0} set Spawn to {1}, {2}.", sender.Name, Main.spawnTileX, Main.spawnTileY)); } }
public bool LoadFromFile(string fileName) { DashCMD.WriteImportant("[ServerWorld] Loading world '{0}'...", fileName); try { Description = WorldIO.Load(CurrentWorldName = fileName); SetTerrain(Description.Terrain); Terrain.LockBottomLayer = true; DashCMD.WriteImportant("[ServerWorld] Successfully loaded world '{0}'.", fileName); return(true); } catch (IOException ioex) { DashCMD.WriteError("[ServerWorld] Failed to load world '{0}'!", fileName); DashCMD.WriteError(ioex); return(false); } }
public static BackupResult SaveWorld(string Path) { if (WorldModify.saveLock) { return(BackupResult.SAVE_LOCK); } //Please wait for the current operation to finish. if (WorldIO.SaveWorld(Path)) { if (Program.properties.CompressBackups) { Compress(Path); // it just adds ".zip" to the timestamp+".wld" } return(BackupResult.SUCCESS); } else { return(BackupResult.SAVE_FAIL); } }
public void Load() { if (!isServer) { return; } // Load world state from file. WorldIO.LoadWorldState(this); // Load player state (position, health, etc.) PlayerIO.LoadPlayerState(RealityName, Player.Local); // Load all world items to map. ItemIO.FileToWorldItems(RealityName, true); // Load the player inventory. // This will only load the host's inventory. TODO support other clients loading inventory data. InventoryIO.LoadInventory(RealityName); // Save current gear held and worn by local player. TODO see above. InventoryIO.LoadGear(RealityName, Player.Local); // Load currently held item. TODO see above. InventoryIO.LoadHolding(RealityName, Player.Local); // Load furniture... FurnitureIO.LoadFurniture(this); // Load player building inventory... BuildingIO.LoadBuildingInventory(RealityName, Player.Local); // No need to load tile layers, this is done all the time passively. // Call post-load PostLoad(); }
public void RealityNameChange() { if (RealityName == null) { Title.text = "LoadReality_SelectPrompt".Translate(); D_Day.text = "LoadReality_DayLabel".Translate("<color=white>---</color>"); D_LastPlayed.text = "LoadReality_LastPlayed".Translate("<color=white>---</color>", ""); EnterReality.text = "LoadReality_NoneSelected".Translate(); Play.interactable = false; Delete.interactable = false; } else { Title.text = RealityName.Trim(); D_Day.text = "LoadReality_DayLabel".Translate("<color=white>0</color>"); D_LastPlayed.text = "LoadReality_LastPlayed".Translate("<color=white>Never</color>", ""); EnterReality.text = "LoadReality_EnterReality".Translate(RealityName.Trim()); Play.interactable = true; Delete.interactable = true; WorldSaveState st = null; try { st = WorldIO.GetSaveState(RealityName); } catch { Debug.LogWarning(string.Format("Error loading reality state for '{0}'", RealityName)); } if (st != null) { D_Day.text = "LoadReality_DayLabel".Translate("<b><color=white>" + (int)(st.Time) + "</color></b>"); D_LastPlayed.text = "LoadReality_LastPlayed".Translate("<b><color=white>" + st.LastPlayed.ToString("g") + "</color></b>", "<b><color=white>" + st.LastPlayed.TimeAgo() + "</color></b>"); } } }
public override void Load(TagCompound tag) { WorldIO.LoadModData(tag.GetList <TagCompound>("list")); WorldIO.LoadNPCs(tag.GetList <TagCompound>("mysteryNPCs")); WorldIO.LoadNPCKillCounts(tag.GetList <TagCompound>("mysteryKillCounts")); }
public static void Main(string[] args) { Thread.CurrentThread.Name = "Main"; //header: Terraria's Dedicated Server Mod. (1.1.2 #36) ~ Build: 37 [CodeName] string codeName = Statics.CODENAME.Length > 0 ? String.Format(" [{0}]", Statics.CODENAME) : String.Empty; string MODInfo = String.Format( "Terraria's Dedicated Server Mod. ({0} #{1}) ~ Build: {2}{3}", Statics.VERSION_NUMBER, Statics.CURRENT_TERRARIA_RELEASE, Statics.BUILD, codeName ); try { try { Console.Title = MODInfo; } catch { } var lis = new Logging.LogTraceListener(); System.Diagnostics.Trace.Listeners.Clear(); System.Diagnostics.Trace.Listeners.Add(lis); System.Diagnostics.Debug.Listeners.Clear(); System.Diagnostics.Debug.Listeners.Add(lis); using (var prog = new ProgressLogger(1, "Loading language definitions")) Languages.LoadClass(Collections.Registries.LANGUAGE_FILE); if (Languages.Startup_Initializing == null) { ProgramLog.Error.Log("Please update the language file, either by deleting or finding another online."); Console.ReadKey(true); return; } ProgramLog.Log("{0} {1}", Languages.Startup_Initializing, MODInfo); ProgramLog.Log(Languages.Startup_SettingUpPaths); if (!SetupPaths()) { return; } Platform.InitPlatform(); ProgramLog.Log(Languages.Startup_SettingUpProperties); bool propertiesExist = File.Exists("server.properties"); SetupProperties(); if (!propertiesExist) { ProgramLog.Console.Print(Languages.Startup_NoPropertiesFileFound); if (Console.ReadLine().ToLower() == "y") { //ProgramLog.Console.Print(Languages.Startup_PropertiesCreationComplete); ProgramLog.Log(Languages.ExitRequestCommand); //Console.ReadKey(true); return; } } var logFile = Statics.DataPath + Path.DirectorySeparatorChar + "server.log"; ProgramLog.OpenLogFile(logFile); string PIDFile = properties.PIDFile.Trim(); if (PIDFile.Length > 0) { string ProcessUID = Process.GetCurrentProcess().Id.ToString(); bool Issue = false; if (File.Exists(PIDFile)) { try { File.Delete(PIDFile); } catch (Exception) { ProgramLog.Console.Print(Languages.Startup_IssueDeletingPID); if (Console.ReadLine().ToLower() == "n") { ProgramLog.Console.Print(Languages.Startup_PressAnyKeyToExit); Console.ReadKey(true); return; } Issue = true; } } if (!Issue) { try { File.WriteAllText(PIDFile, ProcessUID); } catch (Exception) { ProgramLog.Console.Print(Languages.Startup_IssueCreatingPID); if (Console.ReadLine().ToLower() == "n") { ProgramLog.Console.Print(Languages.Startup_PressAnyKeyToExit); Console.ReadKey(true); return; } } ProgramLog.Log(Languages.Startup_PIDCreated + ProcessUID); } } ParseArgs(args); try { if (UpdateManager.PerformProcess()) { ProgramLog.Log(Languages.Startup_RestartingIntoNewUpdate); return; } } catch (UpdateCompleted) { throw; } catch (Exception e) { ProgramLog.Log(e, Languages.Startup_ErrorUpdating); } LoadMonitor.Start(); ProgramLog.Log(Languages.Startup_StartingRCON); RemoteConsole.RConServer.Start("rcon_logins.properties"); ProgramLog.Log(Languages.Startup_StartingPermissions); permissionManager = new PermissionManager(); ProgramLog.Log(Languages.Startup_PreparingServerData); using (var prog = new ProgressLogger(1, Languages.Startup_LoadingItemDefinitions)) Collections.Registries.Item.Load(); using (var prog = new ProgressLogger(1, Languages.Startup_LoadingNPCDefinitions)) Collections.Registries.NPC.Load(Collections.Registries.NPC_FILE); using (var prog = new ProgressLogger(1, Languages.Startup_LoadingProjectileDefinitions)) Collections.Registries.Projectile.Load(Collections.Registries.PROJECTILE_FILE); //if (Languages.IsOutOfDate()) // ProgramLog.Error.Log( // String.Format("{0}\n{1}", // Languages.Startup_LanguageFileOOD, Languages.Startup_LanguageFileUpdate) // , true); commandParser = new CommandParser(); commandParser.ReadPermissionNodes(); LoadPlugins(); /* Save access languages - once only */ Languages.Save(Collections.Registries.LANGUAGE_FILE); HookContext ctx; HookArgs.ServerStateChange eArgs; string worldFile = properties.WorldPath; FileInfo file = new FileInfo(worldFile); if (!file.Exists) { try { file.Directory.Create(); } catch (Exception exception) { ProgramLog.Log(exception); ProgramLog.Console.Print(Languages.Startup_PressAnyKeyToExit); Console.ReadKey(true); return; } ctx = new HookContext { Sender = World.Sender, }; eArgs = new HookArgs.ServerStateChange { ServerChangeState = ServerState.GENERATING }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); ProgramLog.Log("{0} '{1}'", Languages.Startup_GeneratingWorld, worldFile); string seed = properties.Seed; if (seed == "-1") { seed = WorldModify.genRand.Next(Int32.MaxValue).ToString(); ProgramLog.Log("{0} {1}", Languages.Startup_GeneratedSeed, seed); } int worldX = properties.GetMapSizes()[0]; int worldY = properties.GetMapSizes()[1]; if (properties.UseCustomTiles) { int X = properties.MaxTilesX; int Y = properties.MaxTilesY; if (X > 0 && Y > 0) { worldX = X; worldY = Y; } if (worldX < (int)World.MAP_SIZE.SMALL_X || worldY < (int)World.MAP_SIZE.SMALL_Y) { ProgramLog.Log("{0} {1}x{2}", Languages.Startup_WorldSizingError, (int)World.MAP_SIZE.SMALL_X, (int)World.MAP_SIZE.SMALL_Y); worldX = (int)((int)World.MAP_SIZE.SMALL_Y * 3.5); worldY = (int)World.MAP_SIZE.SMALL_Y; } ProgramLog.Log("{0} {1}x{2}", Languages.Startup_GeneratingWithCustomSize, worldX, worldY); } Terraria_Server.Main.maxTilesX = worldX; Terraria_Server.Main.maxTilesY = worldY; WorldIO.ClearWorld(); Terraria_Server.Main.Initialize(); if (properties.UseCustomGenOpts) { WorldGen.numDungeons = properties.DungeonAmount; WorldModify.ficount = properties.FloatingIslandAmount; } else { WorldGen.numDungeons = 1; WorldModify.ficount = (int)((double)Terraria_Server.Main.maxTilesX * 0.0008); //The Statics one was generating with default values, We want it to use the actual tileX for the world } WorldGen.GenerateWorld(null, seed); WorldIO.SaveWorld(worldFile, true); } ctx = new HookContext { Sender = World.Sender, }; eArgs = new HookArgs.ServerStateChange { ServerChangeState = ServerState.LOADING }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); // TODO: read map size from world file instead of config int worldXtiles = properties.GetMapSizes()[0]; int worldYtiles = properties.GetMapSizes()[1]; if (properties.UseCustomTiles) { int X = properties.MaxTilesX; int Y = properties.MaxTilesY; if (X > 0 && Y > 0) { worldXtiles = X; worldYtiles = Y; } if (worldXtiles < (int)World.MAP_SIZE.SMALL_X || worldYtiles < (int)World.MAP_SIZE.SMALL_Y) { ProgramLog.Log("{0} {1}x{2}", Languages.Startup_WorldSizingError, (int)World.MAP_SIZE.SMALL_X, (int)World.MAP_SIZE.SMALL_Y); worldXtiles = (int)((int)World.MAP_SIZE.SMALL_Y * 3.5); worldYtiles = (int)World.MAP_SIZE.SMALL_Y; } ProgramLog.Log("{0} {1}x{2}", Languages.Startup_GeneratingWithCustomSize, worldXtiles, worldXtiles); } World.SavePath = worldFile; Server.InitializeData(properties.MaxPlayers, Statics.DataPath + Path.DirectorySeparatorChar + "whitelist.txt", Statics.DataPath + Path.DirectorySeparatorChar + "banlist.txt", Statics.DataPath + Path.DirectorySeparatorChar + "oplist.txt"); NetPlay.password = properties.Password; NetPlay.serverPort = properties.Port; NetPlay.serverSIP = properties.ServerIP; Terraria_Server.Main.Initialize(); Terraria_Server.Main.maxTilesX = worldXtiles; Terraria_Server.Main.maxTilesY = worldYtiles; Terraria_Server.Main.maxSectionsX = worldXtiles / 200; Terraria_Server.Main.maxSectionsY = worldYtiles / 150; WorldIO.LoadWorld(null, null, World.SavePath); ctx = new HookContext { Sender = World.Sender, }; eArgs = new HookArgs.ServerStateChange { ServerChangeState = ServerState.LOADED }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); updateThread = new ProgramThread("Updt", Program.UpdateLoop); ProgramLog.Log(Languages.Startup_StartingTheServer); NetPlay.StartServer(); while (!NetPlay.ServerUp) { } ThreadPool.QueueUserWorkItem(CommandThread); ProgramLog.Console.Print(Languages.Startup_YouCanNowInsertCommands); while (WorldModify.saveLock || NetPlay.ServerUp || Restarting) { Thread.Sleep(100); } ProgramLog.Log(Languages.Startup_Exiting); Thread.Sleep(1000); } catch (UpdateCompleted) { } catch (Exception e) { try { using (StreamWriter streamWriter = new StreamWriter(Statics.DataPath + Path.DirectorySeparatorChar + "crashlog.txt", true)) { streamWriter.WriteLine(DateTime.Now); streamWriter.WriteLine(String.Format("{0} {1}", Languages.Startup_CrashlogGeneratedBy, MODInfo)); streamWriter.WriteLine(e); streamWriter.WriteLine(); } ProgramLog.Log(e, Languages.Startup_ProgramCrash); ProgramLog.Log("{0} crashlog.txt -> http://tdsm.org/", Languages.Startup_PleaseSend); } catch { } } if (properties != null && File.Exists(properties.PIDFile.Trim())) { File.Delete(properties.PIDFile.Trim()); } Thread.Sleep(500); ProgramLog.Log(Languages.Startup_LogEnd); ProgramLog.Close(); RemoteConsole.RConServer.Stop(); }
public override void LoadWorldData(TagCompound tag) { WorldIO.LoadModData(tag.GetList <TagCompound>("list")); WorldIO.LoadNPCs(tag.GetList <TagCompound>("unloadedNPCs")); WorldIO.LoadNPCKillCounts(tag.GetList <TagCompound>("unloadedKillCounts")); }
private static void UpdateTime() { Time += 1.0; if (!dayTime) { if (WorldModify.spawnEye && Time > 4860.0) { foreach (Player player in players) { if (player.Active && !player.dead && (double)player.Position.Y < worldSurface * 16.0) { NPC.SpawnOnPlayer(player.whoAmi, 4); WorldModify.spawnEye = false; break; } } } if (Time > 32400.0) { checkXmas(); if (invasionDelay > 0) { invasionDelay--; } WorldModify.spawnNPC = 0; checkForSpawns = 0; Time = 0.0; bloodMoon = false; dayTime = true; moonPhase++; if (moonPhase >= 8) { moonPhase = 0; } NetMessage.SendData(7); WorldIO.SaveWorldThreaded(); if (WorldModify.shadowOrbSmashed) { var startInvasion = !NPC.downedGoblins ? rand.Next(3) == 0 : rand.Next(15) == 0; if (startInvasion) { StartInvasion(); } } } if (Time > 16200.0 && WorldModify.spawnMeteor) { WorldModify.spawnMeteor = false; WorldModify.dropMeteor(null, null); return; } } else { bloodMoon = false; if (Time > 54000.0) { WorldModify.spawnNPC = 0; checkForSpawns = 0; if (rand.Next(50) == 0 && WorldModify.shadowOrbSmashed) { WorldModify.spawnMeteor = true; } if (!NPC.downedBoss1) { bool flag = false; foreach (Player player in players) { if (player.Active && player.statLifeMax >= 200 && player.statDefense > 10) { flag = true; break; } } if (flag && rand.Next(3) == 0) { int num = 0; for (int i = 0; i < NPC.MAX_NPCS; i++) { if (npcs[i].Active && npcs[i].townNPC) { num++; } } if (num >= 4) { WorldModify.spawnEye = true; NetMessage.SendData(25, -1, -1, "You feel an evil presence watching you...", 255, 50f, 255f, 130f); } } } if (!WorldModify.spawnEye && moonPhase != 4 && rand.Next(9) == 0) { for (int i = 0; i < 255; i++) { if (players[i].Active && players[i].statLifeMax > 100) { bloodMoon = true; break; } } if (bloodMoon) { NetMessage.SendData(25, -1, -1, "The Blood Moon is rising...", 255, 50f, 255f, 130f); } } Time = 0.0; dayTime = false; NetMessage.SendData(7); } //checkForSpawns++; if (++checkForSpawns >= 7200) { int num2 = 0; for (int i = 0; i < 255; i++) { if (players[i].Active) { num2++; } } checkForSpawns = 0; WorldModify.spawnNPC = 0; int num3 = 0; int num4 = 0; int num5 = 0; int num6 = 0; int num7 = 0; int num8 = 0; int num9 = 0; int num10 = 0; int num11 = 0; int goblin = 0, wizard = 0, mechanic = 0, santa = 0; for (int i = 0; i < NPC.MAX_NPCS; i++) { if (npcs[i].Active && npcs[i].townNPC) { if (npcs[i].type != NPCType.N37_OLD_MAN && !npcs[i].homeless) { WorldModify.QuickFindHome(null, i); } switch (npcs[i].type) { case NPCType.N37_OLD_MAN: num8++; break; case NPCType.N17_MERCHANT: num3++; break; case NPCType.N18_NURSE: num4++; break; case NPCType.N19_ARMS_DEALER: num6++; break; case NPCType.N20_DRYAD: num5++; break; case NPCType.N22_GUIDE: num7++; break; case NPCType.N38_DEMOLITIONIST: num9++; break; case NPCType.N54_CLOTHIER: num10++; break; case NPCType.N107_GOBLIN_TINKERER: goblin++; break; case NPCType.N108_WIZARD: wizard++; break; case NPCType.N124_MECHANIC: mechanic++; break; case NPCType.N142_SANTA_CLAUS: santa++; break; } num11++; } } if (WorldModify.spawnNPC == 0) { int num12 = 0; bool flag2 = false; int num13 = 0; bool flag3 = false; bool flag4 = false; for (int i = 0; i < 255; i++) { if (players[i].Active) { for (int j = 0; j < 44; j++) { if (players[i].inventory[j] != null & players[i].inventory[j].Stack > 0) { if (players[i].inventory[j].Type == 71) { num12 += players[i].inventory[j].Stack; } if (players[i].inventory[j].Type == 72) { num12 += players[i].inventory[j].Stack * 100; } if (players[i].inventory[j].Type == 73) { num12 += players[i].inventory[j].Stack * 10000; } if (players[i].inventory[j].Type == 74) { num12 += players[i].inventory[j].Stack * 1000000; } if (players[i].inventory[j].Ammo == ProjectileType.N14_BULLET || players[i].inventory[j].UseAmmo == ProjectileType.N14_BULLET) { flag3 = true; } if (players[i].inventory[j].Type == 166 || players[i].inventory[j].Type == 167 || players[i].inventory[j].Type == 168 || players[i].inventory[j].Type == 235) { flag4 = true; } } } int num14 = players[i].statLifeMax / 20; if (num14 > 5) { flag2 = true; } num13 += num14; } } if (!NPC.downedBoss3 && num8 == 0) { int num15 = NPC.NewNPC(dungeonX * 16 + 8, dungeonY * 16, 37, 0); npcs[num15].homeless = false; npcs[num15].homeTileX = dungeonX; npcs[num15].homeTileY = dungeonY; } if (WorldModify.spawnNPC == 0 && num7 < 1) { WorldModify.spawnNPC = 22; } if (WorldModify.spawnNPC == 0 && (double)num12 > 5000.0 && num3 < 1) { WorldModify.spawnNPC = 17; } if (WorldModify.spawnNPC == 0 && flag2 && num4 < 1) { WorldModify.spawnNPC = 18; } if (WorldModify.spawnNPC == 0 && flag3 && num6 < 1) { WorldModify.spawnNPC = 19; } if (WorldModify.spawnNPC == 0 && (NPC.downedBoss1 || NPC.downedBoss2 || NPC.downedBoss3) && num5 < 1) { WorldModify.spawnNPC = 20; } if (WorldModify.spawnNPC == 0 && flag4 && num3 > 0 && num9 < 1) { WorldModify.spawnNPC = 38; } if (WorldModify.spawnNPC == 0 && NPC.downedBoss3 && num10 < 1) { WorldModify.spawnNPC = 54; } if (WorldModify.spawnNPC == 0 && NPC.savedGoblin && goblin < 1) { WorldModify.spawnNPC = 107; } if (WorldModify.spawnNPC == 0 && NPC.savedWizard && wizard < 1) { WorldModify.spawnNPC = 108; } if (WorldModify.spawnNPC == 0 && NPC.savedMech && mechanic < 1) { WorldModify.spawnNPC = 124; } if (WorldModify.spawnNPC == 0 && NPC.downedFrost && santa < 1 && Xmas) { WorldModify.spawnNPC = 142; } } } } }
public static void ServerLoop() { Main.players[255].whoAmi = 255; NetPlay.serverIP = IPAddress.Parse(serverSIP); NetPlay.serverListenIP = NetPlay.serverIP; NetPlay.disconnect = false; // for (int i = 0; i < 256; i++) // { //// Netplay.slots[i] = new ServerSlot(); // Netplay.slots[i].whoAmI = i; // Netplay.slots[i].Reset(); // } Init(); NetPlay.tcpListener = new TcpListener(NetPlay.serverListenIP, NetPlay.serverPort); try { NetPlay.tcpListener.Start(); } catch (Exception exception) { ProgramLog.Error.Log("Error Starting the Server: {0}", exception); NetPlay.disconnect = true; } if (!NetPlay.disconnect) { if (!Program.updateThread.IsAlive) { Program.updateThread.Start(); } ProgramLog.Admin.Log("{0} {1}:{2}", Language.Languages.ServerStartedOn, serverSIP, serverPort); // ProgramLog.Log("Loading Plugins..."); // PluginManager.LoadAllPlugins(); // ProgramLog.Log("Plugins Loaded: " + PluginManager.Plugins.Count.ToString()); //Statics.serverStarted = true; } else { return; } SlotManager.Initialize(Program.properties.MaxPlayers, Program.properties.OverlimitSlots); ServerUp = true; var serverSock = NetPlay.tcpListener.Server; try { while (!NetPlay.disconnect) { NetPlay.anyClients = Networking.ClientConnection.All.Count > 0; //clientList.Count > 0; serverSock.Poll(500000, SelectMode.SelectRead); if (NetPlay.disconnect) { break; } // Accept new clients while (NetPlay.tcpListener.Pending()) { var client = NetPlay.tcpListener.AcceptSocket(); var accepted = AcceptClient(client); if (accepted) { NetPlay.anyClients = true; } } } } catch (Exception e) { ProgramLog.Log(e, "ServerLoop terminated with exception"); } NetPlay.anyClients = false; try { tcpListener.Stop(); } catch (SocketException) { } lock (Networking.ClientConnection.All) { var conns = Networking.ClientConnection.All.ToArray(); foreach (var conn in conns) { conn.Kick("Server is shutting down."); } } for (int i = 0; i < 255; i++) { try { slots[i].Kick("Server is shutting down."); } catch { } } Thread.Sleep(1000); for (int i = 0; i < 255; i++) { try { slots[i].Reset(); } catch { } } if (!WorldIO.SaveWorld(World.SavePath, true)) { ProgramLog.Error.Log("Saving failed. Quitting without saving."); } ServerUp = false; }
//static TimeChangedEvent timeEvent = new TimeChangedEvent(); private static void UpdateTime() { Main.time += 1.0; //Server.PluginManager.processHook(Hooks.TIME_CHANGED, timeEvent); if (!Main.dayTime) { if (WorldModify.spawnEye) { if (Main.time > 4860.0) { int count = 0; foreach (Player player in Main.players) { if (player.Active && !player.dead && (double)player.Position.Y < Main.worldSurface * 16.0) { NPC.SpawnOnPlayer(player, count, 4); WorldModify.spawnEye = false; break; } count++; } } } if (Main.time > 32400.0) { if (Main.invasionDelay > 0) { Main.invasionDelay--; } WorldModify.spawnNPC = 0; Main.checkForSpawns = 0; Main.time = 0.0; Main.bloodMoon = false; Main.dayTime = true; Main.moonPhase++; if (Main.moonPhase >= 8) { Main.moonPhase = 0; } NetMessage.SendData(7); WorldIO.SaveWorldThreaded(); if (Main.rand.Next(15) == 0) { Main.StartInvasion(); } } if (Main.time > 16200.0 && WorldModify.spawnMeteor) { WorldModify.spawnMeteor = false; WorldModify.dropMeteor(); } } else { if (Main.time > 54000.0) { WorldModify.spawnNPC = 0; Main.checkForSpawns = 0; if (Main.rand.Next(50) == 0 && WorldModify.shadowOrbSmashed) { WorldModify.spawnMeteor = true; } if (!NPC.downedBoss1) { bool flag = false; foreach (Player player in Main.players) { if (player.Active && player.statLifeMax >= 200) { flag = true; break; } } if (flag && Main.rand.Next(3) == 0) { int num = 0; for (int i = 0; i < NPC.MAX_NPCS; i++) { if (Main.npcs[i].Active) { if (Main.npcs[i].townNPC) { num++; } } } if (num >= 4) { WorldModify.spawnEye = true; NetMessage.SendData(25, -1, -1, "You feel an evil presence watching you...", 255, 50f, 255f, 130f); } } } if (!WorldModify.spawnEye && Main.moonPhase != 4 && Main.rand.Next(7) == 0) { for (int i = 0; i < 255; i++) { if (Main.players[i].Active && Main.players[i].statLifeMax > 100) { Main.bloodMoon = true; break; } } if (Main.bloodMoon) { NetMessage.SendData(25, -1, -1, "The Blood Moon is rising...", 255, 50f, 255f, 130f); } } Main.time = 0.0; Main.dayTime = false; NetMessage.SendData(7); } Main.checkForSpawns++; if (Main.checkForSpawns >= 7200) { int num2 = 0; for (int i = 0; i < 255; i++) { if (Main.players[i].Active) { num2++; } } Main.checkForSpawns = 0; WorldModify.spawnNPC = 0; int num3 = 0; int num4 = 0; int num5 = 0; int num6 = 0; int num7 = 0; int num8 = 0; int num9 = 0; int num10 = 0; int num11 = 0; for (int i = 0; i < NPC.MAX_NPCS; i++) { if (Main.npcs[i].Active && Main.npcs[i].townNPC) { if (Main.npcs[i].type != NPCType.N37_OLD_MAN && !Main.npcs[i].homeless) { WorldModify.QuickFindHome(i); } else { num8++; } switch (Main.npcs[i].type) { case NPCType.N17_MERCHANT: num3++; break; case NPCType.N18_NURSE: num4++; break; case NPCType.N19_ARMS_DEALER: num6++; break; case NPCType.N20_DRYAD: num5++; break; case NPCType.N22_GUIDE: num7++; break; case NPCType.N38_DEMOLITIONIST: num9++; break; case NPCType.N54_CLOTHIER: num10++; break; } num11++; } } if (WorldModify.spawnNPC == 0) { int num12 = 0; bool flag2 = false; int num13 = 0; bool flag3 = false; bool flag4 = false; for (int i = 0; i < 255; i++) { if (Main.players[i].Active) { for (int j = 0; j < 44; j++) { if (Main.players[i].inventory[j] != null & Main.players[i].inventory[j].Stack > 0) { if (Main.players[i].inventory[j].Type == 71) { num12 += Main.players[i].inventory[j].Stack; } if (Main.players[i].inventory[j].Type == 72) { num12 += Main.players[i].inventory[j].Stack * 100; } if (Main.players[i].inventory[j].Type == 73) { num12 += Main.players[i].inventory[j].Stack * 10000; } if (Main.players[i].inventory[j].Type == 74) { num12 += Main.players[i].inventory[j].Stack * 1000000; } if (Main.players[i].inventory[j].Ammo == ProjectileType.N14_BULLET || Main.players[i].inventory[j].UseAmmo == ProjectileType.N14_BULLET) { flag3 = true; } if (Main.players[i].inventory[j].Type == 166 || Main.players[i].inventory[j].Type == 167 || Main.players[i].inventory[j].Type == 168 || Main.players[i].inventory[j].Type == 235) { flag4 = true; } } } int num14 = Main.players[i].statLifeMax / 20; if (num14 > 5) { flag2 = true; } num13 += num14; } } if (num7 < 1) { WorldModify.spawnNPC = 22; } if ((double)num12 > 5000.0 && num3 < 1) { WorldModify.spawnNPC = 17; } if (flag2 && num4 < 1) { WorldModify.spawnNPC = 18; } if (flag3 && num6 < 1) { WorldModify.spawnNPC = 19; } if ((NPC.downedBoss1 || NPC.downedBoss2 || NPC.downedBoss3) && num5 < 1) { WorldModify.spawnNPC = 20; } if (flag4 && num3 > 0 && num9 < 1) { WorldModify.spawnNPC = 38; } if (NPC.downedBoss3 && num10 < 1) { WorldModify.spawnNPC = 54; } if (num12 > 100000 && num3 < 2 && num2 > 2) { WorldModify.spawnNPC = 17; } if (num13 >= 20 && num4 < 2 && num2 > 2) { WorldModify.spawnNPC = 18; } if (num12 > 5000000 && num3 < 3 && num2 > 4) { WorldModify.spawnNPC = 17; } if (!NPC.downedBoss3 && num8 == 0) { int num15 = NPC.NewNPC(Main.dungeonX * 16 + 8, Main.dungeonY * 16, 37, 0); Main.npcs[num15].homeless = false; Main.npcs[num15].homeTileX = Main.dungeonX; Main.npcs[num15].homeTileY = Main.dungeonY; } } } } }
public override void Load(TagCompound tag) { WorldIO.LoadModData(tag.GetList <TagCompound>("list")); }
public static void Main(string[] args) { Thread.CurrentThread.Name = "Main"; try { string MODInfo = "Terraria's Dedicated Server Mod. (" + VERSION_NUMBER + " {" + Statics.CURRENT_TERRARIA_RELEASE + "}) #" + Statics.BUILD; try { Console.Title = MODInfo; } catch { } var lis = new Logging.LogTraceListener(); System.Diagnostics.Trace.Listeners.Clear(); System.Diagnostics.Trace.Listeners.Add(lis); System.Diagnostics.Debug.Listeners.Clear(); System.Diagnostics.Debug.Listeners.Add(lis); ProgramLog.Log("Initializing " + MODInfo); ProgramLog.Log("Setting up Paths."); if (!SetupPaths()) { return; } Platform.InitPlatform(); ProgramLog.Log("Setting up Properties."); bool propertiesExist = File.Exists("server.properties"); SetupProperties(); if (!propertiesExist) { ProgramLog.Console.Print("New properties file created. Would you like to exit for editing? [Y/n]: "); if (Console.ReadLine().ToLower() == "y") { ProgramLog.Console.Print("Complete, Press any Key to Exit..."); Console.ReadKey(true); return; } } var logFile = Statics.DataPath + Path.DirectorySeparatorChar + "server.log"; ProgramLog.OpenLogFile(logFile); string PIDFile = properties.PIDFile.Trim(); if (PIDFile.Length > 0) { string ProcessUID = Process.GetCurrentProcess().Id.ToString(); bool Issue = false; if (File.Exists(PIDFile)) { try { File.Delete(PIDFile); } catch (Exception) { ProgramLog.Console.Print("Issue deleting PID file, Continue? [Y/n]: "); if (Console.ReadLine().ToLower() == "n") { ProgramLog.Console.Print("Press any Key to Exit..."); Console.ReadKey(true); return; } Issue = true; } } if (!Issue) { try { File.WriteAllText(PIDFile, ProcessUID); } catch (Exception) { ProgramLog.Console.Print("Issue creating PID file, Continue? [Y/n]: "); if (Console.ReadLine().ToLower() == "n") { ProgramLog.Console.Print("Press any Key to Exit..."); Console.ReadKey(true); return; } } ProgramLog.Log("PID File Created, Process ID: " + ProcessUID); } } ParseArgs(args); try { if (UpdateManager.performProcess()) { ProgramLog.Log("Restarting into new update!"); return; } } catch (UpdateCompleted) { throw; } catch (Exception e) { ProgramLog.Log(e, "Error updating"); } LoadMonitor.Start(); ProgramLog.Log("Starting remote console server"); RemoteConsole.RConServer.Start("rcon_logins.properties"); ProgramLog.Log("Starting permissions manager"); permissionManager = new PermissionManager(); ProgramLog.Log("Preparing Server Data..."); using (var prog = new ProgressLogger(1, "Loading item definitions")) Collections.Registries.Item.Load(); using (var prog = new ProgressLogger(1, "Loading NPC definitions")) Collections.Registries.NPC.Load(Collections.Registries.NPC_FILE); using (var prog = new ProgressLogger(1, "Loading projectile definitions")) Collections.Registries.Projectile.Load(Collections.Registries.PROJECTILE_FILE); commandParser = new CommandParser(); commandParser.ReadPermissionNodes(); ProgramLog.Log("Loading plugins..."); Terraria_Server.Plugins.PluginManager.Initialize(Statics.PluginPath, Statics.LibrariesPath); var ctx = new HookContext() { Sender = new ConsoleSender() }; var eArgs = new HookArgs.ServerStateChange() { ServerChangeState = ServerState.INITIALIZING }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); PluginManager.LoadPlugins(); ProgramLog.Log("Plugins loaded: " + PluginManager.PluginCount); string worldFile = properties.WorldPath; FileInfo file = new FileInfo(worldFile); if (!file.Exists) { try { file.Directory.Create(); } catch (Exception exception) { ProgramLog.Log(exception); ProgramLog.Console.Print("Press any key to continue..."); Console.ReadKey(true); return; } ctx = new HookContext { Sender = World.Sender, }; eArgs = new HookArgs.ServerStateChange { ServerChangeState = ServerState.GENERATING }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); ProgramLog.Log("Generating world '{0}'", worldFile); string seed = properties.Seed; if (seed == "-1") { seed = new Random().Next(100).ToString(); ProgramLog.Log("Generated seed: {0}", seed); } int worldX = properties.GetMapSizes()[0]; int worldY = properties.GetMapSizes()[1]; if (properties.UseCustomTiles) { int X = properties.MaxTilesX; int Y = properties.MaxTilesY; if (X > 0 && Y > 0) { worldX = X; worldY = Y; } if (worldX < (int)World.MAP_SIZE.SMALL_X || worldY < (int)World.MAP_SIZE.SMALL_Y) { ProgramLog.Log("World dimensions need to be equal to or larger than {0} by {1}; using built-in 'small'", (int)World.MAP_SIZE.SMALL_X, (int)World.MAP_SIZE.SMALL_Y); worldX = (int)((int)World.MAP_SIZE.SMALL_Y * 3.5); worldY = (int)World.MAP_SIZE.SMALL_Y; } ProgramLog.Log("Generating world with custom map size: {0}x{1}", worldX, worldY); } Terraria_Server.Main.maxTilesX = worldX; Terraria_Server.Main.maxTilesY = worldY; WorldIO.clearWorld(); Terraria_Server.Main.Initialize(); if (properties.UseCustomGenOpts) { WorldGen.numDungeons = properties.DungeonAmount; WorldModify.ficount = properties.FloatingIslandAmount; } else { WorldGen.numDungeons = 1; WorldModify.ficount = (int)((double)Terraria_Server.Main.maxTilesX * 0.0008); //The Statics one was generating with default values, We want it to use the actual tileX for the world } WorldGen.GenerateWorld(seed); WorldIO.saveWorld(worldFile, true); } ctx = new HookContext { Sender = World.Sender, }; eArgs = new HookArgs.ServerStateChange { ServerChangeState = ServerState.LOADING }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); // TODO: read map size from world file instead of config int worldXtiles = properties.GetMapSizes()[0]; int worldYtiles = properties.GetMapSizes()[1]; if (properties.UseCustomTiles) { int X = properties.MaxTilesX; int Y = properties.MaxTilesY; if (X > 0 && Y > 0) { worldXtiles = X; worldYtiles = Y; } if (worldXtiles < (int)World.MAP_SIZE.SMALL_X || worldYtiles < (int)World.MAP_SIZE.SMALL_Y) { ProgramLog.Log("World dimensions need to be equal to or larger than {0} by {1}; using built-in 'small'", (int)World.MAP_SIZE.SMALL_X, (int)World.MAP_SIZE.SMALL_Y); worldXtiles = (int)((int)World.MAP_SIZE.SMALL_Y * 3.5); worldYtiles = (int)World.MAP_SIZE.SMALL_Y; } ProgramLog.Log("Using world with custom map size: {0}x{1}", worldXtiles, worldYtiles); } World world = new World(worldXtiles, worldYtiles); world.SavePath = worldFile; Server.InitializeData(world, properties.MaxPlayers, Statics.DataPath + Path.DirectorySeparatorChar + "whitelist.txt", Statics.DataPath + Path.DirectorySeparatorChar + "banlist.txt", Statics.DataPath + Path.DirectorySeparatorChar + "oplist.txt"); NetPlay.password = properties.Password; NetPlay.serverPort = properties.Port; NetPlay.serverSIP = properties.ServerIP; Terraria_Server.Main.Initialize(); Terraria_Server.Main.maxTilesX = worldXtiles; Terraria_Server.Main.maxTilesY = worldYtiles; Terraria_Server.Main.maxSectionsX = worldXtiles / 200; Terraria_Server.Main.maxSectionsY = worldYtiles / 150; WorldIO.LoadWorld(Server.World.SavePath); ctx = new HookContext { Sender = World.Sender, }; eArgs = new HookArgs.ServerStateChange { ServerChangeState = ServerState.LOADED }; HookPoints.ServerStateChange.Invoke(ref ctx, ref eArgs); updateThread = new ProgramThread("Updt", Program.UpdateLoop); ProgramLog.Log("Starting the Server"); NetPlay.StartServer(); while (!NetPlay.ServerUp) { } ProgramLog.Console.Print("You can now insert Commands."); while (!Statics.Exit) { try { string line = Console.ReadLine(); if (line.Length > 0) { commandParser.ParseConsoleCommand(line); } } catch (ExitException e) { ProgramLog.Log(e.Message); break; } catch (Exception e) { ProgramLog.Log(e, "Issue parsing console command"); } } while (WorldModify.saveLock || NetPlay.ServerUp) { Thread.Sleep(100); } ProgramLog.Log("Exiting..."); Thread.Sleep(1000); } catch (UpdateCompleted) { } catch (Exception e) { try { using (StreamWriter streamWriter = new StreamWriter(Statics.DataPath + Path.DirectorySeparatorChar + "crashlog.txt", true)) { streamWriter.WriteLine(DateTime.Now); streamWriter.WriteLine("Crash Log Generated by TDSM #" + Statics.BUILD + " for " + //+ " r" + Statics.revision + " for " + VERSION_NUMBER + " {" + Statics.CURRENT_TERRARIA_RELEASE + "}"); streamWriter.WriteLine(e); streamWriter.WriteLine(""); } ProgramLog.Log(e, "Program crash"); ProgramLog.Log("Please send crashlog.txt to http://tdsm.org/"); } catch { } } if (File.Exists(properties.PIDFile.Trim())) { File.Delete(properties.PIDFile.Trim()); } Thread.Sleep(500); ProgramLog.Log("Log end."); ProgramLog.Close(); RemoteConsole.RConServer.Stop(); }