CS pitfalls and tips

2 posts / 0 new
Last post
Rot's picture
Rot
Lead DeveloperDeveloperQuest Developer
Joined:
2014-03-16 17:45
Last seen:
4 days 7 hours ago

WIP, gathered here so they can be put into the handbook eventually

CS Startup

  • When starting the CS with the "AllowYesToAll=1" change in Morrowind.ini, don't automatically click "Cancel" on the first error you see. If the first message is "One or more plugins could not find the correct versions of the master files they depend on. (...)", click "Yes", then wait until you get the message "Previous string is different for topic (...)" to click Cancel. If there are any other messages before the "Previous string" messages, it's probably something important. Be on the lookout for these messages when loading several files with dependences between them (dependences either visible or invisible, to ESM or ESP), which is frequent when working with TR, or when loading a plugin after it's modified with another application.
  • You can also open the CS several times with AllowMultipleEditors=1 in Morrowind.ini. If you already cancelled error messages before with the CS still open, the other CS won't ask and will ignore errors too.
  • If the Object Window is missing object tabs (Static, Activator...) when you open the CS, just resize the object window.
  • If the CS isn't saving your window sizes and positions, change them while running the CS with "run as administrator".

General

  • To give meshes or icons that are in the TR BSA to a new object: if the new object is the same type as an object that already uses those assets, change the ID of that object to your new object ID, save and click "Yes" to create a new ID; if it's a different type (creating an Activator from a Static) you can extract the files from the BSA but you don't have to -- you can also create an empty file with the same filename and extension as the mesh or icon, place it in the folders it's supposed to be in, link the new object to that empty file, then delete the empty file.
  • You can jump to an object in the Object Window by clicking on the list and pressing the first letters of its ID. You can do the same in most windows and ID lists (scripts, globals, sounds...).
  • Most lists can be sorted by alphabetical order of a column by clicking on the tab at the top.
  • CS search in Edit->Find Text also looks at some object property fields
  • To delete something that doesn't show you any delete option (global variables, sounds), use the "Del" key.
  • If the CS crashes, make a copy of the file "pukcab.bak" in Data Files BEFORE starting the CS again. (but you won't need that because you already know you have to save often and copy your active file into a new file each time you save)

Interiors/Exteriors

  • Click "Cancel" when editing the properties of an object in a cell (object instance), such as coordinates, scale, or owner extra data. If you click "Save", you dirty the ID (object definition) itself.
  • If an object that is defined in another plugin (not in the active plugin, and not in an ESM master) is placed into a cell, the object becomes dirtied in the active plugin when it's saved, and it will have to be cleaned manually. Will happen if you use an object from TR_Mainland.esp or a Data add-on that has the ESP format instead of ESM.
  • Copying objects from another cell often leaves the new one with ownerships you need to clean, so it's better to get them from the objects list.
  • If you use Ctrl+D to duplicate an object instance and try to move the object, the original instance is still selected and is the one that will be moved, not the new duplicate instance. If you're using TR_Mainland.esp as a "master" for a claim, you don't want to edit the original instance. You can find the new instance in the list of cell objects (has * after the ID, is the last object with that name in the list if sorted by default or by Object ID, and the first object with that name in the list if sorted by Type) and select it there, then click on the top frame of the cell Render Window, and usually pressing F will move it away from the original instance and allow you to move it. It's easier to place a new one from the objects list.
  • Hold X, Y, Z to move an object on that axis. If it doesn't work, try moving it in the opposite direction.
  • See MD's list for many useful and some previously unknown CS shortcuts
  • To change a cell name, select it by clicking on it once in "Cell View", then click again (or press F2).
  • In the object list of a cell, many objects in a row can be selected with Shift+click.

NPCs

  • You can quickly preview faces in Edit->Preview Window by browsing them in "Body Parts", but you can find them in an index (for vanilla - for TR).
  • Copying NPCs to make new ones often leaves the new NPCs with services or special AI packages. If you cookie-cut NPCs, always check the AI tabs for each of services, travel destination, AI packages, idle animation chances, and clean them.
  • Some NPC classes have default services they will always provide if they have "Autocalc" toggled. The "Agent" class will always be a default trainer for Light Armour, etc.
  • To give a NPC specific spells or services, you must not give them Autocalc. If you toggle Autocalc on after giving them a custom selection of spells, they will lose those spells.
  • NPCs with 90 Alarm will attack when you commit crimes and "report" you to other NPCs in the cell, but if none of these NPCs have 100 Alarm, crimes will not give a bounty.
  • NPCs can have more than one AI package. They can have Wander AND Follow. The Follow package isn't the same as AiFollow in scripting, it won't make the NPC follow the target, it will make the NPC join the target in combat (except if the package target is "player", then the NPC will follow only through loaddoors if they're close enough)
  • Applying NPC ownership to many objects in a cell: in the object list of a cell, many objects in a row can be selected with Shift+click. To apply ownership to all of them, Ctrl+click the last one in the render window, then Ctrl+doubleclick it to open its Properties while all other objects are still selected.
  • In a cell, you won't find coordinates in a NPC or creature's instance properties. Their coordinates can be seen at the bottom of the CS window (the main one called "TES Construction Set")

Dialogue

  • You can open several dialogue windows at the same time.
  • Copying text from Microsoft Word, Google Docs or other text software will often leave you with ’bad apostrophes’, “bad quotes”, spaces at the end of IDs, linux linebreaks... none of these things are good to keep.
  • When creating a new dialogue entry, whether you click "new" or "copy", the new one will be above the entry you had selected. Always edit the one above. The entries above and below the new one will always be dirtied, see tesame cleaning.
  • You can move the position of a dialogue entry up and down using the left and right arrow keys.
  • You can jump to a topic or dialogue line by selecting the list and pressing its first letters.
  • You can jump to the first edited line of an active plugin by pressing *. You can jump to specific lines by pressing "space" after * and then the first letters of the dialogue line.
  • If you create a new NPC, object ID or local variable while the dialogue window is already open, you won't find the new ID available in dialogue conditions until you select a different entry.
  • When you edit the existing conditions of a dialogue entry, without changing the condition type (for instance changing a Journal == 0 condition to < 0, or to a different journal ID), the change won't be saved until you select a different entry, or edit the text, or add a new condition, or close the dialogue window... ie if you open an active plugin, open the dialogue window, edit the contents of a condition and immediately click to save the plugin, the condition won't be changed in the saved file. As long as you don't see a * sign to the right of the active file name in the top CS bar, there is no change to the file.
  • Don't edit the name of a master file's topic, such as a topic in TR_Mainland.ESM while editing another file. If you do, the plugin will attempt to delete the topic and that be won't easy to clean.
  • Don't directly edit the name of a topic just to change capitalisation ("topic" also applies to journal IDs). If you do, the topic and its contents will be deleted when saving the plugin. If you need to only change capitalisation, either use tes3cmd, or first change the topic to a different word, then save, exit the CS, open the plugin again and change the topic back.
  • CS will not complain if a journal or topic is given the same ID as an object, but this will create bugs. When in doubt check that new journal or topic IDs aren't taken by an object.
  • If the only condition the player doesn't meet for a dialogue entry is "Disp", they will still see the topic, but will get a response from the Persuasion->Info Refusal tab instead.
  • An EMPTY dialogue entry will not work with NPCs in the game (different for journals, see below in "Giving a journal entry with no text") and an EMPTY greeting can prevent the player from being able to talk to the NPC. Using a regular space (keyboard spacebar) to create an entry with no text will not work in the CS, as it will revert to an EMPTY entry or to the text it had before. Using a nonbreak space will work.
  • You CAN see the ID (INFO ID) of each dialogue entry in the CS. The tab is normally hidden. You can expand the tab between "Info" (the tab under which the text is) and "Disp/Index".
  • "Journal" conditions: sometimes under some condition slots, you may not be able to see the end of journal IDs, and be unable to tell which journal it is if there are several that start the same way. To see which journal ID is already there, you can expand that condition's "Fun/Var" tab in the dialogue list above. To add the journal ID you want you can type its full name while the dropdown list is expanded (you should do that anyway, it's faster)

Dialogue results

  • Never save after using Error Check Results (see other related comments here) as it applies all changes to global variables in any dialogue results in the file, modifying the default values of those global variables.
  • Dialogue results are scripts but they're not pre-compiled by the CS, so they will behave differently when giving explicit targets ("targetID"-> instead of implicitly targeting the speaker). Compiled scripts can only target an explicit ID if an instance of that ID has been placed in the CS and they can only target the first instance that existed (if a NPC is killed and resurrected, the living NPC no longer counts as the first instance). Dialogue results do not have this limitation, but Error Check Results will report errors if no instance exists.
  • "Startcombat, player" isn't enough to make a NPC hostile. If they don't see the player when the dialogue result happens, they will never attack and will stay friendly. If they do attack, their hostility will fade after 72 hours outside of the cell. Use "SetFight" too.
  • Normal NPC hostiles such as bandits have 90 Fight, and won't attack if they have 100 Disposition with the player. Fight 100 will always attack.
  • You don't need to check if you've already given a journal entry in dialogue results: if you give the same entry again with Journal, nothing happens. This is different when out of dialogue: giving the same journal entry again in a script will give a journal update message (but still no repeat entry in the journal).
  • Giving a journal entry with no text (EMPTY) is the same as giving a journal that was already given: no journal entry and no update message in dialogue results, no journal entry but an update message if not in dialogue. You can silently "Finish" or "Restart" a journal with an empty journal entry given in dialogue.
  • A topic will not be hyperlinked in a dialogue line if no topic entry was available before that dialogue line's results. (Example: if the greeting "Help me!" gives Journal "MyJournal" 10 but the topic "Help" has no available entry before a Journal "MyJournal" >= 10 condition, "Help" will not be hyperlinked the first time you see "Help me!").

Scripts

  •  
  • Recompiling a script after editing the ID (that comes after "begin") will change the ID of that script. Start a new blank script.
  • If you try to add a script to an object and its script stays blank after saving the object, check that the script ID doesn't have more than 31 characters.
  • A script needs to be compiled once before any script can start or stop it, so it's normal for a script that terminates itself to give an error the first time it's compiled.
  • A script also needs to be compiled once before its local variables can be targeted with the "objectID".variable syntax by a compiled script. If a script refers to its own variables using the "objectID".variable syntax, and if you haven't compiled it with these variables yet (or accidentally saved this script by moving to another script in the window without compiling it), the "variable not found" error will prevent you from compiling the script, and it won't be able to find its own variables until it's compiled... You need to comment out these references to its own variables, compile, then uncomment and compile again.
  • The order in which local variables are defined in a script matters, not just for the 34th variable of a type which doesn't work, but also for any other script that targets it with the "objectID".variable syntax. When editing an existing script, any new variables should be added at the end of existing variable definitions.
  • If you accidentally used an object ID in an argument that doesn't accept that type of object (like giving a NPC ID instead of a cell name) and get an error about it when trying to compile, you may find that your script has become the local script of that object, replacing its local script if it had one.
  • Copying text from Microsoft Word, Google Docs or other text software will often leave you with ’bad apostrophes’, “bad quotes”, spaces at the end of IDs, linux linebreaks... none of these things are good to keep. A script copied from elsewhere can have characters that aren't visible in the CS and that still make the script fail.
  • CS search will fail to find text in extremely long scripts
  • CS will not complain if a script is given the same ID as an object, but this will create bugs. When in doubt check that new script IDs aren't taken by an object. Same for topic IDs or journal IDs.
  • A global variable shouldn't be declared as a local variable in a script if the script uses the global variable. For the global DaysPassed, don't use vanilla scripts as an example when they use "short daysPassed" (besides, the vanilla script method for tracking time with "currentDay" and "daysPassed" only works correctly for global scripts that will always run with the player, not for local scripts that will only run when the player is in the same cell).
  • If you've fixed a script, but there are no changes ingame: yes, you've edited and recompiled the script, but did you save the plugin? yes, you've saved the plugin, but did you save the script? You don't get a warning on exit.

Sound gen

  • Creature soundgen is based on... models? If your new creature ID uses a mesh that hasn't been used by any creatures before, the "Sound Gen Creature" in that ID's properties will successfully give it the same sounds as whatever creature you select. But if your new creature ID uses the same mesh as an existing creature, it will get that creature's sounds even if you give it another "Sound Gen Creature" - if you want different sounds, or want to add sound types (Moan, Scream, Land...) that the first creature to use the mesh didn't have, you'll need to create new sounds for all the sound types you want and associate each of them with the new creature ID in Gameplay->Sound Gen.
Rot's picture
Rot
Lead DeveloperDeveloperQuest Developer
Joined:
2014-03-16 17:45
Last seen:
4 days 7 hours ago