De/Recoding Weapons: Difference between revisions

From Valve Developer Community
< De
Jump to navigation Jump to search
m (→‎Einleitung: Pre to list)
Line 412: Line 412:
==Waffen Schaden ändern==
==Waffen Schaden ändern==


//@WIP
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:
"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!


==Bonus==
==Bonus==

Revision as of 02:44, 14 April 2006

Broom icon.png
This article or section should be converted to third person to conform to wiki standards.

Einleitung

Hallo,Ich möchte euch in diesem Tutorial erklären wie man schon mit simplen coding seinen eigenen kleinen HL2DM Coden 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!


Was ihr benötigt:

  • 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 Schussfrequenz umcoden

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:

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)

Das müsste so aussehen(Ich hab den Wert schon geändert!):

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/vertiefen.

Ändert den Wert mal in:

float	GetFireRate( void ) { return 0.005f; }	// Gefixt!(Extrem Langsam!)


Jetzt sollte eure Waffe extrem langsam sein :)

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. Eure waffe schiesst nun schneller.

Das könnt ihr auch bei dem Brecheisen und eigentlich allen anderen Waffen. Somit wisst ihr wie man die schussfrequenz ändern kann.

Die Munition erhöhen/verringern

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. Darin befinden sich alle waffenscripts die wir benötigen.

Nehmen wir wieder mal unsere SMG1. Diese besitzt folgendes script:

weapon_smg1.txt 

Nun müsst ihr sie mit dem Editor öffnen. Jetzt können wir uns erstmal den Aufbau angucken.

Natürlich wird es euch bestimmt verwirren was dort alles drin ist aber wir brauchen nur diese Teile:

// Weapon data is loaded by both the Game and Client DLLs.
"printname"	"#HL2_SMG1"
"clip_size"			"45"
"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).
"default_clip"			"45"           //Legt fest wieviel Ammo die Waffe im Magazin(Primär Munition) hat wenn man sie aufnimmt
"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.

Jetzt solltet ihr erstmal einen kleinen einblick haben wie der obere und hier acuh wichtige Teil aufgebaut ist.

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


Nur 2 dieser einträge kann und sollte man nicht ändern:

"clip2_size"			"-1"
"default_clip2"		"-1"

Diese sind nämlich im Code festgelegt aber darum kümmern wir uns auch noch.

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

Als erstes nehmen wir diesen Eintrag:

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

Aber da wir jetzt auch noch die Standart Werte haben müssen wir uns nochmal an die weapon_smg1.txt machen!

Jetzt schreiben wir mal diese Zeile um:

"clip_size"			"45"

Am besten wir schreiben den Wert auf 100 Schuß um:

"clip_size"			"100"

Jetzt kann unsere Waffe schon 100 Schuß tragen.

Aber einen fehler gibt es noch und zwar diesen:

"default_clip"			"45"

Jedes mal wenn wir die Waffe aufnehmen hätten wir nur 45 Schuß im Magazin also auch auf 100 Stellen:

"default_clip"			"100"

Nun haben wir eine kleine Minigun gecodet die sehr schnell schiesst und dazu noch alle Werte wie eine echte Minigun hat. Natürlich haben wir noch 2 Einträge vergesen und zwar:

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

Natürlich könnten wir jetzt erstmal nicht viel damit machen aber wir könnten den Eintrag für die Sekundäre Munition auskommentieren:

//"secondary_ammo"		"SMG1_Grenade"

Oder falls es dabei fehler gibt dann machen wir bei der Munitionstyp angabe NONE rein dann gibt es keine alternativen Munitionstyp!

"secondary_ammo"		"None" //das sorgt dafür das es keine alternative Munition gibt.

Somit können wir nur Primäre Munition aufnehmen aber trotzdem haben wir ja noch die granaten beim Start! Das wird sich aber bald ändern den dafür werden wir noch den Code umschreiben.

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:

"primary_ammo"			"AR2"

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. Jetzt kommen wir wieder zurück zum Coding teil!

Ü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!

Hier mal eine Übersicht welche Waffen und Welche Munition ihr einbauen könnt:

//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" );

Gesamt Munition erhöhen/verringern

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

Dafür brauchen wir folgende Dateien:

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:

CAmmoDef *GetAmmoDef()

Dort findet ihr solche Einträge:

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! 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:

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

Jetzt können wir insgesamt 1000 Schuß im SMG1 mit uns führen wenn wir compilieren.

Und wir müssen noch die Granaten abstellen!

Das machen wir wie bei der extra Munition, erstmal diese Zeile suchen:

def.AddAmmoType("SMG1_Grenade",		DMG_BURN,					TRACER_NONE,			0,
0,			3,			0,							0 );

Diese ändern wir dann von der 3 in 0:

def.AddAmmoType("SMG1_Grenade",		DMG_BURN,					TRACER_NONE,			0,
0,			0,			0,							0 );


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

Dazu müssen wir die zweite cpp öffnen:

src\game_shared\hl2mp\hl2mp_gamerules.cpp

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

void CHL2MP_Player::GiveDefaultItems( void )

Diese legt fest welche Startwaffen man bekommt! Uns interesiert erstmal nur der Teil:

//Diese Funktion gibt uns den Anzug!
EquipSuit();
//Diese Methoden geben uns die Munition und die Waffe dafür!
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" );


Somit habt ihr jetzt einen Überblick mit welchem Aufruf ihr welche Waffe mit der dazugehörigen Munition bekommt.


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

Aber warum ändern wir das nich mal was :)?

Machen wir uns mal einen richtigen Deathmatch!

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:

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


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:

//CBasePlayer::GiveAmmo( 200,	"Pistol");
CBasePlayer::GiveAmmo( 30,	"357" );
CBasePlayer::GiveAmmo( 250,	"SMG1");
CBasePlayer::GiveAmmo( 5,	"grenade" );
CBasePlayer::GiveAmmo( 20,	"Buckshot");
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:

GiveNamedItem( "weapon_pistol" );
GiveNamedItem( "weapon_smg1" );
GiveNamedItem( "weapon_frag" );
GiveNamedItem( "weapon_physcannon" );

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

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

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.


Jetzt wisst ihr wie man:

Die Schußfrequenz ändert
Die Magazingröße ändert
Die Startwaffen festlegt
Die Munition für die Startwaffen festlegt
Welche Waffen, welche Munition benötigen

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:

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

Bonus

Hier noch eine Erklärung wie ihr diesen Cheat unbrauchbar macht:

impulse 101

Dazu müsst ihr nur im code der oberen cpp etwas auskommentieren!

//Diese cpp raucht ihr:
src\dlls\hl2mp\hl2mp_player.cpp

Dort geht ihr zu Zeile 149 also zur Methode void CHL2MP_Player::GiveAllItems( void )

Nun müsst ihr nur unter den Funktionsaufruf EquipSuit(); den gesamten code bis zum ende der Methode auskomentieren.

Am besten mit dem:

/* */

dann sieht eure Methode so aus:

void CHL2MP_Player::GiveAllItems( void )
{
EquipSuit();
//Code wurde auskommentiert (gegen Cheater gut!)
/*
 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" );
 GiveNamedItem( "weapon_crowbar" );
 GiveNamedItem( "weapon_stunstick" );
 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" );
 GiveNamedItem( "weapon_physcannon" );
*/
}

Somit ist der Cheat unbrauchbar! Das solltet ihr erst nach dem eure Mod im Waffencoding fertig ist einbauen!