De/Recoding Weapons: Difference between revisions

From Valve Developer Community
< De
Jump to navigation Jump to search
No edit summary
m (obsolete language category)
 
(45 intermediate revisions by 12 users not shown)
Line 1: Line 1:
{{todo|Is there an English page?}}
==Einleitung==
==Einleitung==
Hallo,Ich möchte euch in diesem Tutorial erklären wie man schon mit simplen coding seinen eigenen kleinen HL2DM Coden kann.
Dieses Tutorial beschreibt anhand des {{L|weapon_smg1|SMG1}}s wie man die Eigenschaften einer Waffe ändern kann.
In diesem Tutorial werden wir uns als Basis nur das SMG1 umcoden.
Dieses Tutorial kann aber auf andere Waffen angewendet werden.


Aber auch wie man die Ammo im Magazin, sowie die extra Munition umstellen kann(Also die man insgesamt mit scih trägt), aber auch wie man den Damage, den die Waffe anrichtet, umcoden kann!
Die Vorgehensweise kann entsprechend bei anderen Waffen angewendet werden.




'''Was ihr benötigt:'''
'''Was ihr benötigt:'''
*Einen Compiler um den Sourcecode zu kompilieren.


Gute C++ Kenntnisse damit ihr das auch versteht!
Einen Compilierer für eure Mod(Leider muss es erstmal VC++ 2003 sein!)
Verständnis wie alles Funktioniert!
Ein wenig Zeit zum lesen!


Wenn ihr das alles habt dann ist das kein Problem was ich schreibe.
==Die WaffenScriptdatei==
Die Munition im Magazin ist nicht im Source Code definiert, sondern in einem Script.


==Die Schussfrequenz umcoden==
Geh' zunächst in euren Mod Ordner und öffne den Unterordner scripts.
Als erstes müsst ihr nur die Weapon_smg1.cpp öffnen.
Diese findet ihr hier-> src\game_shared\hl2mp\weapon_smg1.cpp


Als erstes wird euch diese Klasse gezeigt:
Darin befinden sich alle Waffenscripts die wir benötigen.


'''class CWeaponSMG1 : public CHL2MPMachineGun'''
Öffne nun die Datei


'''weapon_smg1.txt'''




In ihr müsst ihr diese Elementfunktion(Methode)finden:
Der für dieses Tutorial wichtige Teil ist folgender:
 
// Weapon data is loaded by both the Game and Client DLLs.
"printname" "#HL2_SMG1" //Legt den In-Game Namen der Waffe den ihr beim Waffenwechsel angezeigt bekommt fest.
"clip_size" "45" //Legt die Grösse des Magazins fest(Primär-Munition).
"clip2_size" "-1" //Legt die Größe des Magazins fest(Sekundär-Munition).
"default_clip" "45" //Legt fest wieviel Munition die Waffe anfangs im Magazin(Primär Munition) hat.
"default_clip2" "-1" //Legt fest wieviel Munition die Waffe zunächst im Magazin(Sekundär Munition) hat.
"primary_ammo" "SMG1" //Legt den Typ der Primär-Munition fest.
"secondary_ammo" "SMG1_Grenade" //Legt den Typ der Sekundär-Munition fest.


'''float GetFireRate( void )'''




Kommen wir zum Abändern dieser:


Diese wurde von Valve inline gecodet (Direkt in die Klassendeklaration implementiert)
===Name der Waffe===
Möchte man den Namen Ändern, so kann man
"printname" "#HL2_SMG1"
in
"printname" "Minigun"
ändern.


Das müsste so aussehen(Ich hab den Wert schon geändert!):
<nowiki>#</nowiki>HL2_SMG1 verweist auf eine andere Datei wo die Namen definiert sind. Wir haben den Namen jetzt aber einfach in diesem Script geändert.


  '''float GetFireRate( void ) { return 0.065f; } // 13.3hz'''
===Magazingröße===
Nun ändern wir die max. Schusszahl pro Magazin indem wir
  "clip_size" "45"
in
"clip_size" "100"
ändern.


Jetzt kann unsere Waffe schon 100 Schuß im Magazin tragen.


Damit eure Waffe nun schneller/langsamer schiesst müsst ihr den wert hinter return nur erhöhen/vertiefen.
Würde man jetzt ins Spiel hätte man jedoch im ersten Magazin trotzdem nur 45 Schuss. Ändern wir also noch
"default_clip" "45"
zu
"default_clip" "100"
Nun haben wir beim Spawn 1 Magazin = 100 Schuss.


Ändert den Wert mal in:
===Munitionsart===
Bisher noch nicht geändert wurden
"primary_ammo" "SMG1"
"secondary_ammo" "SMG1_Grenade"
Diese bestimmen die primäre und sekundäre Munitionsart der Waffe.


  '''float GetFireRate( void ) { return 0.005f; } // Gefixt!(Extrem Langsam!)'''
