MAPVERÖFFENTLICHUNG
Autor: Fragpoint
Downloads: Beispielmap 31 als PK4-Datei
Da wir mittlerweile genug Grundwissen besitzen, um unsere erste Map fertig stellen zu können, müssen wir uns kurz mit dem Thema beschäftigen, wie wir diese veröffentlichen sollten. Grundsätzlich könnte man den Spielern die einzelnen Dateien zuschicken, was bei den Leuten aber zu Frust führen wird, da sich nicht jeder so gut mit den Konsolen-Befehlen auskennt. Wie bereits zu Beginn der Tutorials erwähnt, wollen wir hauptsächlich eine Multiplayer-Map erstellen. Zwar befinden sich in unserem Level auch zahlreiche Einzelspielerkomponenten, aber das soll nicht weiter stören. Damit man unsere Map-Datei leichter als Multiplayer-Level erkennen kann, benennen wir sie in "mp_beispiel" (mp_ = Multiplayer).
Zunächst einmal müssen wir unsere Map "richtig" berechnen lassen. Denn bisher wurde diese nur "testweise" berechnet und noch dazu nur im Einzelspieler-Modus geladen. Löscht daher unseren Startpunkt für Einzelspielermaps (info_player_start) heraus. Startet anschließend Doom 3 über die Taste F2 aus dem Editor heraus und gebt in der Konsole folgenden Befehl ein:
dmap mp_beispiel
Doom 3 berechnet anschließend Euren Level und erstellt dabei die nachfolgend aufgeführten Dateien, die wir unbedingt benötigen, wenn die Map funktionieren soll. Beachtet, dass die beiden AAS-Dateien von uns nicht benötigt werden. In Ihnen sind die Mapinformationen für die KI - also die Monster - gespeichert, die im Multiplayer aber nicht zum Einsatz kommen.

Damit das Spiel überhaupt weiß, dass es Eure Map gibt und dass es diese im Auswahlmenue anzeigen soll, müssen wir eine Datei anlegen, die diese Informationen enthält. Erstellt dazu im Base-Verzeichnis einen neuen Unterordner mit Namen def. In diesem Ordner selbst wird nun noch eine Datei mit Namen name-eurer-map.def erstellt. Heißt Eure Map also "mp_beispiel.map", muss diese Datei "mp_beispiel.def" heißen. Diese Datei solltet ihr unbedingt nur mit Notepad (Start -> Programme -> Zubehör -> Editor) erstellen. Word & Co. könnten hier evtl. zu Problemen führen.

In diese Datei fügen wir folgenden Inhalt ein:
mapDef mp_beispiel
{
"Name" "BEISPIEL"
"Deathmatch" "1"
"Team DM" "1"
"Last Man" "1"
"Tourney" "1"
}
Gehen wir kurz auf die einzelnen Befehle ein (schwarz = Befehl, rot = Wert):
mapDef mp_beispiel
Hierüber sagt ihr dem Spiel, wie die .MAP-Datei heißt, die geladen werden soll. In unserem Fall ist das die mp_beispiel. Achtet bitte auf die exakte Schreibeweise, da der Level sonst nicht gefunden wird. Die Endung .MAP darf hier nicht mit angegeben werden.
"name" "BEISPIEL"
Dieser Name wird in der Auswahlliste für Eure Map angezeigt. Hier könnt Ihr auch eine ganz andere Bezeichnung eintragen, die nichts mit dem Dateinamen zu tun hat.
"Deathmatch" "1"
Tragt Ihr hier die Zahl 1 ein, weiß das Spiel, dass es sich hier um eine Deathmatch-Map handelt, die auch in der Liste des entsprechenden Spielmodus angezeigt wird. Die Zahl 0 deaktiviert diesen Multiplayer-Modus.
"Team DM" "1"
Tragt Ihr hier die Zahl 1 ein, weiß das Spiel, dass es sich hier um eine Team-Deathmatch-Map handelt, die auch in der Liste des entsprechenden Spielmodus angezeigt wird. Die Zahl 0 deaktiviert diesen Multiplayer-Modus.
"Last Man" "1"
Tragt Ihr hier die Zahl 1 ein, weiß das Spiel, dass es sich hier um eine Last-Man-Standing-Map handelt, die auch in der Liste des entsprechenden Spielmodus angezeigt wird. Die Zahl 0 deaktiviert diesen Multiplayer-Modus.
"Tourney" "1"
Tragt Ihr hier die Zahl 1 ein, weiß das Spiel, dass es sich hier um eine Tourney-Map handelt, die auch in der Liste des entsprechenden Spielmodus angezeigt wird. Die Zahl 0 deaktiviert diesen Multiplayer-Modus.

