Einzelnen Beitrag anzeigen
  #1  
Alt 10-07-2003, 21:24
Benutzerbild von Antr4ks.de
Antr4ks.de Antr4ks.de ist offline
EVA Programmierer

 
Registriert seit: Jul 2001
Beiträge: 2.528
Antr4ks.de hat noch keine Bewertung oder ist auf 0
OL Nick: Antr4ks
An alle C++ Profis, habe Kompilierungsfehler

Hi Leutz, bin grad an nem Mod für Half-Life dran, hab n bisschen im Netz gesucht und echt gute Skripte gefunden. Da hab ich auch ein Skript wie man n Flammenwerfer erstellt. Nur leider hab ichs SDK 2.3 und das Skript wurde sicher für n früheres geschrieben, deshalb bekam ich auch n paar Fehler. Die meisten hab ich gefixt, doch jetzt ist noch ein Fehler da, den ich nicht wegkrieg.
Hier ist erstmal der Code vom Flammenwerfer:

Zitat:
flamethrower.cpp
---------------------------------------------------------------------------------

//zuerst mal die ganzen includes...
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"
#include "shake.h" //braucht man nur, wenn man den Spieler beim Auslösen durchschütteln will

//Hier fängt der spannende Teil an: Meine Flamme besteht aus (bis zu 15) "Feuerbällen". Die werden hier "gemacht".
class CFireBall : public CBaseEntity
{
void Spawn( void );
void Precache( void );
void EXPORT AnimateThink( void );
void EXPORT ExplodeTouch( CBaseEntity *pOther );

EHANDLE m_hOwner;

public:
static CFireBall *BallCreate( void );

};


LINK_ENTITY_TO_CLASS( fire_ball, CFireBall );

//Hiermit wird ein neuer Feuerball erstellt...
CFireBall *CFireBall::BallCreate( void )
{
CFireBall *pBall = GetClassPtr( (CFireBall *)NULL );
pBall->pev->classname = MAKE_STRING("fireball");
pBall->Spawn();

return pBall;
}


void CFireBall :: Spawn( void )
{
Precache( );
pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_BBOX;

SET_MODEL(ENT(pev), "sprites/xspark4.spr");
pev->rendermode = kRenderTransAdd;
pev->rendercolor.x = 255;
pev->rendercolor.y = 255;
pev->rendercolor.z = 255;
pev->renderamt = 255;
pev->scale = 0.2;

UTIL_SetSize(pev, Vector( 0, 0, 0), Vector(0, 0, 0));
UTIL_SetOrigin( pev, pev->origin );

SetThink( AnimateThink ); //Das wird jetzt immer wieder ausgeführt...

//Wenn man beim Auftreffen der Bälle irgendwas machen will (Sound, anderes Sprite),
//muss man die nächste Zeile wieder ent-kommentieren
// SetTouch( ExplodeTouch );

m_hOwner = Instance( pev->owner );
pev->dmgtime = gpGlobals->time; // keep track of when ball spawned
pev->nextthink = gpGlobals->time + 0.03;
}


void CFireBall :: Precache( void )
{
PRECACHE_MODEL("sprites/xspark4.spr"); //wir brauchen bloß ein Sprite
}


void CFireBall :: AnimateThink( void )
{
pev->nextthink = gpGlobals->time + 0.05; //das nächste Mal in einer zwanzigstel Sekunde ausführen

pev->frame = ((int)pev->frame + 1) % 11; //Das Sprite ein bischen animieren...
pev->scale = pev->scale * 1.5; //Ganz wichtig: hier wird das Sprite vergrößert
//Am Anfang ist es ganz klein und wird dann immer größer

entvars_t *pevOwner;
if ( pev->owner )
pevOwner = VARS( pev->owner );
else
pevOwner = NULL;
pev->owner = NULL; // can't traceline attack owner if this is set

RadiusDamage( pev->origin, pev, pevOwner, 1, pev->scale * 10, CLASS_NONE, DMG_BURN );
//Hier richten wir dann den Schaden an. Der Ausmaß orientiert sich auch ander Größe des Sprites
//Pro Feuerball ziehe ich hier einen Lebenspunkt ab. Bei 30 Feuerbällen pro Sekunde ist das nicht wenig. Man kann es natürlich noch erhöhen...

//Wenn das Sprite länger als eine halbe Sekunde lebt, wird es hier zerstört.
if (gpGlobals->time - pev->dmgtime > 0.5 || pev->velocity.Length() < 10)
{
SetTouch( NULL );
UTIL_Remove( this );
}
}


void CFireBall::ExplodeTouch( CBaseEntity *pOther )
{

//Wenn man das weiter oben aktiviert hat kann man hier seinen Code reinschreiben...

UTIL_Remove( this );
}



//Hier fängt endlich die eigentliche Waffe an!





LINK_ENTITY_TO_CLASS( weapon_flamethrower, CFlamethrower ); //Unsere Waffe heißt "weapon_flamethrower"

//Ich verwende das Model der Egon. Passt eigentlich ganz gut.
enum egon_e {
EGON_IDLE1 = 0,
EGON_FIDGET1,
EGON_ALTFIREON,
EGON_ALTFIRECYCLE,
EGON_ALTFIREOFF,
EGON_FIRE1,
EGON_FIRE2,
EGON_FIRE3,
EGON_FIRE4,
EGON_DRAW,
EGON_HOLSTER
};

int CFlamethrower::AddToPlayer( CBasePlayer *pPlayer ) //langweilig, aber nötig...
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}

