Difference between revisions of "Map Editing"
| Line 1: | Line 1: | ||
| − | Holdfast allows server owners to customise existing maps to create a whole new experience. You can add props, change spawns, weapon setup, class limits, and more until you’ve created something entirely new. Map customisation is defined using {{ll|Server Configuration#Map_Rotations|Map Rotations}} in the configuration file. = Starting Maps = As well as building upon the normal {{ll|Server Configuration#Maps|maps}}, there are two flat and empty maps that are perfect to let your imagination run wild: '''CustomMap''' and '''CustomMapNaval'''. As you’ll likely spend plenty of time setting up your new map, create a new {{ll|Server Configuration#Map_Rotations|rotation}} with an unlimited timer and open spawns, e.g.: [[File:Holdfast_CustomMap.jpg|right|600px|CustomMap]] <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>!map_rotation start map_name CustomMap game_mode ArmyBattlefield round_time_minutes -1 reinforcements_per_faction 9000 wave_spawn_time_seconds 1 max_player_respawns -1 faction_balancing false allow_midround_spawning true allow_faction_switching true allow_spectating true minimum_players -1 maximum_players 150 time_hour 8 time_dynamic false friendly_fire true weather_preset calm weather_dynamic false game_type hardcore !map_rotation end</nowiki></pre> To refresh changes to your map without restarting your server, issue the following (substitute the correct rotation index): <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>rc fileReloader serverConfigFile rc mapRotation 1</nowiki></pre> <div style="clear:both;"></div> = Positioning = Before placing a prop, decide where it goes and which way it faces. Stand where you want it in-game, open the console with <code>F1</code> and type <code>get</code>. [[File:Holdfast_Console_Get.png|left|350px|The output of <code>get</code>]] This prints your position and rotation: <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>playerPosition => (15.3, 16.8, 146.9) playerRotation => (0.0, 218.0, 0.0)</nowiki></pre> * '''Position''' is (X, Y, Z). Positive X is North, positive Y is up, positive Z is West. * '''Rotation''' is degrees around (X, Y, Z). You’ll use '''Y''' most to turn objects; X and Z tilt. * To face the opposite direction of the example above, use <code>(0.0, 38.0, 0.0)</code> (218 − 180). As of [[Game_Version_0.3X#0.35|0.35]], <code>get details</code> also copies position & rotation to your clipboard for easy pasting. <div style="clear:both;"></div> = Placing Props = Props range from simple decor (just position/rotation) to interactables (with extra parameters). == Decorative Props == See {{ll|Spawnable_Props|Spawnable Props}} for the full list. Place a decorative prop with: <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>objects_override <prop> <pX> <pY> <pZ> <rX> <rY> <rZ></nowiki></pre> : '''<prop>''' — Enum from {{ll|Spawnable_Props|Spawnable Props}} : '''<pX> <pY> <pZ>''' — Position (use <code>get playerPosition</code>) : '''<rX> <rY> <rZ>''' — Rotation (use <code>get playerRotation</code>) [[File:Holdfast_CustomMap_TargetDummy.jpg|right|600px|CustomMap]] Example—add a Target Dummy at the example coordinates: <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>!map_rotation start map_name CustomMap game_mode ArmyBattlefield round_time_minutes -1 reinforcements_per_faction 9000 wave_spawn_time_seconds 1 max_player_respawns -1 faction_balancing false allow_midround_spawning true allow_faction_switching true allow_spectating true minimum_players -1 maximum_players 150 time_hour 8 time_dynamic false friendly_fire true weather_preset calm weather_dynamic false game_type hardcore objects_override TargetDummy 15.3 16.8 146.9 0.0 218.0 0.0 !map_rotation end</nowiki></pre> == Interactable Props == These require extra arguments. === Weapon Racks === Players can hold <kbd>E</kbd> to take weapons from a rack (limited supply). <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>objects_override WeaponRack <Object Position> <Object Rotation> <Weapon> <Number Of Weapons In Rack></nowiki></pre> : '''<Object Position>''' — <code>x y z</code> (use <code>get playerPosition</code>) : '''<Object Rotation>''' — <code>x y z</code> (use <code>get playerRotation</code>) : '''<Weapon>''' — Enum from {{ll|Server_Configuration_Enums#Weapon|Weapon}} : '''<Number Of Weapons In Rack>''' — <code>0–255</code> '''Example''' <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki># Override Commands (This is a comment and will be ignored by the game) objects_override WeaponRack 1 2 3 7 8 9 Rifle_Pattern1800Infantry 4</nowiki></pre> Place this between <code>!map_rotation start</code> and <code>!map_rotation end</code>. === Firearm Ammoboxes === Customisable ammo boxes for RP/events. Players replenish ammo on use. <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>objects_override firearmammobox <Object Position> <Object Rotation> <Firearm> <Maximum Interactions Until Depletion> <Ammo Given> <Maximum Interactions Allowed Per Player></nowiki></pre> : '''<Object Position>''' — <code>x y z</code> : '''<Object Rotation>''' — <code>x y z</code> : '''<Firearm>''' — Enum from {{ll|Server_Configuration_Enums#Firearm|Firearm}} : '''<Maximum Interactions Until Depletion>''' — <code>0–255</code> total uses : '''<Ammo Given>''' — <code>0–255</code> rounds per use : '''<Maximum Interactions Allowed Per Player>''' — <code>0–255</code> per-player cap '''Example''' <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki># Override Commands (This is a comment and will be ignored by the game) objects_override firearmammobox 1 2 3 7 8 9 Rifle_Pattern1800Infantry 20 2 1</nowiki></pre> Place this between <code>!map_rotation start</code> and <code>!map_rotation end</code>. <div style="clear:both;"></div> = Polishing Up = Once your map is laid out, adjust class limits, spawns, and other settings as usual via the {{ll|Server_Configuration|Server Configuration}} guide. <div style="clear:both;"></div> = Community Maps = The Holdfast modding community shares custom map configs and assists new modders. Join via the official Discord: [https://discord.gg/holdfastgame Holdfast Official Discord] Once joined, go to <code>#getting-started</code> and react to the pinned message to unlock the Modding Bench channels. | + | Holdfast allows server owners to customise existing maps to create a whole new experience. You can add props, change spawns, weapon setup, class limits, and more until you’ve created something entirely new. Map customisation is defined using {{ll|Server Configuration#Map_Rotations|Map Rotations}} in the configuration file. |
| + | |||
| + | = Starting Maps = | ||
| + | As well as building upon the normal {{ll|Server Configuration#Maps|maps}}, there are two flat and empty maps that are perfect to let your imagination run wild: '''CustomMap''' and '''CustomMapNaval'''. As you’ll likely spend plenty of time setting up your new map, create a new {{ll|Server Configuration#Map_Rotations|rotation}} with an unlimited timer and open spawns, e.g.: | ||
| + | |||
| + | [[File:Holdfast_CustomMap.jpg|right|600px|CustomMap]] | ||
| + | |||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>!map_rotation start | ||
| + | map_name CustomMap | ||
| + | game_mode ArmyBattlefield | ||
| + | round_time_minutes -1 | ||
| + | reinforcements_per_faction 9000 | ||
| + | wave_spawn_time_seconds 1 | ||
| + | max_player_respawns -1 | ||
| + | faction_balancing false | ||
| + | allow_midround_spawning true | ||
| + | allow_faction_switching true | ||
| + | allow_spectating true | ||
| + | minimum_players -1 | ||
| + | maximum_players 150 | ||
| + | time_hour 8 | ||
| + | time_dynamic false | ||
| + | friendly_fire true | ||
| + | weather_preset calm | ||
| + | weather_dynamic false | ||
| + | game_type hardcore | ||
| + | !map_rotation end</nowiki></pre> | ||
| + | |||
| + | To refresh changes to your map without restarting your server, issue the following (substitute the correct rotation index): | ||
| + | |||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>rc fileReloader serverConfigFile | ||
| + | rc mapRotation 1</nowiki></pre> | ||
| + | |||
| + | <div style="clear:both;"></div> | ||
| + | |||
| + | = Positioning = | ||
| + | Before placing a prop, decide where it goes and which way it faces. Stand where you want it in-game, open the console with <code>F1</code> and type <code>get</code>. | ||
| + | |||
| + | [[File:Holdfast_Console_Get.png|left|350px|The output of <code>get</code>]] | ||
| + | |||
| + | This prints your position and rotation: | ||
| + | |||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>playerPosition => (15.3, 16.8, 146.9) | ||
| + | playerRotation => (0.0, 218.0, 0.0)</nowiki></pre> | ||
| + | |||
| + | * '''Position''' is (X, Y, Z). Positive X is North, positive Y is up, positive Z is West. | ||
| + | * '''Rotation''' is degrees around (X, Y, Z). You’ll use '''Y''' most to turn objects; X and Z tilt. | ||
| + | * To face the opposite direction of the example above, use <code>(0.0, 38.0, 0.0)</code> (218 − 180). | ||
| + | |||
| + | As of [[Game_Version_0.3X#0.35|0.35]], <code>get details</code> also copies position & rotation to your clipboard for easy pasting. | ||
| + | |||
| + | <div style="clear:both;"></div> | ||
| + | |||
| + | = Placing Props = | ||
| + | Props range from simple decor (just position/rotation) to interactables (with extra parameters). | ||
| + | |||
| + | == Decorative Props == | ||
| + | See {{ll|Spawnable_Props|Spawnable Props}} for the full list. Place a decorative prop with: | ||
| + | |||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>objects_override <prop> <pX> <pY> <pZ> <rX> <rY> <rZ></nowiki></pre> | ||
| + | |||
| + | : '''<prop>''' — Enum from {{ll|Spawnable_Props|Spawnable Props}} | ||
| + | : '''<pX> <pY> <pZ>''' — Position (use <code>get playerPosition</code>) | ||
| + | : '''<rX> <rY> <rZ>''' — Rotation (use <code>get playerRotation</code>) | ||
| + | |||
| + | [[File:Holdfast_CustomMap_TargetDummy.jpg|right|600px|CustomMap]] | ||
| + | |||
| + | Example—add a Target Dummy at the example coordinates: | ||
| + | |||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>!map_rotation start | ||
| + | map_name CustomMap | ||
| + | game_mode ArmyBattlefield | ||
| + | round_time_minutes -1 | ||
| + | reinforcements_per_faction 9000 | ||
| + | wave_spawn_time_seconds 1 | ||
| + | max_player_respawns -1 | ||
| + | faction_balancing false | ||
| + | allow_midround_spawning true | ||
| + | allow_faction_switching true | ||
| + | allow_spectating true | ||
| + | minimum_players -1 | ||
| + | maximum_players 150 | ||
| + | time_hour 8 | ||
| + | time_dynamic false | ||
| + | friendly_fire true | ||
| + | weather_preset calm | ||
| + | weather_dynamic false | ||
| + | game_type hardcore | ||
| + | |||
| + | objects_override TargetDummy 15.3 16.8 146.9 0.0 218.0 0.0 | ||
| + | !map_rotation end</nowiki></pre> | ||
| + | |||
| + | == Interactable Props == | ||
| + | These require extra arguments. | ||
| + | |||
| + | === Weapon Racks === | ||
| + | Players can hold <kbd>E</kbd> to take weapons from a rack (limited supply). | ||
| + | |||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>objects_override WeaponRack <Object Position> <Object Rotation> <Weapon> <Number Of Weapons In Rack></nowiki></pre> | ||
| + | |||
| + | : '''<Object Position>''' — <code>x y z</code> (use <code>get playerPosition</code>) | ||
| + | : '''<Object Rotation>''' — <code>x y z</code> (use <code>get playerRotation</code>) | ||
| + | : '''<Weapon>''' — Enum from {{ll|Server_Configuration_Enums#Weapon|Weapon}} | ||
| + | : '''<Number Of Weapons In Rack>''' — <code>0–255</code> | ||
| + | |||
| + | '''Example''' | ||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki># Override Commands (This is a comment and will be ignored by the game) | ||
| + | objects_override WeaponRack 1 2 3 7 8 9 Rifle_Pattern1800Infantry 4</nowiki></pre> | ||
| + | Place this between <code>!map_rotation start</code> and <code>!map_rotation end</code>. | ||
| + | |||
| + | === Firearm Ammoboxes === | ||
| + | Customisable ammo boxes for RP/events. Players replenish ammo on use. | ||
| + | |||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki>objects_override firearmammobox <Object Position> <Object Rotation> <Firearm> <Maximum Interactions Until Depletion> <Ammo Given> <Maximum Interactions Allowed Per Player></nowiki></pre> | ||
| + | |||
| + | : '''<Object Position>''' — <code>x y z</code> | ||
| + | : '''<Object Rotation>''' — <code>x y z</code> | ||
| + | : '''<Firearm>''' — Enum from {{ll|Server_Configuration_Enums#Firearm|Firearm}} | ||
| + | : '''<Maximum Interactions Until Depletion>''' — <code>0–255</code> total uses | ||
| + | : '''<Ammo Given>''' — <code>0–255</code> rounds per use | ||
| + | : '''<Maximum Interactions Allowed Per Player>''' — <code>0–255</code> per-player cap | ||
| + | |||
| + | '''Example''' | ||
| + | <pre style="background:#111827;color:#e5e7eb;padding:.8em 1em;border-radius:.6em;overflow:auto;line-height:1.45;font-size:.9em;"><nowiki># Override Commands (This is a comment and will be ignored by the game) | ||
| + | objects_override firearmammobox 1 2 3 7 8 9 Rifle_Pattern1800Infantry 20 2 1</nowiki></pre> | ||
| + | Place this between <code>!map_rotation start</code> and <code>!map_rotation end</code>. | ||
| + | |||
| + | <div style="clear:both;"></div> | ||
| + | |||
| + | = Polishing Up = | ||
| + | Once your map is laid out, adjust class limits, spawns, and other settings as usual via the {{ll|Server_Configuration|Server Configuration}} guide. | ||
| + | |||
| + | <div style="clear:both;"></div> | ||
| + | |||
| + | = Community Maps = | ||
| + | The Holdfast modding community shares custom map configs and assists new modders. Join via the official Discord: | ||
| + | |||
| + | [https://discord.gg/holdfastgame Holdfast Official Discord] | ||
| + | |||
| + | Once joined, go to <code>#getting-started</code> and react to the pinned message to unlock the Modding Bench channels. | ||
Revision as of 17:18, 23 September 2025
Holdfast allows server owners to customise existing maps to create a whole new experience. You can add props, change spawns, weapon setup, class limits, and more until you’ve created something entirely new. Map customisation is defined using Template:Ll in the configuration file.
Starting Maps
As well as building upon the normal Template:Ll, there are two flat and empty maps that are perfect to let your imagination run wild: CustomMap and CustomMapNaval. As you’ll likely spend plenty of time setting up your new map, create a new Template:Ll with an unlimited timer and open spawns, e.g.:
!map_rotation start map_name CustomMap game_mode ArmyBattlefield round_time_minutes -1 reinforcements_per_faction 9000 wave_spawn_time_seconds 1 max_player_respawns -1 faction_balancing false allow_midround_spawning true allow_faction_switching true allow_spectating true minimum_players -1 maximum_players 150 time_hour 8 time_dynamic false friendly_fire true weather_preset calm weather_dynamic false game_type hardcore !map_rotation end
To refresh changes to your map without restarting your server, issue the following (substitute the correct rotation index):
rc fileReloader serverConfigFile rc mapRotation 1
Positioning
Before placing a prop, decide where it goes and which way it faces. Stand where you want it in-game, open the console with F1 and type get.
This prints your position and rotation:
playerPosition => (15.3, 16.8, 146.9) playerRotation => (0.0, 218.0, 0.0)
- Position is (X, Y, Z). Positive X is North, positive Y is up, positive Z is West.
- Rotation is degrees around (X, Y, Z). You’ll use Y most to turn objects; X and Z tilt.
- To face the opposite direction of the example above, use
(0.0, 38.0, 0.0)(218 − 180).
As of 0.35, get details also copies position & rotation to your clipboard for easy pasting.
Placing Props
Props range from simple decor (just position/rotation) to interactables (with extra parameters).
Decorative Props
See Template:Ll for the full list. Place a decorative prop with:
objects_override <prop> <pX> <pY> <pZ> <rX> <rY> <rZ>
- <prop> — Enum from Template:Ll
- <pX> <pY> <pZ> — Position (use
get playerPosition) - <rX> <rY> <rZ> — Rotation (use
get playerRotation)
Example—add a Target Dummy at the example coordinates:
!map_rotation start map_name CustomMap game_mode ArmyBattlefield round_time_minutes -1 reinforcements_per_faction 9000 wave_spawn_time_seconds 1 max_player_respawns -1 faction_balancing false allow_midround_spawning true allow_faction_switching true allow_spectating true minimum_players -1 maximum_players 150 time_hour 8 time_dynamic false friendly_fire true weather_preset calm weather_dynamic false game_type hardcore objects_override TargetDummy 15.3 16.8 146.9 0.0 218.0 0.0 !map_rotation end
Interactable Props
These require extra arguments.
Weapon Racks
Players can hold E to take weapons from a rack (limited supply).
objects_override WeaponRack <Object Position> <Object Rotation> <Weapon> <Number Of Weapons In Rack>
- <Object Position> —
x y z(useget playerPosition) - <Object Rotation> —
x y z(useget playerRotation) - <Weapon> — Enum from Template:Ll
- <Number Of Weapons In Rack> —
0–255
Example
# Override Commands (This is a comment and will be ignored by the game) objects_override WeaponRack 1 2 3 7 8 9 Rifle_Pattern1800Infantry 4
Place this between !map_rotation start and !map_rotation end.
Firearm Ammoboxes
Customisable ammo boxes for RP/events. Players replenish ammo on use.
objects_override firearmammobox <Object Position> <Object Rotation> <Firearm> <Maximum Interactions Until Depletion> <Ammo Given> <Maximum Interactions Allowed Per Player>
- <Object Position> —
x y z - <Object Rotation> —
x y z - <Firearm> — Enum from Template:Ll
- <Maximum Interactions Until Depletion> —
0–255total uses - <Ammo Given> —
0–255rounds per use - <Maximum Interactions Allowed Per Player> —
0–255per-player cap
Example
# Override Commands (This is a comment and will be ignored by the game) objects_override firearmammobox 1 2 3 7 8 9 Rifle_Pattern1800Infantry 20 2 1
Place this between !map_rotation start and !map_rotation end.
Polishing Up
Once your map is laid out, adjust class limits, spawns, and other settings as usual via the Template:Ll guide.
Community Maps
The Holdfast modding community shares custom map configs and assists new modders. Join via the official Discord:
Once joined, go to #getting-started and react to the pinned message to unlock the Modding Bench channels.


