diff --git a/ClassicalSharp.sln b/ClassicalSharp.sln
index cd0f61af6..06c6fef8c 100644
--- a/ClassicalSharp.sln
+++ b/ClassicalSharp.sln
@@ -1,6 +1,6 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
# SharpDevelop 4.4
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClassicalSharp", "ClassicalSharp\ClassicalSharp.csproj", "{BEB1C785-5CAD-48FF-A886-876BF0A318D4}"
EndProject
@@ -21,14 +21,14 @@ Global
{23B9BDA8-4330-46AB-9012-08D87430391A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.Build.0 = Release|Any CPU
{23B9BDA8-4330-46AB-9012-08D87430391A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug_DX|Any CPU.Build.0 = Debug|Any CPU
- {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug_DX|Any CPU.ActiveCfg = Debug|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug_DX|Any CPU.Build.0 = Debug|Any CPU
+ {23B9BDA8-4330-46AB-9012-08D87430391A}.Debug_DX|Any CPU.ActiveCfg = Debug|Any CPU
{BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.Build.0 = Release|Any CPU
{BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug_DX|Any CPU.Build.0 = Debug_DX|Any CPU
- {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug_DX|Any CPU.ActiveCfg = Debug_DX|Any CPU
+ {BEB1C785-5CAD-48FF-A886-876BF0A318D4}.Debug_DX|Any CPU.ActiveCfg = Debug_DX|Any CPU
{35FEE071-2DE6-48A1-9343-B5C1F202A12B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{35FEE071-2DE6-48A1-9343-B5C1F202A12B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{35FEE071-2DE6-48A1-9343-B5C1F202A12B}.Release|Any CPU.Build.0 = Release|Any CPU
diff --git a/ClassicalSharp/ClassicalSharp.csproj b/ClassicalSharp/ClassicalSharp.csproj
index dd3e3a1e3..5750af17b 100644
--- a/ClassicalSharp/ClassicalSharp.csproj
+++ b/ClassicalSharp/ClassicalSharp.csproj
@@ -128,11 +128,13 @@
-
-
-
+
+
-
+
+
+
+
@@ -184,6 +186,7 @@
+
diff --git a/ClassicalSharp/Game/Game.cs b/ClassicalSharp/Game/Game.cs
index 94e351453..16a4b0e7d 100644
--- a/ClassicalSharp/Game/Game.cs
+++ b/ClassicalSharp/Game/Game.cs
@@ -19,7 +19,7 @@ namespace ClassicalSharp {
public IGraphicsApi Graphics;
public Map Map;
- public NetworkProcessor Network;
+ public INetworkProcessor Network;
public EntityList Players = new EntityList();
public CpeListInfo[] CpePlayersList = new CpeListInfo[256];
diff --git a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs
index 188b975b5..acceb24ce 100644
--- a/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs
+++ b/ClassicalSharp/GraphicsAPI/Direct3D9Api.cs
@@ -278,7 +278,7 @@ namespace ClassicalSharp.GraphicsAPI {
}
public override void DrawIndexedVb( DrawMode mode, int indicesCount, int startIndex ) {
- device.DrawIndexedPrimitives( modeMappings[(int)mode], 0, 0,
+ device.DrawIndexedPrimitives( modeMappings[(int)mode], 0, startIndex / 6 * 4,
indicesCount / 6 * 4, startIndex, NumPrimitives( indicesCount, mode ) );
}
diff --git a/ClassicalSharp/Network/INetworkProcessor.cs b/ClassicalSharp/Network/INetworkProcessor.cs
new file mode 100644
index 000000000..ffc6b6485
--- /dev/null
+++ b/ClassicalSharp/Network/INetworkProcessor.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Net;
+using OpenTK;
+using OpenTK.Input;
+
+namespace ClassicalSharp {
+
+ /// Represents a connection to either a multiplayer server, or an internal single player server.
+ public abstract class INetworkProcessor {
+
+ public abstract bool IsSinglePlayer { get; }
+
+ public abstract void Connect( IPAddress address, int port );
+
+ public abstract void SendChat( string text );
+
+ public abstract void SendPosition( Vector3 pos, float yaw, float pitch );
+
+ public abstract void SendSetBlock( int x, int y, int z, bool place, byte block );
+
+ public abstract void SendPlayerClick( MouseButton button, bool buttonDown, byte targetId, PickedPos pos );
+
+ public abstract void Tick( double delta );
+
+ public abstract void Dispose();
+
+ public string ServerName, ServerMotd;
+ public bool Disconnected;
+ public bool UsingExtPlayerList, UsingPlayerClick;
+ }
+}
\ No newline at end of file
diff --git a/ClassicalSharp/Network/NetworkProcessor.cs b/ClassicalSharp/Network/NetworkProcessor.cs
index c4c61eb4b..7f71d6645 100644
--- a/ClassicalSharp/Network/NetworkProcessor.cs
+++ b/ClassicalSharp/Network/NetworkProcessor.cs
@@ -14,31 +14,31 @@ using OpenTK.Input;
namespace ClassicalSharp {
- public partial class NetworkProcessor {
+ public partial class NetworkProcessor : INetworkProcessor {
public NetworkProcessor( Game window ) {
- Window = window;
+ game = window;
+ }
+
+ public override bool IsSinglePlayer {
+ get { return false; }
}
Socket socket;
NetworkStream stream;
- public Game Window;
- public string ServerName, ServerMotd;
- public bool Disconnected;
+ Game game;
bool sendHeldBlock;
bool useMessageTypes;
bool useBlockPermissions;
bool receivedFirstPosition;
- public bool UsingExtPlayerList;
- public bool UsingPlayerClick;
- public void Connect( IPAddress address, int port ) {
+ public override void Connect( IPAddress address, int port ) {
socket = new Socket( address.AddressFamily, SocketType.Stream, ProtocolType.Tcp );
try {
socket.Connect( address, port );
} catch( SocketException ex ) {
Utils.LogError( "Error while trying to connect: {0}{1}", Environment.NewLine, ex );
- Window.Disconnect( "&eUnable to reach " + address + ":" + port,
+ game.Disconnect( "&eUnable to reach " + address + ":" + port,
"Unable to establish an underlying connection" );
Dispose();
return;
@@ -46,55 +46,55 @@ namespace ClassicalSharp {
stream = new NetworkStream( socket, true );
reader = new FastNetReader( stream );
gzippedMap = new FixedBufferStream( reader.buffer );
- MakeLoginPacket( Window.Username, Window.Mppass );
+ MakeLoginPacket( game.Username, game.Mppass );
SendPacket();
}
- public void SendChat( string text ) {
+ public override void SendChat( string text ) {
if( !String.IsNullOrEmpty( text ) ) {
MakeMessagePacket( text );
SendPacket();
}
}
- public void SendPosition( Vector3 pos, float yaw, float pitch ) {
- byte payload = sendHeldBlock ? (byte)Window.HeldBlock : (byte)0xFF;
+ public override void SendPosition( Vector3 pos, float yaw, float pitch ) {
+ byte payload = sendHeldBlock ? (byte)game.HeldBlock : (byte)0xFF;
MakePositionPacket( pos, yaw, pitch, payload );
SendPacket();
}
- public void SendSetBlock( int x, int y, int z, bool place, byte block ) {
+ public override void SendSetBlock( int x, int y, int z, bool place, byte block ) {
MakeSetBlockPacket( (short)x, (short)y, (short)z, place, block );
SendPacket();
}
- public void SendPlayerClick( MouseButton button, bool buttonDown, byte targetId, PickedPos pos ) {
- Player p = Window.LocalPlayer;
+ public override void SendPlayerClick( MouseButton button, bool buttonDown, byte targetId, PickedPos pos ) {
+ Player p = game.LocalPlayer;
MakePlayerClick( (byte)button, buttonDown, p.YawDegrees, p.PitchDegrees, targetId,
pos.BlockPos, pos.BlockFace );
}
- public void Dispose() {
+ public override void Dispose() {
socket.Close();
Disconnected = true;
}
void CheckForNewTerrainAtlas() {
DownloadedItem item;
- Window.AsyncDownloader.TryGetItem( "terrain", out item );
+ game.AsyncDownloader.TryGetItem( "terrain", out item );
if( item != null && item.Bmp != null ) {
- Window.ChangeTerrainAtlas( item.Bmp );
+ game.ChangeTerrainAtlas( item.Bmp );
}
}
- public void Tick( double delta ) {
+ public override void Tick( double delta ) {
if( Disconnected ) return;
try {
reader.ReadPendingData();
} catch( IOException ex ) {
Utils.LogError( "Error while reading packets: {0}{1}", Environment.NewLine, ex );
- Window.Disconnect( "&eLost connection to the server", "Underlying connection was closed" );
+ game.Disconnect( "&eLost connection to the server", "Underlying connection was closed" );
Dispose();
return;
}
@@ -105,7 +105,7 @@ namespace ClassicalSharp {
ReadPacket( opcode );
}
- Player player = Window.LocalPlayer;
+ Player player = game.LocalPlayer;
if( receivedFirstPosition ) {
SendPosition( player.Position, player.YawDegrees, player.PitchDegrees );
}
@@ -232,7 +232,7 @@ namespace ClassicalSharp {
stream.Write( outBuffer, 0, packetLength );
} catch( IOException ex ) {
Utils.LogError( "Error while writing packets: {0}{1}", Environment.NewLine, ex );
- Window.Disconnect( "&eLost connection to the server", "Underlying connection was closed" );
+ game.Disconnect( "&eLost connection to the server", "Underlying connection was closed" );
Dispose();
}
}
@@ -262,11 +262,11 @@ namespace ClassicalSharp {
ServerMotd = reader.ReadAsciiString();
byte userType = reader.ReadUInt8();
if( !useBlockPermissions ) {
- Window.CanDelete[(int)Block.Bedrock] = userType == 0x64;
+ game.CanDelete[(int)Block.Bedrock] = userType == 0x64;
}
- Window.LocalPlayer.UserType = userType;
+ game.LocalPlayer.UserType = userType;
receivedFirstPosition = false;
- Window.LocalPlayer.ParseHackFlags( ServerName, ServerMotd );
+ game.LocalPlayer.ParseHackFlags( ServerName, ServerMotd );
} break;
case PacketId.Ping:
@@ -274,10 +274,10 @@ namespace ClassicalSharp {
case PacketId.LevelInitialise:
{
- Window.Map.Reset();
- Window.RaiseOnNewMap();
- Window.SelectionManager.Dispose();
- Window.SetNewScreen( new LoadingMapScreen( Window, ServerName, ServerMotd ) );
+ game.Map.Reset();
+ game.RaiseOnNewMap();
+ game.SelectionManager.Dispose();
+ game.SetNewScreen( new LoadingMapScreen( game, ServerName, ServerMotd ) );
if( ServerMotd.Contains( "cfg=" ) ) {
ReadWomConfigurationAsync();
}
@@ -322,20 +322,20 @@ namespace ClassicalSharp {
}
reader.Remove( 1024 );
byte progress = reader.ReadUInt8();
- Window.RaiseMapLoading( progress );
+ game.RaiseMapLoading( progress );
} break;
case PacketId.LevelFinalise:
{
- Window.SetNewScreen( new NormalScreen( Window ) );
+ game.SetNewScreen( new NormalScreen( game ) );
int mapWidth = reader.ReadInt16();
int mapHeight = reader.ReadInt16();
int mapLength = reader.ReadInt16();
double loadingMs = ( DateTime.UtcNow - receiveStart ).TotalMilliseconds;
Utils.LogDebug( "map loading took:" + loadingMs );
- Window.Map.UseRawMap( map, mapWidth, mapHeight, mapLength );
- Window.RaiseOnNewMapLoaded();
+ game.Map.UseRawMap( map, mapWidth, mapHeight, mapLength );
+ game.RaiseOnNewMapLoaded();
map = null;
gzipStream.Close();
if( sendWomId && !sentWomId ) {
@@ -352,7 +352,7 @@ namespace ClassicalSharp {
int y = reader.ReadInt16();
int z = reader.ReadInt16();
byte type = reader.ReadUInt8();
- Window.UpdateBlock( x, y, z, type );
+ game.UpdateBlock( x, y, z, type );
} break;
case PacketId.AddEntity:
@@ -383,11 +383,11 @@ namespace ClassicalSharp {
case PacketId.RemoveEntity:
{
byte entityId = reader.ReadUInt8();
- Player player = Window.Players[entityId];
+ Player player = game.Players[entityId];
if( entityId != 0xFF && player != null ) {
- Window.RaiseEntityRemoved( entityId );
+ game.RaiseEntityRemoved( entityId );
player.Despawn();
- Window.Players[entityId] = null;
+ game.Players[entityId] = null;
}
} break;
@@ -395,13 +395,13 @@ namespace ClassicalSharp {
{
byte messageType = reader.ReadUInt8();
string text = reader.ReadChatString( ref messageType, useMessageTypes );
- Window.AddChat( text, (CpeMessage)messageType );
+ game.AddChat( text, (CpeMessage)messageType );
} break;
case PacketId.Kick:
{
string reason = reader.ReadAsciiString();
- Window.Disconnect( "&eLost connection to the server", reason );
+ game.Disconnect( "&eLost connection to the server", reason );
Dispose();
} break;
@@ -409,9 +409,9 @@ namespace ClassicalSharp {
{
byte userType = reader.ReadUInt8();
if( !useBlockPermissions ) {
- Window.CanDelete[(int)Block.Bedrock] = userType == 0x64;
+ game.CanDelete[(int)Block.Bedrock] = userType == 0x64;
}
- Window.LocalPlayer.UserType = userType;
+ game.LocalPlayer.UserType = userType;
} break;
case PacketId.CpeExtInfo:
@@ -451,7 +451,7 @@ namespace ClassicalSharp {
case PacketId.CpeSetClickDistance:
{
- Window.LocalPlayer.ReachDistance = reader.ReadInt16() / 32f;
+ game.LocalPlayer.ReachDistance = reader.ReadInt16() / 32f;
} break;
case PacketId.CpeCustomBlockSupportLevel:
@@ -462,10 +462,10 @@ namespace ClassicalSharp {
if( supportLevel == 1 ) {
for( int i = (int)Block.CobblestoneSlab; i <= (int)Block.StoneBrick; i++ ) {
- Window.CanPlace[i] = true;
- Window.CanDelete[i] = true;
+ game.CanPlace[i] = true;
+ game.CanDelete[i] = true;
}
- Window.RaiseBlockPermissionsChanged();
+ game.RaiseBlockPermissionsChanged();
} else {
Utils.LogWarning( "Server's block support level is {0}, this client only supports level 1.", supportLevel );
Utils.LogWarning( "You won't be able to see or use blocks from levels above level 1" );
@@ -476,9 +476,9 @@ namespace ClassicalSharp {
{
byte blockType = reader.ReadUInt8();
bool canChange = reader.ReadUInt8() == 0;
- Window.CanChangeHeldBlock = true;
- Window.HeldBlock = (Block)blockType;
- Window.CanChangeHeldBlock = canChange;
+ game.CanChangeHeldBlock = true;
+ game.HeldBlock = (Block)blockType;
+ game.CanChangeHeldBlock = canChange;
} break;
case PacketId.CpeExtAddPlayerName:
@@ -489,14 +489,14 @@ namespace ClassicalSharp {
string groupName = reader.ReadAsciiString();
byte groupRank = reader.ReadUInt8();
if( nameId >= 0 && nameId <= 255 ) {
- CpeListInfo oldInfo = Window.CpePlayersList[nameId];
+ CpeListInfo oldInfo = game.CpePlayersList[nameId];
CpeListInfo info = new CpeListInfo( (byte)nameId, playerName, listName, groupName, groupRank );
- Window.CpePlayersList[nameId] = info;
+ game.CpePlayersList[nameId] = info;
if( oldInfo != null ) {
- Window.RaiseCpeListInfoChanged( (byte)nameId );
+ game.RaiseCpeListInfoChanged( (byte)nameId );
} else {
- Window.RaiseCpeListInfoAdded( (byte)nameId );
+ game.RaiseCpeListInfoAdded( (byte)nameId );
}
}
} break;
@@ -513,7 +513,7 @@ namespace ClassicalSharp {
{
short nameId = reader.ReadInt16();
if( nameId >= 0 && nameId <= 255 ) {
- Window.RaiseCpeListInfoRemoved( (byte)nameId );
+ game.RaiseCpeListInfoRemoved( (byte)nameId );
}
} break;
@@ -536,13 +536,13 @@ namespace ClassicalSharp {
Vector3I p1 = Vector3I.Min( startX, startY, startZ, endX, endY, endZ );
Vector3I p2 = Vector3I.Max( startX, startY, startZ, endX, endY, endZ );
FastColour col = new FastColour( r, g, b, a );
- Window.SelectionManager.AddSelection( selectionId, p1, p2, col );
+ game.SelectionManager.AddSelection( selectionId, p1, p2, col );
} break;
case PacketId.CpeRemoveSelection:
{
byte selectionId = reader.ReadUInt8();
- Window.SelectionManager.RemoveSelection( selectionId );
+ game.SelectionManager.RemoveSelection( selectionId );
} break;
case PacketId.CpeEnvColours:
@@ -555,15 +555,15 @@ namespace ClassicalSharp {
FastColour col = new FastColour( red, green, blue );
if( variable == 0 ) { // sky colour
- Window.Map.SetSkyColour( invalid ? Map.DefaultSkyColour : col );
+ game.Map.SetSkyColour( invalid ? Map.DefaultSkyColour : col );
} else if( variable == 1 ) { // clouds colour
- Window.Map.SetCloudsColour( invalid ? Map.DefaultCloudsColour : col );
+ game.Map.SetCloudsColour( invalid ? Map.DefaultCloudsColour : col );
} else if( variable == 2 ) { // fog colour
- Window.Map.SetFogColour( invalid ? Map.DefaultFogColour : col );
+ game.Map.SetFogColour( invalid ? Map.DefaultFogColour : col );
} else if( variable == 3 ) { // ambient light (shadow light)
- Window.Map.SetShadowlight( invalid ? Map.DefaultShadowlight : col );
+ game.Map.SetShadowlight( invalid ? Map.DefaultShadowlight : col );
} else if( variable == 4 ) { // diffuse light (sun light)
- Window.Map.SetSunlight( invalid ? Map.DefaultSunlight : col );
+ game.Map.SetSunlight( invalid ? Map.DefaultSunlight : col );
}
} break;
@@ -573,22 +573,22 @@ namespace ClassicalSharp {
bool canPlace = reader.ReadUInt8() != 0;
bool canDelete = reader.ReadUInt8() != 0;
if( blockId == 0 ) {
- for( int i = 1; i < Window.CanPlace.Length; i++ ) {
- Window.CanPlace[i] = canPlace;
- Window.CanDelete[i] = canDelete;
+ for( int i = 1; i < game.CanPlace.Length; i++ ) {
+ game.CanPlace[i] = canPlace;
+ game.CanDelete[i] = canDelete;
}
} else {
- Window.CanPlace[blockId] = canPlace;
- Window.CanDelete[blockId] = canDelete;
+ game.CanPlace[blockId] = canPlace;
+ game.CanDelete[blockId] = canDelete;
}
- Window.RaiseBlockPermissionsChanged();
+ game.RaiseBlockPermissionsChanged();
} break;
case PacketId.CpeChangeModel:
{
byte playerId = reader.ReadUInt8();
string modelName = reader.ReadAsciiString().ToLowerInvariant();
- Player player = Window.Players[playerId];
+ Player player = game.Players[playerId];
if( player != null ) {
player.SetModel( modelName );
}
@@ -600,36 +600,36 @@ namespace ClassicalSharp {
byte sideBlock = reader.ReadUInt8();
byte edgeBlock = reader.ReadUInt8();
short waterLevel = reader.ReadInt16();
- Window.Map.SetWaterLevel( waterLevel );
- Window.Map.SetEdgeBlock( (Block)edgeBlock );
- Window.Map.SetSidesBlock( (Block)sideBlock );
+ game.Map.SetWaterLevel( waterLevel );
+ game.Map.SetEdgeBlock( (Block)edgeBlock );
+ game.Map.SetSidesBlock( (Block)sideBlock );
if( url == String.Empty ) {
Bitmap bmp = new Bitmap( "terrain.png" );
- Window.ChangeTerrainAtlas( bmp );
+ game.ChangeTerrainAtlas( bmp );
} else {
- Window.AsyncDownloader.DownloadImage( url, true, "terrain" );
+ game.AsyncDownloader.DownloadImage( url, true, "terrain" );
}
Utils.LogDebug( "Image url: " + url );
} break;
case PacketId.CpeEnvWeatherType:
{
- Window.Map.SetWeather( (Weather)reader.ReadUInt8() );
+ game.Map.SetWeather( (Weather)reader.ReadUInt8() );
} break;
case PacketId.CpeHackControl:
{
- Window.LocalPlayer.CanFly = reader.ReadUInt8() != 0;
- Window.LocalPlayer.CanNoclip = reader.ReadUInt8() != 0;
- Window.LocalPlayer.CanSpeed = reader.ReadUInt8() != 0;
- Window.LocalPlayer.CanRespawn = reader.ReadUInt8() != 0;
- Window.CanUseThirdPersonCamera = reader.ReadUInt8() != 0;
- if( !Window.CanUseThirdPersonCamera ) {
- Window.SetCamera( false );
+ game.LocalPlayer.CanFly = reader.ReadUInt8() != 0;
+ game.LocalPlayer.CanNoclip = reader.ReadUInt8() != 0;
+ game.LocalPlayer.CanSpeed = reader.ReadUInt8() != 0;
+ game.LocalPlayer.CanRespawn = reader.ReadUInt8() != 0;
+ game.CanUseThirdPersonCamera = reader.ReadUInt8() != 0;
+ if( !game.CanUseThirdPersonCamera ) {
+ game.SetCamera( false );
}
float jumpHeight = reader.ReadInt16() / 32f;
if( jumpHeight < 0 ) jumpHeight = 1.4f;
- Window.LocalPlayer.CalculateJumpVelocity( jumpHeight );
+ game.LocalPlayer.CalculateJumpVelocity( jumpHeight );
} break;
case PacketId.CpeExtAddEntity2:
@@ -647,19 +647,19 @@ namespace ClassicalSharp {
void AddEntity( byte entityId, string displayName, string skinName, bool readPosition ) {
if( entityId != 0xFF ) {
- Player oldPlayer = Window.Players[entityId];
+ Player oldPlayer = game.Players[entityId];
if( oldPlayer != null ) {
- Window.RaiseEntityRemoved( entityId );
+ game.RaiseEntityRemoved( entityId );
oldPlayer.Despawn();
}
- Window.Players[entityId] = new NetPlayer( displayName, skinName, Window );
- Window.RaiseEntityAdded( entityId );
- Window.AsyncDownloader.DownloadSkin( skinName );
+ game.Players[entityId] = new NetPlayer( displayName, skinName, game );
+ game.RaiseEntityAdded( entityId );
+ game.AsyncDownloader.DownloadSkin( skinName );
}
if( readPosition ) {
ReadAbsoluteLocation( entityId, false );
if( entityId == 0xFF ) {
- Window.LocalPlayer.SpawnPoint = Window.LocalPlayer.Position;
+ game.LocalPlayer.SpawnPoint = game.LocalPlayer.Position;
}
}
}
@@ -706,7 +706,7 @@ namespace ClassicalSharp {
}
void UpdateLocation( byte playerId, LocationUpdate update, bool interpolate ) {
- Player player = Window.Players[playerId];
+ Player player = game.Players[playerId];
if( player != null ) {
player.SetLocation( update, interpolate );
}
diff --git a/ClassicalSharp/Network/SinglePlayerServer.cs b/ClassicalSharp/Network/SinglePlayerServer.cs
new file mode 100644
index 000000000..1153aa6b2
--- /dev/null
+++ b/ClassicalSharp/Network/SinglePlayerServer.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Net;
+using OpenTK;
+using OpenTK.Input;
+
+namespace ClassicalSharp {
+
+ public sealed class SinglePlayerServer : INetworkProcessor {
+
+ Game game;
+ public SinglePlayerServer( Game window ) {
+ game = window;
+ }
+
+ public override bool IsSinglePlayer {
+ get { return true; }
+ }
+
+ public override void Connect( IPAddress address, int port ) {
+ for( int i = (int)Block.Stone; i <= (int)Block.StoneBrick; i++ ) {
+ game.CanPlace[i] = true;
+ game.CanDelete[i] = true;
+ }
+ game.RaiseBlockPermissionsChanged();
+ NewMap();
+ MapLoaded();
+ }
+
+ public override void SendChat( string text ) {
+ if( !String.IsNullOrEmpty( text ) ) {
+ game.AddChat( text, CpeMessage.Normal );
+ }
+ }
+
+ public override void SendPosition( Vector3 pos, float yaw, float pitch ) {
+ }
+
+ public override void SendSetBlock( int x, int y, int z, bool place, byte block ) {
+ }
+
+ public override void SendPlayerClick( MouseButton button, bool buttonDown, byte targetId, PickedPos pos ) {
+ }
+
+ public override void Dispose() {
+ }
+
+ public override void Tick( double delta ) {
+ if( Disconnected ) return;
+ }
+
+ void NewMap() {
+ ServerName = "Single player";
+ ServerMotd = "Generating a map..";
+ game.LocalPlayer.UserType = 0x64;
+
+ game.Map.Reset();
+ game.RaiseOnNewMap();
+ game.SetNewScreen( new LoadingMapScreen( game, ServerName, ServerMotd ) );
+ }
+
+ void MapLoaded() {
+ game.SetNewScreen( new NormalScreen( game ) );
+ int width = 16, height = 16, length = 16;
+ byte[] map = new byte[width * height * length];
+ MapSet( width, length, map, 0, height / 2 - 2, (byte)Block.Dirt );
+ MapSet( width, length, map, height / 2 - 1, height / 2 - 1, (byte)Block.Grass );
+ game.Map.UseRawMap( map, width, height, length );
+ game.RaiseOnNewMapLoaded();
+ ResetPlayerPosition();
+ game.AddChat( "&ePlaying single player", CpeMessage.Status1 );
+ GC.Collect();
+ }
+
+ void MapSet( int width, int length, byte[] map, int yStart, int yEnd, byte block ) {
+ int startIndex = yStart * length * width;
+ int endIndex = ( yEnd * length + (length - 1) ) * width + (width - 1);
+ for( int i = startIndex; i <= endIndex; i++ ) {
+ map[i] = block;
+ }
+ }
+
+ void ResetPlayerPosition() {
+ float x = game.Map.Width / 2, y = game.Map.Height / 2, z = game.Map.Length / 2;
+ LocationUpdate update = LocationUpdate.MakePosAndOri( x, y, z, 0, 0, false );
+ game.LocalPlayer.SetLocation( update, false );
+ }
+ }
+}
\ No newline at end of file
diff --git a/ClassicalSharp/Network/AsyncDownloader.cs b/ClassicalSharp/Network/Utils/AsyncDownloader.cs
similarity index 100%
rename from ClassicalSharp/Network/AsyncDownloader.cs
rename to ClassicalSharp/Network/Utils/AsyncDownloader.cs
diff --git a/ClassicalSharp/Network/FastNetReader.cs b/ClassicalSharp/Network/Utils/FastNetReader.cs
similarity index 100%
rename from ClassicalSharp/Network/FastNetReader.cs
rename to ClassicalSharp/Network/Utils/FastNetReader.cs
diff --git a/ClassicalSharp/Network/FixedBufferStream.cs b/ClassicalSharp/Network/Utils/FixedBufferStream.cs
similarity index 100%
rename from ClassicalSharp/Network/FixedBufferStream.cs
rename to ClassicalSharp/Network/Utils/FixedBufferStream.cs
diff --git a/ClassicalSharp/Network/GZipHeaderReader.cs b/ClassicalSharp/Network/Utils/GZipHeaderReader.cs
similarity index 100%
rename from ClassicalSharp/Network/GZipHeaderReader.cs
rename to ClassicalSharp/Network/Utils/GZipHeaderReader.cs
diff --git a/ClassicalSharp/Network/WomConfigHandler.cs b/ClassicalSharp/Network/WomConfigHandler.cs
index 503cedc69..f74c5da21 100644
--- a/ClassicalSharp/Network/WomConfigHandler.cs
+++ b/ClassicalSharp/Network/WomConfigHandler.cs
@@ -12,14 +12,14 @@ namespace ClassicalSharp {
void CheckForWomEnvironment() {
DownloadedItem item;
- Window.AsyncDownloader.TryGetItem( womEnvIdentifier, out item );
+ game.AsyncDownloader.TryGetItem( womEnvIdentifier, out item );
if( item != null && item.Page != null ) {
ParseWomConfig( item.Page );
}
- Window.AsyncDownloader.TryGetItem( womTerrainIdentifier, out item );
+ game.AsyncDownloader.TryGetItem( womTerrainIdentifier, out item );
if( item != null && item.Bmp != null ) {
- Window.ChangeTerrainAtlas( item.Bmp );
+ game.ChangeTerrainAtlas( item.Bmp );
}
}
@@ -35,17 +35,17 @@ namespace ClassicalSharp {
if( key == "environment.cloud" ) {
FastColour col = ParseWomColour( value, Map.DefaultCloudsColour );
- Window.Map.SetCloudsColour( col );
+ game.Map.SetCloudsColour( col );
} else if( key == "environment.sky" ) {
FastColour col = ParseWomColour( value, Map.DefaultSkyColour );
- Window.Map.SetSkyColour( col );
+ game.Map.SetSkyColour( col );
} else if( key == "environment.fog" ) {
FastColour col = ParseWomColour( value, Map.DefaultFogColour );
- Window.Map.SetFogColour( col );
+ game.Map.SetFogColour( col );
} else if( key == "environment.level" ) {
int waterLevel = 0;
if( Int32.TryParse( value, out waterLevel ) )
- Window.Map.SetWaterLevel( waterLevel );
+ game.Map.SetWaterLevel( waterLevel );
} else if( key == "environment.terrain" ) {
GetWomImageAsync( "terrain", value );
} else if( key == "environment.edge" ) { // TODO: custom edges and sides
@@ -53,7 +53,7 @@ namespace ClassicalSharp {
} else if( key == "environment.side" ) {
//GetWomImageAsync( "side", value );
} else if( key == "user.detail" && !useMessageTypes ) {
- Window.AddChat( value, CpeMessage.Status2 );
+ game.AddChat( value, CpeMessage.Status2 );
}
}
}
@@ -63,20 +63,20 @@ namespace ClassicalSharp {
const string hostFormat = "http://files.worldofminecraft.com/skin.php?type={0}&id={1}";
string url = String.Format( hostFormat, type, Uri.EscapeDataString( id ) );
string identifier = "wom" + type + "_" + womCounter;
- Window.AsyncDownloader.DownloadImage( url, true, identifier );
+ game.AsyncDownloader.DownloadImage( url, true, identifier );
}
void ReadWomConfigurationAsync() {
string host = ServerMotd.Substring( ServerMotd.IndexOf( "cfg=" ) + 4 );
string url = "http://" + host;
- url = url.Replace( "$U", Window.Username );
+ url = url.Replace( "$U", game.Username );
// NOTE: this (should, I did test this) ensure that if the user quickly changes to a
// different world, the environment settings from the last world are not loaded in the
// new world if the async 'get request' didn't complete before the new world was loaded.
womCounter++;
womEnvIdentifier = "womenv_" + womCounter;
womTerrainIdentifier = "womterrain_" + womCounter;
- Window.AsyncDownloader.DownloadPage( url, true, womEnvIdentifier );
+ game.AsyncDownloader.DownloadPage( url, true, womEnvIdentifier );
sendWomId = true;
}