So, das hätten wir schon mal, auch wenn momentan noch kein Ladebild für unsere Map angezeigt wird.
Als nächstes legen wir im Base-Verzeichnis einen weiteren Ordner an. Dieser nennt sich guis. In diesem erzeugen wir gleich noch ein Unterverzeichnis mit Namen assets. Um es noch umständlicher zu machen, kommt in den Assets-Ordner ein weiteres Unterverzeichnis mit der Bezeichnung splash. Dieser Verzeichnisname ist zwingend notwendig!

In dieses Verzeichnis kommt später nämlich ein Screenshot unserer Map, der beim Auswahlmenue angezeigt wird. Damit auch während des Ladevorganges ein Screenshot zu sehen ist, benötigen wir im Verzeichnis guis noch ein Unterverzeichnis mit Namen loading. Hier kommt später (fast) der gleiche Screenshot hin, wie im Splash-Verzeichnis.
Nun wollen wir kurz den Screenshot erstellen. Ladet dazu Eure Map und sucht Euch eine schöne Stelle aus, die auf dem Bild zu sehen sein soll. Wechselt anschließend in die Konsole und gebt dort folgende Befehle ein:
bind F11 "set ui_showGun 0; set g_showHud 0; screenshot; set g_showHud 1; set ui_showGun 1"
Doch was bewirkt dieser Befehl? Nun dadurch könnt ihr nun durch das Drücken der Taste F11 saubere Screenshots machen, da diese mit den dazugehörigen Befehlen belegt wurde. Der Befehl ui_showGun 0 blendet die Waffe aus, g_showHud 0 dagegen die Munitions- und Lebensanzeige. Nachdem über den Befehl screenshot eine entsprechende Aufnahme unseres Levels gemacht wurde, werden die soeben vorgenommenen Ausblendungen wieder aufgehoben. Soweit zur Erklärung. Schließt nun die Konsole und drückt die Taste F11, damit wir einen Screenshot erhalten.
Dieser Screenshot wird vom Spiel automatisch im Verzeichnis base/screenshots als TGA-Datei (zum Beispiel shot00001.tga) abgespeichert. Damit Doom 3 diese Datei auch korrekt verarbeiten kann, müssen wir diese noch verkleinern. Öffnet sie daher mit einem Bildbearbeitungsprogramm und verkleinert sie auf eine Auflösung von 256x256 Pixeln (Beispiel in Photoshop):

Geht nun auf "Datei -> Speichern" unter und speichert diese Datei im von uns angelegten guis/assets/splash-Verzeichnis unter dem Namen Eurer Map als 24-bit TGA-Datei ab. 32 Bit ist nicht nötig, da wir keinen Alpha-Kanal verwenden müssen. In unserem Fall würde der korrekte Dateiname mp_beispiel.tga lauten.
Anschließend laden wir den Screenshot nochmals und speichern ihn nun in einer Auflösung von 512x512 Pixeln im guis/loading-Verzeichnis ab.