Da wir eine "Minigun" coden entfernen wir den zweiten Feuermodus.
  "secondary_ammo" "None"




Jetzt sollte eure Waffe extrem langsam sein :)
Man könnte nun die primäre Munition einer anderen Waffe nutzen; z.B.
"primary_ammo" "AR2"


Stellt die zahl mal auf 0.065f ein dann habt ihr schon ein schnelles MG!
Das nutzen wir für den Rest des  Tutorials.


Jetzt könnt ihr eure Mod Compilieren und fertig.
==Waffen Schaden ändern==
Eure waffe schiesst nun schneller.


Das könnt ihr auch bei dem Brecheisen und eigentlich allen anderen Waffen.
So nun kommen wir zum Einstellen des Schadens den eine Waffe bei einem Schuß anrichtet!
Somit wisst ihr wie man die schussfrequenz ändern kann.
Der Schaden jeder Waffe wird im Scripts ordner in der jewiligen weapon_ Textdatei festgelegt.


Nehmen wir uns mal die '''weapon_pistol.txt'''!


==Die Munition erhöhen/verringern==
Om oberen Teil steht diese Zeile:
Die Munition im Magazin wird einfach umgeändert, dies muss nicht mal groß gecodet werden!


Dazu müsst ihr in eurem Mod Ordner den Unterordner scripts öffnen.
"damage" "8"
Darin befinden sich alle waffenscripts die wir benötigen.


Nehmen wir wieder mal unsere SMG1. Diese besitzt folgendes script:
Dort wird also festgelegt das Jeder schuß aus der Pistole einen Schaden von 8 Healthpoints macht!
Ändern wie diesen wert mal wie folgt:
{{Note|Diese Zeile steht nur in der Scriptdatei wenn man eine Mod im SDK erstellt hat. In der Datei von HL2 ist diese Zeile nicht vorhanden.}}
"damage" "50"


weapon_smg1.txt
Nun macht jeder Schuß aus der Pistole einen Schaden von 50 Healthpoints.


Nun müsst ihr sie mit dem Editor öffnen. Jetzt können wir uns erstmal den Aufbau angucken.
Das war es auch schon wieder mit dem Tutorial für das Waffencoding!


Natürlich wird es euch bestimmt verwirren was dort alles drin ist aber wir brauchen nur diese Teile:
==Die Schussfrequenz ändern==
Öffne zunächste die Datei '''Weapon_smg1.cpp'''.
Du findest sie in deinem Sourcecode Ordner in src\game_shared\hl2mp\weapon_smg1.cpp


// Weapon data is loaded by both the Game and Client DLLs.
Die erste Klasse heißt wie folgt:
"printname" "#HL2_SMG1"
 
"clip_size" "45"
  class CWeaponSMG1 : public CHL2MPMachineGun
"clip2_size" "-1"
"default_clip" "45"
"default_clip2" "-1"
"primary_ammo" "SMG1"
  "secondary_ammo" "SMG1_Grenade"


'''Erklärung der Befehle:'''
"printname" "#HL2_SMG1"                    //Legt den In-Game Namen der Waffe den ihr beim Waffenwechsel angezeigt bekommt.


"clip_size" "45"          //Legt die Grösse des Magazins fest(Primär Munition).


"clip2_size" "-1"          //Legt die Größe des Magazins fest(Sekundär Munition).
In ihr müsst ihr diese Elementfunktion(Methode) finden:


  "default_clip" "45"          //Legt fest wieviel Ammo die Waffe im Magazin(Primär Munition) hat wenn man sie aufnimmt
  float GetFireRate( void )


"default_clip2" "-1"          //Legt fest wieviel Ammo die Waffe im Magazin(Sekundär Munition) hat wenn man sie aufnimmt


"primary_ammo" "SMG1"        //Legt fest wie die Munition der Primär Ammo heisst.


"secondary_ammo" "SMG1_Grenade" //Legt fest wie die Munition der Sekundär Ammo heisst.
Diese wurde von Valve inline gecodet (Direkt in die Klassendeklaration implementiert) und sollte so aussehen:


Jetzt solltet ihr erstmal einen kleinen einblick haben wie der obere und hier acuh wichtige Teil aufgebaut ist.
float GetFireRate( void ) { return 0.065f; } // 13.3hz


'''(Ihr solltet mit diesen Wissen schonmal rumexperementieren damit ihr euch damit vertraut macht was ich meine!)'''


Damit eure Waffe nun schneller/langsamer schiesst müsst ihr den Wert hinter ''return'' nur erhöhen/verringern.


