De/Recoding Weapons: Difference between revisions

From Valve Developer Community
< De
Jump to navigation Jump to search
m (obsolete language category)
 
(23 intermediate revisions by 9 users not shown)
Line 1: Line 1:
[[Category:German]][[Category:Programming:de]]
{{todo|Is there an English page?}}
{{TutPOV:de}}
 
==Einleitung==
==Einleitung==
Dieses Tutorial beschreibt anhand des [[weapon_SMG1 SMG1]]s wie man die Eigenschaften einer Waffe ändern kann.
Dieses Tutorial beschreibt anhand des {{L|weapon_smg1|SMG1}}s wie man die Eigenschaften einer Waffe ändern kann.


Die Vorgehensweise kann entsprechend bei anderen Waffen angewendet werden.
Die Vorgehensweise kann entsprechend bei anderen Waffen angewendet werden.
Line 10: Line 10:
*Einen Compiler um den Sourcecode zu kompilieren.
*Einen Compiler um den Sourcecode zu kompilieren.


==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.


==Die Munition erhöhen/verringern==
==Die WaffenScriptdatei==
Die Munition im Magazin ist nicht im Source Code definiert, sondern in einem Script.
Die Munition im Magazin ist nicht im Source Code definiert, sondern in einem Script.


Line 48: Line 19:


Öffne nun die Datei
Öffne nun die Datei
weapon_smg1.txt
 
'''weapon_smg1.txt'''
 


Der für dieses Tutorial wichtige Teil ist folgender:
Der für dieses Tutorial wichtige Teil ist folgender:


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




Line 74: Line 38:
Kommen wir zum Abändern dieser:
Kommen wir zum Abändern dieser:


===Name der Waffe===
Möchte man den Namen Ändern, so kann man
Möchte man den Namen Ändern, so kann man
  "printname" "#HL2_SMG1"
  "printname" "#HL2_SMG1"
Line 82: Line 47:
<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.
<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.


 
===Magazingröße===
Nun ändern wir die max. Schusszahl pro Magazin indem wir
Nun ändern wir die max. Schusszahl pro Magazin indem wir
  "clip_size" "45"
  "clip_size" "45"
Line 91: Line 56:
Jetzt kann unsere Waffe schon 100 Schuß im Magazin tragen.
Jetzt kann unsere Waffe schon 100 Schuß im Magazin tragen.


Würde man jetzt ins Spiel hätte man jedoch trotzdem nur 45 Schuss. Ändern wir also noch
Würde man jetzt ins Spiel hätte man jedoch im ersten Magazin trotzdem nur 45 Schuss. Ändern wir also noch
  "default_clip" "45"
  "default_clip" "45"
zu
zu
Line 97: Line 62:
Nun haben wir beim Spawn 1 Magazin = 100 Schuss.
Nun haben wir beim Spawn 1 Magazin = 100 Schuss.


 
===Munitionsart===
Bisher noch nicht geändert wurden
Bisher noch nicht geändert wurden
  "primary_ammo" "SMG1"
  "primary_ammo" "SMG1"
  "secondary_ammo" "SMG1_Grenade"
  "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.
Da wir eine "Minigun" coden entfernen wir den zweiten Feuermodus.
Line 109: Line 75:
  "primary_ammo" "AR2"
  "primary_ammo" "AR2"


==Übersicht der Waffen und Munition==


Damit euch das umcoden leichter fällt und ihr auch alles versteht hab ich mal eine Übersicht der Waffenverhältnisse gemacht!
==Waffen Schaden ändern==


Hier mal eine Übersicht welche Waffen und Welche Munition ihr einbauen könnt:
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.


//Nur Waffen geben(Wie im HUD):
Nehmen wir uns mal die '''weapon_pistol.txt'''!
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:
Om oberen Teil steht diese Zeile:
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" );


"damage" "8"


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 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"


Fangen wir mit einer Legende an:
Nun macht jeder Schuß aus der Pistole einen Schaden von 50 Healthpoints.


Aufbau der Legende:
Das war es auch schon wieder mit dem Tutorial für das Waffencoding!


//Waffe im Spiel(Primär Ammo, Sekundär Ammo)
==Die Schussfrequenz ändern==
Befehl zum aufnehmen der Waffe
Öffne zunächste die Datei '''Weapon_smg1.cpp'''.
Befehl zum aufnehmen der Munition der Waffe(Primär)
Du findest sie in deinem Sourcecode Ordner in src\game_shared\hl2mp\weapon_smg1.cpp
Befehl zum aufnehmen der Munition der Waffe(Sekundär)


Jetzt kommen wir zum eigentlichen Aufbau des Codes:
Die erste Klasse heißt wie folgt:
//Brecheisen (Keine Munition)
GiveNamedItem( "weapon_crowbar" );


  //Combine Schlagstock (Keine Munition)
  class CWeaponSMG1 : public CHL2MPMachineGun
GiveNamedItem( "weapon_stunstick" );


//Physcannon(Keine Munition):
GiveNamedItem( "weapon_physcannon" );


//Pistole(Pistol):
GiveNamedItem( "weapon_pistol" );
CBasePlayer::GiveAmmo( 250, "Pistol");


