Modules

January 29, 2023 ยท View on GitHub

Base Classes

Depending on which ScriptModule you desire the module to be in, you change the inheritance to allow for more events. All the possible events in the modules are documented within the the respective classes.

Script ModuleCF Module
1_CoreCF_ModuleCore
2_GameScriptCF_ModuleCore
3_GameCF_ModuleGame
4_WorldCF_ModuleWorld
5_MissionCF_ModuleWorld

Events

All events within the modules are by default disabled. Once enabled the event can't be disabled. To enable an event you call the corresponding method starting with 'Enable'.

Event MethodEnable MethodWhen Fired?Executing PlatformExpected Arguments
CF_ModuleCore::OnMissionStartEnableMissionStartCalled when MissionBase::OnMissionStart is ranALLCF_EventArgs
CF_ModuleCore::OnMissionFinishEnableMissionFinishCalled when MissionBase::OnMissionFinish is ranALLCF_EventArgs
CF_ModuleCore::OnMissionLoadedEnableMissionLoadedCalled when MissionBase::OnMissionLoaded is ranALLCF_EventArgs
CF_ModuleCore::OnUpdateEnableUpdateCalled when MissionBase::OnUpdate is ranALLCF_EventArgs, CF_EventUpdateArgs
CF_ModuleCore::OnWorldCleanupEnableWorldCleanupSee: WorldCleaupEventTypeIDALLCF_EventArgs
CF_ModuleCore::OnMPSessionStartEnableMPSessionStartSee: MPSessionStartEventTypeIDClientCF_EventArgs
CF_ModuleCore::OnMPSessionPlayerReadyEnableMPSessionPlayerReadySee: MPSessionPlayerReadyEventTypeIDClientCF_EventArgs
CF_ModuleCore::OnMPSessionFailEnableMPSessionFailSee: MPSessionFailEventTypeIDClientCF_EventArgs
CF_ModuleCore::OnMPSessionEndEnableMPSessionEndSee: MPSessionEndEventTypeIDClientCF_EventArgs
CF_ModuleCore::OnMPConnectAbortEnableMPConnectAbortSee: ConnectingAbortEventTypeIDClientCF_EventArgs
CF_ModuleCore::OnMPConnectionLostEnableMPConnectionLostSee: MPConnectionLostEventTypeIDClientCF_EventArgs, CF_EventTimeArgs
CF_ModuleCore::OnRespawnEnableRespawnSee: RespawnEventTypeIDClientCF_EventArgs, CF_EventTimeArgs
CF_ModuleCore::OnLoginTimeEnableLoginTimeSee: LoginTimeEventTypeIDClientCF_EventArgs, CF_EventTimeArgs
CF_ModuleCore::OnLoginStatusEnableLoginStatusSee: LoginStatusEventTypeIDClientCF_EventArgs, CF_EventLoginArgs
CF_ModuleCore::OnLogoutEnableLogoutSee: LogoutEventTypeIDClientCF_EventArgs, CF_EventTimeArgs
CF_ModuleCore::OnChatEnableChatSee: ChatMessageEventTypeIDClientCF_EventArgs, CF_EventChatArgs
CF_ModuleGame::OnRPCEnableRPCCalled when DayZGame::OnRPC is ranALLCF_EventArgs, CF_EventRPCArgs
CF_ModuleWorld::OnInvokeConnectEnableInvokeConnectCalled from MissionServer::InvokeOnConnectServerCF_EventArgs, CF_EventPlayerArgs
CF_ModuleWorld::OnInvokeDisconnectEnableInvokeDisconnectCalled from MissionServer::InvokeOnDisconnectServerCF_EventArgs, CF_EventPlayerArgs
CF_ModuleWorld::OnClientNewEnableClientNewSee: ClientNewEventTypeIDServerCF_EventArgs, CF_EventPlayerArgs, CF_EventNewPlayerArgs
CF_ModuleWorld::OnClientRespawnEnableClientRespawnSee: ClientRespawnEventTypeIDServerCF_EventArgs, CF_EventPlayerArgs
CF_ModuleWorld::OnClientReadyEnableClientReadySee: ClientReadyEventTypeIDServerCF_EventArgs, CF_EventPlayerArgs
CF_ModuleWorld::OnClientPrepareEnableClientPrepareSee: ClientPrepareEventTypeIDServerCF_EventArgs, CF_EventPlayerPrepareArgs
CF_ModuleWorld::OnClientReconnectEnableClientReconnectSee: ClientReconnectEventTypeIDServerCF_EventArgs, CF_EventPlayerArgs
CF_ModuleWorld::OnClientLogoutEnableClientLogoutSee: ClientDisconnectedEventTypeIDServerCF_EventArgs, CF_EventPlayerArgs, CF_EventPlayerDisconnectedArgs
CF_ModuleWorld::OnClientDisconnectEnableClientDisconnectCalled from MissionServer::PlayerDisconnectedServerCF_EventArgs, CF_EventPlayerArgs, CF_EventPlayerDisconnectedArgs
CF_ModuleWorld::OnClientLogoutCancelledEnableClientLogoutCancelledSee: LogoutCancelEventTypeIDServerCF_EventArgs, CF_EventPlayerArgs

See: X refer to all events originating from DayZGame::OnEvent

Example Module

Below is an example module which will send a message to the player 5 seconds after they log into the server.

[CF_RegisterModule(SomeModule)]
class SomeModule : CF_ModuleWorld
{
	override void OnInit()
	{
		super.OnInit();

		// Enable the 'OnInvokeConnect' event
		EnableInvokeConnect();
	}

	override void OnInvokeConnect(Class sender, CF_EventArgs args)
	{
		super.OnInvokeConnect(sender, args);

		auto player = CF_EventPlayerArgs.Cast(args).Player;

		// Send the messsage 5 seconds later, this event can fire before the HUD is loaded and so the message won't be seen
		GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(this.SendMessage, 5000, false, player, "Welcome to the server!");
	}

	void SendMessage(PlayerBase player, string message)
	{
		// Send a message by firing the RPC to the player
		GetGame().RPCSingleParam(player, ERPCs.RPC_USER_ACTION_MESSAGE, new Param1<string>(message), true, player.GetIdentity());
	}
};

Variables

Similiar to what is found in EntityAI, modules can contain variables that can be synchronized over the network from the server to every client.

A basic implementation for the modules is below. For more advanced examples checkout Networked Variables.

[CF_RegisterModule(SomeModule)]
class SomeModule : CF_ModuleWorld
{
	private float m_ModuleTime;
	private float m_ModuleTimeSynch;

	override void OnInit()
	{
		super.OnInit();

		RegisterNetSyncVariable("m_ModuleTimeSynch");

		EnableUpdate();
	}

	override void OnVariablesSynchronized(Class sender, CF_EventArgs args)
	{
		super.OnVariablesSynchronized(sender, args);
		
		Print("The client module is at " + m_ModuleTime);
		Print("The server module is at " + m_ModuleTimeSynch);
	}

	override void OnUpdate(Class sender, CF_EventArgs args)
	{
		auto update = CF_EventUpdateArgs.Cast(args);

		m_ModuleTime += update.DeltaTime;

		if (GetGame().IsServer())
		{
			m_ModuleTimeSynch += update.DeltaTime;
			SetSynchDirty();
		}
	}
};