Nur 2 dieser einträge kann und sollte man nicht ändern:
Ändere den Wert mal in:
"clip2_size" "-1"
"default_clip2" "-1"


Diese sind nämlich im Code festgelegt aber darum kümmern wir uns auch noch.
float GetFireRate( void ) { return 0.05f; } // Geändert! (default: 0.065f; //13.3hz)


Jetzt werden wir mal ein paar einträge ändern und unsere Waffen etwas modifiezieren!


Als erstes nehmen wir diesen Eintrag:
Kompilierst du nun den Code und kopierst die dlls (sofern nicht automatisch geschehen) in den passenden Ordner so sollte die Waffe im Spiel nun die geänderte Schussfrequenz haben.
"printname" "#HL2_SMG1"
Dieser legt den Namen der Waffe im HUD fest.
Nehmen wir uns mal den Namen Minigun! Dann müsst ihr nur den Eintrag zwischen den "" umschreiben:


"printname" "Minigun"


Nun können wir die Datei abspeichern und unsere Mod starten und mal die Waffen wechseln zu unserem SMG1 das jetzt als Minigun angezeigt wird.
==Maximal-Munition verändern==


Aber da wir jetzt auch noch die Standart Werte haben müssen wir uns nochmal an die weapon_smg1.txt machen!
Im folgenden wird erklärt wie man die maximal mitführbare Primär-Munition erhöhen kann.


Jetzt schreiben wir mal diese Zeile um:
Öffne zunächst folgende Datei:
src\game_shared\hl2mp\'''hl2mp_gamerules.cpp'''
Oder im Solution Explorer unter: Source Files -> HL2MP -> hl2mp_gamerules.cpp


"clip_size" "45"


Am besten wir schreiben den Wert auf 100 Schuß um:
In Zeile 795 findet man die Funktion
CAmmoDef *GetAmmoDef()


"clip_size" "100"
Sie definiert die verschiedenen Munitionstypen.


Jetzt kann unsere Waffe schon 100 Schuß tragen.
Z.B. SMG1 (primäre SMG1 Munition):
def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0, 0, 225, BULLET_IMPULSE(200, 1225), 0 );
Die Definition hat die Form:
// AddAmmoType(name, int damageType, int tracerType, int plr_dmg, int npc_dmg, int carry, float physicsForceImpulse, int nFlags, int minSplashSize, int maxSplashSize )
(aus ammodef.cpp)


Aber einen fehler gibt es noch und zwar diesen:
Die aktuelle maxAmmo (carry) ist also momentan 225.


"default_clip" "45"
Da wir eine "Minigun" coden ändern wir die 225 in 900.


Jedes mal wenn wir die Waffe aufnehmen hätten wir nur 45 Schuß im Magazin also auch auf 100 Stellen:
Die Zeile sieht dann folgendermaßen aus:
def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0,
0, 900, BULLET_IMPULSE(200, 1225), 0 );


"default_clip" "100"
Fertig zum kompilieren und testen.


Nun haben wir eine kleine Minigun gecodet die sehr schnell schiesst und dazu noch alle Werte wie eine echte Minigun hat.
==Startwaffen festlegen==
Natürlich haben wir noch 2 Einträge vergesen und zwar:
Jetzt haben wir aber beim Spawn noch die Standart-Munitionsmenge. Aber das können wir auch umcoden.


"primary_ammo" "SMG1"
Dazu müssen wir die zweite cpp öffnen:
  "secondary_ammo" "SMG1_Grenade"
  src\game_shared\hl2mp\'''hl2mp_player.cpp'''


Natürlich könnten wir jetzt erstmal nicht viel damit machen aber wir könnten den Eintrag für die Sekundäre Munition auskommentieren:
Dort müssen wir in Zeile 186 eine Methode editieren:


  //"secondary_ammo" "SMG1_Grenade"
  void CHL2MP_Player::GiveDefaultItems( void )
bzw: hl -> Source Files -> HL2MP -> hl2mp_player.cpp


Somit können wir nur Primäre Munition aufnehmen aber trotzdem haben wir ja noch die granaten beim Start!
Diese legt fest welche Waffen man beim Start bekommt. Für uns ist erstmal nur folgender Teil interessant:
Das wird sich aber bald ändern den dafür werden wir noch den Code umschreiben.
EquipSuit();  // Diese Funktion gibt uns den Anzug!
              // Folgende Methoden geben uns Munition bestimmter Typen!
