From de8c76f0512709e405086ceb82ac4c3b8485c474 Mon Sep 17 00:00:00 2001 From: Dennis Andersen Date: Tue, 4 Feb 2014 16:07:10 +0100 Subject: [PATCH] GameServer - Fixed bugg where threads touched same data, n players should now be able to connect --- Code/DanBias.sln | 224 +++++++++++++----- Code/Game/DanBiasGame/DanBiasGame_Impl.cpp | 40 +++- .../Game/DanBiasGame/GameClientRecieverFunc.h | 33 ++- .../DanBiasGame/GameClientState/GameState.cpp | 15 +- .../GameClientState/LobbyState.cpp | 13 +- .../GameClientState/LoginState.cpp | 2 +- Code/Game/GameLogic/AttatchmentSocket.cpp | 5 +- Code/Game/GameLogic/CollisionManager.cpp | 2 +- Code/Game/GameLogic/Game.cpp | 2 +- Code/Game/GameLogic/Game.h | 2 - Code/Game/GameLogic/Level.cpp | 29 ++- Code/Game/GameLogic/Weapon.cpp | 14 +- Code/Game/GameProtocols/GeneralProtocols.h | 13 +- Code/Game/GameProtocols/LobbyProtocols.h | 14 +- Code/Game/GameProtocols/ObjectProtocols.h | 6 +- Code/Game/GameServer/GameClient.h | 8 +- Code/Game/GameServer/GameLobby.h | 1 + Code/Game/GameServer/GameServerAPI.h | 3 + Code/Game/GameServer/GameSession.h | 10 +- .../GameServer/Implementation/GameClient.cpp | 18 ++ .../GameServer/Implementation/GameLobby.cpp | 19 +- .../GameLobby_ProtocolParser.cpp | 9 +- .../GameServer/Implementation/GameServer.cpp | 35 ++- .../Implementation/GameSession_Gameplay.cpp | 18 +- .../Implementation/GameSession_General.cpp | 56 +++++ Code/Misc/DynamicArray.h | 27 ++- Code/Misc/Thread/OysterThread_Impl.cpp | 159 ++++++++----- Code/Misc/Utilities-Impl.h | 186 ++++++++++++++- Code/Misc/Utilities.h | 54 ++++- Code/Network/NetworkAPI/CustomNetProtocol.cpp | 167 +++++++++++-- Code/Network/NetworkAPI/CustomNetProtocol.h | 58 ++++- Code/Network/NetworkAPI/NetworkClient.cpp | 16 +- Code/Network/NetworkAPI/NetworkClient.h | 30 ++- Code/Network/NetworkAPI/NetworkServer.cpp | 2 +- Code/Network/NetworkAPI/NetworkServer.h | 2 +- Code/Network/NetworkAPI/NetworkSession.cpp | 2 +- Code/Network/NetworkAPI/Translator.cpp | 39 +-- .../FileLoader/ShaderLoader.cpp | 3 +- .../HLSL/Deffered Shaders/PostPass.hlsl | 4 +- 39 files changed, 1062 insertions(+), 278 deletions(-) diff --git a/Code/DanBias.sln b/Code/DanBias.sln index 7182fe89..4dedaaa2 100644 --- a/Code/DanBias.sln +++ b/Code/DanBias.sln @@ -23,13 +23,27 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OysterNetworkServer", "Netw EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetworkDependencies", "Network\NetworkDependencies\NetworkDependencies.vcxproj", "{C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameLogic", "GameLogic\GameLogic.vcxproj", "{B1195BB9-B3A5-47F0-906C-8DEA384D1520}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GamePhysics", "GamePhysics\GamePhysics.vcxproj", "{104FA3E9-94D9-4E1D-A941-28A03BC8A095}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Tester", "Tester\Tester.vcxproj", "{1B3BEA4C-CF75-438A-9693-60FB8444BBF3}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DanBiasGame", "Game\DanBiasGame\DanBiasGame.vcxproj", "{2A1BC987-AF42-4500-802D-89CD32FC1309}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DanBiasGame", "DanBiasGame\DanBiasGame.vcxproj", "{2A1BC987-AF42-4500-802D-89CD32FC1309}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Game", "Game", "{20720CA7-795C-45AD-A302-9383A6DD503A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameLogic", "Game\GameLogic\GameLogic.vcxproj", "{B1195BB9-B3A5-47F0-906C-8DEA384D1520}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DanBiasLauncher", "Game\DanBiasLauncher\DanBiasLauncher.vcxproj", "{8690FDDF-C5B7-4C42-A337-BD5243F29B85}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetworkAPI", "Network\NetworkAPI\NetworkAPI.vcxproj", "{460D625F-2AC9-4559-B809-0BA89CEAEDF4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameProtocols", "Game\GameProtocols\GameProtocols.vcxproj", "{DA2AA800-ED64-4649-8B3B-E7F1E3968B78}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DanBiasServerLauncher", "Game\DanBiasServerLauncher\DanBiasServerLauncher.vcxproj", "{060B1890-CBF3-4808-BA99-A4776222093B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Physics lab", "Physics lab\Physics lab.vcxproj", "{5128BD77-6472-4C4A-BE6F-724AD0E589C2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GameServer", "Game\GameServer\GameServer.vcxproj", "{143BD516-20A1-4890-A3E4-F8BFD02220E7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aDanBiasGameLauncher", "Game\aDanBiasGameLauncher\aDanBiasGameLauncher.vcxproj", "{666FEA52-975F-41CD-B224-B19AF3C0ABBA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -41,26 +55,26 @@ Global Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|Mixed Platforms.ActiveCfg = Release|x64 - {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|Mixed Platforms.Build.0 = Release|x64 + {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|Win32.ActiveCfg = Debug|Win32 {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|Win32.Build.0 = Debug|Win32 - {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|x64.ActiveCfg = Release|x64 - {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|x64.Build.0 = Release|x64 - {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|Mixed Platforms.Build.0 = Release|x64 + {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|x64.ActiveCfg = Debug|x64 + {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Debug|x64.Build.0 = Debug|x64 + {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|Mixed Platforms.Build.0 = Release|Win32 {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|Win32.ActiveCfg = Release|Win32 {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|Win32.Build.0 = Release|Win32 {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|x64.ActiveCfg = Release|x64 {0EC83E64-230E-48EF-B08C-6AC9651B4F82}.Release|x64.Build.0 = Release|x64 - {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|Mixed Platforms.ActiveCfg = Release|x64 - {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|Mixed Platforms.Build.0 = Release|x64 + {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|Win32.ActiveCfg = Debug|Win32 {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|Win32.Build.0 = Debug|Win32 - {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|x64.ActiveCfg = Release|x64 - {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|x64.Build.0 = Release|x64 - {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Release|Mixed Platforms.Build.0 = Release|x64 + {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|x64.ActiveCfg = Debug|x64 + {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Debug|x64.Build.0 = Debug|x64 + {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Release|Mixed Platforms.Build.0 = Release|Win32 {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Release|Win32.ActiveCfg = Release|Win32 {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Release|Win32.Build.0 = Release|Win32 {F10CBC03-9809-4CBA-95D8-327C287B18EE}.Release|x64.ActiveCfg = Release|x64 @@ -113,65 +127,54 @@ Global {7E3990D2-3D94-465C-B58D-64A74B3ECF9B}.Release|Win32.Build.0 = Release|Win32 {7E3990D2-3D94-465C-B58D-64A74B3ECF9B}.Release|x64.ActiveCfg = Release|x64 {7E3990D2-3D94-465C-B58D-64A74B3ECF9B}.Release|x64.Build.0 = Release|x64 - {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|Mixed Platforms.ActiveCfg = Release|x64 - {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|Mixed Platforms.Build.0 = Release|x64 + {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|Win32.ActiveCfg = Debug|Win32 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|Win32.Build.0 = Debug|Win32 - {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|x64.ActiveCfg = Release|x64 - {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|x64.Build.0 = Release|x64 - {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|Mixed Platforms.Build.0 = Release|x64 + {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|x64.ActiveCfg = Debug|x64 + {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Debug|x64.Build.0 = Debug|x64 + {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|Mixed Platforms.Build.0 = Release|Win32 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|Win32.ActiveCfg = Release|Win32 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|Win32.Build.0 = Release|Win32 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|x64.ActiveCfg = Release|x64 {2EC4DDED-8F75-4C86-A10B-E1E8EB29F3EE}.Release|x64.Build.0 = Release|x64 - {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|Mixed Platforms.ActiveCfg = Release|x64 - {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|Mixed Platforms.Build.0 = Release|x64 + {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|Win32.ActiveCfg = Debug|Win32 {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|Win32.Build.0 = Debug|Win32 - {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|x64.ActiveCfg = Release|x64 - {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|x64.Build.0 = Release|x64 - {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|Mixed Platforms.Build.0 = Release|x64 + {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|x64.ActiveCfg = Debug|x64 + {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Debug|x64.Build.0 = Debug|x64 + {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|Mixed Platforms.Build.0 = Release|Win32 {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|Win32.ActiveCfg = Release|Win32 {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|Win32.Build.0 = Release|Win32 {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|x64.ActiveCfg = Release|x64 {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8}.Release|x64.Build.0 = Release|x64 - {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|Mixed Platforms.ActiveCfg = Release|x64 - {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|Mixed Platforms.Build.0 = Release|x64 + {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|Win32.ActiveCfg = Debug|Win32 {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|Win32.Build.0 = Debug|Win32 - {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|x64.ActiveCfg = Release|x64 - {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|x64.Build.0 = Release|x64 - {6A066806-F43F-4B31-A4E3-57179674F460}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {6A066806-F43F-4B31-A4E3-57179674F460}.Release|Mixed Platforms.Build.0 = Release|x64 + {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|x64.ActiveCfg = Debug|x64 + {6A066806-F43F-4B31-A4E3-57179674F460}.Debug|x64.Build.0 = Debug|x64 + {6A066806-F43F-4B31-A4E3-57179674F460}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {6A066806-F43F-4B31-A4E3-57179674F460}.Release|Mixed Platforms.Build.0 = Release|Win32 {6A066806-F43F-4B31-A4E3-57179674F460}.Release|Win32.ActiveCfg = Release|Win32 {6A066806-F43F-4B31-A4E3-57179674F460}.Release|Win32.Build.0 = Release|Win32 {6A066806-F43F-4B31-A4E3-57179674F460}.Release|x64.ActiveCfg = Release|x64 {6A066806-F43F-4B31-A4E3-57179674F460}.Release|x64.Build.0 = Release|x64 - {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|Mixed Platforms.ActiveCfg = Release|x64 - {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|Mixed Platforms.Build.0 = Release|x64 + {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|Win32.ActiveCfg = Debug|Win32 {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|Win32.Build.0 = Debug|Win32 - {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|x64.ActiveCfg = Release|x64 - {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|x64.Build.0 = Release|x64 - {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|Mixed Platforms.ActiveCfg = Release|x64 - {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|Mixed Platforms.Build.0 = Release|x64 + {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|x64.ActiveCfg = Debug|x64 + {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Debug|x64.Build.0 = Debug|x64 + {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|Mixed Platforms.Build.0 = Release|Win32 {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|Win32.ActiveCfg = Release|Win32 {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|Win32.Build.0 = Release|Win32 {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|x64.ActiveCfg = Release|x64 {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50}.Release|x64.Build.0 = Release|x64 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Mixed Platforms.Build.0 = Debug|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Win32.ActiveCfg = Debug|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Win32.Build.0 = Debug|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|x64.ActiveCfg = Debug|x64 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|x64.Build.0 = Debug|x64 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Mixed Platforms.Build.0 = Release|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Win32.ActiveCfg = Release|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Win32.Build.0 = Release|Win32 - {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|x64.ActiveCfg = Release|Win32 {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Debug|Win32.ActiveCfg = Debug|Win32 @@ -182,19 +185,8 @@ Global {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Release|Mixed Platforms.Build.0 = Release|Win32 {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Release|Win32.ActiveCfg = Release|Win32 {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Release|Win32.Build.0 = Release|Win32 - {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Release|x64.ActiveCfg = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Debug|Mixed Platforms.ActiveCfg = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Debug|Mixed Platforms.Build.0 = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Debug|Win32.ActiveCfg = Debug|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Debug|Win32.Build.0 = Debug|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Debug|x64.ActiveCfg = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Debug|x64.Build.0 = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Release|Mixed Platforms.ActiveCfg = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Release|Mixed Platforms.Build.0 = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Release|Win32.ActiveCfg = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Release|Win32.Build.0 = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Release|x64.ActiveCfg = Release|Win32 - {1B3BEA4C-CF75-438A-9693-60FB8444BBF3}.Release|x64.Build.0 = Release|Win32 + {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Release|x64.ActiveCfg = Release|x64 + {104FA3E9-94D9-4E1D-A941-28A03BC8A095}.Release|x64.Build.0 = Release|x64 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|Mixed Platforms.Build.0 = Debug|Win32 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Debug|Win32.ActiveCfg = Debug|Win32 @@ -207,6 +199,102 @@ Global {2A1BC987-AF42-4500-802D-89CD32FC1309}.Release|Win32.Build.0 = Release|Win32 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Release|x64.ActiveCfg = Release|x64 {2A1BC987-AF42-4500-802D-89CD32FC1309}.Release|x64.Build.0 = Release|x64 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Win32.ActiveCfg = Debug|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|Win32.Build.0 = Debug|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|x64.ActiveCfg = Debug|x64 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Debug|x64.Build.0 = Debug|x64 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Mixed Platforms.Build.0 = Release|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Win32.ActiveCfg = Release|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|Win32.Build.0 = Release|Win32 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|x64.ActiveCfg = Release|x64 + {B1195BB9-B3A5-47F0-906C-8DEA384D1520}.Release|x64.Build.0 = Release|x64 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Debug|Win32.ActiveCfg = Debug|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Debug|Win32.Build.0 = Debug|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Debug|x64.ActiveCfg = Debug|x64 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Debug|x64.Build.0 = Debug|x64 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Release|Mixed Platforms.Build.0 = Release|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Release|Win32.ActiveCfg = Release|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Release|Win32.Build.0 = Release|Win32 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Release|x64.ActiveCfg = Release|x64 + {8690FDDF-C5B7-4C42-A337-BD5243F29B85}.Release|x64.Build.0 = Release|x64 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Debug|Win32.ActiveCfg = Debug|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Debug|Win32.Build.0 = Debug|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Debug|x64.ActiveCfg = Debug|x64 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Debug|x64.Build.0 = Debug|x64 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Release|Mixed Platforms.Build.0 = Release|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Release|Win32.ActiveCfg = Release|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Release|Win32.Build.0 = Release|Win32 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Release|x64.ActiveCfg = Release|x64 + {460D625F-2AC9-4559-B809-0BA89CEAEDF4}.Release|x64.Build.0 = Release|x64 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Debug|Win32.ActiveCfg = Debug|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Debug|Win32.Build.0 = Debug|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Debug|x64.ActiveCfg = Debug|x64 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Debug|x64.Build.0 = Debug|x64 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Release|Mixed Platforms.Build.0 = Release|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Release|Win32.ActiveCfg = Release|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Release|Win32.Build.0 = Release|Win32 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Release|x64.ActiveCfg = Release|x64 + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78}.Release|x64.Build.0 = Release|x64 + {060B1890-CBF3-4808-BA99-A4776222093B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Debug|Win32.ActiveCfg = Debug|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Debug|Win32.Build.0 = Debug|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Debug|x64.ActiveCfg = Debug|x64 + {060B1890-CBF3-4808-BA99-A4776222093B}.Debug|x64.Build.0 = Debug|x64 + {060B1890-CBF3-4808-BA99-A4776222093B}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Release|Mixed Platforms.Build.0 = Release|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Release|Win32.ActiveCfg = Release|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Release|Win32.Build.0 = Release|Win32 + {060B1890-CBF3-4808-BA99-A4776222093B}.Release|x64.ActiveCfg = Release|x64 + {060B1890-CBF3-4808-BA99-A4776222093B}.Release|x64.Build.0 = Release|x64 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Debug|Win32.ActiveCfg = Debug|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Debug|Win32.Build.0 = Debug|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Debug|x64.ActiveCfg = Debug|x64 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Debug|x64.Build.0 = Debug|x64 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Release|Mixed Platforms.Build.0 = Release|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Release|Win32.ActiveCfg = Release|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Release|Win32.Build.0 = Release|Win32 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Release|x64.ActiveCfg = Release|x64 + {5128BD77-6472-4C4A-BE6F-724AD0E589C2}.Release|x64.Build.0 = Release|x64 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Debug|Win32.ActiveCfg = Debug|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Debug|Win32.Build.0 = Debug|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Debug|x64.ActiveCfg = Debug|x64 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Debug|x64.Build.0 = Debug|x64 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Release|Mixed Platforms.Build.0 = Release|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Release|Win32.ActiveCfg = Release|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Release|Win32.Build.0 = Release|Win32 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Release|x64.ActiveCfg = Release|x64 + {143BD516-20A1-4890-A3E4-F8BFD02220E7}.Release|x64.Build.0 = Release|x64 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Debug|Win32.ActiveCfg = Debug|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Debug|Win32.Build.0 = Debug|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Debug|x64.ActiveCfg = Debug|x64 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Debug|x64.Build.0 = Debug|x64 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Release|Mixed Platforms.Build.0 = Release|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Release|Win32.ActiveCfg = Release|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Release|Win32.Build.0 = Release|Win32 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Release|x64.ActiveCfg = Release|x64 + {666FEA52-975F-41CD-B224-B19AF3C0ABBA}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -215,5 +303,13 @@ Global {838B25C2-D19E-49FE-8CB0-9A977CA3C7E8} = {C27B926E-B3EF-4990-8822-47580E43A0BE} {6A066806-F43F-4B31-A4E3-57179674F460} = {C27B926E-B3EF-4990-8822-47580E43A0BE} {C5AA09D0-6594-4CD3-BD92-1D380C7B3B50} = {C27B926E-B3EF-4990-8822-47580E43A0BE} + {460D625F-2AC9-4559-B809-0BA89CEAEDF4} = {C27B926E-B3EF-4990-8822-47580E43A0BE} + {2A1BC987-AF42-4500-802D-89CD32FC1309} = {20720CA7-795C-45AD-A302-9383A6DD503A} + {B1195BB9-B3A5-47F0-906C-8DEA384D1520} = {20720CA7-795C-45AD-A302-9383A6DD503A} + {8690FDDF-C5B7-4C42-A337-BD5243F29B85} = {20720CA7-795C-45AD-A302-9383A6DD503A} + {DA2AA800-ED64-4649-8B3B-E7F1E3968B78} = {20720CA7-795C-45AD-A302-9383A6DD503A} + {060B1890-CBF3-4808-BA99-A4776222093B} = {20720CA7-795C-45AD-A302-9383A6DD503A} + {143BD516-20A1-4890-A3E4-F8BFD02220E7} = {20720CA7-795C-45AD-A302-9383A6DD503A} + {666FEA52-975F-41CD-B224-B19AF3C0ABBA} = {20720CA7-795C-45AD-A302-9383A6DD503A} EndGlobalSection EndGlobal diff --git a/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp b/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp index 6a79fc0b..e8d9dfe2 100644 --- a/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp +++ b/Code/Game/DanBiasGame/DanBiasGame_Impl.cpp @@ -112,6 +112,10 @@ namespace DanBias { if(Oyster::Graphics::API::Init(m_data->window->GetHWND(), false, false, Oyster::Math::Float2( 1024, 768)) != Oyster::Graphics::API::Sucsess) return E_FAIL; + Oyster::Graphics::API::Option p; + p.modelPath = L"..\\Content\\Models\\"; + p.texturePath = L"..\\Content\\Textures\\"; + Oyster::Graphics::API::SetOptions(p); return S_OK; } @@ -146,6 +150,7 @@ namespace DanBias if(state != Client::GameClientState::ClientState_Same) { + bool stateVal = false; m_data->recieverObj->gameClientState->Release(); delete m_data->recieverObj->gameClientState; m_data->recieverObj->gameClientState = NULL; @@ -154,23 +159,36 @@ namespace DanBias { case Client::GameClientState::ClientState_LobbyCreated: m_data->serverOwner = true; + stateVal = true; case Client::GameClientState::ClientState_Lobby: m_data->recieverObj->gameClientState = new Client::LobbyState(); + stateVal = true; break; case Client::GameClientState::ClientState_Game: - if(m_data->serverOwner) - DanBias::GameServerAPI::GameStart(); - m_data->recieverObj->gameClientState = new Client::GameState(); - if(m_data->serverOwner) - ((Client::GameState*)m_data->recieverObj->gameClientState)->setClientId(2); - else - ((Client::GameState*)m_data->recieverObj->gameClientState)->setClientId(3); + //if(m_data->serverOwner) + //Initiate the game server through the server API + + + //if(m_data->serverOwner) + //{ + // ((Client::GameState*)m_data->recieverObj->gameClientState)->setClientId(2); + //} + //else + // ((Client::GameState*)m_data->recieverObj->gameClientState)->setClientId(3); break; default: return E_FAIL; break; } - m_data->recieverObj->gameClientState->Init(m_data->recieverObj); // send game client + + if(stateVal) + { + m_data->recieverObj->gameClientState->Init(m_data->recieverObj); // send game client + } + else + { + + } } return S_OK; @@ -202,10 +220,10 @@ namespace DanBias delete m_data->inputObj; delete m_data; - GameServerAPI::ServerStop(); - - Oyster::Graphics::API::Clean(); + + GameServerAPI::ServerStop(); + return S_OK; } diff --git a/Code/Game/DanBiasGame/GameClientRecieverFunc.h b/Code/Game/DanBiasGame/GameClientRecieverFunc.h index 6d4a2fda..21c260d4 100644 --- a/Code/Game/DanBiasGame/GameClientRecieverFunc.h +++ b/Code/Game/DanBiasGame/GameClientRecieverFunc.h @@ -4,6 +4,7 @@ //WTF!? No headers included??? #include "../DanBiasGame/Include/DanBiasGame.h" #include "../GameProtocols/GeneralProtocols.h" +#include "..\GameProtocols\Protocols.h" namespace DanBias { @@ -14,9 +15,15 @@ namespace DanBias // receiver function for server messages // parsing protocols and sending it to the gameState - void NetworkCallback(Oyster::Network::CustomNetProtocol& p) override + //void NetworkCallback(Oyster::Network::CustomNetProtocol& p) override + void GameRecieverObject::DataRecieved(Oyster::Network::NetEvent e) override { + Oyster::Network::CustomNetProtocol p = e.args.data.protocol; int pType = p[0].value.netInt; + + //printf("Message(%i) arrived at client(%i)\n", pType, this->GetID()); + + switch (pType) { case protocol_General_Status: @@ -60,20 +67,20 @@ namespace DanBias case protocol_Gameplay_ObjectCreate: { - Client::GameClientState::NewObj* protocolData = new Client::GameClientState::NewObj; - protocolData->object_ID = p[1].value.netInt; - protocolData->path = p[2].value.netCharPtr; + Client::GameClientState::NewObj protocolData;// = new Client::GameClientState::NewObj; + protocolData.object_ID = p[1].value.netInt; + protocolData.path = p[2].value.netCharPtr; for(int i = 0; i< 16; i++) { - protocolData->worldPos[i] = p[i+3].value.netFloat; + protocolData.worldPos[i] = p[i+3].value.netFloat; } if(dynamic_cast(gameClientState)) - ((Client::GameState*)gameClientState)->Protocol(protocolData); + ((Client::GameState*)gameClientState)->Protocol(&protocolData); - delete p[2].value.netCharPtr; //delete char array - delete protocolData; - protocolData = NULL; + //delete p[2].value.netCharPtr; //delete char array + //delete protocolData; + //protocolData = NULL; } break; case protocol_Gameplay_ObjectDisabled: @@ -104,14 +111,16 @@ namespace DanBias break; case protocol_Lobby_Start: { - /* if(dynamic_cast(gameClientState)) { + GameLogic::Protocol_LobbyStartGame pt(p); + gameClientState->Release(); delete gameClientState; gameClientState = new Client::GameState(); - gameClientState->Init(m_data->recieverObj); - }*/ + gameClientState->Init(this); + ((Client::GameState*)gameClientState)->setClientId(pt.clientID); + } } break; diff --git a/Code/Game/DanBiasGame/GameClientState/GameState.cpp b/Code/Game/DanBiasGame/GameClientState/GameState.cpp index c1b9da91..70fdba4e 100644 --- a/Code/Game/DanBiasGame/GameClientState/GameState.cpp +++ b/Code/Game/DanBiasGame/GameClientState/GameState.cpp @@ -44,7 +44,10 @@ bool GameState::Init(Oyster::Network::NetworkClient* nwClient) privData->state = gameStateState_loading; privData->nwClient = nwClient; privData->state = LoadGame(); - + + //tELL SERver ready + nwClient->Send(GameLogic::Protocol_General_Status(GameLogic::Protocol_General_Status::States_ready)); + return true; } GameState::gameStateState GameState::LoadGame() @@ -83,7 +86,7 @@ bool GameState::LoadModels(std::wstring mapFile) C_Object* obj; translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(0,0,0)); modelData.world = translate ;//modelData.world * translate - modelData.modelPath = L"..\\Content\\Models\\world_earth.dan"; + modelData.modelPath = L"world_earth.dan"; modelData.id = 0; obj = new C_Player(); @@ -94,7 +97,7 @@ bool GameState::LoadModels(std::wstring mapFile) modelData.world = Oyster::Math3D::Float4x4::identity; translate = Oyster::Math3D::TranslationMatrix(Oyster::Math::Float3(4,320,0)); modelData.world = modelData.world * translate; - modelData.modelPath = L"..\\Content\\Models\\box.dan"; + modelData.modelPath = L"box.dan"; modelData.id = 1; obj = new C_Player(); @@ -108,7 +111,7 @@ bool GameState::LoadModels(std::wstring mapFile) modelData.world = modelData.world * translate; modelData.visible = true; - modelData.modelPath = L"..\\Content\\Models\\char_white.dan"; + modelData.modelPath = L"char_white.dan"; modelData.id = 2; // load models obj = new C_Player(); @@ -121,7 +124,7 @@ bool GameState::LoadModels(std::wstring mapFile) modelData.world = modelData.world * translate; modelData.visible = true; - modelData.modelPath = L"..\\Content\\Models\\char_white.dan"; + modelData.modelPath = L"char_white.dan"; modelData.id = 3; // load models obj = new C_Player(); @@ -158,7 +161,7 @@ GameClientState::ClientState GameState::Update(float deltaTime, InputClass* KeyI { switch (privData->state) { - case gameStateState_loading: + case gameStateState_loading: //Will this ever happen in this scope?? { // load map // wait for all players diff --git a/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp b/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp index 538408c5..ccfe636d 100644 --- a/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp +++ b/Code/Game/DanBiasGame/GameClientState/LobbyState.cpp @@ -5,6 +5,7 @@ #include "C_obj/C_StaticObj.h" #include "C_obj/C_DynamicObj.h" #include +#include using namespace DanBias::Client; @@ -55,7 +56,7 @@ bool LobbyState::LoadModels(std::wstring file) modelData.world = Oyster::Math3D::Float4x4::identity; modelData.visible = true; - modelData.modelPath = L"..\\Content\\Models\\box_2.dan"; + modelData.modelPath = L"box_2.dan"; // load models privData->object[0] = new C_StaticObj(); privData->object[0]->Init(modelData); @@ -88,9 +89,15 @@ GameClientState::ClientState LobbyState::Update(float deltaTime, InputClass* Key // send data to server // check data from server - if( KeyInput->IsKeyPressed(DIK_G)) + if(GameServerAPI::ServerIsRunning() && GameServerAPI::ServerIsRunning()) //May be a problem if server is not shut down properly after lan session. { - return ClientState_Game; + if( KeyInput->IsKeyPressed(DIK_G)) + { + if(!DanBias::GameServerAPI::GameStart()) + { + //this->nwClient->Send(GameLogic::Protocol_LobbyStartGame()); + } + } } return ClientState_Same; diff --git a/Code/Game/DanBiasGame/GameClientState/LoginState.cpp b/Code/Game/DanBiasGame/GameClientState/LoginState.cpp index 9beb6657..940dc5aa 100644 --- a/Code/Game/DanBiasGame/GameClientState/LoginState.cpp +++ b/Code/Game/DanBiasGame/GameClientState/LoginState.cpp @@ -55,7 +55,7 @@ bool LoginState::LoadModels(std::wstring file) modelData.world = Oyster::Math3D::Float4x4::identity; modelData.visible = true; - modelData.modelPath = L"..\\Content\\Models\\box_2.dan"; + modelData.modelPath = L"box_2.dan"; // load models privData->object[0] = new C_StaticObj(); privData->object[0]->Init(modelData); diff --git a/Code/Game/GameLogic/AttatchmentSocket.cpp b/Code/Game/GameLogic/AttatchmentSocket.cpp index 4a663bef..7a8076b1 100644 --- a/Code/Game/GameLogic/AttatchmentSocket.cpp +++ b/Code/Game/GameLogic/AttatchmentSocket.cpp @@ -14,7 +14,10 @@ AttatchmentSocket::AttatchmentSocket(void) AttatchmentSocket::~AttatchmentSocket(void) { - + if(this->attatchment) + delete this->attatchment; + + this->attatchment = 0; } IAttatchment* AttatchmentSocket::GetAttatchment() diff --git a/Code/Game/GameLogic/CollisionManager.cpp b/Code/Game/GameLogic/CollisionManager.cpp index 019df6f4..c0b21462 100644 --- a/Code/Game/GameLogic/CollisionManager.cpp +++ b/Code/Game/GameLogic/CollisionManager.cpp @@ -59,7 +59,7 @@ using namespace GameLogic; if(kineticEnergyLoss > forceThreashHold) //should only take damage if the force is high enough { - damageDone = kineticEnergyLoss * 0.10f; + damageDone = (int)kineticEnergyLoss * 0.10f; player.DamageLife(damageDone); } diff --git a/Code/Game/GameLogic/Game.cpp b/Code/Game/GameLogic/Game.cpp index badd7328..ae030c19 100644 --- a/Code/Game/GameLogic/Game.cpp +++ b/Code/Game/GameLogic/Game.cpp @@ -162,6 +162,6 @@ void Game::PhysicsOnMove(const ICustomBody *object) } void Game::PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer proto) { - if(gameInstance.onDeadFnc) gameInstance.onDeadFnc(0); + } diff --git a/Code/Game/GameLogic/Game.h b/Code/Game/GameLogic/Game.h index 3ea76b61..a1427689 100644 --- a/Code/Game/GameLogic/Game.h +++ b/Code/Game/GameLogic/Game.h @@ -73,11 +73,9 @@ namespace GameLogic float GetFrameTime() const; - private: static void PhysicsOnMove(const Oyster::Physics::ICustomBody *object); static void PhysicsOnDestroy(::Utility::DynamicMemory::UniquePointer proto); - private: Utility::DynamicMemory::DynamicArray players; LevelData* level; float frameTime; diff --git a/Code/Game/GameLogic/Level.cpp b/Code/Game/GameLogic/Level.cpp index 50737eb9..2f08a671 100644 --- a/Code/Game/GameLogic/Level.cpp +++ b/Code/Game/GameLogic/Level.cpp @@ -7,11 +7,18 @@ using namespace Oyster::Physics; Level::Level(void) + :levelObj(0) + ,testBox(0) { } Level::~Level(void) { + delete this->levelObj; + this->levelObj = 0; + + delete this->testBox; + this->testBox = 0; } void Level::InitiateLevel(std::string levelPath) @@ -23,7 +30,7 @@ void Level::InitiateLevel(float radius) // add level sphere API::SphericalBodyDescription sbDesc; - sbDesc.centerPosition = Oyster::Math::Float4(0,0,0,1); + sbDesc.centerPosition = Oyster::Math::Float3(0,0,0); sbDesc.ignoreGravity = true; sbDesc.radius = 300; sbDesc.mass = 10e12f; @@ -32,12 +39,18 @@ void Level::InitiateLevel(float radius) ICustomBody::State state; rigidBody->GetState(state); - state.SetRestitutionCoeff(0.2); + state.SetRestitutionCoeff(0.2f); rigidBody->SetState(state); - levelObj = new StaticObject(rigidBody, LevelCollisionBefore, LevelCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_WORLD); + this->levelObj = new StaticObject(rigidBody, LevelCollisionBefore, LevelCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_WORLD); rigidBody->SetCustomTag(levelObj); + // add gravitation + API::Gravity gravityWell; + gravityWell.gravityType = API::Gravity::GravityType_Well; + gravityWell.well.mass = 1e15f; + gravityWell.well.position = Oyster::Math::Float3(0,0,0); + API::Instance().AddGravity(gravityWell); // add box API::SimpleBodyDescription sbDesc_TestBox; @@ -52,16 +65,8 @@ void Level::InitiateLevel(float radius) testBox = new DynamicObject(rigidBody_TestBox,Object::DefaultCollisionBefore, Object::DefaultCollisionAfter, OBJECT_TYPE::OBJECT_TYPE_BOX); rigidBody_TestBox->SetCustomTag(testBox); rigidBody_TestBox->GetState(state); - state.ApplyLinearImpulse(Oyster::Math::Float3(0,0,0)); + state.ApplyLinearImpulse(Oyster::Math::Float3(1,0,0)); rigidBody_TestBox->SetState(state); - - - // add gravitation - API::Gravity gravityWell; - gravityWell.gravityType = API::Gravity::GravityType_Well; - gravityWell.well.mass = 1e15f; - gravityWell.well.position = Oyster::Math::Float4(0,0,0,1); - API::Instance().AddGravity(gravityWell); } void Level::AddPlayerToTeam(Player *player, int teamID) diff --git a/Code/Game/GameLogic/Weapon.cpp b/Code/Game/GameLogic/Weapon.cpp index a4c87e9e..942f7074 100644 --- a/Code/Game/GameLogic/Weapon.cpp +++ b/Code/Game/GameLogic/Weapon.cpp @@ -18,9 +18,17 @@ Weapon::Weapon() Weapon::Weapon(int MaxNrOfSockets,Player *owner) { + if(MaxNrOfSockets > 1) return; + + attatchmentSockets.Resize(MaxNrOfSockets); attatchmentSockets[0] = new AttatchmentSocket(); + for (int i = 0; i < MaxNrOfSockets; i++) + { + this->attatchmentSockets[i] = 0; + } + weaponState = WEAPON_STATE_IDLE; currentNrOfAttatchments = 0; selectedAttatchment = 0; @@ -36,7 +44,11 @@ Weapon::Weapon(int MaxNrOfSockets,Player *owner) Weapon::~Weapon(void) { - + for (unsigned int i = 0; i < this->attatchmentSockets.Size(); i++) + { + delete this->attatchmentSockets[i]; + this->attatchmentSockets[i] = 0; + } } /******************************************************** diff --git a/Code/Game/GameProtocols/GeneralProtocols.h b/Code/Game/GameProtocols/GeneralProtocols.h index 0353d63f..db50b61f 100644 --- a/Code/Game/GameProtocols/GeneralProtocols.h +++ b/Code/Game/GameProtocols/GeneralProtocols.h @@ -24,17 +24,18 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Short; } - Protocol_General_Status(Oyster::Network::CustomNetProtocol& p) - { - this->protocol = p; - status = (States)p[1].value.netShort; - } Protocol_General_Status(States state) { this->protocol[0].value = protocol_General_Status; this->protocol[0].type = Oyster::Network::NetAttributeType_Short; - this->status = state; + this->protocol[1].type = Oyster::Network::NetAttributeType_Short; + this->status = state; + } + + Protocol_General_Status(Oyster::Network::CustomNetProtocol& p) + { + status = (States)this->protocol[1].value.netShort; } Oyster::Network::CustomNetProtocol GetProtocol() override { diff --git a/Code/Game/GameProtocols/LobbyProtocols.h b/Code/Game/GameProtocols/LobbyProtocols.h index 3c173849..95ec8537 100644 --- a/Code/Game/GameProtocols/LobbyProtocols.h +++ b/Code/Game/GameProtocols/LobbyProtocols.h @@ -46,7 +46,7 @@ namespace GameLogic */ struct Protocol_LobbyStartGame :public Oyster::Network::CustomProtocolObject { - short gameId; + short clientID; // The unuiqe id reprsenting a specific client Protocol_LobbyStartGame() { @@ -55,13 +55,21 @@ namespace GameLogic this->protocol[1].type = Oyster::Network::NetAttributeType_Short; } + Protocol_LobbyStartGame(short _clientID) + { + this->protocol[0].value = protocol_Lobby_Start; + this->protocol[0].type = Oyster::Network::NetAttributeType_Short; + + this->protocol[1].type = Oyster::Network::NetAttributeType_Short; + clientID = _clientID; + } Protocol_LobbyStartGame(Oyster::Network::CustomNetProtocol& o) { - gameId = o[1].value.netInt; + clientID = o[1].value.netInt; } Oyster::Network::CustomNetProtocol GetProtocol() override { - protocol[1].value = gameId; + protocol[1].value = clientID; return protocol; } diff --git a/Code/Game/GameProtocols/ObjectProtocols.h b/Code/Game/GameProtocols/ObjectProtocols.h index ca8bb362..11085041 100644 --- a/Code/Game/GameProtocols/ObjectProtocols.h +++ b/Code/Game/GameProtocols/ObjectProtocols.h @@ -235,7 +235,7 @@ namespace GameLogic struct Protocol_ObjectCreate :public Oyster::Network::CustomProtocolObject { int object_ID; - char *name; + std::string name; float worldMatrix[16]; Protocol_ObjectCreate() @@ -244,7 +244,7 @@ namespace GameLogic this->protocol[0].type = Oyster::Network::NetAttributeType_Short; this->protocol[1].type = Oyster::Network::NetAttributeType_Int; - this->protocol[2].type = Oyster::Network::NetAttributeType_CharArray; + this->protocol[2].type = Oyster::Network::NetAttributeType_CharArray; for (int i = 3; i <= 18; i++) { @@ -276,7 +276,7 @@ namespace GameLogic { this->protocol[1].value = object_ID; - this->protocol[2].value = name; + this->protocol.Set(2, name); this->protocol[3].value = worldMatrix[0]; this->protocol[4].value = worldMatrix[1]; this->protocol[5].value = worldMatrix[2]; diff --git a/Code/Game/GameServer/GameClient.h b/Code/Game/GameServer/GameClient.h index 5db6efdb..097999ea 100644 --- a/Code/Game/GameServer/GameClient.h +++ b/Code/Game/GameServer/GameClient.h @@ -25,13 +25,19 @@ namespace DanBias Utility::DynamicMemory::SmartPointer GetClient(); Utility::DynamicMemory::SmartPointer ReleaseClient(); int GetID() const; - + float GetSinceLastResponse() const; + bool IsReady() const; bool Equals(const Oyster::Network::NetworkClient* c); + void SetReadyState(bool isReady); + void SetSinceLastResponse(float seconds); + private: GameLogic::IPlayerData* player; Utility::DynamicMemory::SmartPointer client; int id; + bool isReady; + float secondsSinceLastResponse; }; }//End namespace DanBias diff --git a/Code/Game/GameServer/GameLobby.h b/Code/Game/GameServer/GameLobby.h index b5213518..94cb0e3c 100644 --- a/Code/Game/GameServer/GameLobby.h +++ b/Code/Game/GameServer/GameLobby.h @@ -55,6 +55,7 @@ namespace DanBias GameSession gameSession; LobbyLevelData description; + Utility::DynamicMemory::SmartPointer sessionOwner; }; }//End namespace DanBias #endif // !DANBIASGAME_GAMELOBBY_H diff --git a/Code/Game/GameServer/GameServerAPI.h b/Code/Game/GameServer/GameServerAPI.h index e76b4264..edd9c473 100644 --- a/Code/Game/GameServer/GameServerAPI.h +++ b/Code/Game/GameServer/GameServerAPI.h @@ -32,9 +32,11 @@ namespace DanBias { char* serverName; int listenPort; + bool broadcast; //Not fully implemented! ServerInitDesc() : serverName("Game Server") , listenPort(15151) + , broadcast(true) {}; }; struct GameServerInfo @@ -49,6 +51,7 @@ namespace DanBias static void ServerStop(); static void ServerUpdate(); static GameServerInfo ServerGetInfo(); + static bool ServerIsRunning(); static void GameSetMapId(const int& val); static void GameSetMaxClients(const int& val); diff --git a/Code/Game/GameServer/GameSession.h b/Code/Game/GameServer/GameSession.h index 14144aaa..c9e426d8 100644 --- a/Code/Game/GameServer/GameSession.h +++ b/Code/Game/GameServer/GameSession.h @@ -52,6 +52,7 @@ namespace DanBias * @param client The client to attach to the session */ bool Attach(Oyster::Network::NetClient client) override; + void CloseSession( bool dissconnectClients ) override; inline bool IsCreated() const { return this->isCreated; } inline bool IsRunning() const { return this->isRunning; } @@ -66,11 +67,13 @@ namespace DanBias //Sends a client to the owner, if obj is NULL then all clients is sent void SendToOwner(DanBias::GameClient* obj); - //Frame function, derived from IThreadObject + //Derived from IThreadObject + void ThreadEntry() override; bool DoWork ( ) override; + private: - void ParseProtocol (Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c); + void ParseProtocol ( Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c ); void Gameplay_PlayerMovement ( GameLogic::Protocol_PlayerMovement& p, DanBias::GameClient* c ); void Gameplay_PlayerLookDir ( GameLogic::Protocol_PlayerLook& p, DanBias::GameClient* c ); @@ -87,11 +90,12 @@ namespace DanBias void General_Text ( GameLogic::Protocol_General_Text& p, DanBias::GameClient* c ); //Callback method recieving from gamelogic - static void ObjectMove(GameLogic::IObjectData* movedObject); + static void ObjectMove ( GameLogic::IObjectData* movedObject ); //Private member variables private: Utility::DynamicMemory::DynamicArray> clients; + Utility::DynamicMemory::SmartPointer sessionOwner; Oyster::Thread::OysterThread worker; GameLogic::GameAPI& gameInstance; GameLogic::ILevelData *levelData; diff --git a/Code/Game/GameServer/Implementation/GameClient.cpp b/Code/Game/GameServer/Implementation/GameClient.cpp index 3f0c8308..167dacc0 100644 --- a/Code/Game/GameServer/Implementation/GameClient.cpp +++ b/Code/Game/GameServer/Implementation/GameClient.cpp @@ -18,12 +18,14 @@ GameClient::GameClient(SmartPointer client, GameLogic::IPlayerDat this->client = client; this->id = gameClientIDCount++; this->player = player; + isReady = false; } GameClient::~GameClient() { this->client->Disconnect(); this->player = 0; this->id = -1; + isReady = false; } GameLogic::IPlayerData* GameClient::GetPlayer() @@ -50,9 +52,25 @@ int GameClient::GetID() const { return this->id; } +float GameClient::GetSinceLastResponse() const +{ + return this->secondsSinceLastResponse; +} +bool GameClient::IsReady() const +{ + return this->isReady; +} bool GameClient::Equals(const NetworkClient* c) { return (c->GetID() == this->client->GetID()); } +void GameClient::SetReadyState(bool r) +{ + this->isReady = r; +} +void GameClient::SetSinceLastResponse(float s) +{ + this->secondsSinceLastResponse = s; +} diff --git a/Code/Game/GameServer/Implementation/GameLobby.cpp b/Code/Game/GameServer/Implementation/GameLobby.cpp index 4a064a26..df0738f0 100644 --- a/Code/Game/GameServer/Implementation/GameLobby.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby.cpp @@ -24,13 +24,11 @@ namespace DanBias void GameLobby::Release() { NetworkSession::CloseSession(true); + this->gameSession.CloseSession(true); } void GameLobby::Update() { - if(GetAsyncKeyState(VK_DOWN)) //TODO: Dont forget to remove this... - this->Send(GameLogic::Protocol_General_Status().GetProtocol()); - this->ProcessClients(); } void GameLobby::SetGameDesc(const LobbyLevelData& desc) @@ -47,20 +45,21 @@ namespace DanBias desc.mapNumber = this->description.mapNumber; desc.maxClients = this->description.maxClients; } - bool GameLobby::StartGameSession() + bool GameLobby::StartGameSession( ) { GameSession::GameDescription desc; - desc.gameMode = this->description.gameMode; - desc.gameTime = this->description.gameTime; - desc.mapNumber = this->description.mapNumber; - desc.owner = this; - desc.clients = this->clients; + desc.gameMode = this->description.gameMode; + desc.gameTime = this->description.gameTime; + desc.mapNumber = this->description.mapNumber; + desc.owner = this; + desc.clients = this->clients; - this->clients.Clear(); + this->clients.Clear(); //Remove clients from lobby list if(this->gameSession.Create(desc)) { this->gameSession.Run(); + return true; } return false; diff --git a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp index 3a86bc6b..93986650 100644 --- a/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp +++ b/Code/Game/GameServer/Implementation/GameLobby_ProtocolParser.cpp @@ -62,7 +62,14 @@ void GameLobby::GeneralText(GameLogic::Protocol_General_Text& p, Oyster::Network //} void GameLobby::LobbyStartGame(GameLogic::Protocol_LobbyStartGame& p, Oyster::Network::NetworkClient* c) { - //TODO: Prio 1 + if(this->sessionOwner->GetClient()->GetID() == c->GetID()) + { + + } + else + { + //Someone else tried to start the server.. + } } //void GameLobby::LobbyJoin(GameLogic::Protocol_LobbyJoin& p, Oyster::Network::NetworkClient* c) //{ diff --git a/Code/Game/GameServer/Implementation/GameServer.cpp b/Code/Game/GameServer/Implementation/GameServer.cpp index 670f7888..bb046a41 100644 --- a/Code/Game/GameServer/Implementation/GameServer.cpp +++ b/Code/Game/GameServer/Implementation/GameServer.cpp @@ -53,7 +53,7 @@ void GameServerAPI::ServerStart() } void GameServerAPI::ServerStop() { - if(!server.IsStarted()) return; + if(!server.IsRunning()) return; lobby.Release(); server.Shutdown(); @@ -62,19 +62,19 @@ void GameServerAPI::ServerStop() int time = (int)total; int hour, min, sec; - hour=time / 3600; - time=time % 3600; - min=time / 60; - time=time % 60; + hour = time / 3600; + time = time % 3600; + min = time / 60; + time = time % 60; sec = time; printf( "Server has been running for: %i:%i:%i - [hh:mm:ss] \n\n", hour, min, sec ); - printf( "Terminating in : "); - for (int i = 0; i < 3; i++) - { - printf( "%i ", 3-i ); - Sleep(1000); - } + //printf( "Terminating in : "); + //for (int i = 0; i < 3; i++) + //{ + // printf( "%i ", 3-i ); + // Sleep(1000); + //} printf( "\nServer terminated!" ); } void GameServerAPI::ServerUpdate() @@ -83,7 +83,6 @@ void GameServerAPI::ServerUpdate() lobby.Update(); } - GameServerAPI::GameServerInfo GameServerAPI::ServerGetInfo() { GameServerAPI::GameServerInfo i; @@ -91,6 +90,11 @@ GameServerAPI::GameServerInfo GameServerAPI::ServerGetInfo() i.listenPort = server.GetPort(); return i; } +bool GameServerAPI::ServerIsRunning() +{ + return server.IsRunning(); +} + void GameServerAPI::GameSetMapId(const int& val) { LobbyLevelData d; @@ -151,6 +155,11 @@ const char* GameServerAPI::GameGetGameName() } bool GameServerAPI::GameStart() { - return lobby.StartGameSession(); + if(lobby.StartGameSession()) + { + + return true; + } + return false; } diff --git a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp index 64a4a039..495e34c3 100644 --- a/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_Gameplay.cpp @@ -88,16 +88,14 @@ namespace DanBias if(dynamic_cast (movedObject)) { - IPlayerData* temp = (IPlayerData*)movedObject; - - int id = temp->GetID(); - Oyster::Math::Float4x4 world = temp->GetOrientation(); - + int id = movedObject->GetID(); + Oyster::Math::Float4x4 world = movedObject->GetOrientation(); + Protocol_ObjectPosition p(world, id); GameSession::gameSession->Send(p.GetProtocol()); - } + } - if(dynamic_cast(movedObject)) + if(dynamic_cast(movedObject)) { GameLogic::IObjectData* obj = NULL; obj = ((GameLogic::ILevelData*)movedObject)->GetObjectAt(0); @@ -136,6 +134,8 @@ namespace DanBias void GameSession::ParseProtocol(Oyster::Network::CustomNetProtocol& p, DanBias::GameClient* c) { + //TODO: Update response timer + switch (p[0].value.netShort) { case protocol_Gameplay_PlayerMovement: this->Gameplay_PlayerMovement ( Protocol_PlayerMovement (p), c ); @@ -224,6 +224,8 @@ namespace DanBias { case GameLogic::Protocol_General_Status::States_disconected: printf("Client with ID [%i] dissconnected\n", c->GetClient()->GetID()); + //TODO: Tell other clients + //Protocol_ this->Detach(c->GetClient()->GetID()); break; @@ -232,7 +234,7 @@ namespace DanBias break; case GameLogic::Protocol_General_Status::States_ready: - + c->SetReadyState(true); break; case GameLogic::Protocol_General_Status::States_leave: diff --git a/Code/Game/GameServer/Implementation/GameSession_General.cpp b/Code/Game/GameServer/Implementation/GameSession_General.cpp index dfd0617f..379e7a6c 100644 --- a/Code/Game/GameServer/Implementation/GameSession_General.cpp +++ b/Code/Game/GameServer/Implementation/GameSession_General.cpp @@ -9,6 +9,7 @@ #define NOMINMAX #include +#include using namespace Utility::DynamicMemory; @@ -92,6 +93,9 @@ namespace DanBias /* Set some game instance data options */ this->gameInstance.SetSubscription(GameLogic::GameEvent::ObjectEventFunctionType_OnMove, GameSession::ObjectMove); + //this->gameInstance.SetSubscription(GameLogic::GameEvent::ObjectEventFunctionType_OnDead, GameSession::ObjectDead); + + this->description.clients.Clear(); this->isCreated = true; return this->isCreated; @@ -109,7 +113,53 @@ namespace DanBias } } + void GameSession::ThreadEntry( ) + { + //A timer so we dont lock because 1 client disconnected.. + Utility::WinTimer t; + DynamicArray> readyList = this->clients; + + //First we need to clean invalid clients, if any, and tell them to start loading game data + for (unsigned int i = 0; i < readyList.Size(); i++) + { + if(!readyList[i]) + { + readyList.Remove(i); + } + else + { + Protocol_LobbyStartGame p(readyList[i]->GetPlayer()->GetID()); + readyList[i]->GetClient()->Send(p); + } + } + + unsigned int readyCounter = readyList.Size(); + //Sync with clients + while (readyCounter != 0) + { + this->ProcessClients(); + for (unsigned int i = 0; i < readyList.Size(); i++) + { + if(readyList[i] && readyList[i]->IsReady()) + { + //Need to send information about other players to all players + for (unsigned int k = 0; k < readyList.Size(); k++) + { + if(k != i && this->clients[k]) + { + Protocol_ObjectCreate p(this->clients[k]->GetPlayer()->GetOrientation(), this->clients[k]->GetPlayer()->GetID(), "char_white.dan"); //The model name will be custom later.. + readyList[i]->GetClient()->Send(p); + } + } + + readyCounter-- ; + readyList[i] = 0; + } + } + Sleep(5); //TODO: This might not be needed here. + } + } bool GameSession::Attach(Utility::DynamicMemory::SmartPointer client) { @@ -132,6 +182,12 @@ namespace DanBias return true; } + void GameSession::CloseSession( bool dissconnectClients ) + { + NetworkSession::CloseSession(true); + this->clients.Clear(); + } + }//End namespace DanBias diff --git a/Code/Misc/DynamicArray.h b/Code/Misc/DynamicArray.h index 1db30719..6c3b4609 100644 --- a/Code/Misc/DynamicArray.h +++ b/Code/Misc/DynamicArray.h @@ -44,6 +44,11 @@ namespace Utility unsigned int Size() const; unsigned int Capacity() const; + bool IsEmpty() const; + + T* begin(); + T* end(); + private: void Expand(int elements = 0); @@ -165,7 +170,7 @@ namespace Utility template void DynamicArray::Remove(unsigned int index) { - assert(index > this->size); + assert(index > (unsigned int) this->size); T* temp = new T[this->capacity - 1]; @@ -181,7 +186,8 @@ namespace Utility template void DynamicArray::Clear() { - delete [] this->data; + if(this->data) + delete [] this->data; this->data = 0; this->size = 0; @@ -227,6 +233,11 @@ namespace Utility return (unsigned int)this->capacity; } + template bool DynamicArray::IsEmpty() const + { + return (this->size == 0); + } + template void DynamicArray::Expand(int elements) { if(elements < 1) return; @@ -248,6 +259,18 @@ namespace Utility } } + template T* DynamicArray::begin() + { + if(this->size == 0) return 0; + return &this->data[0]; + } + + template T* DynamicArray::end() + { + if(this->size == 0) return 0; + return ((&this->data[this->size - 1]) + 1); + } + #pragma endregion } } diff --git a/Code/Misc/Thread/OysterThread_Impl.cpp b/Code/Misc/Thread/OysterThread_Impl.cpp index 79c7c700..91430eab 100644 --- a/Code/Misc/Thread/OysterThread_Impl.cpp +++ b/Code/Misc/Thread/OysterThread_Impl.cpp @@ -42,15 +42,10 @@ using namespace Utility::DynamicMemory; }; struct ThreadData { - OYSTER_THREAD_STATE state; // ownerObj; // - OwnerContainer ownerObj; // - std::atomic msec; //threadData->state = OYSTER_THREAD_STATE_DEAD; - - if(this->workerThread.joinable()) + if(std::this_thread::get_id() != this->workerThread.get_id()) { - this->workerThread.join(); + //this->threadData->threadDataAcces.lock(); + //{ + this->threadData->state = OYSTER_THREAD_STATE_DEAD; + + if(this->workerThread.joinable()) + { + this->workerThread.join(); + } + + this->isCreated = false; + delete this->threadData; + this->threadData = 0; + //} this->threadData->threadDataAcces.unlock(); + } + else + { + this->threadData->state = OYSTER_THREAD_STATE_DEAD; + if(this->workerThread.joinable()) + { + this->workerThread.join(); + } + this->isCreated = false; delete this->threadData; this->threadData = 0; @@ -102,12 +115,10 @@ using namespace Utility::DynamicMemory; this->threadData->state = OYSTER_THREAD_STATE_IDLE; threadData->ownerObj = worker; threadData->prio = OYSTER_THREAD_PRIORITY_2; + threadData->msec = 0; workerThread = std::thread(fnc, this->threadData); - //if(detach) - // this->workerThread.detach(); - isCreated = true; return OYSTER_THREAD_ERROR_SUCCESS; @@ -145,6 +156,9 @@ using namespace Utility::DynamicMemory; public: static void CheckPriority(ThreadData* w) { + + Oyster::Thread::OYSTER_THREAD_PRIORITY temp = w->prio; + switch (w->prio) { case Oyster::Thread::OYSTER_THREAD_PRIORITY_1: @@ -190,16 +204,18 @@ using namespace Utility::DynamicMemory; while (w->state == OYSTER_THREAD_STATE_NORMAL) { - CheckPriority(w); - if(!DoWork(w)) break; - CheckStatus(w); + //while (!w->threadDataAcces.try_lock()); + + CheckPriority(w); + if(!DoWork(w)) break; + CheckStatus(w); + + //w->threadDataAcces.unlock(); } if(w->ownerObj.value.obj) w->ownerObj.value.obj->ThreadExit(); w->state = OYSTER_THREAD_STATE_DEAD; - - //delete w; } }; @@ -247,79 +263,114 @@ OYSTER_THREAD_ERROR OysterThread::Create(ThreadFnc worker, bool start, bool deta OYSTER_THREAD_ERROR OysterThread::Start() { - if(!this->privateData->data->threadData->ownerObj) - return OYSTER_THREAD_ERROR_ThreadHasNoWorker; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; + //this->privateData->data->threadData->threadDataAcces.lock();{ - if(this->privateData->data->threadData->state == OYSTER_THREAD_STATE_DEAD) - return OYSTER_THREAD_ERROR_ThreadIsDead; + if(!this->privateData->data->threadData->ownerObj) + val = OYSTER_THREAD_ERROR_ThreadHasNoWorker; - this->privateData->data->threadData->state = OYSTER_THREAD_STATE_NORMAL; + if(this->privateData->data->threadData->state == OYSTER_THREAD_STATE_DEAD) + val = OYSTER_THREAD_ERROR_ThreadIsDead; - return OYSTER_THREAD_ERROR_SUCCESS; + this->privateData->data->threadData->state = OYSTER_THREAD_STATE_NORMAL; + + //} this->privateData->data->threadData->threadDataAcces.unlock(); + + return val; } OYSTER_THREAD_ERROR OysterThread::Stop() { - this->privateData->data->threadData->state = OYSTER_THREAD_STATE_IDLE; - return OYSTER_THREAD_ERROR_SUCCESS; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; + //this->privateData->data->threadData->threadDataAcces.lock(); { + this->privateData->data->threadData->state = OYSTER_THREAD_STATE_IDLE; + //} this->privateData->data->threadData->threadDataAcces.unlock(); + + return val; } OYSTER_THREAD_ERROR OysterThread::Stop(int msec) { - this->privateData->data->threadData->msec = msec; - return OYSTER_THREAD_ERROR_SUCCESS; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; + //this->privateData->data->threadData->threadDataAcces.lock(); { + this->privateData->data->threadData->msec = msec; + //} this->privateData->data->threadData->threadDataAcces.unlock(); + return val; } OYSTER_THREAD_ERROR OysterThread::Resume() { - if(this->privateData->data->threadData->state == OYSTER_THREAD_STATE_DEAD) - return OYSTER_THREAD_ERROR_ThreadIsDead; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; + //this->privateData->data->threadData->threadDataAcces.lock(); { + if(this->privateData->data->threadData->state == OYSTER_THREAD_STATE_DEAD) + val = OYSTER_THREAD_ERROR_ThreadIsDead; - this->privateData->data->threadData->state = OYSTER_THREAD_STATE_NORMAL; + this->privateData->data->threadData->state = OYSTER_THREAD_STATE_NORMAL; + //} this->privateData->data->threadData->threadDataAcces.unlock(); - return OYSTER_THREAD_ERROR_SUCCESS; + return val; } OYSTER_THREAD_ERROR OysterThread::SetWorker(IThreadObject* worker) { - this->privateData->data->threadData->ownerObj.value = worker; - this->privateData->data->threadData->ownerObj.type = Oyster::Callback::CallbackType_Object; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; + //this->privateData->data->threadData->threadDataAcces.lock();{ - this->privateData->data->threadData->msec = 0; + this->privateData->data->threadData->ownerObj.value = worker; + this->privateData->data->threadData->ownerObj.type = Oyster::Callback::CallbackType_Object; - return OYSTER_THREAD_ERROR_SUCCESS;; + this->privateData->data->threadData->msec = 0; + //} this->privateData->data->threadData->threadDataAcces.unlock(); + + return val;; } OYSTER_THREAD_ERROR OysterThread::SetWorker(ThreadFnc worker) { - this->privateData->data->threadData->ownerObj.value = worker; - this->privateData->data->threadData->ownerObj.type = Oyster::Callback::CallbackType_Function; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; + //this->privateData->data->threadData->threadDataAcces.lock();{ - this->privateData->data->threadData->msec = 0; + this->privateData->data->threadData->ownerObj.value = worker; + this->privateData->data->threadData->ownerObj.type = Oyster::Callback::CallbackType_Function; - return OYSTER_THREAD_ERROR_SUCCESS;; + this->privateData->data->threadData->msec = 0; + //} this->privateData->data->threadData->threadDataAcces.unlock(); + + return val;; } OYSTER_THREAD_ERROR OysterThread::Terminate() { if(this->privateData) return this->privateData->Terminate(); + return OYSTER_THREAD_ERROR_SUCCESS; } OYSTER_THREAD_ERROR OysterThread::Wait() { - if(this->privateData->data->threadData->state == OYSTER_THREAD_STATE_DEAD) - return OYSTER_THREAD_ERROR_ThreadIsDead; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; - if( this->privateData->data->workerThread.get_id() == std::this_thread::get_id()) - return OYSTER_THREAD_ERROR_ThreadCannotWaintOnItselfe; + //this->privateData->data->threadData->threadDataAcces.lock();{ - return OYSTER_THREAD_ERROR_SUCCESS; + if(this->privateData->data->threadData->state == OYSTER_THREAD_STATE_DEAD) + val = OYSTER_THREAD_ERROR_ThreadIsDead; + + if( this->privateData->data->workerThread.get_id() == std::this_thread::get_id()) + val = OYSTER_THREAD_ERROR_ThreadCannotWaintOnItselfe; + + //} this->privateData->data->threadData->threadDataAcces.unlock(); + + return val; } OYSTER_THREAD_ERROR OysterThread::Wait(int msec) { - if(this->privateData->data->workerThread.get_id() == std::this_thread::get_id()) - return OYSTER_THREAD_ERROR_ThreadCannotWaintOnItselfe; - - return OYSTER_THREAD_ERROR_SUCCESS; + OYSTER_THREAD_ERROR val = OYSTER_THREAD_ERROR_SUCCESS; + + //this->privateData->data->threadData->threadDataAcces.lock();{ + if(this->privateData->data->workerThread.get_id() == std::this_thread::get_id()) + val = OYSTER_THREAD_ERROR_ThreadCannotWaintOnItselfe; + //} this->privateData->data->threadData->threadDataAcces.unlock(); + return val; } OYSTER_THREAD_ERROR OysterThread::Swap(const OysterThread* other) { - this->privateData->data->workerThread.swap(other->privateData->data->workerThread); + //this->privateData->data->threadData->threadDataAcces.lock();{ + this->privateData->data->workerThread.swap(other->privateData->data->workerThread); + //} this->privateData->data->threadData->threadDataAcces.unlock(); return OYSTER_THREAD_ERROR_SUCCESS; } diff --git a/Code/Misc/Utilities-Impl.h b/Code/Misc/Utilities-Impl.h index 1cfe8b8f..eedf9430 100644 --- a/Code/Misc/Utilities-Impl.h +++ b/Code/Misc/Utilities-Impl.h @@ -374,7 +374,191 @@ namespace Utility return (this->_ptr != NULL) ? true : false; } #pragma endregion - + + } + + namespace Thread + { +#pragma region ThreadSafeSmartPointer + template void ThreadSafeSmartPointer::Destroy() + { + delete this->_rc.load(); + this->_rc = NULL; + + //Use default function for memory deallocation. + SafeDeleteInstance(this->_ptr.load()); + + this->_ptr = NULL; + } + template ThreadSafeSmartPointer::ThreadSafeSmartPointer() + :_rc(0), _ptr(0) + { } + template ThreadSafeSmartPointer::ThreadSafeSmartPointer(UniquePointer& p) + :_ptr(p.Release()) + { + this->_rc = new ReferenceCount(); + this->_rc->Incref(); + } + template ThreadSafeSmartPointer::ThreadSafeSmartPointer(T* p) + :_ptr(p) + { + this->_rc.store = new ReferenceCount(); + this->_rc->Incref(); + } + template ThreadSafeSmartPointer::ThreadSafeSmartPointer(const ThreadSafeSmartPointer& d) + :_ptr(d._ptr), _rc(d._rc) + { + if(this->_rc) + this->_rc->Incref(); + } + template ThreadSafeSmartPointer::~ThreadSafeSmartPointer() + { + this->Release(); + } + template ThreadSafeSmartPointer& ThreadSafeSmartPointer::operator= (const ThreadSafeSmartPointer& p) + { + if (this != &p) + { + //Last to go? + if(this->_rc.load() && this->_rc.load()->Decref() == 0) + { + //Call child specific + Destroy(); + } + + this->_ptr.store(p._ptr.load()); + this->_rc.store(p._rc.load()); + if(this->_rc.load()) this->_rc.load()->Incref(); + } + return *this; + } + template ThreadSafeSmartPointer& ThreadSafeSmartPointer::operator= (UniquePointer& p) + { + //Last to go? + if(this->_rc) + { + if(this->_rc->Decref() == 0) + { + //Call child specific + Destroy(); + this->_rc = new ReferenceCount(); + } + } + else + { + if(p) this->_rc = new ReferenceCount(); + } + + if(this->_rc) + this->_rc->Incref(); + + this->_ptr = p.Release(); + + return *this; + } + template ThreadSafeSmartPointer& ThreadSafeSmartPointer::operator= (T* p) + { + if (this->_ptr != p) + { + //Last to go? + if(this->_rc.load()) + { + if(this->_rc.load()->Decref() == 0) + { + //Call child specific + Destroy(); + if(p) this->_rc = new ReferenceCount(); + } + } + else if(p) + { + this->_rc = new ReferenceCount(); + } + + this->_ptr = p; + + if(p) this->_rc.load()->Incref(); + else this->_rc = 0; + } + return *this; + } + template inline bool ThreadSafeSmartPointer::operator== (const ThreadSafeSmartPointer& d) const + { + return d._ptr == this->_ptr; + } + template inline bool ThreadSafeSmartPointer::operator== (const T& p) const + { + return &p == this->_ptr; + } + template inline bool ThreadSafeSmartPointer::operator!= (const ThreadSafeSmartPointer& d) const + { + return d._ptr != this->_ptr; + } + template inline bool ThreadSafeSmartPointer::operator!= (const T& p) const + { + return &p != this->_ptr; + } + template inline T& ThreadSafeSmartPointer::operator* () + { + return *this->_ptr; + } + template inline const T& ThreadSafeSmartPointer::operator* () const + { + return *this->_ptr; + } + template inline T* ThreadSafeSmartPointer::operator-> () + { + return this->_ptr; + } + template inline const T* ThreadSafeSmartPointer::operator-> () const + { + return this->_ptr; + } + template inline ThreadSafeSmartPointer::operator T* () const + { + return this->_ptr; + } + template inline ThreadSafeSmartPointer::operator const T* () const + { + return this->_ptr; + } + template inline ThreadSafeSmartPointer::operator T& () const + { + return *this->_ptr; + } + template inline ThreadSafeSmartPointer::operator bool() const + { + return (this->_ptr != 0); + } + template inline T* ThreadSafeSmartPointer::Get() + { + return this->_ptr; + } + template inline T* ThreadSafeSmartPointer::Get() const + { + return this->_ptr; + } + template int ThreadSafeSmartPointer::Release() + { + int returnVal = 0; + + if(this->_rc.load() && ((returnVal = this->_rc.load()->Decref()) == 0)) + { + Destroy(); + } + return returnVal; + } + template int ThreadSafeSmartPointer::ReleaseDummy() + { + int val = this->_rc->Decref(); + this->_rc->Incref(); + return val; + } + template inline bool ThreadSafeSmartPointer::IsValid() const + { + return (this->_ptr != NULL) ? true : false; + } +#pragma endregion } } diff --git a/Code/Misc/Utilities.h b/Code/Misc/Utilities.h index 9c71a515..22049ac0 100644 --- a/Code/Misc/Utilities.h +++ b/Code/Misc/Utilities.h @@ -400,7 +400,59 @@ namespace Utility namespace Thread { - //Utilities for threading + using namespace DynamicMemory; + //! Wrapper to manage references on a pointer. + template struct ThreadSafeSmartPointer + { + private: + std::atomic _rc; + std::atomic _ptr; + + /** Destroys the pointer and returns the memory allocated. */ + void Destroy(); + + public: + ThreadSafeSmartPointer(); + ThreadSafeSmartPointer(UniquePointer& up); + ThreadSafeSmartPointer(T* p); + ThreadSafeSmartPointer(const ThreadSafeSmartPointer& d); + virtual~ThreadSafeSmartPointer(); + ThreadSafeSmartPointer& operator= (const ThreadSafeSmartPointer& p); + ThreadSafeSmartPointer& operator= (UniquePointer& p); + ThreadSafeSmartPointer& operator= (T* p); + bool operator== (const ThreadSafeSmartPointer& d) const; + bool operator== (const T& p) const; + bool operator!= (const ThreadSafeSmartPointer& d) const; + bool operator!= (const T& p) const; + T& operator* (); + const T& operator* () const; + T* operator-> (); + const T* operator-> () const; + operator T* () const; + operator const T* () const; + operator T& () const; + operator bool() const; + + /** + * Returns the connected pointer + */ + T* Get(); + T* Get() const; + + /** + * Releases one reference of the pointer and set value to null, making the current ThreadSafeSmartPointer invalid. + */ + int Release(); + /** + * Only test to release to check reference count. + */ + int ReleaseDummy(); + + /** Checks if the pointer is valid (not NULL) + * Returns true for valid, else false. + */ + bool IsValid() const; + }; } } diff --git a/Code/Network/NetworkAPI/CustomNetProtocol.cpp b/Code/Network/NetworkAPI/CustomNetProtocol.cpp index 1762bf86..b3178b5d 100644 --- a/Code/Network/NetworkAPI/CustomNetProtocol.cpp +++ b/Code/Network/NetworkAPI/CustomNetProtocol.cpp @@ -4,13 +4,15 @@ #include "CustomNetProtocol.h" #include #include "Translator.h" +#include using namespace Oyster::Network; using namespace Utility::DynamicMemory; struct CustomNetProtocol::PrivateData { - std::map attributes; //...Im an idiot + //std::map attributes; //...Im an idiot + DynamicArray attributes; //...Im an idiot PrivateData() { } @@ -19,20 +21,19 @@ struct CustomNetProtocol::PrivateData { for (auto i = attributes.begin(); i != attributes.end(); i++) { - RemoveAttribute(i->first); + //RemoveAttribute(i); } - attributes.clear(); + attributes.Clear(); } - void RemoveAttribute(int ID) + void RemoveAttribute(NetAttributeContainer* i) { - auto i = attributes.find(ID); - if(i == attributes.end()) return; + if(!i) return; - switch (i->second.type) + switch (i->type) { case NetAttributeType_CharArray: - delete [] i->second.value.netCharPtr; + delete [] i->value.netCharPtr; break; } } @@ -40,30 +41,49 @@ struct CustomNetProtocol::PrivateData //Do network stuff }; - +static int ia = 0; +static int ib = 0; + CustomNetProtocol::CustomNetProtocol() { + ia++; this->privateData = new PrivateData(); } -CustomNetProtocol::CustomNetProtocol(const CustomNetProtocol& o) +CustomNetProtocol::CustomNetProtocol(CustomNetProtocol& o) { - this->privateData = o.privateData; + ib ++; + this->privateData = new PrivateData(); + this->privateData->attributes = o.privateData->attributes; } -const CustomNetProtocol& CustomNetProtocol::operator=(const CustomNetProtocol& o) +const CustomNetProtocol& CustomNetProtocol::operator=(CustomNetProtocol& o) { - this->privateData = o.privateData; + if(this->privateData) + { + delete this->privateData; + this->privateData = 0; + } + ib ++; + this->privateData = new PrivateData(); + this->privateData->attributes = o.privateData->attributes; return *this; } CustomNetProtocol::~CustomNetProtocol() { + //ia--; + delete this->privateData; + this->privateData = 0; } NetAttributeContainer& CustomNetProtocol::operator[](int ID) { - if(this->privateData->attributes.find(ID) == this->privateData->attributes.end()) + //if(!this->privateData) this->privateData = new PrivateData(); + if((unsigned int)ID >= this->privateData->attributes.Size()) { - this->privateData->attributes[ID]; - this->privateData->attributes[ID].type = NetAttributeType_UNKNOWN; - memset(&this->privateData->attributes[ID].value, 0, sizeof(NetAttributeValue)); + NetAttributeContainer temp; + + temp.type = NetAttributeType_UNKNOWN; + memset(&temp.value, 0, sizeof(NetAttributeValue)); + + this->privateData->attributes.Push(ID, temp); } return this->privateData->attributes[ID]; @@ -102,4 +122,115 @@ void CustomNetProtocol::Set(int ID, std::string s) const NetAttributeContainer& CustomNetProtocol::Get(int id) { return this->privateData->attributes[id]; -} \ No newline at end of file +} + + + + + +/////////////////////////////////////////////////////////////////////// +//// Created by [Dennis Andersen] [2013] +/////////////////////////////////////////////////////////////////////// +//#include "CustomNetProtocol.h" +//#include +//#include "Translator.h" +//#include +//using namespace Oyster::Network; +//using namespace Utility::DynamicMemory; +// +// +// +//struct CustomNetProtocol::PrivateData +//{ +// Utility::DynamicMemory::DynamicArray attributes; //...Im an idiot +// +// PrivateData() +// { } +// +// ~PrivateData() +// { +// for (unsigned int i = 0; i < attributes.Size(); i++) +// { +// RemoveAttribute(i); +// } +// +// attributes.Clear(); +// } +// void RemoveAttribute(int i) +// { +// switch (attributes[i].type) +// { +// case NetAttributeType_CharArray: +// delete [] attributes[i].value.netCharPtr; +// break; +// } +// } +// +// //Do network stuff +//}; +// +// +//CustomNetProtocol::CustomNetProtocol() +//{ +// this->privateData = new PrivateData(); +//} +//CustomNetProtocol::CustomNetProtocol(const CustomNetProtocol& o) +//{ +// this->privateData = o.privateData; +//} +//const CustomNetProtocol& CustomNetProtocol::operator=(const CustomNetProtocol& o) +//{ +// this->privateData = o.privateData; +// return *this; +//} +//CustomNetProtocol::~CustomNetProtocol() +//{ +//} +//NetAttributeContainer& CustomNetProtocol::operator[](int ID) +//{ +// if(ID >= this->privateData->attributes.Size()) +// this->privateData->attributes.Resize( +// if(this->privateData->attributes.find(ID) == this->privateData->attributes.end()) +// { +// this->privateData->attributes[ID]; +// this->privateData->attributes[ID].type = NetAttributeType_UNKNOWN; +// memset(&this->privateData->attributes[ID].value, 0, sizeof(NetAttributeValue)); +// } +// +// return this->privateData->attributes[ID]; +//} +// +//void CustomNetProtocol::Set(int ID, Oyster::Network::NetAttributeValue val, Oyster::Network::NetAttributeType type) +//{ +// this->privateData->attributes[ID].type = type; +// +// switch (type) +// { +// case Oyster::Network::NetAttributeType_Bool: +// case Oyster::Network::NetAttributeType_Char: +// case Oyster::Network::NetAttributeType_UnsignedChar: +// case Oyster::Network::NetAttributeType_Short: +// case Oyster::Network::NetAttributeType_UnsignedShort: +// case Oyster::Network::NetAttributeType_Int: +// case Oyster::Network::NetAttributeType_UnsignedInt: +// case Oyster::Network::NetAttributeType_Int64: +// case Oyster::Network::NetAttributeType_UnsignedInt64: +// case Oyster::Network::NetAttributeType_Float: +// case Oyster::Network::NetAttributeType_Double: +// this->privateData->attributes[ID].value = val; +// break; +// } +//} +//void CustomNetProtocol::Set(int ID, std::string s) +//{ +// if(s.size() == 0) return; +// +// this->privateData->attributes[ID].type = Oyster::Network::NetAttributeType_CharArray; +// +// this->privateData->attributes[ID].value.netCharPtr = new char[s.size() + 1]; +// memcpy(&this->privateData->attributes[ID].value.netCharPtr[0], &s[0], s.size() + 1); +//} +//const NetAttributeContainer& CustomNetProtocol::Get(int id) +//{ +// return this->privateData->attributes[id]; +//} \ No newline at end of file diff --git a/Code/Network/NetworkAPI/CustomNetProtocol.h b/Code/Network/NetworkAPI/CustomNetProtocol.h index c519e417..c982bd1f 100644 --- a/Code/Network/NetworkAPI/CustomNetProtocol.h +++ b/Code/Network/NetworkAPI/CustomNetProtocol.h @@ -69,7 +69,55 @@ namespace Oyster { NetAttributeType type; NetAttributeValue value; - NetAttributeContainer() { type = NetAttributeType_UNKNOWN; } + NetAttributeContainer() + { type = NetAttributeType_UNKNOWN; } + ~NetAttributeContainer() + { + if (this->type == NetAttributeType_CharArray) + { + delete this->value.netCharPtr; + this->value.netCharPtr = 0; + } + } + NetAttributeContainer(NetAttributeContainer& p) + { + type = p.type; + if(type == NetAttributeType_CharArray && p.value.netCharPtr) + { + int len = 0; + if((len = strlen(p.value.netCharPtr)) == 0) return; + len++; + value.netCharPtr = new char[len]; + memcpy(&value.netCharPtr[0], &p.value.netCharPtr[0], sizeof(p.value.netCharPtr[0]) * len); + } + else + { + value = p.value; + } + } + const NetAttributeContainer& operator=(const NetAttributeContainer& p) + { + if(this->type == NetAttributeType_CharArray) + { + delete this->value.netCharPtr; + this->value.netCharPtr = 0; + } + + type = p.type; + if(type == NetAttributeType_CharArray && p.value.netCharPtr) + { + int len = 0; + if((len = strlen(p.value.netCharPtr)) == 0) return *this; + len++; + value.netCharPtr = new char[len]; + memcpy(&value.netCharPtr[0], &p.value.netCharPtr[0], sizeof(p.value.netCharPtr[0]) * len); + } + else + { + value = p.value; + } + return *this; + } }; class CustomNetProtocol; struct CustomProtocolObject @@ -82,8 +130,8 @@ namespace Oyster public: CustomNetProtocol(); ~CustomNetProtocol(); - CustomNetProtocol(const CustomNetProtocol& o); - const CustomNetProtocol& operator=(const CustomNetProtocol& o); + CustomNetProtocol(CustomNetProtocol& o); + const CustomNetProtocol& operator=(CustomNetProtocol& o); NetAttributeContainer& operator[](int ID); void Set(int id, Oyster::Network::NetAttributeValue val, Oyster::Network::NetAttributeType type); @@ -92,7 +140,9 @@ namespace Oyster private: struct PrivateData; - Utility::DynamicMemory::SmartPointer privateData; + //Utility::DynamicMemory::SmartPointer privateData; + //Utility::Thread::ThreadSafeSmartPointer privateData; + PrivateData* privateData; friend class Translator; }; diff --git a/Code/Network/NetworkAPI/NetworkClient.cpp b/Code/Network/NetworkAPI/NetworkClient.cpp index 4434d28c..4d9397bd 100644 --- a/Code/Network/NetworkAPI/NetworkClient.cpp +++ b/Code/Network/NetworkAPI/NetworkClient.cpp @@ -84,6 +84,7 @@ struct NetworkClient::PrivateData : public IThreadObject if(!this->sendQueue.IsEmpty()) { + //printf("\t(%i)\n", this->sendQueue.Size()); OysterByte temp; CustomNetProtocol p = this->sendQueue.Pop(); this->translator.Pack(temp, p); @@ -205,7 +206,11 @@ struct NetworkClient::PrivateData : public IThreadObject CEA parg; parg.type = CEA::EventType_ProtocolRecieved; parg.data.protocol = protocol; - NetEvent e = { this->parent, parg }; + NetEvent e; + e.sender = this->parent; + e.args.data.protocol = parg.data.protocol; + e.args.type = parg.type; + this->recieveQueue.Push(e); } } @@ -248,9 +253,6 @@ void NetworkClient::Update() this->DataRecieved(temp); - //--------- Deprecate --------- - this->NetworkCallback(temp.args.data.protocol); - //------------------------------ } } @@ -303,7 +305,7 @@ void NetworkClient::Send(CustomProtocolObject& protocol) this->privateData->sendQueue.Push(protocol.GetProtocol()); } -void NetworkClient::Send(CustomNetProtocol protocol) +void NetworkClient::Send(CustomNetProtocol& protocol) { this->privateData->sendQueue.Push(protocol); } @@ -332,8 +334,8 @@ void NetworkClient::DataRecieved(NetEvent e) } } -void NetworkClient::NetworkCallback(Oyster::Network::CustomNetProtocol& p) -{} +//void NetworkClient::NetworkCallback(Oyster::Network::CustomNetProtocol& p) +//{} std::string NetworkClient::GetIpAddress() { diff --git a/Code/Network/NetworkAPI/NetworkClient.h b/Code/Network/NetworkAPI/NetworkClient.h index 3af8baf1..a19f74e4 100644 --- a/Code/Network/NetworkAPI/NetworkClient.h +++ b/Code/Network/NetworkAPI/NetworkClient.h @@ -36,7 +36,33 @@ namespace Oyster { struct { Oyster::Network::CustomNetProtocol protocol; }; void * nothing; + EventData(){} + EventData(Oyster::Network::CustomNetProtocol& o) + { + protocol = o; + } + const EventData& operator=(EventData& o) + { + protocol = o.protocol; + return *this; + } + const EventData& operator=(Oyster::Network::CustomNetProtocol& o) + { + protocol = o; return *this; + } } data; + ClientEventArgs(){} + ClientEventArgs(ClientEventArgs& o) + { + type = o.type; + data = o.data; + } + const ClientEventArgs& operator=(ClientEventArgs& o) + { + type = o.type; + data = o.data; + return *this; + } }; typedef void(*ClientEventFunction)(NetEvent e); @@ -75,7 +101,7 @@ namespace Oyster /** * */ - void Send(CustomNetProtocol protocol); + void Send(CustomNetProtocol& protocol); /** * @@ -101,7 +127,7 @@ namespace Oyster * Do not use this furthermore, instead use void DataRecieved(NetEvent e); * @see DataRecieved */ - virtual void NetworkCallback(Oyster::Network::CustomNetProtocol& p); + //virtual void NetworkCallback(Oyster::Network::CustomNetProtocol& p); virtual std::string GetIpAddress(); diff --git a/Code/Network/NetworkAPI/NetworkServer.cpp b/Code/Network/NetworkAPI/NetworkServer.cpp index 4bdc4abf..e31efcde 100644 --- a/Code/Network/NetworkAPI/NetworkServer.cpp +++ b/Code/Network/NetworkAPI/NetworkServer.cpp @@ -261,7 +261,7 @@ NetworkSession const* NetworkServer::ReleaseMainSession() return temp; } -bool NetworkServer::IsStarted() const +bool NetworkServer::IsRunning() const { return this->privateData->isRunning; } diff --git a/Code/Network/NetworkAPI/NetworkServer.h b/Code/Network/NetworkAPI/NetworkServer.h index 97a3e024..01b9337e 100644 --- a/Code/Network/NetworkAPI/NetworkServer.h +++ b/Code/Network/NetworkAPI/NetworkServer.h @@ -77,7 +77,7 @@ namespace Oyster /** * */ - bool IsStarted() const; + bool IsRunning() const; /** * diff --git a/Code/Network/NetworkAPI/NetworkSession.cpp b/Code/Network/NetworkAPI/NetworkSession.cpp index 6c728903..3d7bbadc 100644 --- a/Code/Network/NetworkAPI/NetworkSession.cpp +++ b/Code/Network/NetworkAPI/NetworkSession.cpp @@ -133,7 +133,7 @@ NetClient NetworkSession::Detach(const NetworkClient* client) for (unsigned int i = 0; i < this->clients.Size(); i++) { - if(this->clients[i] && this->clients[0]->GetID() == client->GetID()) + if(this->clients[i] && this->clients[i]->GetID() == client->GetID()) { val = this->clients[i]; this->clients[i] = 0; diff --git a/Code/Network/NetworkAPI/Translator.cpp b/Code/Network/NetworkAPI/Translator.cpp index cab1d48b..3e460b54 100644 --- a/Code/Network/NetworkAPI/Translator.cpp +++ b/Code/Network/NetworkAPI/Translator.cpp @@ -8,7 +8,7 @@ #include "../../Misc/Utilities.h" #include "../NetworkDependencies/Messages/MessageHeader.h" #include "../NetworkDependencies/OysterByte.h" - +#include using namespace Oyster::Network; using namespace ::Messages; @@ -19,7 +19,7 @@ using namespace std; //TODO: Fix this uggly hack struct MyCastingStruct { - std::map attributes; + Utility::DynamicMemory::DynamicArray attributes; }; // TODO: Check if the package has been packed correctly. @@ -34,8 +34,8 @@ struct Translator::PrivateData //Packages a header with a size(int) and a string of characters(char) void PackHeader(OysterByte &bytes, CustomNetProtocol& protocol) { - auto it = ((MyCastingStruct*)protocol.privateData.Get())->attributes.begin(); - auto end = ((MyCastingStruct*)protocol.privateData.Get())->attributes.end(); + auto it = ((MyCastingStruct*)protocol.privateData)->attributes.begin(); + auto end = ((MyCastingStruct*)protocol.privateData)->attributes.end(); size = 4; //size(int) message.SetSize(0); @@ -44,7 +44,7 @@ struct Translator::PrivateData //Find all the data types for(; it != end; it++) { - headerString.push_back(it->second.type); + headerString.push_back(it->type); } message.PackShort(headerString.size(), bytes); @@ -61,48 +61,48 @@ struct Translator::PrivateData void PackMessage(OysterByte &bytes, CustomNetProtocol& protocol) { - auto it = ((MyCastingStruct*)protocol.privateData.Get())->attributes.begin(); - auto end = ((MyCastingStruct*)protocol.privateData.Get())->attributes.end(); + auto it = ((MyCastingStruct*)protocol.privateData)->attributes.begin(); + auto end = ((MyCastingStruct*)protocol.privateData)->attributes.end(); for(int i = 0; i < (int)headerString.size(); i++, it++) { switch((int)headerString.at(i)) { case NetAttributeType_Bool: - message.PackBool(it->second.value.netBool, bytes); + message.PackBool(it->value.netBool, bytes); break; case NetAttributeType_Char: - message.PackChar(it->second.value.netChar, bytes); + message.PackChar(it->value.netChar, bytes); break; case NetAttributeType_UnsignedChar: - message.PackUnsignedChar(it->second.value.netUChar, bytes); + message.PackUnsignedChar(it->value.netUChar, bytes); break; case NetAttributeType_Short: - message.PackShort(it->second.value.netShort, bytes); + message.PackShort(it->value.netShort, bytes); break; case NetAttributeType_UnsignedShort: - message.PackUnsignedShort(it->second.value.netUShort, bytes); + message.PackUnsignedShort(it->value.netUShort, bytes); break; case NetAttributeType_Int: - message.PackInt(it->second.value.netInt, bytes); + message.PackInt(it->value.netInt, bytes); break; case NetAttributeType_UnsignedInt: - message.PackUnsignedInt(it->second.value.netUInt, bytes); + message.PackUnsignedInt(it->value.netUInt, bytes); break; case NetAttributeType_Int64: - message.PackInt64(it->second.value.netInt64, bytes); + message.PackInt64(it->value.netInt64, bytes); break; case NetAttributeType_UnsignedInt64: - message.PackUnsignedInt64(it->second.value.netUInt64, bytes); + message.PackUnsignedInt64(it->value.netUInt64, bytes); break; case NetAttributeType_Float: - message.PackFloat(it->second.value.netFloat, bytes); + message.PackFloat(it->value.netFloat, bytes); break; case NetAttributeType_Double: - message.PackDouble(it->second.value.netDouble, bytes); + message.PackDouble(it->value.netDouble, bytes); break; case NetAttributeType_CharArray: - message.PackStr(it->second.value.netCharPtr, bytes); + message.PackStr(it->value.netCharPtr, bytes); break; default: numberOfUnknownTypes++; @@ -216,6 +216,7 @@ const Translator& Translator::operator=(const Translator& obj) void Translator::Pack(OysterByte &bytes, CustomNetProtocol& protocol) { + privateData->headerString.clear(); privateData->PackHeader(bytes, protocol); diff --git a/Code/OysterGraphics/FileLoader/ShaderLoader.cpp b/Code/OysterGraphics/FileLoader/ShaderLoader.cpp index 17e9d1fe..5edc86dd 100644 --- a/Code/OysterGraphics/FileLoader/ShaderLoader.cpp +++ b/Code/OysterGraphics/FileLoader/ShaderLoader.cpp @@ -143,8 +143,7 @@ namespace Oyster } else { - memset(&out,0,sizeof(out)); - return; + return NULL; } #endif return Core::PipelineManager::CreateShader(data, Core::PipelineManager::ShaderType(type)); diff --git a/Code/OysterGraphics/Shader/HLSL/Deffered Shaders/PostPass.hlsl b/Code/OysterGraphics/Shader/HLSL/Deffered Shaders/PostPass.hlsl index d029535b..612319e5 100644 --- a/Code/OysterGraphics/Shader/HLSL/Deffered Shaders/PostPass.hlsl +++ b/Code/OysterGraphics/Shader/HLSL/Deffered Shaders/PostPass.hlsl @@ -8,6 +8,6 @@ RWTexture2D Output; void main( uint3 DTid : SV_DispatchThreadID ) { //Output[DTid.xy] = Diffuse[DTid.xy] + Specular[DTid.xy] + Diffuse[DTid.xy] * Ambient[DTid.xy/2].w;// + float4(Ambient[DTid.xy/4].xyz,1); GLOW - Output[DTid.xy] = Ambient[DTid.xy/2]; - //Output[DTid.xy] = Diffuse[DTid.xy] + Specular[DTid.xy]; + //Output[DTid.xy] = Ambient[DTid.xy/2]; + Output[DTid.xy] = Diffuse[DTid.xy] + Specular[DTid.xy]; } \ No newline at end of file