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 
|