CBasePlayer::GiveAmmo( 200, "Pistol");
CBasePlayer::GiveAmmo( 250, "SMG1");
CBasePlayer::GiveAmmo( 5, "grenade" );
CBasePlayer::GiveAmmo( 20, "Buckshot");
CBasePlayer::GiveAmmo( 10, "357" );
//Diese if und else verzweigung sorgt dafür das die Combine die Stunsticks und die Rebelen die Brecheisen bekommen!
if ( GetPlayerModelType() == PLAYER_SOUNDS_METROPOLICE || GetPlayerModelType() == PLAYER_SOUNDS_COMBINESOLDIER )
{
  GiveNamedItem( "weapon_stunstick" );
}
else if ( GetPlayerModelType() == PLAYER_SOUNDS_CITIZEN )
{
  GiveNamedItem( "weapon_crowbar" );
}
//Diese Funktionen geben uns die eigentlichen Waffen!
GiveNamedItem( "weapon_pistol" );
GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_frag" );
GiveNamedItem( "weapon_physcannon" );


Jetzt können wir aber erst noch die Primär Munition umändern!


Wenn wir z.b. mal die weapon_ar2.txt öffnen und dann den Eintrag für die Primär Munition daraus kopieren:
Wir bekommen als Standartwaffen also:


"primary_ammo" "AR2"
''Brecheisen/Stunstick, Physcannon, Pistole, SMG1, Granaten''


Jetzt teilen sich die SMG1 und die AR2 die selbe Munition nur ist die SMG1 Munition eigentlich unnütz aber mit etwas Fantasie bekommt ihr die irgend wo unter.


Somit hätten wir den Teil auch hinter uns.
Als Beispiel ändern wir die Standartwaffen zu:
Jetzt kommen wir wieder zurück zum Coding teil!


==Gesamt Munition erhöhen/verringern==
''Brecheisen/Stunstick, Revolver, SMG1, Shotgun, Granaten''


Nun kommen wir zum letzten Teil des ganzen. Hier werden wir noch die Sekundär munition entfernen sowie die Primär Munition erhöhen.
Als erstes ändern wir die Munition:


Dafür brauchen wir folgende Dateien:
CBasePlayer::GiveAmmo( 200, "Pistol");
CBasePlayer::GiveAmmo( 250, "SMG1");
CBasePlayer::GiveAmmo( 5, "grenade" );
CBasePlayer::GiveAmmo( 20, "Buckshot");
CBasePlayer::GiveAmmo( 10, "357" );


src\game_shared\hl2mp\hl2mp_gamerules.cpp //Dort ist die gesamt Munition definiert!
src\dlls\hl2mp\hl2mp_player.cpp          //Dort ist die Start Munition definiert!


Dort müsst ihr in Zeile 795 diese Funktion umschreiben:
Da wir anstatt der Pistole den Revolver wollen kommentieren wir die Zeile für die Pistole aus, fügen für den Revolver eine neue ein und fügen für die Shotgun Munition (Buckshot) hinzu:
//CBasePlayer::GiveAmmo( 200, "Pistol");
CBasePlayer::GiveAmmo( 30, "357" );
CBasePlayer::GiveAmmo( 250, "SMG1");
CBasePlayer::GiveAmmo( 5, "grenade" );
CBasePlayer::GiveAmmo( 20, "Buckshot");
CBasePlayer::GiveAmmo( 10, "357" );


CAmmoDef *GetAmmoDef()


Dort findet ihr solche Einträge:
Auch hier kommentieren wir die Pistole aus und fügen den Revolver und die Shotgun hinzu:
//GiveNamedItem( "weapon_pistol" );
GiveNamedItem( "weapon_357" );
GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_shotgun" );
GiveNamedItem( "weapon_frag" );
GiveNamedItem( "weapon_physcannon" );


def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0,
0, 225, BULLET_IMPULSE(200, 1225), 0 );


Diese Zeile bestimmt die gesamt Munition die ihr mit euch tragen könnt!
==Übersicht der Waffen und Munition==
Diese ist für die SMG1 Also die Waffe die wir umcoden wollen!  im Quellcode sind die wichtigen Zahlen besser geordnet. Ihr müsst jetzt die 225 in eine Anzahl eurer Wahl umschreiben.


Da wir eine Minigun machen schreiben wir mal 900 hin. Dann sieht das so aus:
Zum Abschluss noch ein kleiner Anhang; eine Liste der HL2 Waffen- und Munitionsnamen


  def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0, 0, 900, BULLET_IMPULSE(200, 1225), 0 );
  //Nur Waffen geben(Wie im HUD):
GiveNamedItem( "weapon_crowbar" );
GiveNamedItem( "weapon_stunstick" );
GiveNamedItem( "weapon_physcannon" );
GiveNamedItem( "weapon_pistol" );
GiveNamedItem( "weapon_357" );
  GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_ar2" );
