Files
2025-11-24 14:19:51 +05:30

232 lines
9.1 KiB
C++

/*
* Original work: Copyright (c) 2014, Oculus VR, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* RakNet License.txt file in the licenses directory of this source tree. An additional grant
* of patent rights can be found in the RakNet Patents.txt file in the same directory.
*
*
* Modified work: Copyright (c) 2017-2019, SLikeSoft UG (haftungsbeschränkt)
*
* This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style
* license found in the license.txt file in the root directory of this source tree.
*/
// Most of SLikeNet stuff was tried to be put here, but some of it had to go to CDemo.h too
#ifndef __RAKNET_ADDITIONS_FOR_IRRLICHT_DEMO_H
#define __RAKNET_ADDITIONS_FOR_IRRLICHT_DEMO_H
#include "slikenet/peerinterface.h"
#include "slikenet/ReplicaManager3.h"
#include "slikenet/NatPunchthroughClient.h"
#include "slikenet/CloudClient.h"
#include "slikenet/FullyConnectedMesh2.h"
#include "slikenet/UDPProxyClient.h"
#include "slikenet/TCPInterface.h"
#include "slikenet/HTTPConnection.h"
#include "../../Samples/PHPDirectoryServer2/PHPDirectoryServer2.h"
#include "vector3d.h"
#ifdef _MSC_VER
#pragma warning(push)
#pragma warning(disable:4100) // unreferenced formal parameter
#pragma warning(disable:4127) // conditional expression is constant
#pragma warning(disable:4244) // type-conversion with possible loss of data
#pragma warning(disable:4458) // declaration of 'identifier' hides class member
#endif
#include "IAnimatedMeshSceneNode.h"
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#include "slikenet/MessageIdentifiers.h"
class ReplicaManager3Irrlicht;
class CDemo;
class PlayerReplica;
// All externs defined in the corresponding CPP file
// Most of these classes has a manual entry, all of them have a demo
extern SLNet::RakPeerInterface *rakPeer; // Basic communication
extern SLNet::NetworkIDManager *networkIDManager; // Unique IDs per network object
extern ReplicaManager3Irrlicht *irrlichtReplicaManager3; // Autoreplicate network objects
extern SLNet::NatPunchthroughClient *natPunchthroughClient; // Connect peer to peer through routers
extern SLNet::CloudClient *cloudClient; // Used to upload game instance to the cloud
extern SLNet::FullyConnectedMesh2 *fullyConnectedMesh2; // Used to find out who is the session host
extern PlayerReplica *playerReplica; // Network object that represents the player
// A NAT punchthrough and proxy server Jenkins Software is hosting for free, should usually be online
#define DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_PORT 61111
#define DEFAULT_NAT_PUNCHTHROUGH_FACILITATOR_IP "natpunch.slikesoft.com"
void InstantiateRakNetClasses(void);
void DeinitializeRakNetClasses(void);
// Base RakNet custom classes for Replica Manager 3, setup peer to peer networking
class BaseIrrlichtReplica : public SLNet::Replica3
{
public:
BaseIrrlichtReplica();
virtual ~BaseIrrlichtReplica();
virtual SLNet::RM3ConstructionState QueryConstruction(SLNet::Connection_RM3 *destinationConnection, SLNet::ReplicaManager3 *replicaManager3)
{
// unused parameters
(void)replicaManager3;
return QueryConstruction_PeerToPeer(destinationConnection);
}
virtual bool QueryRemoteConstruction(SLNet::Connection_RM3 *sourceConnection)
{
return QueryRemoteConstruction_PeerToPeer(sourceConnection);
}
virtual void DeallocReplica(SLNet::Connection_RM3 *sourceConnection)
{
// unused parameters
(void)sourceConnection;
delete this;
}
virtual SLNet::RM3QuerySerializationResult QuerySerialization(SLNet::Connection_RM3 *destinationConnection)
{
return QuerySerialization_PeerToPeer(destinationConnection);
}
virtual void SerializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *destinationConnection);
virtual bool DeserializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *sourceConnection);
virtual SLNet::RM3SerializationResult Serialize(SLNet::SerializeParameters *serializeParameters);
virtual void Deserialize(SLNet::DeserializeParameters *deserializeParameters);
virtual void SerializeDestruction(SLNet::BitStream *destructionBitstream, SLNet::Connection_RM3 *destinationConnection)
{
// unused parameters
(void)destructionBitstream;
(void)destinationConnection;
}
virtual bool DeserializeDestruction(SLNet::BitStream *destructionBitstream, SLNet::Connection_RM3 *sourceConnection)
{
// unused parameters
(void)destructionBitstream;
(void)sourceConnection;
return true;
}
virtual SLNet::RM3ActionOnPopConnection QueryActionOnPopConnection(SLNet::Connection_RM3 *droppedConnection) const
{
return QueryActionOnPopConnection_PeerToPeer(droppedConnection);
}
/// This function is not derived from Replica3, it's specific to this app
/// Called from CDemo::UpdateRakNet
virtual void Update(SLNet::TimeMS curTime);
// Set when the object is constructed
CDemo *demo;
// real is written on the owner peer, read on the remote peer
irr::core::vector3df position;
SLNet::TimeMS creationTime;
};
// Game classes automatically updated by ReplicaManager3
class PlayerReplica : public BaseIrrlichtReplica, irr::scene::IAnimationEndCallBack
{
public:
PlayerReplica();
virtual ~PlayerReplica();
// Every function below, before Update overriding a function in Replica3
virtual void WriteAllocationID(SLNet::Connection_RM3 *destinationConnection, SLNet::BitStream *allocationIdBitstream) const;
virtual void SerializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *destinationConnection);
virtual bool DeserializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *sourceConnection);
virtual SLNet::RM3SerializationResult Serialize(SLNet::SerializeParameters *serializeParameters);
virtual void Deserialize(SLNet::DeserializeParameters *deserializeParameters);
virtual void PostDeserializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *destinationConnection);
virtual void PreDestruction(SLNet::Connection_RM3 *sourceConnection);
virtual void Update(SLNet::TimeMS curTime);
void UpdateAnimation(irr::scene::EMD2_ANIMATION_TYPE anim);
float GetRotationDifference(float r1, float r2);
virtual void OnAnimationEnd(irr::scene::IAnimatedMeshSceneNode* node);
void PlayAttackAnimation(void);
// playerName is only sent in SerializeConstruction, since it doesn't change
SLNet::RakString playerName;
// Networked rotation
float rotationAroundYAxis;
// Interpolation variables, not networked
irr::core::vector3df positionDeltaPerMS;
float rotationDeltaPerMS;
SLNet::TimeMS interpEndTime, lastUpdate;
// Updated based on the keypresses, to control remote animation
bool isMoving;
// Only instantiated for remote systems, you never see yourself
irr::scene::IAnimatedMeshSceneNode* model;
irr::scene::EMD2_ANIMATION_TYPE curAnim;
// deathTimeout is set from the local player
SLNet::TimeMS deathTimeout;
bool IsDead(void) const;
// isDead is set from network packets for remote players
bool isDead;
// List of all players, including our own
static DataStructures::List<PlayerReplica*> playerList;
};
class BallReplica : public BaseIrrlichtReplica
{
public:
BallReplica();
virtual ~BallReplica();
// Every function except update is overriding a function in Replica3
virtual void WriteAllocationID(SLNet::Connection_RM3 *destinationConnection, SLNet::BitStream *allocationIdBitstream) const;
virtual void SerializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *destinationConnection);
virtual bool DeserializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *sourceConnection);
virtual SLNet::RM3SerializationResult Serialize(SLNet::SerializeParameters *serializeParameters);
virtual void Deserialize(SLNet::DeserializeParameters *deserializeParameters);
virtual void PostDeserializeConstruction(SLNet::BitStream *constructionBitstream, SLNet::Connection_RM3 *destinationConnection);
virtual void PreDestruction(SLNet::Connection_RM3 *sourceConnection);
virtual void Update(SLNet::TimeMS curTime);
// shotDirection is networked
irr::core::vector3df shotDirection;
// shotlifetime is calculated, not networked
SLNet::TimeMS shotLifetime;
};
class Connection_RM3Irrlicht : public SLNet::Connection_RM3 {
public:
Connection_RM3Irrlicht(const SLNet::SystemAddress &_systemAddress, SLNet::RakNetGUID _guid, CDemo *_demo) : SLNet::Connection_RM3(_systemAddress, _guid)
{
demo=_demo;
}
virtual ~Connection_RM3Irrlicht()
{
}
virtual SLNet::Replica3 *AllocReplica(SLNet::BitStream *allocationId, SLNet::ReplicaManager3 *replicaManager3);
protected:
CDemo *demo;
};
class ReplicaManager3Irrlicht : public SLNet::ReplicaManager3
{
public:
virtual SLNet::Connection_RM3* AllocConnection(const SLNet::SystemAddress &systemAddress, SLNet::RakNetGUID rakNetGUID) const
{
return new Connection_RM3Irrlicht(systemAddress,rakNetGUID,demo);
}
virtual void DeallocConnection(SLNet::Connection_RM3 *connection) const
{
delete connection;
}
CDemo *demo;
};
#endif