//Revolver(357):
In ihr müsst ihr diese Elementfunktion(Methode) finden:
GiveNamedItem( "weapon_357" );
CBasePlayer::GiveAmmo( 30, "357" );


  //SMG1(SMG1, smg1_grenade):
  float GetFireRate( void )
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):
Diese wurde von Valve inline gecodet (Direkt in die Klassendeklaration implementiert) und sollte so aussehen:
GiveNamedItem( "weapon_frag" );
CBasePlayer::GiveAmmo( 15, "grenade" );


  //Armbrust(XBowBolt):
  float GetFireRate( void ) { return 0.065f; } // 13.3hz
GiveNamedItem( "weapon_crossbow" );
CBasePlayer::GiveAmmo( 5, "XBowBolt" );


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


//Slam(slam):
Damit eure Waffe nun schneller/langsamer schiesst müsst ihr den Wert hinter ''return'' nur erhöhen/verringern.
GiveNamedItem( "weapon_slam" );
CBasePlayer::GiveAmmo( 10, "slam" );


==Gesamt Munition erhöhen/verringern==
Ändere den Wert mal in:


Nun kommen wir zum letzten Teil des ganzen. Hier werden wir noch die Sekundär munition entfernen sowie die Primär Munition erhöhen.
float GetFireRate( void ) { return 0.05f; } // Geändert! (default: 0.065f; //13.3hz)


Dafür brauchen wir zuerst folgende Datei:


src\game_shared\hl2mp\hl2mp_gamerules.cpp //Dort ist die gesamt Munition definiert!
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.


Dort müsst ihr in Zeile 795 diese Funktion umschreiben:


CAmmoDef *GetAmmoDef()
==Maximal-Munition verändern==


Dort findet ihr solche Einträge:
Im folgenden wird erklärt wie man die maximal mitführbare Primär-Munition erhöhen kann.


  def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0,
Öffne zunächst folgende Datei:
0, 225, BULLET_IMPULSE(200, 1225), 0 );
  src\game_shared\hl2mp\'''hl2mp_gamerules.cpp'''
Oder im Solution Explorer unter: Source Files -> HL2MP -> hl2mp_gamerules.cpp


Diese Zeile bestimmt die gesamt Munition die ihr mit euch tragen könnt!
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:
In Zeile 795 findet man die Funktion
CAmmoDef *GetAmmoDef()


def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0,
Sie definiert die verschiedenen Munitionstypen.
0, 900, BULLET_IMPULSE(200, 1225), 0 );


Jetzt können wir insgesamt 1000 Schuß im SMG1 mit uns führen wenn wir compilieren.
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)


Und wir müssen noch die Granaten abstellen!
Die aktuelle maxAmmo (carry) ist also momentan 225.


Das machen wir wie bei der extra Munition, erstmal diese Zeile suchen:
Da wir eine "Minigun" coden ändern wir die 225 in 900.


def.AddAmmoType("SMG1_Grenade", DMG_BURN, TRACER_NONE, 0,
Die Zeile sieht dann folgendermaßen aus:
0, 3, 0, 0 );
  def.AddAmmoType("SMG1", DMG_BULLET, TRACER_LINE_AND_WHIZ, 0,
 
  0, 900, BULLET_IMPULSE(200, 1225), 0 );
Diese ändern wir dann von der 3 in 0:
 
  def.AddAmmoType("SMG1_Grenade", DMG_BURN, TRACER_NONE, 0,
  0, 0, 0, 0 );


Fertig zum kompilieren und testen.


==Startwaffen festlegen==
==Startwaffen festlegen==
Jetzt haben wir aber noch die Standart Munitionsmenge. Aber das können wir auch umcoden.  
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:
Dazu müssen wir die zweite cpp öffnen:
 
  src\game_shared\hl2mp\'''hl2mp_player.cpp'''
  src\game_shared\hl2mp\hl2mp_player.cpp


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


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


Diese legt fest welche Startwaffen man bekommt! Uns interesiert erstmal nur der Teil:
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!
  //Diese Funktion gibt uns den Anzug!
              // Folgende Methoden geben uns Munition bestimmter Typen!
EquipSuit();
//Diese Methoden geben uns die Munition und die Waffe dafür!
  CBasePlayer::GiveAmmo( 200, "Pistol");
  CBasePlayer::GiveAmmo( 200, "Pistol");
  CBasePlayer::GiveAmmo( 250, "SMG1");
  CBasePlayer::GiveAmmo( 250, "SMG1");
Line 282: Line 194:




Somit habt ihr jetzt einen Überblick mit welchem Aufruf ihr welche Waffe mit der dazugehörigen Munition bekommt.
Wir bekommen als Standartwaffen also:
 
 
Jetzt könnt ihr Festlegen welche Waffen ihr als Standart waffen festlegen wollt und welche Munition ihr bekommt und wieviel davon!


Jetzt wissen wir ja schon welche standart waffen wir bekommen:
''Brecheisen/Stunstick, Physcannon, Pistole, SMG1, Granaten''


Brecheisen/Stunstick, Physcannon, Pistole, SMG1, Granaten


