Hi,
in Left 4 Dead gibt es sogenannte Radialmenüs oder auch Mausmenüs. Ein Beispiel für solch ein
Menü siehst Du im Bild rechts. Natürlich kann man auch eigene Menüs erstellen, was gerade zum Training von Left 4 Dead sehr nett ist oder wenn man ein paar lokalisierte Sprachausgaben nachschieben will.
Wie man es ja von Valve schon fast gewohnt ist, kann man viel scripten oder am Spiel ändern, wenn man einfach mal in den Textdateien herumschnuppert. Die meisten Textdateien sind auch recht offensichtlich und selbsterklärend aufgebaut, weswegen es meist kein Problem ist, neues zu altem hinzuzufügen. Doch nun zur Erklärung, wie man eigene Radialmenüs erstellt.
Als erstes musst Du in den Ordner $Steam\steamapps\common\left 4 dead\left4dead\scripts navigieren. $Steam ist dabei der Installationsort von Steam, in meinem Fall wäre es E:\Steam. Dort angekommen findet sich eine Textdatei namens RadialMenu.txt. Nach dem Öffnen dieser Datei finden sich die zwei gewohnten Standardmenüs.
Grundlegender Aufbau eines Menüs
Der grundlegende Aufbau ist recht simpel. Betrachte folgendes, kleines Beispiel:
"Menüname,<Team>,<Dead>"
{
"<Richtung>"
{
"command" "<Konsolenkommando>"
"text" "Angezeigter Text"
}
}
Beachte, dass alles, was in spitzen Klammern steht, einen vordefinierten Wert bekommen muss. Alles andere (bis auf “command” und “text”) ist frei wählbar. Die spitzen Klammern tauchen im fertigen Script nicht auf, sie dienen hier nur zur Verdeutlichung. Doch nun zur Erklärung:
- Menüname: Hier kannst Du einen freiwählbaren Namen für Dein Menü eintippen. Ich empfehle jedoch keine Sonderzeichen, Umlaute und Leerzeichen zu verwenden, ich weiß nicht, ob diese korrekt unterstützt werden (ich hab es bisher noch nicht getestet). Am besten ist meist ein kurzes Wort, was das Menü beschreibt.
- <Team>: Hier kannst Du bestimmen, für welches Team das Menü gültig ist. Als Werte werden Survivor und Infected akzeptiert. Das heißt, wenn Du ein Menü willst, dass es nur für Survivor gültig ist, trägst Du hier auch Survivor ein.
- <Status>: Der Status nimmt entgegen, wann das Menü sichtbar sein soll. Als Werte werden Alive und Dead akzeptiert. Das heißt, dass je nach Eintrag das Menü nur sichtbar ist, wenn man lebt (= alive) oder tot (= dead) ist.
- <Richtung>: Hier wird bestimmt, in welcher Richtung der Menüeintrag angezeigt werden soll. Es handelt sich dabei um die Himmelsrichtungen. Folgende Werte sind möglich:
- Center
- North
- NorthEast
- East
- SouthEast
- South
- SouthWest
- West
- NorthWest
- <Konsolenkommando>: Hier kommt das eigentliche Kommando hin, was passieren soll, wenn ein Spieler diesen Menüpunkt auswählt. Dabei werden jegliche Werte akzeptiert, die die Source-Engine bietet und man in die InGame-Konsole eintippen kann.
- Angezeigter Text: Hier kann jeglicher Text stehen, den der Spieler sehen soll, wenn er das Menü öffnet. Auch hier gilt, weniger ist mehr. Bei langem Text, gerade die, die auf der linken Menüseite stehen, überlappen sich die Menüeinträge. Andererseits, wenn Du unbedingt einen halben Roman zu Erklärung brauchst, nutze dafür die Menüpunkte, die auf der rechten Seite liegen und somit mehr Platz bieten. Wie gesagt: Weniger ist mehr.
Ein Warnmenü
Soviel zur Erklärung, dann können wir ja nun richtig loslegen und ein kleines Menü erstellen! Ein beliebtes Menü ist zum Warnen vor verschiedenen Zombies, wie Tank, Boomer etc. (Anmerkung: Ja! Es wird auch von vielen einfach nur zum Nerven benutzt…)
Führen wir uns vor Augen, vor was wir warnen können. Spontan fallen mir da ein:
- Tank
- Boomer
- Hunter
- Smoker
- Witch
Zusätzlich wollen wir noch allgemein sagen, dass man aufpassen muss oder das etwas hinter uns ist.
Das macht zusammen sieben Menüpunkte, wunderbar, denn wir können maximal neun verschiedene Kommandos pro Menü einfügen. Sinnigerweise nennen wir dieses Menü, dass ausschließlich zum Warnen dient, auch “Warnmenu”. Gebraucht wird es nur, wenn wir Survivor sind und leben. Das fertige Menü siehst Du auf der rechten Seite.
Das Script für das Menü ist das hier:
"Warnmenu,Survivor,Alive"
{
"Center"
{
"command" ""
"text" "Warnmenu"
}
"North"
{
"command" "vocalize PlayerWarnTank"
"text" "Warn Tank"
}
"NorthEast"
{
"command" "vocalize PlayerWarnHunter"
"text" "Warn Hunter"
}
"East"
{
"command" "vocalize PlayerWarnBoomer"
"text" "Warn Boomer"
}
"SouthEast"
{
"command" "vocalize PlayerWarnSmoker"
"text" "Warn Smoker"
}
"South"
{
"command" "vocalize PlayerWarnWitch"
"text" "Warn Witch"
}
"SouthWest"
{
"command" "vocalize PlayerWarnCarefull"
"text" "Be Carefull"
}
"West"
{
"command" "vocalize PlayerWatchOutBehind"
"text" "Behind us!"
}
"NorthWest"
{
"command" ""
"text" ""
}
}
Anmerkung: Wie man die Menüs auf eine Taste bindet, steht ganz unten!
Wie man sieht, heißt das Menü “Warnmenu” ist gültig für lebende Survivors (alles andere würde ja auch kein Sinn machen). Auf der Position “Center” ist nur der Name vom Menü eingetragen, ohne Funktion. Muss man nicht machen, da aber der Platz frei war, hab ich es mal reingemacht. Der weitaus interessantere Teil steckt aber in den Positionen von North bis West. Die Source Engine bietet mit dem Befehl “vocalize <SoundDatei>” die Möglichkeit, personalisierte Sounddateien wiederzugeben. Die Liste für die Sounds ist lange, man findet diese im Ordner $Steam\Steam\steamapps\common\left 4 dead\left4dead\sound\player\survivor\voice. Dort sind vier Unterordner drin:
- Biker – Stimme von Francis
- Manager – Stimme von Louis
- NamVet – Stimme von Bill
- TeenGirl – Stimme von Zoey
Wenn man einen Ordner öffnet, findet man viele Dateien. Diese Dateien kann man für vocalize nutzen. Man sucht sich einfach eine Datei raus, z.B. AreaClear01.wav. Damit man diese Datei nutzen kann, schreibt man nun “vocalize PlayerAreaClear”. Wichtig ist, dass man immer ein “Player” voranstellt und beim Soundnamen die Zahlen und die Dateiendung weglässt. Den Sound AreaClearxx.wav gibt es zehn mal. Per Zufall wird einer davon ausgewählt und abgespielt. Hier ist eine (vollständige) alphabetisch geordnete Liste der Sounds:
AlertGiveItem AnswerReady AreaClear ArriveBoat ArriveBoatInitial ArriveChopper ArriveChopperInitial ArriveTruck ArriveTruckInitial AskReady BackUp BackUpQuit BoomerReaction CallForRescue Choke CloseTheDoor ContextModifierCalm ContextModifierLoud Cough CoverMe DeathScream DoubleDeathResponse DowninFront Dying EmpathicGo EmpathicRun ExertionCritical ExertionMajor ExertionMinor Fall FallShort FinaleAhead FollowMe FriendlyFire Generic GenericDirections GettingRevived GoingToDie GoingToDieAskForHeal GoingToDieLight grabbedbysmoker Grenade GriefBiker GriefFemaleGeneric GriefManager GriefTeengirl GriefVet HealOther HealOtherCombat HeardBoomer HeardHunter HeardWitch Help HordeAttack HunterBillPounced HunterFrancisPounced HunterLouisPounced HunterZoeyPounced Hurrah HurryUp HurtCritical HurtMajor HurtMinor ImWithYou IncapacitatedInitial IncapacitatedInjury Incoming InsideSafeRoom KillConfirmation KillThatLight Laughter LeadOn LedgeHangEnd LedgeHangMiddle LedgeHandStart LedgeSave Look LookHere LookOut LostCall MiniFinialeGetReady MoveOn NameBill NameFrancis NameLouis NameZoey NegativeNoise NervousHumming NervousWhistle NiceJob NiceShot No Notoneofus PainReliefSigh PathClear PlayerSuggestHealth PlayerSuggestHealthSpecific PositiveNoise RadioUsedBoat RadioUsedChoper RadioUsedGeneric RadioUsedTruck ReactionApprehensive ReactionBoomervomit ReactionDisgusted ReactionNegative ReactionNegativeSpecial ReactionPositive Reloading ReviveCriticalFriend ReviveFriend RiviveFriendLoud SafeSpotAhead SafespotAheadReaction ScenarioJoin ScenarioJoinLast ScreamWhilePounced SeeCabin Shaved Sorry SpotAmmo SportFirstAid SportGrenaded SportPills SportWeapons StayTogether StayTogetherInside SuggestHealth SuggestHealthBill SuggestHealthFrancis SuggestHealthLouis SuggestHealthZoey Swear TakeAssaultRifle TakeAutoShotgun TakeFirstAid TakeMolotov TakePills TakePipeBomb TakePistol TakeShotgun TakeSniper TakeSubMachineGun TankPound Taunt TeamKillAccident Thanks ToTheRescue ToTheRescueThanks TransitionClose Uncertain ViolenceAwe WaitHere WarnBoomer WarnCareful WarnHunter WarnSmoker WarnTank WarnWitch WatchOutBehind WitchGettingAngry WorldAirport WorldAirportIntro WorldFarmHouse WorldHospital WorldHospitalGeneric WorldHospitalIntro WorldSmallTown WorldSmallTownIntro Yes YouAreWelcome
Zombiespawnmenü
Doch wir können nicht nur Quatschen mit unserem Menü, wir können sehr viel mehr tun. Gerade zum Trainieren für Clans ist es ganz nett, wenn man auf Verlangen einen Zombie spawnen kann oder eine Horde kommen lässt. Dafür könnte man folgendes Menü verwenden:
"Spawnmenu"
{
"NorthEast"
{
"command" "z_common_limit 80; director_force_panic_event"
"text" "Panic Event"
}
"Center"
{
"command" "z_common_limit 50; z_spawn mob"
"text" "Spawn mob"
}
"North"
{
"command" "z_common_limit 200; z_spawn mob"
"text" "Spawn megamob"
}
"East"
{
"command" "z_common_limit 100; director_panic_forever 1; director_force_panic_event"
"text" "Inifinite zombies (!)"
}
"SouthEast"
{
"command" "z_spawn tank"
"text" "Spawn Tank"
}
"South"
{
"command" "z_spawn witch"
"text" "Spawn witch"
}
"SouthWest"
{
"command" "z_spawn hunter"
"text" "Spawn hunter"
}
"West"
{
"command" "z_spawn smoker"
"text" "Spawn smoker"
}
"NorthWest"
{
"command" "z_spawn boomer"
"text" "Spawn boomer"
}
}
Was kann das Menü alles?
- Center: Spawnt eine Horde mit 50 Zombies
- North: Spawnt eine riesige Horde mit 200 Zombies
- NorthEast: Spawnt 80 Zombies und startete ein PanicEvent
- East: Spawnt 100 Zombies, startet ein nie aufhörendes PanicEvent (will heißen, es kommen unendlich lange Zombies)
- SouthEast: Spawnt einen Tank
- South: Spawnt eine Witch
- SouthWest: Spawnt einen Hunter
- West: Spawnt einen Smoker
- NorthWest: Spawnt einen Boomer
Beachte noch die Definition vom Menü. Hier steht nur der Name “Spawnmenü”, weitere Angaben wie “Survivor,Alive” sind weggelassen. Das heißt, dass dieses Menü für Survivor und für Infected gilt, egal ob lebend oder tot.
So ka
nnst Du Deiner Fantasie freien Lauf lassen. Für eine kleine Anregung stelle ich meine Radialmenüs bereit. Einfach die vorhandene RadialMenu.txt überschreiben, dann habt ihr die Standardmenüs, die zwei im Beitrag vorgestellten Menüs und noch zwei weitere Menüs (WaffenspawnMenu und ein allgemeines).
Menüs binden
Moment mal, jetzt haben wir zwar viele lustige Menüs, aber wie zeigt man die im Spiel nun an? Dafür ist noch ein letzter Schritt notwendig. Wechsle in den Ordner $Steam\steamapps\common\left 4 dead\left4dead\cfg. Dort findet sich die Datei “config.cfg“. Öffne diese z.B. mtit dem Notepad. Du siehst nun einen Haufen von Befehlen. Die, die uns interessieren, fangen mit “bind” an. Per Standard sind das ca. die ersten 45 Zeilen. “bind” macht nichts anderes, als eine Taste einer bestimmten Funktion zuzuweisen. Aufgebaut ist der Befehl wie folgt:
bind "Taste" "Befehl"
In unserem Fall binden wir nun die beiden Menüs Warnmenu und Spawnmenu auf die Tasten c (Warnmenu) und v (Spawnmenu)
Das zwei Zeilen hierfür lauten:
bind "c" "+mouse_menu Warnmenu" bind "v" "+mouse_menu Spawnmenu"
Das war es schon! Nun kannst Du das Spiel starten und die neuen Menüs bestaunen. Dennoch verzichte ich nicht auf eine kleine Erklärung der zwei Zeilen.
Anmerkung: Du solltest die config.cfg hinterher als schreibgeschützt markieren (Rechtsklick auf die Datei -> Eigenschaften -> Haken bei “Schreibgeschützt” machen und OK klicken. Es könnte sonst sein, dass beim Aufruf der Optionen im Spiel die config.cfg wieder überschrieben wird und Deine selbst gemachten Binds weg sind.
Als “Befehl” wurde hier “+mouse_menu Warnmenu” eingetragen. “+mouse_menu” bedeutet, dass wir ein Mausmenü aufrufen wollen. Dahinter geben wir den Namen vom Menü an, in unserem Falle “Warnmenu” bzw. “Spawnmenu”.
Ich hoffe, dass Du nun einen kleinen Einblick in die Welt der Radialmenüs von Left 4 Dead bekommen hast. Die Dinger haben noch viel Potential, dass man ausschöpfen kann. Viel Spaß damit.
Pingback: Radialmenü (Mausmenü) für L4D | Manus Blog
hallo manu.
ich hab es aber schonmal in nem game gehört. mache ich was falsch? der todesschrei wird ja auch nicht DeathScream eingetragen, sondern nur “vocalize PlayerDeath”. kannst du mir bitte helfen???
also irgendwie funzt das bei mir nicht. ich will unbedingt die sprüche für z.b. bill(namvet) ins radialmenü einbinden. ich hab einfach das orginal mit den sprüchen verändert. als beispiel will ich das nervöse singen haben. also schreib ich “vocalize PlayerNervousHumming”, als text einfach nur “singen”. alles gespeichert und schreibgeschützt, aber es tut sich nix. angezeigt bekomm ich es im spiel, aber keine sounds…
mfg und danke, timo.
Hallo Timo,
Du solltest mir noch den entsprechenden Ausschnitt aus Deiner RadialMenu.txt zeigen oder sende mir einfach die komplette Datei an meine E-Mail-Adresse. Ansonsten kann ich Dir schwer sagen, was evtl. falsch gemacht ist.
danke für die schnell antwort. ich hab dir das radialmenu.txt ma kopiert. da siehst du ja bestimmt was falsch ist. hab ja noch mehr sachen geändert. schaus dir einfach ma an. wenn net kann ich dir ja auch ma mein steam namen geben, da gehts schneller^^
danke im voraus, timo
“RadialMenu”
{
//————————————————————–
“Sounds,Survivor,Alive”
{
“Center”
{
“command” “vocalize PlayerNervousHumming”
“text” “Singen”
}
“North”
{
“command” “vocalize PlayerReviveCriticalFriend”
“text” “Hilfe”
}
“NorthEast”
{
“command” “vocalize PlayerTakeAssaultRifle”
“text” “Waffen”
}
“East”
{
“command” “vocalize PlayerWitchGettingAngry”
“text” “Witch”
}
“SouthEast”
{
“command” “vocalize PlayerNiceJob”
“text” “#L4D_rosetta_nicejob”
}
“South”
{
“command” “vocalize PlayerGeneric”
“text” “Spruch”
}
“SouthWest”
{
“command” “vocalize PlayerAreaClear”
“text” “#L4D_rosetta_clear”
}
“West”
{
“command” “vocalize PlayerCoverMe”
“text” “#L4D_rosetta_coverme”
}
“NorthWest”
{
“command” “vocalize PlayerImWithYou”
“text” “#L4D_rosetta_withyou”
}
}
//————————————————————–
“QA,Survivor,Alive”
{
“Center”
{
“command” “vocalize PlayerAskReady”
“text” “#L4D_rosetta_ready”
}
“North”
{
“command” “vocalize PlayerLaugh”
“text” “#L4D_rosetta_laugh”
}
“NorthEast”
{
“command” “vocalize PlayerWarnCareful”
“text” “#L4D_rosetta_becareful”
}
“East”
{
“command” “vocalize PlayerNegative”
“text” “#L4D_rosetta_negative”
}
“SouthEast”
{
“command” “vocalize PlayerNo”
“text” “#L4D_rosetta_no”
}
“South”
{
“command” “vocalize PlayerDeath”
“text” “#L4D_rosetta_sorry”
}
“SouthWest”
{
“command” “vocalize PlayerNervousHumming”
“text” “#L4D_rosetta_yes”
}
“West”
{
“command” “vocalize PlayerWarnWitch”
“text” “Witch”
}
“NorthWest”
{
“command” “vocalize PlayerWarnTank”
“text” “Tank”
}
}
//————————————————————–
“Orders,Zombie,Alive”
{
“Center”
{
“command” “vocalize PlayerZombieTaunt”
“label” “#L4D_rosetta_grrrr”
}
}
//————————————————————–
“QA,Zombie,Alive”
{
“Center”
{
“command” “vocalize PlayerZombieTaunt”
“text” “#L4D_rosetta_grrrr”
}
}
//————————————————————–
“Alerts,Zombie,Alive”
{
“Center”
{
“command” “vocalize PlayerZombieTaunt”
“text” “#L4D_rosetta_grrrr”
}
}
}
schreib doch ma bitte zurück, das is mir wichtig!
Da war doch noch was. Add mich mal in Steam: tsd_spider
soweit schaut Dein RadialMenu richtig aus.
Hallo Manu,
schau Dir bitte das Menü an und teil mir mit was da falsch ist. thx.
“RadialMenu”
{
//————————————————————–
“LulMenu,Survivor,Alive”//all characters
{
“Center”
{
“command” “vocalize EmphaticArriveRun”
“text” “Lauft!”//RRRUUUUNNNN!!!!! (funktioniert einwandfrei)
}
“North”
{
“command” “vocalize PlayerStayTogether”
“text” “Bleibt zusammen!”//Zusammen bleiben!!!!! (funktioniert einwandfrei)
}
“NorthEast”
{
“command” “vocalize PlayerFollowMe” (funktioniert einwandfrei)
“text” “Ich gehe nach Vorn!”// Fuehrung
}
“East”
{
“command” “vocalize PlayerWatchOutBehind” (funktioniert einwandfrei)
“text” “Hinter uns!”
}
“SouthEast”
{
“command” “vocalize PlayerIncoming” (funktioniert einwandfrei)
“text” “Sie kommen!”//Here they come!
}
“South”
{
“command” “vocalize DownArriveinFront” (funktioniert nicht, auch “text” “Aus der Schusslinie!” nicht mit PLAYER davor)
}
“SouthWest”
{
“command” “vocalize PlayerFriendlyFire” (funktioniert einwandfrei)
“text” “Pass doch auf!”// Pass doch auf!
}
“West”
{
“command” “vocalize PlayerBackup” (funktioniert NUR in
“text” “Zuruck Leute!” // Backup bestimmten Situationen)
}
“NorthWest”
{
“command” “vocalize PlayerKillThatLight” (funktioniert einwandfrei)
“text” “Taschenlampe aus!”//Lights off!
}
}
//————————————————————–
“Lulmenu2,Survivor,Alive”//All characters besides the elevator.
{
“Center”
{
“command” “vocalize elevator_conversation” (funktioniert teilweise)
“text” “Lustiges”//Only for Zoey and Francis, still funny.!
}
“North”
{
“command” “vocalize ResponseSoftDispleasureSwear” (funktioniert einwandfrei)
“text” “Fluchen”//Cuss word
}
“NorthEast”
{
“command” “vocalize PlayerLedgeHangEnd” (funktioniert einwandfrei)
“text” “Hilfe, ich falle!”//I can’t hold on much longer!
}
“East”
{
“command” “vocalize PlayerToTheRescue” (funktioniert garnicht)
“text” “Ich komm ja”//Cuss word
}
“SouthEast”
{
“command” “vocalize PlayerIncapacitated” (funktioniert einwandfrei)
“text” “Helft mir auf!”//Help im down!!
}
“South”
{
“command” “vocalize PlayerNiceShot” (funktioniert teilweise)
“text” “Guter Schuss!”// Nice Shot!
}
“SouthWest”
{
“command” “vocalize PlayerDeath” (funktioniert einwandfrei)
“text” “Ich verrecke,Hilfe!”//Dying Sounds
}
“West”
{
“command” “vocalize PlayerGoingToDieAskForHeal” (funktioniert garnicht)
“text” “Medizin!”//Jemand Medizin ueber?
}
“NorthWest”
{
“command” “vocalize PlayerReviveFriend” (funktioniert einwandfrei)
“text” “Ich helf Dir auf”//I got you buddy.
}
}
//————————————————————–
“LulMenu3,Survivor,Alive”//all characters
{
“Center”
{
“command” “vocalize PlayerWarnTank” (funktioniert einwandfrei)
“text” “Tank!”//Player warns about tank
}
“North”
{
“command” “vocalize PlayerWarnWitch” (funktioniert einwandfrei)
“text” “Witch!”//Player warns witch
}
“East”
{
“command” “vocalize PlayerWarnBoomer” (funktioniert einwandfrei)
“text” “Boomer!”//Player warns about boomer
}
“South”
{
“command” “vocalize PlayerWarnHunter” (funktioniert einwandfrei)
“text” “Hunter!”//player warns about hunter
}
“West”
{
“command” “vocalize PlayerWarnSmoker” (funktioniert einwandfrei)
“text” “Smoker!”//Player warns about smoker
}
}
//————————————————————–
“Orders,Zombie,Alive”
{
“Center”
{
“command” “vocalize PlayerZombieTaunt”
“label” “#L4D_rosetta_grrrr”
}
}
//————————————————————–
“QA,Zombie,Alive”
{
“Center”
{
“command” “vocalize PlayerZombieTaunt”
“text” “#L4D_rosetta_grrrr”
}
}
//————————————————————–
“Alerts,Zombie,Alive”
{
“Center”
{
“command” “vocalize PlayerZombieTaunt”
“text” “#L4D_rosetta_grrrr”
}
}
}
Hi,
würdest Du mir bitte die Datei als E-Mail zukommen lassen?