Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8f28c760dd |
@@ -16,8 +16,6 @@ struct InputCommand : Event
|
|||||||
std::string Command;
|
std::string Command;
|
||||||
/** The value of the command. */
|
/** The value of the command. */
|
||||||
float Value = 0;
|
float Value = 0;
|
||||||
/** Timestamp of the command. */
|
|
||||||
double TimeStamp = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
//dashing with shift
|
//dashing with shift
|
||||||
if (m_ShiftDashing && m_AssaultDashCoolDownTimer <= 0.0f && !isJumping) {
|
if (m_ShiftDashing && m_AssaultDashCoolDownTimer <= 0.0f) {
|
||||||
//player is dashing with shift
|
//player is dashing with shift
|
||||||
//the wanted-direction is set in playermovement already so we dont need to check what direction we want to dash in!
|
//the wanted-direction is set in playermovement already so we dont need to check what direction we want to dash in!
|
||||||
m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
|
m_AssaultDashCoolDownTimer = assaultDashCoolDownMaxTimer;
|
||||||
@@ -227,7 +227,7 @@ void FirstPersonInputController<EventContext>::AssaultDashCheck(double dt, bool
|
|||||||
}
|
}
|
||||||
m_ValidDoubleTap = false;
|
m_ValidDoubleTap = false;
|
||||||
|
|
||||||
if (!(m_AssaultDashCoolDownTimer <= 0.0f && !isJumping)) {
|
if (!(m_AssaultDashCoolDownTimer <= 0.0f)) {
|
||||||
//if we cant dash at the moment, then just reset the tap-sensitivity-timer
|
//if we cant dash at the moment, then just reset the tap-sensitivity-timer
|
||||||
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
m_AssaultDashDoubleTapDeltaTime = 0.f;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ public:
|
|||||||
~Client();
|
~Client();
|
||||||
|
|
||||||
void Connect(std::string address, int port);
|
void Connect(std::string address, int port);
|
||||||
void Update(double dt) override;
|
void Update() override;
|
||||||
private:
|
|
||||||
std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents;
|
std::vector<Events::PlayerSpawned> m_PlayerSpawnEvents;
|
||||||
void parseSpawnEvents();
|
void parseSpawnEvents();
|
||||||
// Save for children
|
// Save for children
|
||||||
@@ -56,13 +56,13 @@ private:
|
|||||||
bool m_IsConnected = false;
|
bool m_IsConnected = false;
|
||||||
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
EntityWrapper m_LocalPlayer = EntityWrapper::Invalid;
|
||||||
// Server Client Lookup map
|
// Server Client Lookup map
|
||||||
|
// Assumes that root node for client and server is EntityID 0.
|
||||||
|
|
||||||
// Don't Add items to these two maps with insert, use insertIntoServerClientMaps(EntityID, EntityID)!!!!
|
// Don't Add items to these two maps with insert, use insertIntoServerClientMaps(EntityID, EntityID)!!!!
|
||||||
std::unordered_map<EntityID, EntityID> m_ServerIDToClientID;
|
std::unordered_map<EntityID, EntityID> m_ServerIDToClientID;
|
||||||
std::unordered_map<EntityID, EntityID> m_ClientIDToServerID;
|
std::unordered_map<EntityID, EntityID> m_ClientIDToServerID;
|
||||||
|
|
||||||
// Network logic
|
// Network logic
|
||||||
UDPClient m_Unreliable;
|
|
||||||
TCPClient m_Reliable;
|
|
||||||
PlayerDefinition m_PlayerDefinitions[8];
|
PlayerDefinition m_PlayerDefinitions[8];
|
||||||
SnapshotDefinitions m_NextSnapshot;
|
SnapshotDefinitions m_NextSnapshot;
|
||||||
double m_DurationOfPingTime;
|
double m_DurationOfPingTime;
|
||||||
@@ -70,9 +70,9 @@ private:
|
|||||||
std::clock_t m_TimeSinceSentInputs;
|
std::clock_t m_TimeSinceSentInputs;
|
||||||
unsigned int m_SendInputIntervalMs;
|
unsigned int m_SendInputIntervalMs;
|
||||||
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
std::vector<Events::InputCommand> m_InputCommandBuffer;
|
||||||
std::vector<Events::InputCommand> m_ReceivedInputCommands;
|
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
|
size_t receive(char* data);
|
||||||
void disconnect();
|
void disconnect();
|
||||||
void parseMessageType(Packet& packet);
|
void parseMessageType(Packet& packet);
|
||||||
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID);
|
void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID);
|
||||||
@@ -88,8 +88,6 @@ private:
|
|||||||
void parseComponentDeletion(Packet& packet);
|
void parseComponentDeletion(Packet& packet);
|
||||||
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType);
|
||||||
void parseSnapshot(Packet& packet);
|
void parseSnapshot(Packet& packet);
|
||||||
void parseOnInputCommand(Packet& packet);
|
|
||||||
void publishInputCommands();
|
|
||||||
void identifyPacketLoss();
|
void identifyPacketLoss();
|
||||||
void hasServerTimedOut();
|
void hasServerTimedOut();
|
||||||
EntityID createPlayer();
|
EntityID createPlayer();
|
||||||
@@ -112,6 +110,9 @@ private:
|
|||||||
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
|
EventRelay<Client, Events::PlayerSpawned> m_EPlayerSpawned;
|
||||||
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
bool OnPlayerSpawned(const Events::PlayerSpawned& e);
|
||||||
void parsePlayerDamage(Packet& packet);
|
void parsePlayerDamage(Packet& packet);
|
||||||
|
private:
|
||||||
|
UDPClient m_Unreliable;
|
||||||
|
TCPClient m_Reliable;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -22,13 +22,11 @@ public:
|
|||||||
Network(World* world, EventBroker* eventBroker);
|
Network(World* world, EventBroker* eventBroker);
|
||||||
virtual ~Network() { };
|
virtual ~Network() { };
|
||||||
|
|
||||||
virtual void Update(double dt) = 0;
|
virtual void Update() = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
World* m_World;
|
World* m_World;
|
||||||
EventBroker* m_EventBroker;
|
EventBroker* m_EventBroker;
|
||||||
// for network
|
|
||||||
double m_TimeStamp = 0;
|
|
||||||
|
|
||||||
// For Debug
|
// For Debug
|
||||||
bool isReadingData = false;
|
bool isReadingData = false;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ public:
|
|||||||
Server(World* world, EventBroker* eventBroker, int port);
|
Server(World* world, EventBroker* eventBroker, int port);
|
||||||
~Server();
|
~Server();
|
||||||
|
|
||||||
void Update(double dt) override;
|
void Update() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Network channels
|
// Network channels
|
||||||
@@ -52,7 +52,6 @@ private:
|
|||||||
int checkTimeOutInterval = 100;
|
int checkTimeOutInterval = 100;
|
||||||
int m_NextPlayerID = 0;
|
int m_NextPlayerID = 0;
|
||||||
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
|
std::vector<Events::InputCommand> m_InputCommandsToBroadcast;
|
||||||
std::vector<Events::InputCommand> m_InputCommandsToPublish;
|
|
||||||
//Timers
|
//Timers
|
||||||
std::clock_t m_StartPingTime;
|
std::clock_t m_StartPingTime;
|
||||||
|
|
||||||
@@ -83,7 +82,6 @@ private:
|
|||||||
void parseTCPConnect(Packet & packet);
|
void parseTCPConnect(Packet & packet);
|
||||||
void parseDisconnect();
|
void parseDisconnect();
|
||||||
bool shouldSendToClient(EntityWrapper childEntity);
|
bool shouldSendToClient(EntityWrapper childEntity);
|
||||||
void publishInputCommands();
|
|
||||||
|
|
||||||
// Debug event
|
// Debug event
|
||||||
EventRelay<Server, Events::InputCommand> m_EInputCommand;
|
EventRelay<Server, Events::InputCommand> m_EInputCommand;
|
||||||
|
|||||||
@@ -39,5 +39,5 @@ private:
|
|||||||
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
bool OnPlayerSpawned(Events::PlayerSpawned& e);
|
||||||
|
|
||||||
void updateMovementControllers(double dt);
|
void updateMovementControllers(double dt);
|
||||||
void updateVelocity(EntityWrapper player, double dt);
|
void updateVelocity(double dt);
|
||||||
};
|
};
|
||||||
@@ -5019,7 +5019,7 @@
|
|||||||
</Team>
|
</Team>
|
||||||
</c:Team>
|
</c:Team>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-60.3695679" Y="2.14482641" Z="-79.3789597"/>
|
<Position X="-60.3695679" Y="5.64500046" Z="-79.3789597"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
@@ -5089,7 +5089,7 @@
|
|||||||
</Team>
|
</Team>
|
||||||
</c:Team>
|
</c:Team>
|
||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="60.0169258" Y="2.37972379" Z="76.2893906"/>
|
<Position X="60.0169258" Y="5.78000021" Z="76.2893906"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
</Components>
|
</Components>
|
||||||
<Children>
|
<Children>
|
||||||
@@ -5165,7 +5165,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="48.9189453" Y="7.06223536" Z="-78.9347992"/>
|
<Position X="48.9189453" Y="7.06223536" Z="-78.9347992"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="71.4059677" Z="0"/>
|
<Orientation X="0" Y="75.6124268" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -5184,7 +5184,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-59.3499641" Y="7.46932745" Z="-20.6276321"/>
|
<Position X="-59.3499641" Y="7.46932745" Z="-20.6276321"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="68.0603104" Z="0"/>
|
<Orientation X="0" Y="72.2667694" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -5203,7 +5203,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-1.13644195" Y="1.38919806" Z="38.9768829"/>
|
<Position X="-1.13644195" Y="1.38919806" Z="38.9768829"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="65.6683426" Z="0"/>
|
<Orientation X="0" Y="69.8748016" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -5222,7 +5222,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="54.7225227" Y="6.51863909" Z="29.0052128"/>
|
<Position X="54.7225227" Y="6.51863909" Z="29.0052128"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="65.9822693" Z="0"/>
|
<Orientation X="0" Y="70.1887283" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -5241,7 +5241,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-51.6792374" Y="8.44526482" Z="32.5153465"/>
|
<Position X="-51.6792374" Y="8.44526482" Z="32.5153465"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="65.4309921" Z="0"/>
|
<Orientation X="0" Y="69.6374512" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -5260,7 +5260,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-42.3974304" Y="7.28327894" Z="81.9305344"/>
|
<Position X="-42.3974304" Y="7.28327894" Z="81.9305344"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="63.560215" Z="0"/>
|
<Orientation X="0" Y="67.7666702" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -5279,7 +5279,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="-9.85184956" Y="8.25567532" Z="39.6119232"/>
|
<Position X="-9.85184956" Y="8.25567532" Z="39.6119232"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="62.6090584" Z="0"/>
|
<Orientation X="0" Y="66.8154602" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
@@ -5298,7 +5298,7 @@
|
|||||||
<c:Transform>
|
<c:Transform>
|
||||||
<Position X="49.2257118" Y="7.39368248" Z="-31.1810112"/>
|
<Position X="49.2257118" Y="7.39368248" Z="-31.1810112"/>
|
||||||
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
<Scale X="0.300000012" Y="0.300000012" Z="0.300000012"/>
|
||||||
<Orientation X="0" Y="59.8201942" Z="0"/>
|
<Orientation X="0" Y="64.0265808" Z="0"/>
|
||||||
</c:Transform>
|
</c:Transform>
|
||||||
<c:Trigger/>
|
<c:Trigger/>
|
||||||
</Components>
|
</Components>
|
||||||
|
|||||||
@@ -41,11 +41,9 @@ void Client::Connect(std::string address, int port)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Client::Update(double dt)
|
void Client::Update()
|
||||||
{
|
{
|
||||||
m_EventBroker->Process<Client>();
|
m_EventBroker->Process<Client>();
|
||||||
//m_TimeStamp += dt;
|
|
||||||
publishInputCommands();
|
|
||||||
while (m_Unreliable.IsSocketAvailable()) {
|
while (m_Unreliable.IsSocketAvailable()) {
|
||||||
// Packet will get real data in receive
|
// Packet will get real data in receive
|
||||||
Packet packet(MessageType::Invalid);
|
Packet packet(MessageType::Invalid);
|
||||||
@@ -74,8 +72,7 @@ void Client::Update(double dt)
|
|||||||
sendInputCommands();
|
sendInputCommands();
|
||||||
m_TimeSinceSentInputs = std::clock();
|
m_TimeSinceSentInputs = std::clock();
|
||||||
}
|
}
|
||||||
// HACK: Send absolute player positions for now to avoid desync until we have reliable messages.
|
// HACK: Send absolute player positions for now to avoid desync until we have reliable messages
|
||||||
// Reliable messages and timestamps did not fix it.
|
|
||||||
sendLocalPlayerTransform();
|
sendLocalPlayerTransform();
|
||||||
|
|
||||||
hasServerTimedOut();
|
hasServerTimedOut();
|
||||||
@@ -125,9 +122,6 @@ void Client::parseMessageType(Packet& packet)
|
|||||||
case MessageType::OnPlayerDamage:
|
case MessageType::OnPlayerDamage:
|
||||||
parsePlayerDamage(packet);
|
parsePlayerDamage(packet);
|
||||||
break;
|
break;
|
||||||
case MessageType::OnInputCommand:
|
|
||||||
//parsePlayerDamage(packet);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -290,30 +284,21 @@ void Client::ignoreFields(Packet& packet, const ComponentInfo& componentInfo)
|
|||||||
|
|
||||||
void Client::parseSnapshot(Packet& packet)
|
void Client::parseSnapshot(Packet& packet)
|
||||||
{
|
{
|
||||||
//// Read input commands
|
// Read input commands
|
||||||
//std::size_t numInputCommands = packet.ReadPrimitive<std::size_t>();
|
std::size_t numInputCommands = packet.ReadPrimitive<std::size_t>();
|
||||||
//for (std::size_t i = 0; i < numInputCommands; ++i) {
|
for (std::size_t i = 0; i < numInputCommands; ++i) {
|
||||||
// Events::InputCommand e;
|
Events::InputCommand e;
|
||||||
// e.PlayerID = packet.ReadPrimitive<EntityID>();
|
e.PlayerID = packet.ReadPrimitive<EntityID>();
|
||||||
// EntityID player = packet.ReadPrimitive<EntityID>();
|
EntityID player = packet.ReadPrimitive<EntityID>();
|
||||||
// std::string command = packet.ReadString();
|
std::string command = packet.ReadString();
|
||||||
// float value = packet.ReadPrimitive<float>();
|
float value = packet.ReadPrimitive<float>();
|
||||||
// double timestamp = packet.ReadPrimitive<double>();
|
if (m_ServerIDToClientID.find(player) != m_ServerIDToClientID.end()) {
|
||||||
// if (m_ServerIDToClientID.find(player) != m_ServerIDToClientID.end()) {
|
e.Player = EntityWrapper(m_World, m_ServerIDToClientID.at(player));
|
||||||
// e.Player = EntityWrapper(m_World, m_ServerIDToClientID.at(player));
|
e.Command = command;
|
||||||
// e.Command = command;
|
e.Value = value;
|
||||||
// e.Value = value;
|
m_EventBroker->Publish(e);
|
||||||
// e.TimeStamp = timestamp;
|
}
|
||||||
// m_EventBroker->Publish(e);
|
}
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
// Read timestamp
|
|
||||||
double remoteTimestamp = packet.ReadPrimitive<double>();
|
|
||||||
//if (abs(remoteTimestamp - m_TimeStamp) > 0.100) {
|
|
||||||
// m_TimeStamp = remoteTimestamp;
|
|
||||||
// LOG_INFO("Resynced remote and local timestamp");
|
|
||||||
//}
|
|
||||||
|
|
||||||
// Read world state
|
// Read world state
|
||||||
while (packet.DataReadSize() < packet.Size()) {
|
while (packet.DataReadSize() < packet.Size()) {
|
||||||
@@ -374,36 +359,6 @@ void Client::parseSnapshot(Packet& packet)
|
|||||||
parseSpawnEvents();
|
parseSpawnEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Client::parseOnInputCommand(Packet & packet)
|
|
||||||
{
|
|
||||||
while (packet.DataReadSize() < packet.Size()) {
|
|
||||||
Events::InputCommand e;
|
|
||||||
e.PlayerID = packet.ReadPrimitive<int>();
|
|
||||||
e.Player = EntityWrapper(m_World, packet.ReadPrimitive<int>());
|
|
||||||
e.Command = packet.ReadString();
|
|
||||||
e.Value = packet.ReadPrimitive<float>();
|
|
||||||
e.TimeStamp = packet.ReadPrimitive<double>();
|
|
||||||
m_EventBroker->Publish(e);
|
|
||||||
m_ReceivedInputCommands.push_back(e);
|
|
||||||
//LOG_INFO("Server::parseOnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::publishInputCommands()
|
|
||||||
{
|
|
||||||
std::vector<Events::InputCommand> notPublishedEvents;
|
|
||||||
for (int i = 0; i < m_ReceivedInputCommands.size(); i++) {
|
|
||||||
if (m_ReceivedInputCommands.at(i).TimeStamp < m_TimeStamp) {
|
|
||||||
m_EventBroker->Publish(m_ReceivedInputCommands.at(i));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
notPublishedEvents.push_back(m_ReceivedInputCommands.at(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_ReceivedInputCommands = notPublishedEvents;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Client::disconnect()
|
void Client::disconnect()
|
||||||
{
|
{
|
||||||
m_IsConnected = false;
|
m_IsConnected = false;
|
||||||
@@ -447,9 +402,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (m_IsConnected) {
|
if (m_IsConnected) {
|
||||||
Events::InputCommand setTimestamp = e;
|
m_InputCommandBuffer.push_back(e);
|
||||||
setTimestamp.TimeStamp = m_TimeStamp;
|
|
||||||
m_InputCommandBuffer.push_back(setTimestamp);
|
|
||||||
}
|
}
|
||||||
//LOG_DEBUG("Client::OnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID);
|
//LOG_DEBUG("Client::OnInputCommand: Command is %s. Value is %f. PlayerID is %i.", e.Command.c_str(), e.Value, e.PlayerID);
|
||||||
return true;
|
return true;
|
||||||
@@ -484,12 +437,11 @@ void Client::parsePlayerDamage(Packet& packet)
|
|||||||
{
|
{
|
||||||
Events::PlayerDamage e;
|
Events::PlayerDamage e;
|
||||||
PlayerID victimID = packet.ReadPrimitive<EntityID>();
|
PlayerID victimID = packet.ReadPrimitive<EntityID>();
|
||||||
PlayerID inflictorID = packet.ReadPrimitive<EntityID>();
|
if(serverClientMapsHasEntity(victimID)){
|
||||||
if(!serverClientMapsHasEntity(victimID) || !serverClientMapsHasEntity(inflictorID)){
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
e.Inflictor = EntityWrapper(m_World, m_ServerIDToClientID.at(victimID));
|
e.Inflictor = EntityWrapper(m_World, m_ServerIDToClientID.at(victimID));
|
||||||
e.Victim = EntityWrapper(m_World, m_ServerIDToClientID.at(inflictorID));
|
e.Victim = EntityWrapper(m_World, m_ServerIDToClientID.at(packet.ReadPrimitive<EntityID>()));
|
||||||
e.Damage = packet.ReadPrimitive<double>();
|
e.Damage = packet.ReadPrimitive<double>();
|
||||||
// Don't rebroadcast our own player damage events or we'll have an infinite loop!
|
// Don't rebroadcast our own player damage events or we'll have an infinite loop!
|
||||||
if (e.Inflictor != m_LocalPlayer) {
|
if (e.Inflictor != m_LocalPlayer) {
|
||||||
@@ -563,7 +515,6 @@ void Client::sendInputCommands()
|
|||||||
for (int i = 0; i < m_InputCommandBuffer.size(); i++) {
|
for (int i = 0; i < m_InputCommandBuffer.size(); i++) {
|
||||||
packet.WriteString(m_InputCommandBuffer[i].Command);
|
packet.WriteString(m_InputCommandBuffer[i].Command);
|
||||||
packet.WritePrimitive(m_InputCommandBuffer[i].Value);
|
packet.WritePrimitive(m_InputCommandBuffer[i].Value);
|
||||||
packet.WritePrimitive(m_InputCommandBuffer[i].TimeStamp);
|
|
||||||
}
|
}
|
||||||
m_Reliable.Send(packet);
|
m_Reliable.Send(packet);
|
||||||
m_InputCommandBuffer.clear();
|
m_InputCommandBuffer.clear();
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Network::Network(World* world, EventBroker* eventBroker)
|
|||||||
m_TimeoutMs = config->Get<int>("Networking.TimeoutMs", 20000);
|
m_TimeoutMs = config->Get<int>("Networking.TimeoutMs", 20000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Network::Update(double dt)
|
void Network::Update()
|
||||||
{
|
{
|
||||||
updateNetworkData();
|
updateNetworkData();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,12 +26,10 @@ Server::~Server()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::Update(double dt)
|
void Server::Update()
|
||||||
{
|
{
|
||||||
m_EventBroker->Process<Server>();
|
|
||||||
m_TimeStamp += dt;
|
|
||||||
publishInputCommands();
|
|
||||||
PlayerDefinition pd;
|
PlayerDefinition pd;
|
||||||
|
|
||||||
m_Reliable.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers);
|
m_Reliable.AcceptNewConnections(m_NextPlayerID, m_ConnectedPlayers);
|
||||||
for (auto& kv : m_ConnectedPlayers) {
|
for (auto& kv : m_ConnectedPlayers) {
|
||||||
while (kv.second.TCPSocket->available()) {
|
while (kv.second.TCPSocket->available()) {
|
||||||
@@ -82,9 +80,11 @@ void Server::Update(double dt)
|
|||||||
checkForTimeOuts();
|
checkForTimeOuts();
|
||||||
timOutTimer = currentTime;
|
timOutTimer = currentTime;
|
||||||
}
|
}
|
||||||
|
m_EventBroker->Process<Server>();
|
||||||
if (isReadingData) {
|
if (isReadingData) {
|
||||||
Network::Update(dt);
|
Network::Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::parseMessageType(Packet& packet)
|
void Server::parseMessageType(Packet& packet)
|
||||||
@@ -146,8 +146,7 @@ void Server::unreliableBroadcast(Packet& packet)
|
|||||||
void Server::sendSnapshot()
|
void Server::sendSnapshot()
|
||||||
{
|
{
|
||||||
Packet packet(MessageType::Snapshot);
|
Packet packet(MessageType::Snapshot);
|
||||||
//addInputCommandsToPacket(packet);
|
addInputCommandsToPacket(packet);
|
||||||
packet.WritePrimitive(m_TimeStamp/*+ somePingvalue + offset*/);
|
|
||||||
addChildrenToPacket(packet, EntityID_Invalid);
|
addChildrenToPacket(packet, EntityID_Invalid);
|
||||||
unreliableBroadcast(packet);
|
unreliableBroadcast(packet);
|
||||||
}
|
}
|
||||||
@@ -161,7 +160,6 @@ void Server::addInputCommandsToPacket(Packet& packet)
|
|||||||
packet.WritePrimitive(m_ConnectedPlayers.at(command.PlayerID).EntityID);
|
packet.WritePrimitive(m_ConnectedPlayers.at(command.PlayerID).EntityID);
|
||||||
packet.WriteString(command.Command);
|
packet.WriteString(command.Command);
|
||||||
packet.WritePrimitive(command.Value);
|
packet.WritePrimitive(command.Value);
|
||||||
packet.WritePrimitive(command.TimeStamp);
|
|
||||||
}
|
}
|
||||||
m_InputCommandsToBroadcast.clear();
|
m_InputCommandsToBroadcast.clear();
|
||||||
}
|
}
|
||||||
@@ -335,7 +333,6 @@ void Server::disconnect(PlayerID playerID)
|
|||||||
e.PlayerID = playerID;
|
e.PlayerID = playerID;
|
||||||
m_EventBroker->Publish(e);
|
m_EventBroker->Publish(e);
|
||||||
//m_World->DeleteEntity(m_ConnectedPlayers[playerID].EntityID);
|
//m_World->DeleteEntity(m_ConnectedPlayers[playerID].EntityID);
|
||||||
// TODO Kolla Anders crashade efter timeout med break point
|
|
||||||
m_ConnectedPlayers[playerID].TCPSocket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
|
m_ConnectedPlayers[playerID].TCPSocket->shutdown(boost::asio::ip::tcp::socket::shutdown_both);
|
||||||
m_ConnectedPlayers[playerID].TCPSocket->close();
|
m_ConnectedPlayers[playerID].TCPSocket->close();
|
||||||
m_World->DeleteEntity(m_ConnectedPlayers[playerID].EntityID);
|
m_World->DeleteEntity(m_ConnectedPlayers[playerID].EntityID);
|
||||||
@@ -378,7 +375,8 @@ bool Server::OnInputCommand(const Events::InputCommand & e)
|
|||||||
}
|
}
|
||||||
isReadingData = !isReadingData;
|
isReadingData = !isReadingData;
|
||||||
m_SaveDataTimer = std::clock();
|
m_SaveDataTimer = std::clock();
|
||||||
} else if (e.Command == "KickPlayer" && e.Value > 0) {
|
}
|
||||||
|
if (e.Command == "KickPlayer" && e.Value > 0) {
|
||||||
kick(0);
|
kick(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -468,9 +466,7 @@ void Server::parseOnInputCommand(Packet& packet)
|
|||||||
e.PlayerID = player; // Set correct player id
|
e.PlayerID = player; // Set correct player id
|
||||||
e.Player = EntityWrapper(m_World, m_ConnectedPlayers.at(player).EntityID);
|
e.Player = EntityWrapper(m_World, m_ConnectedPlayers.at(player).EntityID);
|
||||||
e.Value = packet.ReadPrimitive<float>();
|
e.Value = packet.ReadPrimitive<float>();
|
||||||
e.TimeStamp = packet.ReadPrimitive<double>();
|
m_EventBroker->Publish(e);
|
||||||
/* m_EventBroker->Publish(e);*/
|
|
||||||
m_InputCommandsToPublish.push_back(e);
|
|
||||||
if (e.Command == "PrimaryFire" || e.Command == "Reload") {
|
if (e.Command == "PrimaryFire" || e.Command == "Reload") {
|
||||||
m_InputCommandsToBroadcast.push_back(e);
|
m_InputCommandsToBroadcast.push_back(e);
|
||||||
}
|
}
|
||||||
@@ -520,20 +516,6 @@ bool Server::shouldSendToClient(EntityWrapper childEntity)
|
|||||||
return childEntity.HasComponent("Player") || childEntity.FirstParentWithComponent("Player").Valid();
|
return childEntity.HasComponent("Player") || childEntity.FirstParentWithComponent("Player").Valid();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::publishInputCommands()
|
|
||||||
{
|
|
||||||
std::vector<Events::InputCommand> notPublishedEvents;
|
|
||||||
for (int i = 0; i < m_InputCommandsToPublish.size(); i++) {
|
|
||||||
if (m_InputCommandsToPublish.at(i).TimeStamp < m_TimeStamp) {
|
|
||||||
m_EventBroker->Publish(m_InputCommandsToPublish.at(i));
|
|
||||||
} else {
|
|
||||||
LOG_INFO("Did not instantly publish command");
|
|
||||||
notPublishedEvents.push_back(m_InputCommandsToPublish.at(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_InputCommandsToPublish = notPublishedEvents;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlayerID Server::GetPlayerIDFromEndpoint()
|
PlayerID Server::GetPlayerIDFromEndpoint()
|
||||||
{
|
{
|
||||||
// check both tcp and udp connection
|
// check both tcp and udp connection
|
||||||
|
|||||||
+2
-2
@@ -199,10 +199,10 @@ void Game::Tick()
|
|||||||
// Update network
|
// Update network
|
||||||
m_EventBroker->Process<MultiplayerSnapshotFilter>();
|
m_EventBroker->Process<MultiplayerSnapshotFilter>();
|
||||||
if (m_NetworkClient != nullptr) {
|
if (m_NetworkClient != nullptr) {
|
||||||
m_NetworkClient->Update(dt);
|
m_NetworkClient->Update();
|
||||||
}
|
}
|
||||||
if (m_NetworkServer != nullptr) {
|
if (m_NetworkServer != nullptr) {
|
||||||
m_NetworkServer->Update(dt);
|
m_NetworkServer->Update();
|
||||||
}
|
}
|
||||||
//m_SoundManager->Update(dt);
|
//m_SoundManager->Update(dt);
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,7 @@ PlayerMovementSystem::~PlayerMovementSystem()
|
|||||||
void PlayerMovementSystem::Update(double dt)
|
void PlayerMovementSystem::Update(double dt)
|
||||||
{
|
{
|
||||||
updateMovementControllers(dt);
|
updateMovementControllers(dt);
|
||||||
if (LocalPlayer.Valid()) {
|
updateVelocity(dt);
|
||||||
updateVelocity(LocalPlayer, dt);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlayerMovementSystem::updateMovementControllers(double dt)
|
void PlayerMovementSystem::updateMovementControllers(double dt)
|
||||||
@@ -223,11 +221,15 @@ void PlayerMovementSystem::updateMovementControllers(double dt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PlayerMovementSystem::updateVelocity(EntityWrapper player, double dt)
|
void PlayerMovementSystem::updateVelocity(double dt)
|
||||||
{
|
{
|
||||||
// Only apply velocity to local player
|
// Only apply velocity to local player
|
||||||
ComponentWrapper& cTransform = player["Transform"];
|
if (!LocalPlayer.Valid()) {
|
||||||
ComponentWrapper& cPhysics = player["Physics"];
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ComponentWrapper& cTransform = LocalPlayer["Transform"];
|
||||||
|
ComponentWrapper& cPhysics = LocalPlayer["Physics"];
|
||||||
glm::vec3& velocity = cPhysics["Velocity"];
|
glm::vec3& velocity = cPhysics["Velocity"];
|
||||||
bool isOnGround = (bool)cPhysics["IsOnGround"];
|
bool isOnGround = (bool)cPhysics["IsOnGround"];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user