TrueCraft/TrueCraft.Launcher/Singleplayer/SingleplayerServer.cs
2015-09-07 17:25:14 -04:00

85 lines
3.1 KiB
C#

using System;
using TrueCraft.Core.World;
using System.Threading.Tasks;
using TrueCraft.API.Logging;
using TrueCraft.API;
using System.Net;
using TrueCraft.Core.Logging;
using TrueCraft;
namespace TrueCraft.Launcher.Singleplayer
{
public class SingleplayerServer
{
public delegate void ProgressNotification(double progress, string stage);
public MultiplayerServer Server { get; set; }
public World World { get; set; }
public SingleplayerServer(World world)
{
World = world;
Server = new MultiplayerServer();
TrueCraft.Program.ServerConfiguration = new ServerConfiguration()
{
MOTD = null,
Singleplayer = true
};
world.BlockRepository = Server.BlockRepository;
Server.AddWorld(world);
Server.AddLogProvider(new ConsoleLogProvider());
}
public void Initialize(ProgressNotification progressNotification = null)
{
Server.Log(LogCategory.Notice, "Generating world around spawn point...");
for (int x = -5; x < 5; x++)
{
for (int z = -5; z < 5; z++)
World.GetChunk(new Coordinates2D(x, z));
int progress = (int)(((x + 5) / 10.0) * 100);
if (progressNotification != null)
progressNotification(progress / 100.0, "Generating world...");
if (progress % 10 == 0)
Server.Log(LogCategory.Notice, "{0}% complete", progress + 10);
}
Server.Log(LogCategory.Notice, "Simulating the world for a moment...");
for (int x = -5; x < 5; x++)
{
for (int z = -5; z < 5; z++)
{
var chunk = World.GetChunk(new Coordinates2D(x, z));
for (byte _x = 0; _x < Chunk.Width; _x++)
{
for (byte _z = 0; _z < Chunk.Depth; _z++)
{
for (int _y = 0; _y < chunk.GetHeight(_x, _z); _y++)
{
var coords = new Coordinates3D(x + _x, _y, z + _z);
var data = World.GetBlockData(coords);
var provider = World.BlockRepository.GetBlockProvider(data.ID);
provider.BlockUpdate(data, data, Server, World);
}
}
}
}
int progress = (int)(((x + 5) / 10.0) * 100);
if (progressNotification != null)
progressNotification(progress / 100.0, "Simulating world...");
if (progress % 10 == 0)
Server.Log(LogCategory.Notice, "{0}% complete", progress + 10);
}
World.Save();
}
public void Start()
{
Server.Start(new IPEndPoint(IPAddress.Loopback, 0));
}
public void Stop()
{
Server.Stop();
}
}
}