GiveNamedItem( "weapon_shotgun" );
GiveNamedItem( "weapon_frag" );
GiveNamedItem( "weapon_crossbow" );
GiveNamedItem( "weapon_rpg" );
GiveNamedItem( "weapon_slam" );


Jetzt können wir insgesamt 1000 Schuß im SMG1 mit uns führen wenn wir compilieren aber leider haben wir dann nur die Standart Menge die wir immer beim Start bekommen.
//Anzahl und Typ der Munition für Waffen geben:
CBasePlayer::GiveAmmo( 250, "Pistol");
CBasePlayer::GiveAmmo( 900, "AR2" );
CBasePlayer::GiveAmmo( 5, "AR2AltFire" );
CBasePlayer::GiveAmmo( 500, "SMG1");
CBasePlayer::GiveAmmo( 5, "smg1_grenade");
CBasePlayer::GiveAmmo( 255, "Buckshot");
CBasePlayer::GiveAmmo( 30, "357" );
CBasePlayer::GiveAmmo( 5, "rpg_round");
CBasePlayer::GiveAmmo( 15, "grenade" );
CBasePlayer::GiveAmmo( 10, "slam" );


Aber das können wir auch umcoden. Dazu müssen wir die zweite cpp öffnen:


src\game_shared\hl2mp\hl2mp_gamerules.cpp
Damit ihr auch die verbindung habt, hier eine Übersicht wie die Waffen mit der Munition zusammen gehört. Die reihen folge ist genauso wie im HUD!


Dort müssen wir in Zeile 186 eine Methode editieren:
Fangen wir mit einer Legende an:


void CHL2MP_Player::GiveDefaultItems( void )
Aufbau der Legende:


Diese legt fest welche Startwaffen man bekommt! Uns interesiert erstmal nur der Teil:
//Waffe im Spiel(Primär Ammo, Sekundär Ammo)
Befehl zum aufnehmen der Waffe
Befehl zum aufnehmen der Munition der Waffe(Primär)
Befehl zum aufnehmen der Munition der Waffe(Sekundär)


  //Diese Funktion gibt uns den Anzug!
Jetzt kommen wir zum eigentlichen Aufbau des Codes:
  EquipSuit();
  //Brecheisen (Keine Munition)
  GiveNamedItem( "weapon_crowbar" );


  //Diese Methoden geben uns die Munition und die Waffe dafür!
  //Combine Schlagstock (Keine Munition)
CBasePlayer::GiveAmmo( 200, "Pistol");
  GiveNamedItem( "weapon_stunstick" );
CBasePlayer::GiveAmmo( 250, "SMG1");
CBasePlayer::GiveAmmo( 5, "grenade" );
CBasePlayer::GiveAmmo( 20, "Buckshot");
  CBasePlayer::GiveAmmo( 10, "357" );


  //Diese if und else verzweigung sorgt dafür das die Combine die Stunsticks und die Rebelen die Brecheisen bekommen!
  //Physcannon(Keine Munition):
if ( GetPlayerModelType() == PLAYER_SOUNDS_METROPOLICE || GetPlayerModelType() == PLAYER_SOUNDS_COMBINESOLDIER )
  GiveNamedItem( "weapon_physcannon" );
{
  GiveNamedItem( "weapon_stunstick" );
}
else if ( GetPlayerModelType() == PLAYER_SOUNDS_CITIZEN )
  {
  GiveNamedItem( "weapon_crowbar" );
}


  //Diese Funktionen geben uns die eigentlichen Waffen!
  //Pistole(Pistol):
  GiveNamedItem( "weapon_pistol" );
  GiveNamedItem( "weapon_pistol" );
CBasePlayer::GiveAmmo( 250, "Pistol");
//Revolver(357):
GiveNamedItem( "weapon_357" );
CBasePlayer::GiveAmmo( 30, "357" );
//SMG1(SMG1, smg1_grenade):
  GiveNamedItem( "weapon_smg1" );
  GiveNamedItem( "weapon_smg1" );
CBasePlayer::GiveAmmo( 500, "SMG1");
CBasePlayer::GiveAmmo( 5, "smg1_grenade");
//AR2(AR2, AR2AltFire):
GiveNamedItem( "weapon_ar2" );
CBasePlayer::GiveAmmo( 900, "AR2" );
CBasePlayer::GiveAmmo( 5, "AR2AltFire" );
//Shotgun(Buckshot):
GiveNamedItem( "weapon_shotgun" );
CBasePlayer::GiveAmmo( 255, "Buckshot");
//Handgranaten(grenade):
  GiveNamedItem( "weapon_frag" );
  GiveNamedItem( "weapon_frag" );
  GiveNamedItem( "weapon_physcannon" );
CBasePlayer::GiveAmmo( 15, "grenade" );
 