Die Datei im Splash-Verzeichnis ist für die Anzeige im Auswahlmenue zuständig, wogegen die Datei im Loading-Verzeichnis während des Ladevorgangs des Levels gezeigt wird.
Als nächstes erstellen wir noch ein etwas größeres Script, über das Doom 3 weitere Informationen über die Map erhält. Lasst Euch von der Länge nicht abschrecken, denn Ihr könnt den untenstehenden Code einfach kopieren, da wir lediglich zwei Eintragungen ändern müssen (rot markiert):
windowDef Desktop
{
menugui 1
nocursor 1
rect 0,0,640,480
windowDef BackgroundImage
{
rect 0,0,640,480
visible 1
[COLOR=Red][B]background "guis/loading/mp_beispiel"[/B][/COLOR]
matcolor 1,1,1,1
}
windowDef Scanlines2
{
rect 0,0,640,480
matcolor 0.02,0.02,0.02,1
background "gui/test/gui_scanlines4"
matscaley 3.75
noevents 1
visible 1
}
windowDef bgBlackTop
{
rect 0,0,640,200
visible 1
windowDef bgBlackTop1
{
rect 0,-21,170,-64
background "guis/assets/mainmenu/bg1"
matcolor 1 ,1 ,1 ,0.6
visible 1
noevents 1
}
windowDef bgBlackTop2
{
rect 170,-21,32,-64
background "guis/assets/mainmenu/bg2"
matcolor 1 ,1 ,1 ,0.6
visible 1
noevents 1
}
windowDef bgBlackTop3
{
rect 202,-21,458,-64
background "guis/assets/mainmenu/bg3"
matcolor 1 ,1 ,1 ,0.6
visible 1
noevents 1
}
}
windowDef bgBlackBottom
{
rect 0,435,640,75
noevents 1
visible 1
windowDef bgBlackBottomFill
{
rect 0,64,640,75
backcolor 0 ,0 ,0 ,0.6
visible 1
noevents 1
}
windowDef bgBlackBottom1
{
rect 0,0,347,64
background "guis/assets/mainmenu/bg1"
matcolor 1 ,1 ,1 ,0.6
visible 1
noevents 1
}
windowDef bgBlackBottom2
{
rect 347,0,32,64
background "guis/assets/mainmenu/bg2"
matcolor 1 ,1 ,1 ,0.6
visible 1
noevents 1
}
windowDef bgBlackBottom3
{
rect 379,0,261,64
background "guis/assets/mainmenu/bg3"
matcolor 1 ,1 ,1 ,0.6
visible 1
noevents 1
}
windowDef bgBlackBottomFade
{
rect 0,30,642,128
background "guis/assets/mainmenu/bg4"
matcolor 0,0,0,1
visible 1
noevents 1
}
}
windowDef LoadingFillClip
{
rect 2,18,( "gui::map_loading" * 175 ),16
visible 1
windowDef LoadingFill
{
rect 0,0,256,16
visible 1
background "guis/assets/splash/load"
matcolor 1,1,1,0.8
}
}
windowDef LoadingLine
{
rect 2,18,256,16
visible 1
background "guis/assets/splash/loadborder"
matcolor 1,1,1,0
}
windowDef TextLoading
{
rect 16,-6,123,30
visible 1
text ""
font "fonts/micro"
textscale 0.4
forecolor 0.2,0.6,0.7,1
}
windowDef FlareBox
{
rect 0,0,48,21
background "gui/mainmenu/textflare"
matcolor 0.4 ,0.6, 0.6, 0
visible 1
}
windowDef TextDescription
{
rect 17,394,521,81
visible 1
noevents 1
forecolor 1,1,1,0
[COLOR=Red][B]text "Hier kann eine kurze Beschreibung der Map stehen."[/B][/COLOR]
textscale 0.25
font "fonts/an"
}
windowDef TextTitle
{
rect 16,447,610,30
visible 1
[COLOR=Red][B]text "mp_beispiel"[/B][/COLOR]
font "fonts/micro"
textscale 0.4
forecolor 1,1,1,0
}
windowDef Author
{
rect 396,460,244,20
visible 1
forecolor 1,1,1,0.97647065
[COLOR=Red][B]text "by Fragpoint"[/B] [/COLOR]
textscale 0.25
}
windowDef BlackFade
{
rect 0,0,640,480
backcolor 0, 0, 0, 1
visible 1
}
windowDef Anim
{
rect 0,0,0,0
visible 1
onTime 0
{
transition "BlackFade::backcolor" "0 0 0 1" "0 0 0 0" "400" ;
set "TextLoading::text" "L" ;
transition "FlareBox::matcolor" "0.4 0.6 0.6 0" "0.4 0.6 0.6 0.5" "200" ;
transition "bgBlackTop1::rect" "0 -21 150 -64" "0 -21 170 -64" "400" "0.2" "0.8" ;
transition "bgBlackTop2::rect" "150 -21 32 -64" "170 -21 32 -64" "400" "0.2" "0.8" ;
transition "bgBlackTop3::rect" "182 -21 498 -64" "202 -21 458 -64" "400" "0.2" "0.8" ;
transition "bgBlackBottom1::rect" "0 0 377 64" "0 0 347 64" "400" "0.2" "0.8" ;
transition "bgBlackBottom2::rect" "377 0 32 64" "347 0 32 64" "400" "0.2" "0.8" ;
transition "bgBlackBottom3::rect" "409 0 261 64" "379 0 261 64" "400" "0.2" "0.8" ;
}
onTime 50
{
set "TextLoading::text" "#str_03469" ;
set "FlareBox::rect" "17 0 54 21" ;
}
onTime 100
{
set "TextLoading::text" "#str_03470" ;
set "FlareBox::rect" "37 0 54 21" ;
}
onTime 150
{
set "TextLoading::text" "#str_03343" ;
set "FlareBox::rect" "57 0 54 21" ;
}
onTime 200
{
set "TextLoading::text" "#str_03471" ;
set "FlareBox::rect" "67 0 54 21" ;
transition "TextTitle::forecolor" "0 0 0 0" "1 1 1 0.9" "400" "0.2" ".8" ;
}
onTime 250
{
set "TextLoading::text" "#str_03472" ;
set "FlareBox::rect" "81 0 54 21" ;
}
onTime 300
{
set "TextLoading::text" "#str_00408" ;
set "FlareBox::rect" "100 0 54 21" ;
transition "FlareBox::matcolor" "0.4 0.6 0.6 0.5" "0 0 0 0" "200" ;
transition "LoadingLine::matcolor" "1 1 1 0" "1 1 1 0.8" "600" ;
}
}
}Verwendet für dieses Script bitte auch wieder Notepad. Und speichert die Datei im Verzeichnis base/guis/map/ als mp_beispiel.gui ab. Das Verzeichnis "map" müsst ihr dort noch neu anlegen.