Aber warum ändern wir das nich mal was :)?
Als Beispiel ändern wir die Standartwaffen zu:


Machen wir uns mal einen richtigen Deathmatch!
''Brecheisen/Stunstick, Revolver, SMG1, Shotgun, Granaten''
 
Als start waffen nehmen wir:
 
Brecheisen/Stunstick, Revolver, SMG1, Shotgun, Granaten
 
Um Fehlern vorzubeugen kommentieren wir den überflüßigen Code aus aber löschen ihn nicht!


Als erstes ändern wir die Munition:
Als erstes ändern wir die Munition:
Line 310: Line 212:




Da wir die Pistole rauswerfen und den Revolver reinbauen wollen kommentieren wir die Zeile für die Pistole aus und bauen die für den revolver ein:
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( 200, "Pistol");
  CBasePlayer::GiveAmmo( 30, "357" );
  CBasePlayer::GiveAmmo( 30, "357" );
Line 319: Line 220:
  CBasePlayer::GiveAmmo( 10, "357" );
  CBasePlayer::GiveAmmo( 10, "357" );


Jetzt haben wir die Munition fertig aber  den die Buckshots sind die Shotgun Ammo, jetzt geht es an die Waffen.


Wir haben im Moment diese einstellungen:
Auch hier kommentieren wir die Pistole aus und fügen den Revolver und die Shotgun hinzu:
 
//GiveNamedItem( "weapon_pistol" );
  GiveNamedItem( "weapon_pistol" );
  GiveNamedItem( "weapon_357" );
  GiveNamedItem( "weapon_smg1" );
  GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_shotgun" );
  GiveNamedItem( "weapon_frag" );
  GiveNamedItem( "weapon_frag" );
  GiveNamedItem( "weapon_physcannon" );
  GiveNamedItem( "weapon_physcannon" );


Auch hier müssen wir die Pistole auskommentieren und durch den Revolver und Shotgun ersetzen:


  //GiveNamedItem( "weapon_pistol" );
==Ü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_357" );
  GiveNamedItem( "weapon_smg1" );
  GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_ar2" );
  GiveNamedItem( "weapon_shotgun" );
  GiveNamedItem( "weapon_shotgun" );
  GiveNamedItem( "weapon_frag" );
  GiveNamedItem( "weapon_frag" );
  GiveNamedItem( "weapon_physcannon" );
  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" );


Somit haben wir auch diesen Teil erledigt.
Jetzt habt ihr einen recht guten Überblick wie man die Waffen umcoden kann.


Das war dann soweit alles. Ich hoffe ihr könnt das Tutorial gebrauchen.
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:


'''Jetzt wisst ihr wie man:'''
Aufbau der Legende:


*Die Schußfrequenz ändert
//Waffe im Spiel(Primär Ammo, Sekundär Ammo)
*Die Magazingröße ändert
Befehl zum aufnehmen der Waffe
*Die Startwaffen festlegt
Befehl zum aufnehmen der Munition der Waffe(Primär)
*Die Munition für die Startwaffen festlegt
Befehl zum aufnehmen der Munition der Waffe(Sekundär)
*Welche Waffen, welche Munition benötigen


==Waffen Schaden ändern==
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");


So nun kommen wir zum einstellen des Schadens den eine Waffe bei einem Schuß anrichtet!
//Revolver(357):
Der Schaden jeder Waffe wird im Scripts ordner in der jewiligen weapon_ Textdatei festgelegt.
GiveNamedItem( "weapon_357" );
CBasePlayer::GiveAmmo( 30, "357" );


Nehmen wir uns mal die weapon_pistol.txt!
//SMG1(SMG1, smg1_grenade):
GiveNamedItem( "weapon_smg1" );
CBasePlayer::GiveAmmo( 500, "SMG1");
CBasePlayer::GiveAmmo( 5, "smg1_grenade");


Om oberen Teil steht diese Zeile:
//AR2(AR2, AR2AltFire):
GiveNamedItem( "weapon_ar2" );
CBasePlayer::GiveAmmo( 900, "AR2" );
CBasePlayer::GiveAmmo( 5, "AR2AltFire" );


  "damage" "8"
  //Shotgun(Buckshot):
GiveNamedItem( "weapon_shotgun" );
CBasePlayer::GiveAmmo( 255, "Buckshot");


Dort wird also festgelegt das Jeder schuß aus der Pistole einen Schaden von 8 Healthpoints macht!
//Handgranaten(grenade):
Ändern wie diesen wert mal wie folgt:
GiveNamedItem( "weapon_frag" );
CBasePlayer::GiveAmmo( 15, "grenade" );


  "damage" "50"
  //Armbrust(XBowBolt):
GiveNamedItem( "weapon_crossbow" );
CBasePlayer::GiveAmmo( 5, "XBowBolt" );


Nun macht jeder Schuß aus der Pistole einen Schaden von 50 Healthpoints.
//Raketenwerfer(rpg_round):
GiveNamedItem( "weapon_rpg" );
CBasePlayer::GiveAmmo( 5, "rpg_round");


Das war es auch schon wieder mit dem Tutorial für das Waffencoding!
//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" );