//Armbrust(XBowBolt):
  GiveNamedItem( "weapon_crossbow" );
CBasePlayer::GiveAmmo( 5, "XBowBolt" );


//Raketenwerfer(rpg_round):
GiveNamedItem( "weapon_rpg" );
CBasePlayer::GiveAmmo( 5, "rpg_round");


//Fortsetzung folgt!
//Slam(slam):
GiveNamedItem( "weapon_slam" );
CBasePlayer::GiveAmmo( 10, "slam" );
{{ACategory|Programming}}{{ACategory|Tutorials}}

Latest revision as of 03:17, 22 August 2024

Zu erledigen: Is there an English page?

Einleitung

Dieses Tutorial beschreibt anhand des SMG1(en)s wie man die Eigenschaften einer Waffe ändern kann.

Die Vorgehensweise kann entsprechend bei anderen Waffen angewendet werden.


Was ihr benötigt:

  • Einen Compiler um den Sourcecode zu kompilieren.


Die WaffenScriptdatei

Die Munition im Magazin ist nicht im Source Code definiert, sondern in einem Script.

Geh' zunächst in euren Mod Ordner und öffne den Unterordner scripts.

Darin befinden sich alle Waffenscripts die wir benötigen.

Öffne nun die Datei

weapon_smg1.txt


Der für dieses Tutorial wichtige Teil ist folgender:

// Weapon data is loaded by both the Game and Client DLLs.
"printname"		"#HL2_SMG1"	//Legt den In-Game Namen der Waffe den ihr beim Waffenwechsel angezeigt bekommt fest.
"clip_size"		"45"		//Legt die Grösse des Magazins fest(Primär-Munition).
"clip2_size"		"-1"		//Legt die Größe des Magazins fest(Sekundär-Munition).
"default_clip"		"45"		//Legt fest wieviel Munition die Waffe anfangs im Magazin(Primär Munition) hat.
"default_clip2"		"-1"		//Legt fest wieviel Munition die Waffe zunächst im Magazin(Sekundär Munition) hat.
"primary_ammo"		"SMG1"		//Legt den Typ der Primär-Munition fest.
"secondary_ammo"	"SMG1_Grenade"	//Legt den Typ der Sekundär-Munition fest.


Kommen wir zum Abändern dieser:

Name der Waffe

Möchte man den Namen Ändern, so kann man

"printname"	"#HL2_SMG1"

in

"printname"	"Minigun"

ändern.

#HL2_SMG1 verweist auf eine andere Datei wo die Namen definiert sind. Wir haben den Namen jetzt aber einfach in diesem Script geändert.

Magazingröße

Nun ändern wir die max. Schusszahl pro Magazin indem wir

"clip_size"			"45"

in

"clip_size"			"100"

ändern.

Jetzt kann unsere Waffe schon 100 Schuß im Magazin tragen.

Würde man jetzt ins Spiel hätte man jedoch im ersten Magazin trotzdem nur 45 Schuss. Ändern wir also noch

"default_clip"			"45"

zu

"default_clip"			"100"

Nun haben wir beim Spawn 1 Magazin = 100 Schuss.

Munitionsart

Bisher noch nicht geändert wurden

"primary_ammo"			"SMG1"
"secondary_ammo"		"SMG1_Grenade"

Diese bestimmen die primäre und sekundäre Munitionsart der Waffe.

Da wir eine "Minigun" coden entfernen wir den zweiten Feuermodus.

"secondary_ammo"		"None"


Man könnte nun die primäre Munition einer anderen Waffe nutzen; z.B.

"primary_ammo"			"AR2"


Waffen Schaden ändern

So nun kommen wir zum Einstellen des Schadens den eine Waffe bei einem Schuß anrichtet! Der Schaden jeder Waffe wird im Scripts ordner in der jewiligen weapon_ Textdatei festgelegt.

Nehmen wir uns mal die weapon_pistol.txt!

Om oberen Teil steht diese Zeile:

"damage"			"8"

Dort wird also festgelegt das Jeder schuß aus der Pistole einen Schaden von 8 Healthpoints macht! Ändern wie diesen wert mal wie folgt:

Note.pngBemerkung:Diese Zeile steht nur in der Scriptdatei wenn man eine Mod im SDK erstellt hat. In der Datei von HL2 ist diese Zeile nicht vorhanden.
"damage"			"50"

Nun macht jeder Schuß aus der Pistole einen Schaden von 50 Healthpoints.

Das war es auch schon wieder mit dem Tutorial für das Waffencoding!

Die Schussfrequenz ändern

Öffne zunächste die Datei Weapon_smg1.cpp. Du findest sie in deinem Sourcecode Ordner in src\game_shared\hl2mp\weapon_smg1.cpp

