Creating maps for current NanoMods
I am providing the sources of my maps so that you can use them as templates. Each contains some necessary elements in order to work properly. After having downloaded a map source archive, unzip it in the folder of this map (FarCry\Mods\NanoMods\Levels\xx_xxxxx).
- td_snake_source.zip (980 KB)
-
zh_camp_source.zip (2.59 MB)
zh_balltrap_source.zip (681 KB) -
lr_sewers_source.zip (198 KB)
lr_faceoff_source.zip (190 KB) -
ck_monkeybay_source.zip (1.75 MB)
ck_carnades_source.zip (2.82 MB) - w8_forts_source.zip (828 KB)
Here is now how to create a new map from scratch (I am considering that you master the Sandbox basis). The first part of the explanations is common to each NanoMod.
The folder Levels\ whose I refer to on this page of course is FarCry\Mods\NanoMods\Levels\.
-
Common help
- Run Sandbox and create a new map. Name it according to the other maps of the NanoMod you have chosen (use the same prefix)
- Copy the files languages.lua and properties.lua from the folder of a map of the NanoMod you have chosen to the folder of your new map
- Modify the basic information contained in these two files (the map name, your name, your email address and your public word)
- Optional: You can set some default values for the game settings. The only thing you have to do is to modify (or uncomment) NanoMod.tDefaultSettings in Levels\xx_xxxxx\properties.lua
- Note: This is true only for the maps of the NanoMods with game settings. Not in Tower Defense for instance.
- Place Delaytrigger_OnEverySecond (which rhythms the NanoMods system and is set automatically)
- Later, once you have finished your map, please create its load screen from the template I provide in order for the NanoMods maps to be easily recognizable. Download the PhotoShop template (233 KB)
- General notes:
- Modifying the orientation of a ProximityTrigger is useless. During the collision detection, it is always considered axis aligned (AABB).
- The settings I provide for the objects to be placed on the map are based on their default values: once you have placed a new object, modify those settings only. Be careful if you clone an existing object.
Page top
-
Tower Defense help
- As the very first NanoMod, the Tower Defense knew several much different versions. Its operation keeps some stigmas and seems very archaic to me. I mean the explanations will be long (you should read the entire thing before do anything...).
- Place ProximityTrigger_Switch (the switch which launches the game)
- ActivateWithUseButton = True
- DimX, DimY, DimZ = [1 should be enough]
- OnlyMyPlayer = True
- OnlyPlayer = False
- ScriptCommand = NanoMod:TowerDefense_OnActivateSwitch();
- TextInstruction = use_switch (see Levels\td_xxxxx\languages.lua)
- TriggerOnce = True
- Place DelayTrigger_EngineerTool (which distributes the engineer tools)
- ScriptCommand = NanoMod:TowerDefense_ManageEngineerTools();
- Place DelayTrigger_NextWave (which launches the next wave of enemies)
- ScriptCommand = NanoMod:TowerDefense_LaunchNextWave();
- Place Delaytrigger_RemoveDeadBodies (which removes corpses)
- ScriptCommand = NanoMod:TowerDefense_RemoveDeadBodies();
- Place ProximityTrigger_Defeat (the zone the enemies must reach)
- DimX, DimY, DimZ = [it depends on you...]
- OnlyAI = True
- OnlyPlayer = False
- ScriptCommand = NanoMod:TowerDefense_MissionDefeat();
- TriggerOnce = True
- Place DelayTrigger_GameOver (which manages the end of the game)
- ScriptCommand = NanoMod:TowerDefense_GameOver();
- To preload the .cgf files of the enemies
- Place each enemy special NanoMods (from Entity > AI > NanoMod_[...]) in a place of the map that the players will not see
- Give the following name to each: Preload
- Set them like this:
- HiddenIngame = True
- For the enemies to drop weapons or ammo when dying
- Create an Equipement-Pack for each of the five enemies special NanoMods: name them DropPack_Big, DropPack_Bezerker, DropPack_BezerkerAlt, DropPack_Fast and DropPack_Stealth.
- You can let them empty if you want, but always create those five Equipement-Packs even if you do not make use of the five enemies special NanoMods.
- Note: That point is critical because the server can lag if it does not find a DropPack.
- For the enemies to spawn
- Place some TagPoints at the places where the enemies will spawn (if there are many enemies at a same spot, place a group of TagPoints)
- Name them with a letter (or a word) followed by a digit (see NanoMod.tLocations in Levels\td_xxxxx\properties.lua) by using the same letter (or the same word) for every TagPoints of a same group
- Modify NanoMod.tWaves in Levels\td_xxxxx\properties.lua by trusting the instructions (in English), so that the enemy spawns at the chosen place (location takes as value the letter or the word of the name of the TagPoint minus the digit)
- For the enemies to move
- Draw an AIPath for every TagPoint or group of TagPoints, starting from it or near it, and arriving to the ProximityTrigger_Defeat, or else looping over itself and across some ProximityTrigger_Damage (see below)
- Name that AIPath just as you want (but do not forget _PATH at its end), and modify NanoMod.tWaves in Levels\td_xxxxx\properties.lua so that the enemy follows the chosen path (name takes as value the AIPath starting from the chosen TagPoint or group of TagPoints minus _PATH at its end)
- For the players to build mounted weapons
- Note: Below, n represents a mounted weapon number.
- Place some MountedWeaponMG[n] at the places you find interesting, and set these mounted weapons like this:
- Hidden = True
- angHLimit = [it depends on you...]
- angVLimitMax = [it depends on you...]
- angVLimitMin = [it depends on you...]
- Place some BuildableObject[n] at the mounted weapons places (setting InitalState to 0 is necessary and convenient to place the object), and set them like this:
- Model_building = Objects\multiplayer\buildables\mountedweapon_building.cgf
- Model_built = Objects\multiplayer\buildables\mountedweapon_base.cgf
- Model_damaged = Objects\multiplayer\buildables\mountedweapon_destroyed.cgf
- Model_repair = Objects\multiplayer\buildables\mountedweapon_repair.cgf
- Model_unbuilt = Objects\multiplayer\buildables\unbuilt_mountedweapon.cgf
- max_buildpoints = [a number] (about 250 per second of building)
- max_hitpoints = 0
- max_repairpoints = [a number] (about 250 per second of repair)
- Events > On built > MountedWeaponMG[n] [Unhide]
- Events > On built > ProximityTrigger_Damage[n] [Enable]
- Events > On damaged > MountedWeaponMG[n] [Hide]
- Events > On damaged > ProximityTrigger_Damage[n] [Disable]
- For some enemies to destroy some mounted weapons
- Note: Below, n represents a mounted weapon number.
- Place a ProximityTrigger_Damage[n] near every mounted weapon so that an enemy can trigger it while following an AIPath that is crossing it
- Set it like this:
- DimX, DimY, DimZ = [1 should be enough, but beware of fast enemies...]
- Enabled = False
- OnlyAI = True
- OnlyPlayer = False
- Events > On Enter > BuildableObjects[n] [damaged]
- It is a good job I said you it is complicated. So do not hesitate to read the explanations one more time, and good luck!
Page top
-
Zone Holding help
- As the Tower Defense, the Zone Holding has really changed since the first days of its creation. Again, before you start creating your map, you are invited to carefully read the following instructions.
- Place ProximityTrigger_Switch (the switch which launches the game)
- ActivateWithUseButton = True
- DimX, DimY, DimZ = [1 should be enough]
- OnlyMyPlayer = True
- OnlyPlayer = False
- ScriptCommand = NanoMod:ZoneHolding_OnActivateSwitch();
- TextInstruction = use_switch (see Levels\zh_xxxxx\languages.lua)
- TriggerOnce = True
- Optional: Events > On Enter > SoundSpot_Switch [Play or Stop]
- Optional: Events > On Enter > DelayTrigger_Switch [InputTrigger]
- Place DelayTrigger_ManageEnemiesSpawn (which rhythms the enemies spawn)
- ScriptCommand = NanoMod:ZoneHolding_ManageEnemiesSpawn();
- Place DelayTrigger_RemoveDeadBodies (which removes corpses)
- ScriptCommand = NanoMod:ZoneHolding_RemoveDeadBodies();
- Optional: Place a DestroyableObject (like RadioTransmitter in zh_camp)
- Name it as you want, and write this name between the quotes of NanoMod.sObjectiveName in Levels\zh_xxxxx\properties.lua
- Set it like that:
- Damage = 999
- Place ProximityTrigger_ObjectiveArea (the zone the enemies must reach)
- DimX, DimY, DimZ = [it depends on you...]
- OnlyAI = True
- OnlyPlayer = False
- To preload the .cgf files of the enemies
- Place each enemy special NanoMods (from Entity > AI > NanoMod_[...]) in a place of the map that the players will not see
- Give the following name to each: Preload
- Set them like this:
- HiddenIngame = True
- For the enemies to drop weapons or ammo when dying
- Create an Equipement-Pack for each of the five enemies special NanoMods: name them DropPack_Big, DropPack_Bezerker, DropPack_BezerkerAlt, DropPack_Fast and DropPack_Stealth.
- You can let them empty if you want, but always create those five Equipement-Packs even if you do not make use of the five enemies special NanoMods.
- Note: That point is critical because the server can lag if it does not find a DropPack.
- For the enemies to spawn
- Modify NanoMod.tEnemiesData in Levels\zh_xxxxx\properties.lua by trusting the instructions (in English)
- Place some TagPoints at the places where the enemies will spawn, and name them SpawnPoint[n] with n starting at 1 and finishing at the number of TagPoints placed on the map (do not miss any number)
- Modify NanoMod.iNumberOfSpawnPoints in Levels\zh_xxxxx\properties.lua by setting it to the maximum value of n
- For the enemies to move to their objective
- Draw a AIPath between every TagPoint and ProximityTrigger_ObjectiveArea (this AIPath must finish inside ProximityTrigger_ObjectiveArea)
- Name it Enemy_[n]_PATH (where n is the TagPoint number)
- For the enemies to do something after having reached their objective
- Draw a AIPath around ProximityTrigger_ObjectiveArea and make it loop over itself
- Name it Enemy_PATH
- Note: Enemies will follow that AIPath until they locate a player.
- Optional: For the enemies to jump over some obstacles
- Place some ImpulseTrigger_CustomJump along AIPaths, and set them like this:
- DimX, DimY, DimZ = [it depends on you...]
- ImpulseDuration = [a number representing the impulsion strength variation]
- ImpulseStrength = [a number representing the impulsion strength]
- OnlyAI = True
- OnlyMyPlayer = False
- Note: In practice, the impulsion is random and varies from ImpulseStrength to ImpulseStrength x (1 + ImpulseDuration). In fact, that trigger is neither exclusive to the Zone Holding nor to the AI, and can be used in every NanoMod.
- Place some ImpulseTrigger_CustomJump along AIPaths, and set them like this:
- Optional: To direct some events (like the screams in zh_camp)
- Place SoundSpot_Switch (sound played or stopped once ProximityTrigger_Switch is activated)
- Place DelayTrigger_Switch (triggered once ProximityTrigger_Switch is activated) and set it like this:
- TriggerOnce = true
- Notes: These two elements allow to synchronize the direction state of a game already started when a player joins it. They can be used separately.
- Actually, the Zone Holding is barely simpler than the Tower Defense. Congratulations to those who well understood everything. Cheer up for your map!
Page top
-
Lone Run help
- The Lone Run is closer from the classic Far Cry multiplayer than the Tower Defense and the Zone holding, so its maps are a lot simpler to design.
- Place some ProximityTrigger_Zone at the places where the players must go to score, and set them like this:
- DimX, DimY, DimZ = [it depends on you...]
- TextInstruction = [a number representing the zone value in points]
- If you have correctly followed the common explanations, well, it is done!
Page top
-
Constraint Kill help
- The Constraint Kill is nothing but a death match plus constraints, and its maps are really close from the classic multiplayer ones.
- Edit the file Levels\ck_xxxxx\properties.lua and have a close look at NanoMod.tConstraintsData. What you have to do is to create at least a set of constraints by trusting the instructions (in English).
- If you have well observed the common explanations, then it is already done!
Page top
-
Constraint Kill help
- The Constraint Kill is nothing but a death match plus constraints, and its maps are really close from the classic multiplayer ones.
- Edit the file Levels\ck_xxxxx\properties.lua and have a close look at NanoMod.tConstraintsData. What you have to do is to create at least a set of constraints by trusting the instructions (in English).
- If you have well observed the common explanations, then it is already done!
Page top
-
Wonder 8 help
- Soon...
Page top
