Introduction to Database content for SD3 ================================================ This guide is intended to help people * to understand which information of the database is used with SD3 * who want to contribute their patches as complete as possible World-Database -------------- ScriptNames of NPCs: ~~~~~~~~~~~~~~~~~~~~ If we need to assign a ScriptName to a NPC (GameObject-Scripts are similar) the statement is: ----------- UPDATE creature_template SET ScriptName='npc_and_his_name' WHERE entry=XYZ; ----------- or ----------- UPDATE creature_template SET ScriptName='npc_something_identifying' WHERE entry IN (XYZ, ZYX); ----------- 'Remark:' For creatures with many difficulty entries, only the one for normal difficulty needs the ScriptName. ScriptNames for scripted_areatrigger: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For Areatriggers (or scripted_event) we usally cannot use UPDATE, hence we need to DELETE possible old entries first: ----------- DELETE FROM scripted_areatrigger WHERE entry=XYZ; INSERT INTO scripted_areatrigger VALUES (XYZ, at_some_place); ----------- ScriptDev3-Database ------------------- entry-Format for texts and for gossip-texts: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The to be used entry is a combination of the number depending on the map and a counter. * This is for texts: -1 * For gossip-texts: -3 + where is the ID of the map for instances, or 000 for all other maps. Example: Text on WorldMap ^^^^^^^^^^^^^^^^^^^^^^^^^ Let's say we want to add a new text to a NPC on Kalimdor (no instance), then we need to look which is the last text entry of the format -1000XYZ (this one can be found in scriptdev2_script_full.sql). On the moment where I write this guide this is: ---------- (-1000589,'Kroshius live? Kroshius crush!',0,1,0,0,'SAY_KROSHIUS_REVIVE'); ---------- so our first text entry will be -1000590. Example: Gossip-Item in Instance ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Let's say we want to add a new gossip item to a NPC in Culling of Stratholme, this map has the ID 595. At this moment there is already some gossip_text, and the last one is ------------ (-3595005,'So how does the Infinite Dragonflight plan to interfere?','chromie GOSSIP_ITEM_INN_3'); ------------ so our first gossip-text entry will be -3595006. Format for texts ~~~~~~~~~~~~~~~~ The format is `(entry,content_default,sound,type,language,emote,comment)` with these meanings: entry:: should now be clear ;) content_default:: is the text (in english) enclosed with '. + There are a few placeholders that can be used: + [horizontal] %s;; self, is the name of the Unit saying the text + The $-placeholders work only if you use DoScriptText with a 'target'. $N, $n;; the [N, n]ame of the target $C, $c;; the [C, c]lass of the target $R, $r;; the [R, r]ace of the target $GA:B; ;; if the target is male then A else B is displayed, Example: + -------------------------------- 'Time to teach you a lesson in manners, little $Gboy:girl;!' -------------------------------- + Remember to escape [red]#\'# with [red]#\'#, Example: + -------------------------------- 'That \'s my favourite chocolate bar'. -------------------------------- sound:: is the sound ID that shall be played on saying, they are stored in SoundEntries.dbc + [quote, Ntsc] _____________________________ Sound Ids are stored within the SoundEntries.dbc file. Within that dbc file you will find a reference to the actual file that is played. We cannot help you with reading these files so please do not ask how. _____________________________ + type:: is the type of the text, there are these possibilities: + ------------- 0 CHAT_TYPE_SAY - 'white' text 1 CHAT_TYPE_YELL - 'red' text 2 CHAT_TYPE_TEXT_EMOTE - 'yellow' emote-text (no ... ) 3 CHAT_TYPE_BOSS_EMOTE - 'big yellow' emote-text displayed in the center of the screen 4 CHAT_TYPE_WHISPER - whisper, needs a target 5 CHAT_TYPE_BOSS_WHISPER - whipser, needs a target 6 CHAT_TYPE_ZONE_YELL - 'red' text, displayed to everyone in the zone -------------- + language:: is the language of the text (like LANG_GNOMISH), see +enum Language+ in `game/SharedDefines.h` -- usually zero (LANG_UNIVERSAL) emote:: is the emote the npc shall perform on saying the text, can be found in +enum Emote+ in `game/SharedDefines.h` comment:: is a comment to this text, usually the used enum of the script, like SAY_KROSHIUS_REVIVE, if this enum is not identifying the npc, then the name of the npc is put before. Format for gossip-texts ~~~~~~~~~~~~~~~~~~~~~~~ The format for gossip texts is `(entry,content_default,comment)` + The fields have the same meaning as for script-texts. Format for waypoints ~~~~~~~~~~~~~~~~~~~~ The format for waypoints is `(entry,pointid,location_x,location_y,location_z,waittime,point_comment)` with these meanings: entry:: is the entry of the scripted NPC pointid:: is the ID of the point, usally starting with 01, and increasing location_*:: describes the position of the waypoint waittime:: is the time, the mob will wait after reaching _this_ waypoint, before he continues to go to the next point_comment:: is used to note if something special is happening at this point, like quest credit Creating the Patch ------------------ There are different ways to get to a patch, I prefer this workflow: For the scriptdev3 database (patch files): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Example for normal world text: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Assume the last entry in your map (here world-map) was: -------------- (-1000589,'Kroshius live? Kroshius crush!',0,1,0,0,'SAY_KROSHIUS_REVIVE'); -------------- Now create a new file: Updates/r0000_scriptdev2.sql Add there: ----------- DELETE FROM script_texts WHERE entry=-1000590; INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES (-1000590,'My fancy aggro-text',0,1,0,0,'boss_hogger SAY_AGGRO'); ----------- or ----------- DELETE FROM script_texts WHERE entry BETWEEN -1000592 AND -1000590; INSERT INTO script_texts (entry,content_default,sound,type,language,emote,comment) VALUES (-1000590,'My fancy aggro-text1',0,1,0,0,'boss_hogger SAY_AGGRO1'), (-1000591,'My fancy aggro-text2',0,1,0,0,'boss_hogger SAY_AGGRO2'), (-1000592,'My fancy aggro-text3',0,1,0,0,'boss_hogger SAY_AGGRO3'); ----------- Hint: the INSERT statements can also be copied from the scriptdev2_script_full.sql Example for waypoints: ^^^^^^^^^^^^^^^^^^^^^^ The required SQL code to add a waypoint is: ---------- DELETE FROM script_waypoint WHERE entry=; INSERT INTO script_waypoint VALUES (, 1, 4013.51,6390.33, 29.970, 0, ' - start escort'), (, 2, 4060.51,6400.33, 20.970, 0, ' - finish escort'); ---------- When the Update file is done, append an additional empty line + And test these lines for correctness! For the scriptdev2 database (full files): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If everything works alright, and you finally intend to prepare the full-patch, copy the SQL-Code that is needed to the proper place in scriptdev2_script_full.sql, (for a new npc add an empty line), and change the semicolon to a comma: Example for world text: ^^^^^^^^^^^^^^^^^^^^^^ ----------- (-1000589,'Kroshius live? Kroshius crush!',0,1,0,0,'SAY_KROSHIUS_REVIVE'), (-1000590,'My fancy aggro-text',0,1,0,0,'boss_hogger SAY_AGGRO'); ----------- The waypoints are added behind the last waypoint, after an empty line. For the world database: ~~~~~~~~~~~~~~~~~~~~~~~ Create a new file: Updates/r0000_mangos.sql + In this file put the needed statements for your ScriptNames, append an empty line, convert lineendings to Unix, and then test it for correctness. If everything is alright, open mangos_scriptname_full.sql and go to the right place (this is usally sorted alphabetically by zone). + Insert the needed statement where it fits (usally again ordered alphabetically) After this is done, Create a patch including the (untracked) files in Update/ + then you have all information in the created patch, and anyone who wants to test your patch just needs to apply the created files from Updates/