De/Gibs

From Valve Developer Community
< De
Revision as of 08:41, 17 April 2013 by Sacaldur (talk | contribs) (Created page with "{{otherlang2 |en=Gibs }} Hallo Freunde der Programmierung, Heute werden wir Gibs für Zombines erstellen. Dies funktioniert auch für andere NPCs/Spieler, wenn du ein wenig progr...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Template:Otherlang2 Hallo Freunde der Programmierung, Heute werden wir Gibs für Zombines erstellen. Dies funktioniert auch für andere NPCs/Spieler, wenn du ein wenig programmierst.

Event_Killed Bearbeiten

Als erstes öffnest du den Zombine-Code (npc_zombine.cpp), suchst nach "Event_Killed" und löschst alles mit Ausnahme von BaseClass::Event_Killed( info ). Dies ruft das reguläre Event_Killed, sodass wir immernoch einen Ragdoll haben und der Zombine korrekt stirbt.

Als nächstes erstellst du die Gib-Modelle. Du kannst ein Paket von Garrysmod.org herunterladen, wenn du willst. In diesem Fall musst du bestätigen, dass du Garys Mod legal besitzt, um dort irgendetwas herunterladen zu können.

Pack die Modelle in dein Mod-Verzeichnis und füge in dem Event_Killed-Abschnitt folgendes ein:

if( info.GetDamageType() & ( DMG_BUCKSHOT | DMG_BLAST ) )
{
	SetModel( "models/zombie/classic_legs.mdl" );

	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p1.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p2.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p3.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p4.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/pgib_p5.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_jaw.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_scapula.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/hgibs_scapula.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p1.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p2.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p3.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p4.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p5.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/rgib_p6.mdl", 5 );
	CGib::SpawnSpecificGibs( this, 1, 750, 1500, "models/gibs/gibhead.mdl", 5 );
}

Dies sorgt dafür, dass, wenn du den Zombine mit einer Waffe mit Buckshot Ammo (Schrotflinte) anschießt oder der Zombine Explosivschaden nimmt, dass er in viele Stücke zerspringt und sein Torso verliert. Es gibt verschiedene DMGs in shareddefs.h, wie DMG_BURN oder DMG_BULLET, also kannst du (DMG_BUCKSHOT | DMG_BLAST) mit den Schadensarten deiner Wahl ersetzen.

Du kannst mit einem | mehr Schadensarten 'hinzufügen'.

Vor dem Kompilieren solltest du sicher gehen, dass du die verwendeten Models Precachest, da du sonst Fehler bekommst.

Wenn du dieses Verhalten des Gegners nur ab einer bestimmten Menge von Schaden herbaiführen willst, dann füge diese Bedingung zur Vorherigen im oberen Beispiel hinzu:

if( info.GetDamage() >= ( m_iMaxHealth * 0.75f ) )
{
	//Earlier Gib Function
}

In diesem Fall muss dem Gegner ein Schaden von ~75 % seiner maximalen Lebensenergie verpasst werden.

Ausblenden/Entfernen von Gibs

Wenn du mit dem Multiplayer SDK arbeitest, willst du, dass deine Gibs nach einer Weile ausgeblendet werden, statt in der Welt zu verbleiben. Das Problem ist, dass die SpawnSpecificGibs-Funktion keinen Parameter für eine Lebensdauer entgegennimmt (5 Sekunden, wie im letzten Beispiel erwähnt).

Um diesen Fehler zu beheben, lade die Quelldatei (gib.cpp), finde die Funktion "CGib::SpawnSpecificGibs" und füge dies an Stelle der ursprünglichen Funktion ein.

void CGib::SpawnSpecificGibs(	CBaseEntity*	pVictim, 
								int				nNumGibs, 
								float			vMinVelocity, 
								float			vMaxVelocity, 
								const char*		cModelName,
								float			flLifetime)
{
	for ( int i = 0; i < nNumGibs; i++ )
	{
		CGib *pGib = CREATE_ENTITY( CGib, "gib" );
		pGib->Spawn( cModelName, flLifetime );
		pGib->m_nBody = i;
		pGib->InitGib( pVictim, vMinVelocity, vMaxVelocity );
		pGib->m_lifeTime = flLifetime;

		if ( pVictim != NULL )
		{
			pGib->SetOwnerEntity( pVictim );
		}
	}
}

Der Unterschied zwischen den beiden Funktionen ist, dass die Spawn-Funktion jetzt den Lebensdauer-Parameter verwendet, um den Zeitpunkt des Ausblendens zu wissen.

Brennende Gibs durch entflammte Player

Mal angenommen, du triffst einen entzündeten Spieler gut gezielt mit einer Rakete, also willst du ihn vielleicht in brennende Einzelteile zerspringen lassen. Wenn ja, dann musst du lediglich die folgende Bedingung einfügen, welche das Spiel fragt, ob das Opfer brennt und ggf. seine Einzelteile ebenfalls anzündet.

void CGib::SpawnSpecificGibs(	CBaseEntity*	pVictim, 
								int				nNumGibs, 
								float			vMinVelocity, 
								float			vMaxVelocity, 
								const char*		cModelName,
								float			flLifetime)
{
	for ( int i = 0; i < nNumGibs; i++ )
	{
		CGib *pGib = CREATE_ENTITY( CGib, "gib" );
		pGib->Spawn( cModelName, flLifetime );
		pGib->m_nBody = i;
		pGib->InitGib( pVictim, vMinVelocity, vMaxVelocity );
		pGib->m_lifeTime = flLifetime;

		if ( pVictim != NULL )
		{
			pGib->SetOwnerEntity( pVictim );
		}

		//If pVictim is on fire, ignite pVictim's gibs as well.
		if ( pVictim->GetFlags() & FL_ONFIRE )
		{
			pGib->Ignite( ( flLifetime - 1 ), false );
		}
	}
}