• Introduction (Home)
  • What's New?!
  • MapMaking Q&A:
  • Beginning Issues
  • Intermediate Issues
  • Advanced Issues
  • Mega-TF Issues
  • More Information:
  • Errors & Solutions
  • Author Advice
  • Files Archive
  • Real Audio Show:
  • Blueprints Mint
  • Internal Links:
  • Blueprints News
  • DyerMaker's Maps
  • Blueprints Guestbook
  • External Links:
  • The Forge
  • QuakeLab
  • TF Console
  • Ented Home
  • Intermediate MapMaking Issues

  • What Rules of Thumb do you use?
  • Why Don't you use EntEd?
  • How do you get (trains, plats, doors, hurts, pushes, det-walls) to work right?
  • Why didn't you make your destroyers sink in "Warships?"
  • I'm afraid to experiment. I'll end up getting leaks.
  • Model issues, Info TFGoals and Item TFGoals
  • Writing Map Text Files

  • Q: What Rules of Thumb do you use?

    Many!

    1. Never carve unless absolutely required. Even then, I often carve in a new map and paste the object within the one I'm working on. Sometimes this reduces problems with carving, and at other times it increases them. I just have to try both methods each time and see which one doesn't present any problems. Pasting intricate objects has proven disasterous a couple times, too.

    2. Make Backups. I usually save versions of my file sequencially, such as mymap1, mymap2, mymap3. I always save to a new file name just before carving, if I plan to carve at all. After I've settled on a room or new addition, I make a new file before starting on a new area.

    3. Run QBSP and VIS often. I run them just to make sure the map will compile (I watch for errors while QBSP and VIS run). Most of the time I have "Don't run the game" checked. If ever an error is generated, there are 2 things I can do: 1) I have a backup of the map that did compile, so I may start from there if I need to. 2) I usually know what I did most recently and I can delete or fix the offending object as needed. Once VIS -FAST generates the "leaf portals saw into leaf" error, you will have to begin using VIS -LEVEL 1 to continue seeing your map with the benefits from VIS. At this point you may decide to keep working with QBSP and wait to apply VIS -LEVEL 1 when you are closer to being finished.

    4. Never manipulate vertexes unless necessary. Some of the simplest vertex manipulations just fill a map with problems. If this happens, I'd rather create a new brush and manipulate the new brush's vertexes, or go without an unmanipulated brush, than to suffer with the map's potential for problems. Jim Kaufman AKA Sgt. Thundercok, (the author of Rock1, Well6, and SpazBall) gave some me good advice on this issue, also: never drag a vertex on a vertex, and save as a .map file after doing a new manipulation.

    5. Export to Map. Close. Open Map. Once I had a very strange error, it wasn't even a documented error. I did not want to lose my groupings so I did not export to MAP format even once, and now the map was almost done, it was generating a strange error. Exporting it to MAP format and then re-opening the MAP file took care of this curious problem.

    6. Build the Hard Way. Instead of making a hollow box (room), then creating a block brush, carving with the block brush to make a doorway and using the block as the door, I do this instead: Ungroup the box (room) and make one side of the room smaller. Copy and paste another one of those smaller sides to make the other side of the door. Create a new brush to use as a door. Why? Refer to Rule of Thumb #1 - never carve unless absolutely required! I automatically ungroup my room walls after I'm fairly certain of the size I need. Re-grouping them for whatever reason is easily done later. To make hallways, I make a long block brush, hollow it out, ungroup it, and then delete the ends. Regroup it, and position it where it needs to go. It takes less time than typing this did, and I type 60 WPM on a good day.

    7. I always test the map in Quake using a batch file. I'd noticed that some of the time the "run map in Quake" option in Worldcraft didn't work, or it was running an older version of the map I'm working on (This was an earlier and unregistered version of Worldcraft). When I realized this, I was displeased of course, and immediately made a batch file that copies my .bsp (and also the .pts in case I'm looking for a leak) into my fortress\maps directory, then runs Quake with -game fortress -winmem 24 +mapname. I keep a DOS session open all the time while I work on my maps. Let's say the name of the batch file is "DOMAP" then I just type domap mymap, it copies the files, passes the correct parameters and launches Team Fortress. I can Alt+Tab back and forth between Worldcraft and DOS. When I'm back at DOS, I hit the F3 key, which spams out my last-typed instruction (such as 'domap mymap').

    Worldcraft has lots of new features and the command-string parameters you can change (at least in the Registered version) to suit your needs and your directory structure. I'm just too stuck on doing things the way I do them now. By the time I remember that WC has a whole slew of new options, the map is already loading in Quake. :P

    Here is an example batch file, but you shouldn't need to mess with it if you don't want to:

    copy c:\progra~1\worldcraft\%1.bsp d:\quake\fortress\maps
    copy c:\progra~1\worldcraft\%1.pts d:\quake\fortress\maps
    d:
    cd quake
    quake -game fortress -winmem 24 +map %1

    Q: Why don't you use EntEd?

    UPDATE:  I checked out Raistlan's new EntEd program, it's a must-see-to-appreciate. Here is the zipfile

    Read some of the features that Raistlan wrote to me about his program:

    "I invite you to download version 2.0 Beta 5c: http://www.erinyes.com/ented/ented.zip and try it out. I invite you to experiment with pasting entities in text format into the map, and copying entities from the map into the clipboard in text format. I invite you to experiment with editing out entities so you can see the effect in Quake of removing them without actually deleting them, and then uncommenting them out when you want them to be compiled again. I invite you to look at opening, exporting, importing and appending .ent files.

    With the registered version, you can directly open .bsp files and edit them, and then save them as a .bsp with the only restriction being that you can't delete entities with brushes tied to them. This saves much INVALUABLE time, when you want to bump up the brightness value of a light, for example, and see what it looks like without having to re-compile your map, or for when you're experimenting with TF entities. You can also replace the entities in the .bsp with those from an .ent file, then save the .bsp and it's ready to be run in Quake. You can also append the entities from an .ent file, or export to an .ent."

    Answer to Question: I tried EntEd back when I started making TF Maps and couldn't get it to work right. Nowadays I'm familiar enough with the goal structure of TF that I enter the goal properties right into Worldcraft, which also allows me to keep my groups. Raistlan has a good point: Yes, I have to look up and add up the bits almost every time, but I enjoy doing this. Sound like a headache? Get Raistlan's program, it's easier to figure out than TFENTREF.TXT! :P

    Q: How do you get (trains, plats, doors, hurts, pushes, det-walls) to work right?

    Learn by example, or by experimentation. That's how I did it... and still do! You can go to DOS and type EDIT and open any BSP file that you already have. The trick is to know what you are looking for. Go to SEARCH, and find things like INFO_TFGOAL, INFO_TFDETECT, ITEM_TFGOAL, et cetera. See how the author of the map names them and how they correlate with one another, or triggers, doors and other goals within the map. I intend to whip together some small zip files which include the MAP file, the BSP file and a TXT file here.

    • Trains are brushes tied to a func_train entity. Trains need some path_corner entities in order for them to move. Be sure you name your path_corners (example 1st_stop, 2nd_stop, etc), and tell the Train that the name of the first path_corner needs to be the first stop it makes. If you want your train to double-back along its path like the carts in GOLD RUSH, you will need even more path_corners. If you want to build a multiple-brushed train, then build the objects that will be the train, group all the items together, and then tie the group to the func_train entity. Here is an example of a func_train and a path_corner:
      "classname" "func_train"
      "speed" "450"
      "sounds" "1"
      "wait" "4"
      "lip" "0"
      "dmg" "0"
      "health" "0"
      "target" "stopa"
      "model" "*11"
      "classname" "path_corner"
      "targetname" "stopa"
      "target" "stopb"
      "wait" "5"
      "origin" "-684 -412 -270"
      • Plats are simply brushes tied to the func_plat entity. Now all you need to do is see how far up (or down) it goes, and if that is high or low enough. You can also group several objects and tie the group to the func_plat.
      • Doors are brushes tied to a func_door entity. DO NOT give this door a name ("targetname" "door_one") unless you want a button or something else to trigger it open, and remember that the button must know the doors name ("target" "door_one"). If you want to make Team-Only doors, add the statement "team_no" "(number)" either in DOS or you can add them directly into the map using WorldCraft by turning SmartEdit off. If you want two doors to open in opposite directions simultaneously when a player nears, just make sure the edges of both brushes touch and set the correct angle that each door needs to go. Use the "top view" of your map for reference when setting these angles.
      • Hurts are simply brushes tied to a trigger_hurt entity. Place the damage at around 500 for a really nice gib effect. You may make them Team-Only the same way as a door. The brush you created for the Hurt will turn invisible once you tie it to the entity.
      • Pushes are like hurts in that the brush will turn invisible once he's tied to the Push entity. Play around with the push's values. Pay some attention to the ANGLE value; start with angle "up" for the push to push you upwards. Some fun things come from pushes, like the cannons and smoke stacks on the Destroyers in WARSHIP1.
      • EXAMPLE1.ZIP contains a detpackable wall. If you run the game with Team Fortress (explained in the text file if you don't know how), then drop a 5 second detpack near the dark wall with a dim circle of light on it (type IMPULSE 165 for a 5 second Det) and then run around the corner, back where you came from. Wha-laa.
      • Things to look for in EXAMPLE1: 
        • The Detpackable wall is tied to the entity func_door, and has a name ("targetname" "blow_this_wall").
        • Check out the "speed" setting of the door, this makes it look instantaneous.
        • The Info_TFGoal targets the door by name ("target" "blow_this_wall").
        • The Info_TFGoal's "activation" is set at 2, which means "touched by a detpack."

    Q: Why didn't you make your destroyers sink in "Warships?"

    That was the original plan. Each base is an entire ship. What I *did* try was tying some water to a function in a test map I made. Ya know what? Water becomes hard as concrete when you tie it to anything. Which is so incredibly interesting! There has got to be a way to take advantage of that. We'll all have to change our names to "JC" and walk on water!

    I'm afraid to experiment. I'll end up getting leaks.

    For goodness sake DON'T BE. If you want to test something out, open a new file, build yourself a quickie room, put some light and an info_player_start in there. Then save the map as TEST.MAP or whatever you prefer. Then go on with what you want to test out. You can run this test map anytime you have something new you want to try out. Who cares if it ends up with leaks or other errors, it doesn't matter. Even if it does get errors, you may just learn how to avoid them in the future! If you like something you've done in your test map, edit > copy it and edit > paste it into your "main" map...you know, the one that *does* matter. Group the objects to keep them aligned, if it's more than one brush / goal. I've so many test maps it's pathetic! :P It's fun to mess around with a map you don't care about - it allows you the freedom to exercise your imagination.

    Model issues, info TF goals and item TF goals

    I see far too many model and basic goal function questions on the TF MapMaking Mailing List so I'm going to address these issues here. Click on the links above to get to the goal information.

    I use QMe Lite model editor when I want to change or create a model. You can find QMe and other great products from 3DMatrix including QArt and QEd at the 3DMatrix Files page.


    A model can be given to an info_TFgoal as well as an item_TFgoal. A resupplying bag, commonly called a backpack, is an info_TFgoal, whereas the "key" or "flag" is predominantly an itemTFgoal.

    • Skins:  You may choose which skin you want to use on a model by adding "skin" "X" where X is the number of skin you want.)
    • Frames: If the model has many frames (such as player.mdl) you may also choose which frame you want to use by adding "frame" "X" where X is the frame number. I've posted this on the Advice page but I think it will go well here, too: Here is the reference in my map for the Shambler (ICELAND3's Abominable Snowman):
    "origin" "1192 -12 -366"
    "mdl" progs/shambler.mdl"
    "frame" "39"
    "angle" "180"
    "classname" "info_tfgoal"

    InfoTFGoal: This is a very unique beast, he's used for all sorts of things. He's invisible *unless* you give him a model, then people can see him. This makes it easy for MapMakers to use him for different operations such as removing all your gear, activating other goals, hurting someone, or giving an entire team Quad damage for five seconds. Fun with this goal is the "failed critera" check. Take some time to learn about that. Here is an example of a resupplying bag, or Backpack:

    "g_e" "1"
    "wait" "3"
    "noise" "weapons/lock4.wav"
    "ammo_medikit" "50"
    "ammo_shells" "200"
    "ammo_nails" "200"
    "ammo_cells" "200"
    "ammo_rockets" "150"
    "armorvalue" "300"
    "armortype" "0.8"
    "armorclass" "2"
    "no_grenades_2" "5"
    "no_grenades_1" "5"
    "health" "100"
    "g_a" "1"
    "mdl" "progs/backpack.mdl"
    "netname" "team_1_ammo_lower"
    "team_no" "1"
    "classname" "info_tfgoal"

    Some of the values are self-explanatory, but I will run through them really quick. Keep in mind there are many more values that apply to the info_tfgoal:

    • g_e is Goal Effects. This setting (1) means that only the player is affected. According to TFENTREF, we could ammo up the whole team, now wouldn't that be sweet? :P This setting is not needed since it is default. However, if I took it out, I don't think we'd see the happy little background flash when you touch the bag.
    • Wait of 3 means the resupply bag will resupply someone else in 3 second (I hate waiting at resupply bags, myself!).
    • Noise is the sound you hear (a wave file) when the bag refills you. Ambush (of Ambushed!  Mega-TF Mods) found this wav for me. Everyone already has it in their pak files. The next 11 items are of course how much ammo / armor / health / grenades to give. Remember that negative numbers actually take things away.
    • The g_a is Goal Activation, which is set to one: Activated when touched by a player.
    • The MDL as you can see is the backpack model. This particular model is already in Quake (less for players to have to download).. Notice the forward-leaning slash, that's very important!
    • Netname doesn't mean anything to the map. All it is there for is so that I know exactly what goal this is. It's evidently one of team one's lower ammo packs. :}
    • The team_no is set to team one because even if the Reds (team 2) get into the Blue's lower ammo room, they're not gonna get any goodies. And why should they! :P

    ItemTFGoal: This is the guy usually used for keys and flags. Item and Info goals share some values, but not all! Here is one of the Crystals from ICELAND3:

    "delay" "30"
    "non_team_broadcast" "blue's crystal has been taken!\n"
    "team_broadcast" "red's have blue's crystal!\n"
    "goal_no" "1"
    "items" "131072"
    "team_no" "2"
    "noise4" "Their Crystal has Returned!\n"
    "noise3" "Your Crystal has Returned!\n"
    "skin" "1"
    "group_no" "1"
    "g_a" "693"
    "noise" "items/inv1.wav"
    "message" "you've got Blue's Crystal!\n"
    "mdl" "progs/crystal.mdl"
    "owned_by" "1"
    "netname" "BluKey"
    "classname" "item_tfgoal"

    I'll run through the variables quickly, but remember there are many more than just these that apply to item goals:

    • delay is how long to wait before returning if the key is dropped by a dying player, in seconds.
    • the broadcast messages are fairly self-explanatory. Be sure to put a carriage return (the "\n") after any messages you add to your goal.
    • Goal_no is the unique number of this goal. When captures happen, the capturing goal (info_tfgoal) references this unique number with the axhitme line, thereby removing the goal from the capturing party, such as: "axhitme" "1". If there is not goal_no on your item goal and you try to capture it, you will get "could not find a goal item with a goal number of 1" spammed across your screen, and you'll run around glowing like a banshee...
    • Items specifies which item to light up on the player's console. 131072 makes the silver key icon light up and 262144 is the gold key icon. Pretty cool, huh?
    • team_no means only one team can activate this goal, usually the enemy team.
    • skin is of course which skin of the crystal.mdl that this goal will use. This can be left out when using models with only one skin.
    • group_no: If the item belongs to a group, here is how you tell it which group it's in. Makes it handy when your info_tfgoal can "activate_group_no" "1" instead of having to reference a bunch of goals individually.
    • g_a: Goal activation of an item_tfgoal is different than that of an info_tfgoal. I use the TFENTREF file and just add up the bitfields:
        • 1 : Carrying Player glows.
        • 2 : Carrying Player moves at half speed.
        • 4 : Item is dropped when a player with it dies.
        • 8 : Item is returned when dropped.
        • 16 : Item is returned when removed from players by a Goal
        • 32 : Item is returned due to "pausetime" (see below)
        • 64 : Only activated (picked-up) if AP fails Criteria.
        • 128 : Enable "pausetime" removing.
        • 256 : Players keep this item when they die.
        • 512 : If this Item isn't being carried, it glows dimly.
        • 1024: Don't remove the results of this Item when it's removed from a player.
      • My Crystals, set for 693, means that the bits for this goal are 1010110101. 1 means the bit is used and 0 means it's not. Basically, I'm using bits 1, 4, 16, 32, 128 and 512 which adds up to 693. Here is how my Crystal behaves:
        • 1 : Carrying Player glows.
        • 4 : Item is dropped when a player with it dies.
        • 16 : Item is returned when removed from players by a Goal
        • 32 : Item is returned due to "pausetime"
        • 128 : Enable "pausetime" removing. (strange, I don't have a pausetime setting) hmmm
        • 512 : If this Item isn't being carried, it glows dimly.
    • Noise is the sound you hear when you grab the key, in the form of a wave file.
    • MDL is of course the model. Be sure to note the forward-leaning slash!