Script Modding Guide
Jump to navigation
Jump to search
SDK Modding Script Documentation
To start with script modding in holdfast, create a new mod and in this mod’s folder create a new script. This script should implement the shared interface “IHoldfastSharedMethods”.
For example, here’s a mod that’s called “LineFormer” that has the script called “LineFormer.cs” which implements the IHoldfastSharedMethods interface.
- Https://cdn.discordapp.com/attachments/480345368056561664/862362409599107152/unknown.png
New RC commands specific for modding use
Make carbon player bots not do any auto input
rc carbonPlayers ignoreAutoControls <true/false>
Send network trajectory info to client without showing it to players
rc set drawFirearmTajectoriesInfo <true/false>
Send "quiet" messages to the client that only modding support can read
This message is not shown to the player anywhere.
rc serverAdmin quietPrivateMessage <player_id> <message>
== Broadcasts a "quiet" message to all clients that only modding support can read ==
This message is not shown to the player anywhere.
rc serverAdmin quietBroadcastMessage <message>
///using UnityEngine;
namespace HoldfastSharedMethods {
/// <summary>
/// Main Interface, implement this script and place the script in the root of your mod.
/// </summary>
public interface IHoldfastSharedMethods {
/// <summary>
/// The game will share an int when the mod loads. A random synchronized value (same on client and server), for example useful if you need a seed for a map generator.
/// </summary>
void OnSyncValueState(int value);
/// <summary>
/// The game will share the current synchronized time (same on client and server) on every frame of the game.
/// </summary>
void OnUpdateSyncedTime(double time);
/// <summary>
/// The game will return the seconds since the round started on every frame of the game.
/// </summary>
void OnUpdateElapsedTime(float time);
/// <summary>
/// The game will share the current remaining time on every frame of the game.
/// </summary>
void OnUpdateTimeRemaining(float time);
/// <summary>
/// The game will return if the mod is loaded on a server.
/// </summary>
void OnIsServer(bool server);
/// <summary>
/// The game will return if the mod is loaded on a client, if it is, you'll retrieve the current player's steam id.
/// </summary>
void OnIsClient(bool client, ulong steamId);
/// <summary>
/// The game will call this on round start with details regarding the current round.
/// </summary>
void OnRoundDetails(int roundId, string serverName, string mapName, FactionCountry attackingFaction, FactionCountry defendingFaction, GameplayMode gameplayMode,
GameType gameType);
/// <summary>
/// The game will call this once with all the config variables set on the config file of the server.
/// Note: you will receive all variables, so make sure to filter only the ones you care about.
/// </summary>
void PassConfigVariables(string[] value);
/// <summary>
/// The game will call this when a player or a bot joins the round.
/// </summary>
void OnPlayerJoined(int playerId, ulong steamId, string name, string regimentTag, bool isBot);
/// <summary>
/// The game will call this when a player leaves the round.
/// Note: Bots cannot leave, they'll keep respawning once dead.
/// </summary>
void OnPlayerLeft(int playerId);
/// <summary>
/// The game will call this when a player spawns in game.
/// </summary>
void OnPlayerSpawned(int playerId, int spawnSectionId, FactionCountry playerFaction, PlayerClass playerClass, int uniformId, GameObject playerObject);
/// <summary>
/// The game will call this when a player is hurt in game.
/// </summary>
void OnPlayerHurt(int playerId, byte oldHp, byte newHp, EntityHealthChangedReason reason);
/// <summary>
/// The game will call this when a player is killed by another player.
/// </summary>
void OnPlayerKilledPlayer(int killerPlayerId, int victimPlayerId, EntityHealthChangedReason reason, string details);
/// <summary>
/// The game will call this when a player receives any score.
/// </summary>
void OnScorableAction(int playerId, int score, ScorableActionType reason);
/// <summary>
/// The game will call this when a player shoots his gun.
/// </summary>
void OnPlayerShoot(int playerId, bool dryShot);
/// <summary>
/// The game will call this when a bullet.
/// Note: This requires `rc set drawFirearmTajectories true` or `rc set drawFirearmTajectoriesInfo true`.
/// </summary>
void OnShotInfo(int playerId, int shotCount, Vector3[][] shotsPointsPositions, float[] trajectileDistances, float[] distanceFromFiringPositions,
float[] horizontalDeviationAngles, float[] maxHorizontalDeviationAngles, float[] muzzleVelocities, float[] gravities,
float[] damageHitBaseDamages, float[] damageRangeUnitValues, float[] damagePostTraitAndBuffValues, float[] totalDamages,
Vector3[] hitPositions, Vector3[] hitDirections, int[] hitPlayerIds, int[] hitDamageableObjectIds, int[] hitShipIds, int[] hitVehicleIds);
/// <summary>
/// The game will call this when a player successfully blocks another player.
/// </summary>
void OnPlayerBlock(int attackingPlayerId, int defendingPlayerId);
/// <summary>
/// The game will call this when a player starts a secondary attack (shove).
/// </summary>
void OnPlayerMeleeStartSecondaryAttack(int playerId);
/// <summary>
/// The game will call this when a player swaps their weapon.
/// </summary>
void OnPlayerWeaponSwitch(int playerId, string weapon);
/// <summary>
/// The game will call this when a player starts carrying an object.
/// </summary>
void OnPlayerStartCarry(int playerId, CarryableObjectType carryableObject);
/// <summary>
/// The game will call this when a player stops carrying an object.
/// </summary>
void OnPlayerEndCarry(int playerId);
/// <summary>
/// The game will call this when a player shouts using the ingame voice commands(not voip).
/// </summary>
void OnPlayerShout(int playerId, CharacterVoicePhrase voicePhrase);
/// <summary>
/// The game will call this when the console command is used.
/// Note: This will be only called on the client, or on the server that is executing the console command.
/// </summary>
void OnConsoleCommand(string input, string output, bool success);
/// <summary>
/// The game will call this when a player requests a remote console login.
/// Note: This will be called on the client that is executing the request, and the server. Not other people.
/// </summary>
void OnRCLogin(int playerId, string inputPassword, bool isLoggedIn);
/// <summary>
/// The game will call this when a player requests a remote console command.
/// Note: This will be called on the client that is doing the request, and the server. Not other people.
/// </summary>
void OnRCCommand(int playerId, string input, string output, bool success);
/// <summary>
/// The game will call this when a message is received in the chat system.
/// </summary>
void OnTextMessage(int playerId, TextChatChannel channel, string text);
/// <summary>
/// The game will call this when an administrator does an admin action using the rc commands or the P menu.
/// </summary>
void OnAdminPlayerAction(int playerId, int adminId, ServerAdminAction action, string reason);
/// <summary>
/// The game will call this when an object is damaged.
/// </summary>
void OnDamageableObjectDamaged(GameObject damageableObject, int damageableObjectId, int shipId, int oldHp, int newHp);
/// <summary>
/// The game will call this when an object is interacted with.
/// </summary>
void OnInteractableObjectInteraction(int playerId, int interactableObjectId, GameObject interactableObject, InteractionActivationType interactionActivationType,
int nextActivationStateTransitionIndex);
/// <summary>
/// The game will call this when an emplacement (sapper object) is initially placed.
/// </summary>
void OnEmplacementPlaced(int itemId, GameObject objectBuilt, EmplacementType emplacementType);
/// <summary>
/// The game will call this when an emplacement (sapper object) is fully constructed.
/// </summary>
void OnEmplacementConstructed(int itemId);
/// <summary>
/// The game will call this when a capture point is fully captured.
/// </summary>
void OnCapturePointCaptured(int capturePoint);
/// <summary>
/// The game will call this when a capture point changes owner.
/// </summary>
void OnCapturePointOwnerChanged(int capturePoint, FactionCountry factionCountry);
/// <summary>
/// The game will call this when a capture data changes.
/// </summary>
void OnCapturePointDataUpdated(int capturePoint, int defendingPlayerCount, int attackingPlayerCount);
/// <summary>
/// The game will call this when a buff is applied to a player.
/// Note: Buffs that already exist on a player may stack, so this call will be called multiple times even if a player already has the buff.
/// </summary>
void OnBuffStart(int playerId, BuffType buff);
/// <summary>
/// The game will call this when a buff is removed from a player.
/// </summary>
void OnBuffStop(int playerId, BuffType buff);
/// <summary>
/// The game will call this when a faction vs faction round is over.
/// Note: Most of them except for Army Deathmatch.
/// </summary>
void OnRoundEndFactionWinner(FactionCountry factionCountry, FactionRoundWinnerReason reason);
/// <summary>
/// The game will call this when a free for all round is over.
/// Note: Only Army Deathmatch.
/// </summary>
void OnRoundEndPlayerWinner(int playerId);
/// <summary>
/// The game will call this when a vehicle(horse) is spawned.
/// </summary>
void OnVehicleSpawned(int vehicleId, FactionCountry vehicleFaction, PlayerClass vehicleClass, GameObject vehicleObject, int ownerPlayerId);
/// <summary>
/// The game will call this when a vehicle(horse) is hurt.
/// </summary>
void OnVehicleHurt(int vehicleId, byte oldHp, byte newHp, EntityHealthChangedReason reason);
/// <summary>
/// The game will call this when a vehicle(horse) is killed by a player.
/// </summary>
void OnPlayerKilledVehicle(int killerPlayerId, int victimVehicleId, EntityHealthChangedReason reason, string details);
/// <summary>
/// The game will call this when a ship is spawned.
/// </summary>
void OnShipSpawned(int shipId, GameObject shipObject, FactionCountry shipfaction, ShipType shipType, int shipName);
/// <summary>
/// The game will call this when a ship takes damage.
/// </summary>
void OnShipDamaged(int shipId, int oldHp, int newHp);
}
}///