<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://bftech.darkstormstudios.co.uk/index.php?action=history&amp;feed=atom&amp;title=BF2_Internals</id>
	<title>BF2 Internals - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://bftech.darkstormstudios.co.uk/index.php?action=history&amp;feed=atom&amp;title=BF2_Internals"/>
	<link rel="alternate" type="text/html" href="https://bftech.darkstormstudios.co.uk/index.php?title=BF2_Internals&amp;action=history"/>
	<updated>2026-11-04T04:02:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://bftech.darkstormstudios.co.uk/index.php?title=BF2_Internals&amp;diff=439&amp;oldid=prev</id>
		<title>BftechAdmin: Created page with &quot;The BF2 engine has been written in C++ and also make heavy use of STL.   {{tip}} All virtual functions on this page are in the order they are defined in the vtable unless otherwise specified.  == Reference Counting == A lot of the internal components of the game use intrusive reference counting through inheritance. The base class would look something like this: &lt;pre&gt; class RefCounted { public:     RefCounted() : m_refCount(1) {}      virtual int addRef() {         return...&quot;</title>
		<link rel="alternate" type="text/html" href="https://bftech.darkstormstudios.co.uk/index.php?title=BF2_Internals&amp;diff=439&amp;oldid=prev"/>
		<updated>2025-01-07T20:15:46Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;The BF2 engine has been written in C++ and also make heavy use of STL.   {{tip}} All virtual functions on this page are in the order they are defined in the vtable unless otherwise specified.  == Reference Counting == A lot of the internal components of the game use intrusive reference counting through inheritance. The base class would look something like this: &amp;lt;pre&amp;gt; class RefCounted { public:     RefCounted() : m_refCount(1) {}      virtual int addRef() {         return...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;The BF2 engine has been written in C++ and also make heavy use of STL. &lt;br /&gt;
&lt;br /&gt;
{{tip}} All virtual functions on this page are in the order they are defined in the vtable unless otherwise specified.&lt;br /&gt;
&lt;br /&gt;
== Reference Counting ==&lt;br /&gt;
A lot of the internal components of the game use intrusive reference counting through inheritance.&lt;br /&gt;
The base class would look something like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class RefCounted {&lt;br /&gt;
public:&lt;br /&gt;
    RefCounted() : m_refCount(1) {}&lt;br /&gt;
&lt;br /&gt;
    virtual int addRef() {&lt;br /&gt;
        return ++m_refCount;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    virtual int getRefCount() const {&lt;br /&gt;
        return m_refCount;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Unsure if there actually is a base implementation of this method,&lt;br /&gt;
    // this sometimes points to a unique function in the vtable but follows this pattern.&lt;br /&gt;
    virtual int release() {&lt;br /&gt;
        if (--m_refCount == 0) {&lt;br /&gt;
            delete (RefCounted*)this;&lt;br /&gt;
        }&lt;br /&gt;
        return m_refCount;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Position of the destructor in the vtable may change.&lt;br /&gt;
    virtual ~RefCounted() {}&lt;br /&gt;
private:&lt;br /&gt;
    int m_refCount;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Do note that this class is not thread-safe, as in the actual implementation.&lt;br /&gt;
&lt;br /&gt;
== ClassManager ==&lt;br /&gt;
The program contains a single ClassManager instance which is used to dynamically access different subsystems within the game.&lt;br /&gt;
These subsystems are registered via a string identifier(class name), an instance pointer, the class id and another unknown integer, they can then later be accessed using the class name.&lt;br /&gt;
The following classes are registered in BF2.exe:&lt;br /&gt;
; GameServerSettings&lt;br /&gt;
; HudInformationLayer&lt;br /&gt;
; DistributedLightRenderer&lt;br /&gt;
; LocalProfileManager&lt;br /&gt;
; ProfileManager&lt;br /&gt;
; RankManager&lt;br /&gt;
; ClanManager&lt;br /&gt;
; NewsManager&lt;br /&gt;
; AutoPatch&lt;br /&gt;
; Persistence&lt;br /&gt;
; MenuTeamManager&lt;br /&gt;
; GlobalSettings&lt;br /&gt;
; VideoSettings&lt;br /&gt;
; AudioSettings&lt;br /&gt;
; ControlSettings&lt;br /&gt;
; GeneralSettings&lt;br /&gt;
; HapticSettings&lt;br /&gt;
; ServerBrowserManager&lt;br /&gt;
; SwiffHost&lt;br /&gt;
; DemoLibrary&lt;br /&gt;
; ServerLogoManager&lt;br /&gt;
; ModInfo&lt;br /&gt;
&lt;br /&gt;
The rendering module(RendDX9.dll) also registers the following classes:&lt;br /&gt;
; SwiffRenderer&lt;br /&gt;
; Terrain&lt;br /&gt;
; LightManager&lt;br /&gt;
; GeometryTemplateManager&lt;br /&gt;
; StaticMeshRenderer&lt;br /&gt;
; SkinnedMeshRenderer&lt;br /&gt;
; ParticleSystemManager&lt;br /&gt;
; HemiMapManager&lt;br /&gt;
; DecalManager&lt;br /&gt;
; DecalShadowManager&lt;br /&gt;
; RoadCompiledRenderer&lt;br /&gt;
; RoadEditableRenderer&lt;br /&gt;
; NametagManager&lt;br /&gt;
; SkyDome&lt;br /&gt;
; UndergrowthSystem&lt;br /&gt;
; LightingManager&lt;br /&gt;
; WeatherManager&lt;br /&gt;
; RainManager&lt;br /&gt;
; RenderView&lt;br /&gt;
; EnvMapManager&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
=== GameEvent ===&lt;br /&gt;
The game has multiple event systems, game events are events that occur in-game and are related to gameplay.&lt;br /&gt;
The (incomplete) class below is the base class used by all events, events often have additional data.&lt;br /&gt;
A GameEvent has a maximum size of 1024 bits as defined by &amp;lt;code&amp;gt;const uint MaximumGameEventSize&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class GameEvent : public RefCounted {&lt;br /&gt;
public:&lt;br /&gt;
    GameEvent() : field_8(-1) {}&lt;br /&gt;
    &lt;br /&gt;
    // multiple virtual functions here&lt;br /&gt;
private:&lt;br /&gt;
    int field_8;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
List of Game events:&lt;br /&gt;
; ChallengeEvent&lt;br /&gt;
; ChallengeResponseEvent&lt;br /&gt;
; ConnectionTypeEvent&lt;br /&gt;
; DataBlockEvent&lt;br /&gt;
; CreatePlayerEvent&lt;br /&gt;
; CreateObjectEvent&lt;br /&gt;
; CreateKitEvent&lt;br /&gt;
; DestroyObjectEvent&lt;br /&gt;
; DestroyPlayerEvent&lt;br /&gt;
; EnterVehicleEvent&lt;br /&gt;
; ExitVehicleEvent&lt;br /&gt;
; PostRemoteEvent&lt;br /&gt;
; ChangePlayerNameEvent&lt;br /&gt;
; HandlePickupEvent&lt;br /&gt;
; HandleDropEvent&lt;br /&gt;
; StringBlockEvent&lt;br /&gt;
; JoinSquadEvent&lt;br /&gt;
; LeaveSquadEvent&lt;br /&gt;
; CommanderEvent&lt;br /&gt;
; RadioMessageEvent&lt;br /&gt;
; KilledByEvent&lt;br /&gt;
; ChangeSquadNameEvent&lt;br /&gt;
; SetPrivateSquadEvent&lt;br /&gt;
; IssueSquadOrderEvent&lt;br /&gt;
; InviteEvent&lt;br /&gt;
; RankEvent&lt;br /&gt;
; KickBanEvent&lt;br /&gt;
; SetAcceptOrderEvent&lt;br /&gt;
; SetSquadLeaderEvent&lt;br /&gt;
; SpottedEvent&lt;br /&gt;
; ArtilleryEvent&lt;br /&gt;
; StickyProjectileEvent&lt;br /&gt;
; AmbientEffectAreaEvent&lt;br /&gt;
; VoipOnOffEvent&lt;br /&gt;
; CommanderCamEvent&lt;br /&gt;
; SupplyDropEvent&lt;br /&gt;
; VoidPlayerMuteEvent&lt;br /&gt;
; VoteEvent&lt;br /&gt;
; TargetDirectionEvent&lt;br /&gt;
; BeginRoundEvent&lt;br /&gt;
; EndOfRoundEvent&lt;br /&gt;
; PythonCommandEvent&lt;br /&gt;
; RequestEvent&lt;br /&gt;
; VoipSessionEvent&lt;br /&gt;
; ToggleFreeCameraEvent&lt;br /&gt;
; MedalEvent&lt;br /&gt;
; UnlockEvent&lt;br /&gt;
; MissileInitEvent&lt;br /&gt;
; UAVEvent&lt;br /&gt;
; ContentCheckEvent&lt;br /&gt;
; DropVehicleEvent&lt;br /&gt;
; CreateSpawnGroupEvent&lt;br /&gt;
; RemoveSpawnGroupEvent&lt;br /&gt;
; UpdateTriggerEvent&lt;br /&gt;
; GrapplingHookContainerCreateEvent&lt;br /&gt;
; GrapplingHookContainerUpdateEvent&lt;br /&gt;
; GrapplingHookContainerDetachEvent&lt;br /&gt;
; GrapplingHookCreateEvent&lt;br /&gt;
; GrapplingHookUpdateEvent&lt;br /&gt;
; PlayerTearGassedEvent&lt;br /&gt;
; SetNightVisionEvent&lt;br /&gt;
; VerifyPlayerTeamEvent&lt;br /&gt;
; FixPlayerTeamEvent&lt;br /&gt;
&lt;br /&gt;
== IO ==&lt;br /&gt;
Access to the filesystem is done through the FileManager accessible through the ClassManager.&lt;br /&gt;
&lt;br /&gt;
=== Stream ===&lt;br /&gt;
Interface used for files, used by FileManager.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class Stream {&lt;br /&gt;
public:&lt;br /&gt;
    virtual unsigned read(void* buffer, unsigned numBytes) = 0;&lt;br /&gt;
    virtual bool write(void* buffer, unsigned numBytes) = 0;&lt;br /&gt;
    virtual int unk_1() {};&lt;br /&gt;
    virtual int unk_2() {};&lt;br /&gt;
    virtual Stream clone() = 0;&lt;br /&gt;
    virtual int unk_3() {};&lt;br /&gt;
    virtual int unk_4() {};&lt;br /&gt;
    virtual int unk_5() {};&lt;br /&gt;
    virtual bool seek(unsigned moveMethod, long distanceToMove) = 0;&lt;br /&gt;
    virtual unsigned getPosition() = 0;&lt;br /&gt;
    virtual unsigned getSize() = 0;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== FileSystem ===&lt;br /&gt;
Interface used and implemented by the FileManager to access the underlying file system.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class FileSystem {&lt;br /&gt;
public:&lt;br /&gt;
    virtual int unk_1() {}&lt;br /&gt;
    virtual int unk_2() {}&lt;br /&gt;
    virtual Stream* openFile(std::string* path) = 0;&lt;br /&gt;
    virtual int unk_3() {}&lt;br /&gt;
    virtual int unk_4() {}&lt;br /&gt;
    virtual int unk_5() {}&lt;br /&gt;
    virtual int unk_6() {}&lt;br /&gt;
    virtual bool readFile(std::string* path, void* buffer, unsigned numBytes, unsigned* bytesRed) = 0;&lt;br /&gt;
    virtual int unk_7() {}&lt;br /&gt;
    virtual int findFiles(std::string* folderPath, ? a, ? b) = 0;&lt;br /&gt;
    virtual int getFileInfo(std::string* path, ? a) = 0;&lt;br /&gt;
    virtual int compareFileTime(std::string* path, std::string* otherPath) = 0;&lt;br /&gt;
    virtual bool getFullFileName(std::string* path) = 0;&lt;br /&gt;
    virtual void update() = 0;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>BftechAdmin</name></author>
	</entry>
</feed>