void CFlamethrower::Spawn( ) //Hier wird das Model zum Aufsammeln gespawned
{
Precache( );
m_iId = 16;
SET_MODEL(ENT(pev), "models/w_egon.mdl");
m_iClip = 20;
FallInit();
}

void CFlamethrower::Precache( void )
{
//Wir brauchen drei Models (wie für jede Waffe)
PRECACHE_MODEL("models/w_egon.mdl");
PRECACHE_MODEL("models/v_egon.mdl");
PRECACHE_MODEL("models/p_egon.mdl");

//Und zwei Sounds. Die müsst ihr schon selber machen.
PRECACHE_SOUND("weapons/flamethrower.wav"); //FLAMMENWERFER AKTIV
PRECACHE_SOUND("weapons/flameout.wav"); //FLAMME STIRBT

//Das ist ganz wichtig; wir brauchen für unsere Waffe Feuerbälle
UTIL_PrecacheOther( "fire_ball" );

}
int CFlamethrower::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "uranium"; //wir verwenden die gleiche Muni wie für Egon und Gauss. Könnt ihr ändern.
p->iMaxAmmo1 = URANIUM_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = WEAPON_NOCLIP;
p->iSlot = 0; //Ich hab die Waffe direkt unter die Brechstange gesetzt. Wollt ihr sicher auch ändern.
p->iPosition = 1;
p->iId = m_iId = 16;
p->iFlags = 0;
p->iWeight = EGON_WEIGHT;
return 1;
}


BOOL CFlamethrower:eploy( void )
{
return DefaultDeploy( "models/v_egon.mdl", "models/p_egon.mdl", EGON_DRAW, "egon" );
}

void CFlamethrower::Holster( int skiplocal /* = 0 */ )
{
SendWeaponAnim( EGON_HOLSTER );
}

//Aha, jetzt wirds ernst.

void CFlamethrower::PrimaryAttack()
{
if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] <= 0)
return; //Pech, Ammo ist leer...

if (!Working) {m_flAmmoUseTime = gpGlobals->time;} //Wenn wir gerade erst anschalten -> zieh gleich mal ein Ammo ab!
m_flTimeWeaponIdle = gpGlobals->time + 0.1;
m_flNextPrimaryAttack = gpGlobals->time + 0.1; //sollte klar sein
SendWeaponAnim( EGON_FIRE4 ); //sucht euch eine aus..
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_STATIC, "weapons/flamethrower.wav", 0.98, ATTN_NORM, 0, 125 ); //unser Sound läuft
Working = TRUE;

if ( gpGlobals->time >= m_flAmmoUseTime ) //Zieh ein Ammo ab, wenn die Zeit reif ist
{
UseAmmo( 1 );
m_flAmmoUseTime = gpGlobals->time + 0.2;
}

Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle;
UTIL_MakeVectors( anglesAim );
anglesAim.x = -anglesAim.x;
Vector vecSrc = m_pPlayer->GetGunPosition( ) - gpGlobals->v_up * 2; //Wo wir sind..
Vector vecDir = gpGlobals->v_forward; // ..und wo wir hinwollen!

float delta = 0.06976; //8 Grad Abweichung..

//Jetzt werden drei Feuerbälle ertellt. Alle mit zufälliger Abweichung und Geschwindigkeit

vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) );
CFireBall *pBall1 = CFireBall::BallCreate();
pBall1->pev->origin = vecSrc;
pBall1->pev->angles = anglesAim;
pBall1->pev->owner = m_pPlayer->edict();
pBall1->pev->velocity = vecDir * RANDOM_FLOAT( 400, 600 );

vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) );
CFireBall *pBall2 = CFireBall::BallCreate();
pBall2->pev->origin = vecSrc;
pBall2->pev->angles = anglesAim;
pBall2->pev->owner = m_pPlayer->edict();
pBall2->pev->velocity = vecDir * RANDOM_FLOAT( 400, 600 );

vecDir = vecDir + Vector( RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ), RANDOM_FLOAT( -delta, delta ) );
CFireBall *pBall3 = CFireBall::BallCreate();
pBall3->pev->origin = vecSrc;
pBall3->pev->angles = anglesAim;
pBall3->pev->owner = m_pPlayer->edict();
pBall3->pev->velocity = vecDir * RANDOM_FLOAT( 400, 600 );
}


//der WeaponIdle wird etwas Zweckentfremdet. Hier stellen wir fest, wenn der Spieler aufhört zu feuern.
void CFlamethrower::WeaponIdle()
{
if (m_pPlayer->pev->button & IN_ATTACK)
return;

if (Working == TRUE)
{
EMIT_SOUND(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/flameout.wav", 0.8, ATTN_NORM);
Working = FALSE;
SendWeaponAnim( EGON_FIDGET1 ); //Dreh am Hebel des Flammenwerfers
}
m_flTimeWeaponIdle = gpGlobals->time + 0.1;
return;
}




So, wenn ich jetzt kompielieren will, zeigt der Compiler (Visual c++ 6.0) den Fehler

Zitat:
--------------------Konfiguration: hl - Win32 Profile--------------------
Kompilierung läuft...
flamethrower.cpp
C:\SIERRA\SDK\Source Code\dlls\flamethrower.cpp(207) : error C2065: 'Working' : nichtdeklarierter Bezeichner
Fehler beim Ausführen von cl.exe.

flamethrower.obj - 1 Fehler, 0 Warnung(en)
(Siehe Rot!)

Könnt ihr mir helfen? Was muss ich machen??
THX Wenn ihrs könnt
__________________
ESL-Playersheet
// ESL Admin Team
Mit Zitat antworten