Die erste Klasse heißt wie folgt:

class CWeaponSMG1 : public CHL2MPMachineGun


In ihr müsst ihr diese Elementfunktion(Methode) finden:

float GetFireRate( void )


Diese wurde von Valve inline gecodet (Direkt in die Klassendeklaration implementiert) und sollte so aussehen:

float	GetFireRate( void ) { return 0.065f; }	// 13.3hz


Damit eure Waffe nun schneller/langsamer schiesst müsst ihr den Wert hinter return nur erhöhen/verringern.

Ändere den Wert mal in:

float	GetFireRate( void ) { return 0.05f; }	// Geändert! (default: 0.065f; //13.3hz)


Kompilierst du nun den Code und kopierst die dlls (sofern nicht automatisch geschehen) in den passenden Ordner so sollte die Waffe im Spiel nun die geänderte Schussfrequenz haben.


Maximal-Munition verändern

Im folgenden wird erklärt wie man die maximal mitführbare Primär-Munition erhöhen kann.

Öffne zunächst folgende Datei:

src\game_shared\hl2mp\hl2mp_gamerules.cpp

Oder im Solution Explorer unter: Source Files -> HL2MP -> hl2mp_gamerules.cpp


In Zeile 795 findet man die Funktion

CAmmoDef *GetAmmoDef()

Sie definiert die verschiedenen Munitionstypen.

Z.B. SMG1 (primäre SMG1 Munition):

def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0, 0, 225, BULLET_IMPULSE(200, 1225), 0 );

Die Definition hat die Form:

// AddAmmoType(name, int damageType, int tracerType, int plr_dmg, int npc_dmg, int carry, float physicsForceImpulse, int nFlags, int minSplashSize, int maxSplashSize )

(aus ammodef.cpp)

Die aktuelle maxAmmo (carry) ist also momentan 225.

Da wir eine "Minigun" coden ändern wir die 225 in 900.

Die Zeile sieht dann folgendermaßen aus:

def.AddAmmoType("SMG1",				DMG_BULLET,					TRACER_LINE_AND_WHIZ,	0,	
0,			900,		BULLET_IMPULSE(200, 1225),	0 );

Fertig zum kompilieren und testen.

Startwaffen festlegen

Jetzt haben wir aber beim Spawn noch die Standart-Munitionsmenge. Aber das können wir auch umcoden.

Dazu müssen wir die zweite cpp öffnen:

src\game_shared\hl2mp\hl2mp_player.cpp

Dort müssen wir in Zeile 186 eine Methode editieren:

void CHL2MP_Player::GiveDefaultItems( void )

bzw: hl -> Source Files -> HL2MP -> hl2mp_player.cpp

Diese legt fest welche Waffen man beim Start bekommt. Für uns ist erstmal nur folgender Teil interessant:

EquipSuit();  // Diese Funktion gibt uns den Anzug!
              // Folgende Methoden geben uns Munition bestimmter Typen!
CBasePlayer::GiveAmmo( 200,	"Pistol");
CBasePlayer::GiveAmmo( 250,	"SMG1");
CBasePlayer::GiveAmmo( 5,	"grenade" );
CBasePlayer::GiveAmmo( 20,	"Buckshot");
CBasePlayer::GiveAmmo( 10,	"357" );

//Diese if und else verzweigung sorgt dafür das die Combine die Stunsticks und die Rebelen die Brecheisen bekommen!
if ( GetPlayerModelType() == PLAYER_SOUNDS_METROPOLICE || GetPlayerModelType() == PLAYER_SOUNDS_COMBINESOLDIER )
{
 GiveNamedItem( "weapon_stunstick" );
}
else if ( GetPlayerModelType() == PLAYER_SOUNDS_CITIZEN )
{
 GiveNamedItem( "weapon_crowbar" );
}

//Diese Funktionen geben uns die eigentlichen Waffen!
GiveNamedItem( "weapon_pistol" );
GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_frag" );
GiveNamedItem( "weapon_physcannon" );


Wir bekommen als Standartwaffen also:

Brecheisen/Stunstick, Physcannon, Pistole, SMG1, Granaten


Als Beispiel ändern wir die Standartwaffen zu:

Brecheisen/Stunstick, Revolver, SMG1, Shotgun, Granaten

Als erstes ändern wir die Munition:

CBasePlayer::GiveAmmo( 200,	"Pistol");
CBasePlayer::GiveAmmo( 250,	"SMG1");
CBasePlayer::GiveAmmo( 5,	"grenade" );
CBasePlayer::GiveAmmo( 20,	"Buckshot");
CBasePlayer::GiveAmmo( 10,	"357" );


