Files
firestorm/Gameleap/code/mw4/Libraries/Adept/Replicator.hpp
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

305 lines
7.5 KiB
C++

//===========================================================================//
// File: Replicator.hpp //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 11/29/94 JMA Initial coding. //
// 08/25/97 JMA Infrastructure changes //
// 08/25/97 ECH Infrastructure changes //
//---------------------------------------------------------------------------//
// Copyright (C) 1994-97, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#pragma once
#include "Adept.hpp"
#include "Receiver.hpp"
#include "Connection.hpp"
namespace Adept {
//##########################################################################
//################## Replicator::CreateMessage #######################
//##########################################################################
class Replicator__ClassData;
class Replicator__CreateMessage:
public Connection__Message
{
public:
Stuff::RegisteredClass::ClassID
classID;
int
replicatorFlags;
ReplicatorID
replicatorID;
Replicator__CreateMessage(
size_t length,
int priority,
int message_flags,
Stuff::RegisteredClass::ClassID class_id,
int replicator_flags
):
Connection__Message(
Connection::ReplicateMessageID,
length,
priority,
message_flags
),
classID(class_id),
replicatorFlags(replicator_flags),
replicatorID(ReplicatorID::Null)
{}
class Script
{
public:
void
TestInstance() const
{}
Stuff::MemoryStream
*messageStream;
Stuff::Page
*instancePage;
ReplicatorID
*baseID;
Replicator__ClassData
*classData;
Resource
modelResource;
};
typedef void
(*Factory)(Script *script);
static void
ConstructCreateMessage(Script *script);
};
//##########################################################################
//##################### Replicator::Message ##########################
//##########################################################################
class Replicator__Message:
public Receiver__Message
{
public:
ReplicatorID
replicatorID;
enum {
ReplicantCanReceiveBit = 1<<Receiver__Message::NextBit,
NextBit
};
enum {
ReplicantCanReceiveFlag = 1 << ReplicantCanReceiveBit
};
Replicator__Message(
Receiver::MessageID message_id,
size_t length,
int priority,
int flags,
const ReplicatorID &replicator_id
):
Receiver__Message(message_id, length, priority, flags),
replicatorID(replicator_id)
{}
};
//##########################################################################
//####################### Replicator #################################
//##########################################################################
class Replicator__ClassData;
typedef Replicator__Message Replicator__DestroyMessage;
class _declspec(novtable) Replicator:
public Receiver
{
friend class Connection;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Inheritance support
//
public:
typedef Replicator__ClassData ClassData;
typedef Replicator__Message Message;
typedef Replicator__CreateMessage CreateMessage;
typedef Replicator__DestroyMessage DestroyMessage;
public:
static void
InitializeClass();
static void
TerminateClass();
ClassData*
GetClassData();
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Run-time Construction and Destruction Support
//
public:
typedef Replicator*
(*Factory)(
const CreateMessage *message,
ReplicatorID* base_id
);
virtual CreateMessage*
SaveMakeMessage(Stuff::MemoryStream *stream, ResourceFile *res_file);
protected:
Replicator(
ClassData *class_data,
const CreateMessage *message,
ReplicatorID *base_id
);
~Replicator();
void
Reuse(
const CreateMessage *message,
ReplicatorID *base_id
);
void
Respawn(
const CreateMessage *message
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Message Support
//
public:
enum {
DestroyMessageID = Receiver::NextMessageID,
NextMessageID
};
void
Dispatch(const Receiver::Message *what);
void
DispatchToReplicants(const Message *what);
void
DestroyMessageHandler(const DestroyMessage *message);
protected:
static const MessageEntry
MessageEntries[];
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Flag Support
//
public:
enum {
ReplicantFlagBit=0,
NextFlagBit=3
};
enum ReplicatorMode {
MasterMode = 0<<ReplicantFlagBit,
IndependentMode = 1<<ReplicantFlagBit,
HermitMode = 2<<ReplicantFlagBit,
ReplicantMode = 3<<ReplicantFlagBit,
ClientMasterMode = 4<<ReplicantFlagBit,
ServerMasterMode = 5<<ReplicantFlagBit
};
enum {
ReplicatorModeMask = (7<<ReplicantFlagBit),
DefaultFlags = 0
};
ReplicatorMode
GetReplicatorMode()
{Check_Object(this); return static_cast<ReplicatorMode>(replicatorFlags & ReplicatorModeMask);}
void
SetReplicatorMode(ReplicatorMode mode)
{Check_Object(this); replicatorFlags &= ~ReplicatorModeMask; replicatorFlags |= mode;}
int
replicatorFlags;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Ownership support
//
public:
const ReplicatorID&
GetReplicatorID()
{Check_Object(this); return replicatorID;}
Connection*
GetOwner()
{Check_Object(this); return owningConnection;}
protected:
ReplicatorID
replicatorID;
Connection*
owningConnection;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Test Support
//
public:
void
TestInstance();
static bool
TestClass();
};
//##########################################################################
//################### Replicator::ClassData ##########################
//##########################################################################
class Replicator__ClassData:
public Receiver__ClassData
{
public:
Replicator__ClassData(
Stuff::RegisteredClass::ClassID class_id,
const char* class_name,
Receiver::ClassData *parent_class,
int message_count,
const Receiver::MessageEntry *message_handlers,
Replicator::Factory replicator_factory,
Replicator::CreateMessage::Factory message_factory
):
Receiver__ClassData(
class_id,
class_name,
parent_class,
message_count,
message_handlers
),
replicatorFactory(replicator_factory),
messageFactory(message_factory)
{}
Replicator::Factory
replicatorFactory;
Replicator::CreateMessage::Factory
messageFactory;
void
TestInstance();
};
inline Replicator::ClassData*
Replicator::GetClassData()
{
return Cast_Pointer(ClassData*, classData);
}
}