So, nun gehen wir noch mal kurz auf die beiden Befehle ein, die wir im Script verändert haben:
background "gui/loading/mp_beispiel"
Hierüber gebt ihr dem Spiel an, wo Eure TGA-Datei - also der bearbeitete Screenshot - liegt und wie die dessen Name lautet. In unserem Fall lautet die TGA-Datei mp_beispiel.tga, so dass Ihr hier als Dateiname mp_beispiel (ohne .tga) angebt. Diese Grafik wird in der Übersicht und während des Ladevorganges angezeigt.
text "mp_beispiel" (bei "windowDef TextTitle")
Hier könnt Ihr noch mal den Namen Eurer Map eintragen. Dieser Text wird links unten während des Ladevorgangs angezeigt.
text "mp_beispiel" (bei "windowDef Author ")
Hier könnt Ihr Euren Namen oder Nick eintragen. Dieser Abschnitt ist jedoch nicht notwendig und kann auch weggelassen werden.
Nun sollte Eure Map vollständig für den Multiplayer-Modus tauglich sein. Allerdings haben wir einen Wust von Einzeldateien, die wir nun - so wie ID auch - in eine PK4-Datei stecken wollen. Wir gehen daher in das Base-Verzeichnis von Doom 3 und kopieren uns alle von uns benötigen Verzeichnis/Dateien auf unseren Desktop. Welche das sind, könnt Ihr auf dem nächsten Bild sehen. Solltet Ihr eigene Texturen, Shader, Models oder ähnliches in Eure Map eingefügt haben, werden selbstverständlich auch diese zusätzlichen Dateien/Verzeichnisse benötigt.
Natürlich befinden sich in den verschiedenen Unterverzeichnissen evtl. auch noch andere Dateien die wir nicht benötigen. Diese können wir nun bequem auf dem Desktop aus den einzelnen Verzeichnissen herauslöschen, so dass wirklich nur die Datei vorhanden sind, die wir für unsere Map erstellt haben und benötigen. Dazu gehören folgende:

Nach dieser Säuberungsaktion zieht Ihr Euch bitte das Programm WinRAR und installiert es. Dabei handelt es sich um ein Packprogramm (ähnlich WinZIP), mit dem wir eine PK4-Datei erstellen können. Markiert nun die auf unseren Desktop kopierten Verzeichnisse der Map und macht einen Rechtsklick. Wählt dort "Zu einem Archiv hinzufügen" aus.

Anschließend startet das Programm WinRAR und Ihr könnt oben einen Dateinamen eintragen. Dieser sollte - auch zum leichteren Erkennen der Map - den gleichen Namen wie die .MAP-Datei haben (also mp_beispiel.zip). Wählt bei Archivformat ZIP (wichtig!) aus und lasst die Kompressionsmethode auf normal stehen.

WinRAR erstellt nun eine ZIP-Datei, die auf Eurem Destkop abgelegt wird. Da diese jedoch noch die Endung .ZIP hat, benennen wir diese in den Namen mp_beispiel.pk4 um. Nun könnt Ihr die PK4-Datei in das Base-Verzeichnis von Doom 3 kopieren.

Der Level sollte nun bequem im Multiplayer-Menue auswählbar sein und mit einem Screenshot der Map angezeigt werden.

Damit Ihr auf Nummer sicher gehen könnt, dass auch wirklich alle Dateien enthalten sind, solltet Ihr alle Unterverzeichnis des Base-Ordners löschen, da Doom 3 sonst evtl. auf dort vorhandene Dateien zurückgreift. Sichert diese Verzeichnisse vorher aber unbedingt, da sich darin vermutlich noch andere Dateien befinden, die ihr erstellt habt und evtl. noch braucht. Lässt sich die Map auch dann noch erfolgreich starten, könnt Ihr Euren Level an Freunde und natürlich Doom3Maps zur Veröffentlichung schicken.
Wie man den Ladebalken anzeigen lassen kann, habe ich leider noch nicht herausgefunden. Das wird aber nachgetragen, sobald ich es in Erfahrung gebracht habe.
EDIT: Wegen des Ladebalkens möchte ich Euch kurz auf diesen Thread hinweisen, den ich selbst aber noch nicht testen konnte: http://doom3.planet-multiplayer.de/forum/index.php?showtopic=7625&st=0&#entry101655