Da wir anstatt der Pistole den Revolver wollen kommentieren wir die Zeile für die Pistole aus, fügen für den Revolver eine neue ein und fügen für die Shotgun Munition (Buckshot) hinzu:

//CBasePlayer::GiveAmmo( 200,	"Pistol");
CBasePlayer::GiveAmmo( 30,	"357" );
CBasePlayer::GiveAmmo( 250,	"SMG1");
CBasePlayer::GiveAmmo( 5,	"grenade" );
CBasePlayer::GiveAmmo( 20,	"Buckshot");
CBasePlayer::GiveAmmo( 10,	"357" );


Auch hier kommentieren wir die Pistole aus und fügen den Revolver und die Shotgun hinzu:

//GiveNamedItem( "weapon_pistol" );
GiveNamedItem( "weapon_357" );
GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_shotgun" );
GiveNamedItem( "weapon_frag" );
GiveNamedItem( "weapon_physcannon" );


Übersicht der Waffen und Munition

Zum Abschluss noch ein kleiner Anhang; eine Liste der HL2 Waffen- und Munitionsnamen

//Nur Waffen geben(Wie im HUD):
GiveNamedItem( "weapon_crowbar" );
GiveNamedItem( "weapon_stunstick" );
GiveNamedItem( "weapon_physcannon" );
GiveNamedItem( "weapon_pistol" );
GiveNamedItem( "weapon_357" );
GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_ar2" );
GiveNamedItem( "weapon_shotgun" );
GiveNamedItem( "weapon_frag" );
GiveNamedItem( "weapon_crossbow" );
GiveNamedItem( "weapon_rpg" );
GiveNamedItem( "weapon_slam" );
//Anzahl und Typ der Munition für Waffen geben:
CBasePlayer::GiveAmmo( 250,	"Pistol");
CBasePlayer::GiveAmmo( 900,	"AR2" );
CBasePlayer::GiveAmmo( 5,	"AR2AltFire" );
CBasePlayer::GiveAmmo( 500,	"SMG1");
CBasePlayer::GiveAmmo( 5,	"smg1_grenade");
CBasePlayer::GiveAmmo( 255,	"Buckshot");
CBasePlayer::GiveAmmo( 30,	"357" );
CBasePlayer::GiveAmmo( 5,	"rpg_round");
CBasePlayer::GiveAmmo( 15,	"grenade" );
CBasePlayer::GiveAmmo( 10,	"slam" );


Damit ihr auch die verbindung habt, hier eine Übersicht wie die Waffen mit der Munition zusammen gehört. Die reihen folge ist genauso wie im HUD!

Fangen wir mit einer Legende an:

Aufbau der Legende:

//Waffe im Spiel(Primär Ammo, Sekundär Ammo)
Befehl zum aufnehmen der Waffe
Befehl zum aufnehmen der Munition der Waffe(Primär)
Befehl zum aufnehmen der Munition der Waffe(Sekundär)

Jetzt kommen wir zum eigentlichen Aufbau des Codes:

//Brecheisen (Keine Munition)
GiveNamedItem( "weapon_crowbar" );
//Combine Schlagstock (Keine Munition)
GiveNamedItem( "weapon_stunstick" );
//Physcannon(Keine Munition):
GiveNamedItem( "weapon_physcannon" );
//Pistole(Pistol):
GiveNamedItem( "weapon_pistol" );
CBasePlayer::GiveAmmo( 250,	"Pistol");
//Revolver(357):
GiveNamedItem( "weapon_357" );
CBasePlayer::GiveAmmo( 30,	"357" );
//SMG1(SMG1, smg1_grenade):
GiveNamedItem( "weapon_smg1" );
CBasePlayer::GiveAmmo( 500,	"SMG1");
CBasePlayer::GiveAmmo( 5,	"smg1_grenade");
//AR2(AR2, AR2AltFire):
GiveNamedItem( "weapon_ar2" );
CBasePlayer::GiveAmmo( 900,	"AR2" );
CBasePlayer::GiveAmmo( 5,	"AR2AltFire" );
//Shotgun(Buckshot):
GiveNamedItem( "weapon_shotgun" );
CBasePlayer::GiveAmmo( 255,	"Buckshot");
//Handgranaten(grenade):
GiveNamedItem( "weapon_frag" );
CBasePlayer::GiveAmmo( 15,	"grenade" );
//Armbrust(XBowBolt):
GiveNamedItem( "weapon_crossbow" );
CBasePlayer::GiveAmmo( 5,	"XBowBolt" );
//Raketenwerfer(rpg_round):
GiveNamedItem( "weapon_rpg" );
CBasePlayer::GiveAmmo( 5,	"rpg_round");
//Slam(slam):
GiveNamedItem( "weapon_slam" );
CBasePlayer::GiveAmmo( 10,	"slam" );