From e95429dbef7b76ba93e962116d9231b03a2c12c6 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 2 Jul 2015 07:50:14 +1000 Subject: [PATCH] Move player handling into new EntityList class. --- 2D/Widgets/NormalPlayerListWidget.cs | 7 +++-- ClassicalSharp.csproj | 1 + Entities/EntityList.cs | 39 ++++++++++++++++++++++++++++ Game/Game.cs | 30 ++++----------------- Network/NetworkProcessor.cs | 14 +++++----- 5 files changed, 55 insertions(+), 36 deletions(-) create mode 100644 Entities/EntityList.cs diff --git a/2D/Widgets/NormalPlayerListWidget.cs b/2D/Widgets/NormalPlayerListWidget.cs index 05e1de8b5..63a375089 100644 --- a/2D/Widgets/NormalPlayerListWidget.cs +++ b/2D/Widgets/NormalPlayerListWidget.cs @@ -34,20 +34,19 @@ namespace ClassicalSharp { } void PlayerSpawned( object sender, IdEventArgs e ) { - Player player = Window.NetPlayers[e.Id]; + Player player = Window.Players[e.Id]; AddPlayerInfo( player ); columns = (int)Math.Ceiling( (double)namesCount / namesPerColumn ); SortPlayerInfo(); } protected override void CreateInitialPlayerInfo() { - for( int i = 0; i < Window.NetPlayers.Length; i++ ) { - Player player = Window.NetPlayers[i]; + for( int i = 0; i < Window.Players.MaxCount; i++ ) { + Player player = Window.Players[i]; if( player != null ) { AddPlayerInfo( player ); } } - AddPlayerInfo( Window.LocalPlayer ); } void AddPlayerInfo( Player player ) { diff --git a/ClassicalSharp.csproj b/ClassicalSharp.csproj index c62c9d436..497440c3a 100644 --- a/ClassicalSharp.csproj +++ b/ClassicalSharp.csproj @@ -110,6 +110,7 @@ + diff --git a/Entities/EntityList.cs b/Entities/EntityList.cs new file mode 100644 index 000000000..46290e156 --- /dev/null +++ b/Entities/EntityList.cs @@ -0,0 +1,39 @@ +using System; + +namespace ClassicalSharp { + + public class EntityList { + + public int MaxCount = 256; + public Player[] Players = new Player[256]; + + public void Tick( double delta ) { + for( int i = 0; i < Players.Length; i++ ) { + if( Players[i] != null ) { + Players[i].Tick( delta ); + } + } + } + + public void Render( double delta, float t ) { + for( int i = 0; i < Players.Length; i++ ) { + if( Players[i] != null ) { + Players[i].Render( delta, t ); + } + } + } + + public void Dispose() { + for( int i = 0; i < Players.Length; i++ ) { + if( Players[i] != null ) { + Players[i].Despawn(); + } + } + } + + public Player this[int id] { + get { return Players[id]; } + set { Players[id] = value; } + } + } +} diff --git a/Game/Game.cs b/Game/Game.cs index b03835230..ab9a0a6fe 100644 --- a/Game/Game.cs +++ b/Game/Game.cs @@ -21,7 +21,7 @@ namespace ClassicalSharp { public Map Map; public NetworkProcessor Network; - public Player[] NetPlayers = new Player[256]; + public EntityList Players = new EntityList(); public CpeListInfo[] CpePlayersList = new CpeListInfo[256]; public LocalPlayer LocalPlayer; public Camera Camera; @@ -131,6 +131,7 @@ namespace ClassicalSharp { BlockInfo.SetDefaultBlockPermissions( CanPlace, CanDelete ); Map = new Map( this ); LocalPlayer = new LocalPlayer( 255, this ); + Players[255] = LocalPlayer; width = Width; height = Height; MapRenderer = new MapRenderer( this ); @@ -202,14 +203,9 @@ namespace ClassicalSharp { int ticksThisFrame = 0; while( ticksAccumulator >= ticksPeriod ) { Network.Tick( ticksPeriod ); - LocalPlayer.Tick( ticksPeriod ); + Players.Tick( ticksPeriod ); Camera.Tick( ticksPeriod ); ParticleManager.Tick( ticksPeriod ); - for( int i = 0; i < NetPlayers.Length; i++ ) { - if( NetPlayers[i] != null ) { - NetPlayers[i].Tick( ticksPeriod ); - } - } ticksThisFrame++; ticksAccumulator -= ticksPeriod; } @@ -228,7 +224,7 @@ namespace ClassicalSharp { bool visible = activeScreen == null || !activeScreen.BlocksWorld; if( visible ) { - RenderPlayers( e.Time, t ); + Players.Render( e.Time, t ); ParticleManager.Render( e.Time, t ); Camera.GetPickedBlock( SelectedPos ); // TODO: only pick when necessary if( SelectedPos.Valid ) @@ -264,17 +260,6 @@ namespace ClassicalSharp { Graphics.EndFrame( this ); } - void RenderPlayers( double deltaTime, float t ) { - //Graphics.AlphaTest = true; - for( int i = 0; i < NetPlayers.Length; i++ ) { - if( NetPlayers[i] != null ) { - NetPlayers[i].Render( deltaTime, t ); - } - } - LocalPlayer.Render( deltaTime, t ); - //Graphics.AlphaTest = false; - } - public override void Dispose() { MapRenderer.Dispose(); MapEnvRenderer.Dispose(); @@ -288,12 +273,7 @@ namespace ClassicalSharp { ModelCache.Dispose(); Picking.Dispose(); ParticleManager.Dispose(); - for( int i = 0; i < NetPlayers.Length; i++ ) { - if( NetPlayers[i] != null ) { - NetPlayers[i].Despawn(); - } - } - LocalPlayer.Despawn(); + Players.Dispose(); Graphics.CheckResources(); AsyncDownloader.Dispose(); if( writer != null ) { diff --git a/Network/NetworkProcessor.cs b/Network/NetworkProcessor.cs index 0876460a7..d4c5257e5 100644 --- a/Network/NetworkProcessor.cs +++ b/Network/NetworkProcessor.cs @@ -383,11 +383,11 @@ namespace ClassicalSharp { case PacketId.RemoveEntity: { byte entityId = reader.ReadUInt8(); - Player player = Window.NetPlayers[entityId]; - if( player != null ) { + Player player = Window.Players[entityId]; + if( entityId != 0xFF && player != null ) { Window.RaiseEntityRemoved( entityId ); player.Despawn(); - Window.NetPlayers[entityId] = null; + Window.Players[entityId] = null; } } break; @@ -588,7 +588,7 @@ namespace ClassicalSharp { { byte playerId = reader.ReadUInt8(); string modelName = reader.ReadAsciiString().ToLowerInvariant(); - Player player = playerId == 0xFF ? Window.LocalPlayer : Window.NetPlayers[playerId]; + Player player = Window.Players[playerId]; if( player != null ) { player.SetModel( modelName ); } @@ -647,12 +647,12 @@ namespace ClassicalSharp { void AddEntity( byte entityId, string displayName, string skinName, bool readPosition ) { if( entityId != 0xFF ) { - Player oldPlayer = Window.NetPlayers[entityId]; + Player oldPlayer = Window.Players[entityId]; if( oldPlayer != null ) { Window.RaiseEntityRemoved( entityId ); oldPlayer.Despawn(); } - Window.NetPlayers[entityId] = new NetPlayer( entityId, displayName, skinName, Window ); + Window.Players[entityId] = new NetPlayer( entityId, displayName, skinName, Window ); Window.RaiseEntityAdded( entityId ); Window.AsyncDownloader.DownloadSkin( skinName ); } @@ -706,7 +706,7 @@ namespace ClassicalSharp { } void UpdateLocation( byte playerId, LocationUpdate update, bool interpolate ) { - Player player = playerId == 0xFF ? Window.LocalPlayer : Window.NetPlayers[playerId]; + Player player = Window.Players[playerId]; if( player != null ) { player.SetLocation( update, interpolate ); }