Since there hasn't been much documentation concerning this topic, I have created a tutorial regarding the process necessary to create an .ent file for a map.
In this example I will add spawning with weapons to the existing map
crates.bsp.
Once we've obtained the map we can navigate to it in the maps directory (typically c:\games\paintball\pball\maps\). We'll need to open this map in a text editor, I suggest opening it in Wordpad by performing a right click on the file and selecting
Open With (or simple
Open if Open With is not currently available) and choosing Wordpad.
Don't be alarmed if all you see is illegible characters and/or a bunch of outlined boxes instead of characters. This is normal.
Now scroll towards the very bottom of the file. Towards the bottom some text will begin to be legible. In crates.bsp this begins with:
"message" "Insanely Crate\nBy Fryth"
"team2" "blue"
"team1" "red"
"gamemode" "4"
Fortunately for us, all the information we need to create an .ent file is left in plain text so we can copy it all into a separate text editor. For this you can open another text editor window such as Wordpad or Notepad.
*** It is
very important to copy the first
{ (curly-brace) from the previous line. Without this your .ent file will cause all sorts of problems.
You should have copied the following:
{
"message" "Insanely Crate\nBy Fryth"
"team2" "blue"
"team1" "red"
"gamemode" "4"
"maxteams" "2"
"classname" "worldspawn"
}
{
"classname" "item_pballammo"
"origin" "-15 294 33"
"type" "50"
}
{
"classname" "item_pballammo"
"origin" "216 246 33"
"type" "50"
}
{
"classname" "item_pballammo"
"origin" "312 -121 33"
"type" "50"
}
{
"classname" "item_pballammo"
"origin" "160 70 33"
"type" "50"
}
{
"classname" "item_pballammo"
"origin" "-63 -73 33"
"type" "50"
}
{
"classname" "item_pballammo"
"origin" "-199 182 33"
"type" "50"
}
{
"classname" "weapon_pballgun"
"origin" "536 -9 161"
"type" "autococker"
}
{
"classname" "weapon_pballgun"
"origin" "-479 222 161"
"type" "autococker"
}
{
"classname" "flag"
"origin" "-482 -576 157"
"teamnumber" "1"
}
{
"model" "*1"
"classname" "base"
"teamnumber" "1"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -798 117"
"teamnumber" "1"
"angle" "0"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -722 117"
"teamnumber" "1"
"angle" "0"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -610 117"
"teamnumber" "1"
"angle" "0"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -498 117"
"teamnumber" "1"
"angle" "0"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -382 117"
"teamnumber" "1"
"angle" "0"
}
{
"classname" "item_pballbarrel"
"origin" "-105 -800 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "-105 -800 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "-105 -800 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "-105 -800 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "-105 -800 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "-105 -720 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "-105 -720 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "-105 -720 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "-105 -720 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "-105 -720 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "-105 -608 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "-105 -608 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "-105 -608 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "-105 -608 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "-105 -608 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "-105 -496 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "-105 -496 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "-105 -496 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "-105 -496 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "-105 -496 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "-105 -384 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "-105 -384 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "-105 -384 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "-105 -384 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "-105 -384 27"
"type" "spyder"
}
{
"classname" "flag"
"origin" "546 768 157"
"teamnumber" "2"
}
{
"model" "*2"
"classname" "base"
"teamnumber" "2"
}
{
"classname" "info_player_deathmatch"
"origin" "200 554 117"
"teamnumber" "2"
"angle" "180"
}
{
"classname" "info_player_deathmatch"
"origin" "200 630 117"
"teamnumber" "2"
"angle" "180"
}
{
"classname" "info_player_deathmatch"
"origin" "200 742 117"
"teamnumber" "2"
"angle" "180"
}
{
"classname" "info_player_deathmatch"
"origin" "200 854 117"
"teamnumber" "2"
"angle" "180"
}
{
"classname" "info_player_deathmatch"
"origin" "200 970 117"
"teamnumber" "2"
"angle" "180"
}
{
"classname" "item_pballbarrel"
"origin" "153 552 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "153 552 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "153 552 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "153 552 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "153 552 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "153 632 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "153 632 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "153 632 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "153 632 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "153 632 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "153 744 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "153 744 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "153 744 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "153 744 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "153 744 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "153 856 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "153 856 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "153 856 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "153 856 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "153 856 27"
"type" "spyder"
}
{
"classname" "item_pballbarrel"
"origin" "153 968 155"
"type" "chrome"
}
{
"classname" "item_pballhopper"
"origin" "153 968 123"
"type" "300"
}
{
"classname" "item_pballammo"
"origin" "153 968 91"
"type" "200"
}
{
"classname" "item_pballco2"
"origin" "153 968 59"
"type" "20oz"
}
{
"classname" "weapon_pballgun"
"origin" "153 968 27"
"type" "spyder"
}
Now if you have previous experiencing mapping you may notice that each set of { } represents each entity, starting with the worldspawn entity.
We are now ready to start making modifications to the entities of this map. What I will do is remove any sets which have a classnames that is item_pballammo, weapon_pballgun, item_pballbarrel or item_pballhopper since I plan on giving each player all of that equipment when they spawn.
Once we've done that we can go ahead and add the following information to each set with the
info_player_deathmatch classname.
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
As the fields suggest, that will start everyone with a Carbine, 200 paintballs in their 200 paintball hopper and a pre-loaded 20oz canister of CO2.
The final result should look something like:
{
"message" "Insanely Crate\nBy Fryth"
"team2" "blue"
"team1" "red"
"gamemode" "4"
"maxteams" "2"
"classname" "worldspawn"
}
{
"classname" "flag"
"origin" "-482 -576 157"
"teamnumber" "1"
}
{
"model" "*1"
"classname" "base"
"teamnumber" "1"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -798 117"
"teamnumber" "1"
"angle" "0"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -722 117"
"teamnumber" "1"
"angle" "0"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -610 117"
"teamnumber" "1"
"angle" "0"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -498 117"
"teamnumber" "1"
"angle" "0"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "-152 -382 117"
"teamnumber" "1"
"angle" "0"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"model" "*2"
"classname" "base"
"teamnumber" "2"
}
{
"classname" "info_player_deathmatch"
"origin" "200 554 117"
"teamnumber" "2"
"angle" "180"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "200 630 117"
"teamnumber" "2"
"angle" "180"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "200 742 117"
"teamnumber" "2"
"angle" "180"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "200 854 117"
"teamnumber" "2"
"angle" "180"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
{
"classname" "info_player_deathmatch"
"origin" "200 970 117"
"teamnumber" "2"
"angle" "180"
"givegun" "carbine"
"givehopper" "200"
"givebarrel" "chrome"
"giveammo" "200"
"loadedco2" "20oz"
}
Once everything looks in order and you've ensured that you have a
{ to open and a
} to close each entity set you can save your modifications as crates.ent in the maps\ directory. Next time you load this map on your local server the entities loaded by the server should reflect those that are contained within your .ent file.
If this is for a dedicated server make sure you upload the .ent file to the server or save it to the path of the dedicated server's pball maps for the changes to take effect.
Feel free to reply with any questions or comments and I'll try my best to address them.