Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
18.07.2001, 23:11
fsell



Hi

ich hab hier ein paar Fragen:

1. in der tutorial Sammlung (hier) wird beschrieben, wie man den Zoommodus der Armbrust stufenlos machen kann. allerdings erhalte ich immer folgende Fehler:

crossbow.cpp: In method `void CCrossbowBolt::ZoomThink()':
crossbow.cpp:69: `m_pPlayer' undeclared (first use this function)
crossbow.cpp:69: (Each undeclared identifier is reported only once
crossbow.cpp:69: for each function it appears in.)
crossbow.cpp:73: confused by earlier errors, bailing out
make: *** [crossbow.o] Error 1

ich hab alles befolgt wie beschrieben nur die Funktion "CCrossbowBolt::Deploy()" hab ich nicht gefunden, die steht bei mir nirgens drin nur die Funktion "BOOL CCrossbow::Deploy( )".
ebenso bin ich mir nicht sicher ob ich die ersten drei Zeilen korrekt plaziert hab. (in die func. "class CCrossbowBolt : public CBaseEntity" unter "public:"

mach ich noch irgendwas anderes falsch? falls jemand das schonmal nachgebaut hat kann er mir die Datei auch mailen.

###

2. ich hab in der Settings.scr eine EingabeLeiste eingefügt, mit der man "SV_maxspeed" einstellen kann. wenn jetzt die map gestertet wird setzt er korrekt "sv_maxspeed" auf den eingegebenen Wert. Allerdings 5 Zeilen später wieder auf "270". In welcher Datei ausser der "game.cfg" wird dieser Wert angegeben?

###

3. wie mach ich dass die Healthautomaten mehr als +30 aufladen? (z.B. wie bei SvenCoop) hab nur gefunden wie man die Sounds verstellt.

###

4. Feuerfrequenz erhöhen

###

5. Schwerkraft aufheben aber nicht "sv_gravity 0", da klebt man immer an der Decke. Is zwar auch mal was anderes aber man ist so langsam. Is will eher sowas haben wie "noclip" modus bzw wie im wasser.

Ich würd mich auf Antwort freuen.

fsell

P.S. ich weiß, dass es dazu wahrscheinlich etliche tuts im netz gibt aber ich kann zur Zeit nur über I-Net-Cafes rein, da die plöde telekom das DSL hier nicht hinbekommen... :(

--

zum Seitenanfang zum Seitenende Profil || Suche
001
18.07.2001, 23:33
Diablo_bth



probiers mal hiermit:
Das funst wie in UT
( meine crossbow.cpp wird hier vermutlich wegen der kurzen Zeilen abgespackt wirken! )

Quellcode:
/***
bla bla
****/

#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "weapons.h"
#include "nodes.h"
#include "player.h"
#include "gamerules.h"

#define BOLT_AIR_VELOCITY 2000
#define BOLT_WATER_VELOCITY 1000

// UNDONE: Save/restore this?  Don't forget to set classname and LINK_ENTITY_TO_CLASS()
//
// OVERLOADS SOME ENTVARS:
//
// speed - the ideal magnitude of my velocity
class CCrossbowBolt : public CBaseEntity
{
void Spawn( void );
void Precache( void );
int  Classify ( void );
void EXPORT BubbleThink( void );
void EXPORT BoltTouch( CBaseEntity *pOther );
//void EXPORT ExplodeThink( void );

int m_iTrail;

public:
static CCrossbowBolt *BoltCreate( void );
};
LINK_ENTITY_TO_CLASS( crossbow_bolt, CCrossbowBolt );

CCrossbowBolt *CCrossbowBolt::BoltCreate( void )
{
// Create a new entity with CCrossbowBolt private data
CCrossbowBolt *pBolt = GetClassPtr( (CCrossbowBolt *)NULL );
pBolt->pev->classname = MAKE_STRING("bolt");
pBolt->Spawn();

return pBolt;
}

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

pev->gravity = 0.5;

SET_MODEL(ENT(pev), "models/crossbow_bolt.mdl");

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

SetTouch( BoltTouch );
SetThink( BubbleThink );
pev->nextthink = gpGlobals->time + 0.2;
}


void CCrossbowBolt::Precache( )
{
PRECACHE_MODEL ("models/crossbow_bolt.mdl");
PRECACHE_SOUND("weapons/xbow_hitbod1.wav");
PRECACHE_SOUND("weapons/xbow_hitbod2.wav");
PRECACHE_SOUND("weapons/xbow_fly1.wav");
PRECACHE_SOUND("weapons/xbow_hit1.wav");
PRECACHE_SOUND("fvox/beep.wav");
m_iTrail = PRECACHE_MODEL("sprites/streak.spr");
}


int CCrossbowBolt :: Classify ( void )
{
return CLASS_NONE;
}

void CCrossbowBolt::BoltTouch( CBaseEntity *pOther )
{
SetTouch( NULL );
SetThink( NULL );

if (pOther->pev->takedamage)
{
TraceResult tr = UTIL_GetGlobalTrace( );
entvars_t *pevOwner;

pevOwner = VARS( pev->owner );

// UNDONE: this needs to call TraceAttack instead
ClearMultiDamage( );

if ( pOther->IsPlayer() )
{
pOther->TraceAttack(pevOwner, gSkillData.plrDmgCrossbowClient, pev->velocity.Normalize(), &tr, DMG_NEVERGIB );
}
else
{
pOther->TraceAttack(pevOwner, gSkillData.plrDmgCrossbowMonster, pev->velocity.Normalize(), &tr, DMG_BULLET | DMG_NEVERGIB );
}

ApplyMultiDamage( pev, pevOwner );

pev->velocity = Vector( 0, 0, 0 );
// play body "thwack" sound
switch( RANDOM_LONG(0,1) )
{
case 0:
EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM); break;
case 1:
EMIT_SOUND(ENT(pev), CHAN_WEAPON, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM); break;
}

if ( !g_pGameRules->IsMultiplayer() )
{
Killed( pev, GIB_NEVER );
}
}
else
{
EMIT_SOUND_DYN(ENT(pev), CHAN_WEAPON, "weapons/xbow_hit1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 98 + RANDOM_LONG(0,7));

SetThink( SUB_Remove );
pev->nextthink = gpGlobals->time;// this will get changed below if the bolt is allowed to stick in what it hit.

if ( FClassnameIs( pOther->pev, "worldspawn" ) )
{
// if what we hit is static architecture, can stay around for a while.
Vector vecDir = pev->velocity.Normalize( );
UTIL_SetOrigin( pev, pev->origin - vecDir * 12 );
pev->angles = UTIL_VecToAngles( vecDir );
pev->solid = SOLID_NOT;
pev->movetype = MOVETYPE_FLY;
pev->velocity = Vector( 0, 0, 0 );
pev->avelocity.z = 0;
pev->angles.z = RANDOM_LONG(0,360);
pev->nextthink = gpGlobals->time + 10.0;
}

if (UTIL_PointContents(pev->origin) != CONTENTS_WATER)
{
UTIL_Sparks( pev->origin );
}
}

if ( g_pGameRules->IsMultiplayer() )
{
// SetThink( ExplodeThink );
pev->nextthink = gpGlobals->time + 0.1;
}
}

void CCrossbowBolt::BubbleThink( void )
{
pev->nextthink = gpGlobals->time + 0.1;

if (pev->waterlevel == 0)
return;

UTIL_BubbleTrail( pev->origin - pev->velocity * 0.1, pev->origin, 1 );
}

enum crossbow_e {
CROSSBOW_IDLE1 = 0, // full
CROSSBOW_IDLE2, // empty
CROSSBOW_FIDGET1, // full
CROSSBOW_FIDGET2, // empty
CROSSBOW_FIRE1, // full
CROSSBOW_FIRE2, // reload
CROSSBOW_FIRE3, // empty
CROSSBOW_RELOAD, // from empty
CROSSBOW_DRAW1, // full
CROSSBOW_DRAW2, // empty
CROSSBOW_HOLSTER1, // full
CROSSBOW_HOLSTER2, // empty
};


class CCrossbow : public CBasePlayerWeapon
{
public:
void Spawn( void );
void Precache( void );
int iItemSlot( ) { return 3; }
int GetItemInfo(ItemInfo *p);

void PrimaryAttack( void );
void SecondaryAttack( void );
int AddToPlayer( CBasePlayer *pPlayer );
BOOL Deploy( );
void Holster( int skiplocal = 0 );
void Reload( void );
void WeaponIdle( void );

int m_fInZoom; // don't save this

//für stufenloses Zooming!!!!!!!!!!!! <<-------------------------------->>
double m_dEnd; // für Zeitmessung um
double m_dStart; // den Zoom zurückzusetzen
double m_dAttack_Time; // Zeit bis wieder geffeurt wird (second. Attak)
};
LINK_ENTITY_TO_CLASS( weapon_crossbow, CCrossbow );

void CCrossbow::Spawn( )
{
Precache( );
m_iId = WEAPON_CROSSBOW;
SET_MODEL(ENT(pev), "models/w_crossbow.mdl");

m_iDefaultAmmo = CROSSBOW_DEFAULT_GIVE;

FallInit();// get ready to fall down.
}

int CCrossbow::AddToPlayer( CBasePlayer *pPlayer )
{
if ( CBasePlayerWeapon::AddToPlayer( pPlayer ) )
{
MESSAGE_BEGIN( MSG_ONE, gmsgWeapPickup, NULL, pPlayer->pev );
WRITE_BYTE( m_iId );
MESSAGE_END();
return TRUE;
}
return FALSE;
}

void CCrossbow::Precache( void )
{
PRECACHE_MODEL("models/w_crossbow.mdl");
PRECACHE_MODEL("models/v_crossbow.mdl");
PRECACHE_MODEL("models/p_crossbow.mdl");

PRECACHE_SOUND("weapons/xbow_fire1.wav");
PRECACHE_SOUND("weapons/xbow_reload1.wav");

UTIL_PrecacheOther( "crossbow_bolt" );
}


int CCrossbow::GetItemInfo(ItemInfo *p)
{
p->pszName = STRING(pev->classname);
p->pszAmmo1 = "bolts";
p->iMaxAmmo1 = BOLT_MAX_CARRY;
p->pszAmmo2 = NULL;
p->iMaxAmmo2 = -1;
p->iMaxClip = CROSSBOW_MAX_CLIP;
p->iSlot = 4;
p->iPosition = 0;
p->iId = WEAPON_CROSSBOW;
p->iFlags = 0;
p->iWeight = CROSSBOW_WEIGHT;
return 1;
}


BOOL CCrossbow::Deploy( )
{
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF));
if (m_iClip)
return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW1, "bow" );
return DefaultDeploy( "models/v_crossbow.mdl", "models/p_crossbow.mdl", CROSSBOW_DRAW2, "bow" );
}

void CCrossbow::Holster( int skiplocal /* = 0 */ )
{
m_fInReload = FALSE;// cancel any reload in progress.

if ( m_fInZoom )
{
m_dEnd = 0.0;
SecondaryAttack( );
}

m_pPlayer->m_flNextAttack = UTIL_WeaponTimeBase() + 0.5;
if (m_iClip)
SendWeaponAnim( CROSSBOW_HOLSTER1 );
else
SendWeaponAnim( CROSSBOW_HOLSTER2 );
}

void CCrossbow::PrimaryAttack( void )
{
m_flNextPrimaryAttack = gpGlobals->time + 0.65;

if (m_iClip == 0)
{
PlayEmptySound( );
return;
}

TraceResult tr;

m_pPlayer->m_iWeaponVolume = QUIET_GUN_VOLUME;
m_iClip--;

// make twang sound
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_WEAPON, "weapons/xbow_fire1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF));

if (m_iClip)
{
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF));
SendWeaponAnim( CROSSBOW_FIRE1 );
}
else if (m_pPlayer->m_rgAmmo[m_iPrimaryAmmoType] == 0)
{
SendWeaponAnim( CROSSBOW_FIRE3 );
}

// player "shoot" animation
m_pPlayer->SetAnimation( PLAYER_ATTACK1 );

Vector anglesAim = m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle;
UTIL_MakeVectors( anglesAim );
Vector vecSrc = m_pPlayer->GetGunPosition( ) - gpGlobals->v_up * 2;
Vector vecDir = gpGlobals->v_forward;

UTIL_TraceLine(vecSrc, vecSrc + vecDir * 8192, dont_ignore_monsters, m_pPlayer->edict(), &tr);

if ( tr.pHit->v.takedamage )
{
switch( RANDOM_LONG(0,1) )
{
case 0:
EMIT_SOUND( tr.pHit, CHAN_BODY, "weapons/xbow_hitbod1.wav", 1, ATTN_NORM); break;
case 1:
EMIT_SOUND( tr.pHit, CHAN_BODY, "weapons/xbow_hitbod2.wav", 1, ATTN_NORM); break;
}

ClearMultiDamage( );
CBaseEntity::Instance(tr.pHit)->TraceAttack(m_pPlayer->pev, 120, vecDir, &tr, DMG_BULLET | DMG_NEVERGIB );
ApplyMultiDamage( pev, m_pPlayer->pev );
}
else
{
// create a bolt
CCrossbowBolt *pBolt = CCrossbowBolt::BoltCreate();
pBolt->pev->origin = tr.vecEndPos - vecDir * 10;
pBolt->pev->angles = UTIL_VecToAngles( vecDir );
pBolt->pev->solid = SOLID_NOT;
pBolt->SetTouch( NULL );
pBolt->SetThink( SUB_Remove );

EMIT_SOUND( pBolt->edict(), CHAN_WEAPON, "weapons/xbow_hit1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM );

if (UTIL_PointContents(tr.vecEndPos) != CONTENTS_WATER)
{
UTIL_Sparks( tr.vecEndPos );
}

if ( FClassnameIs( tr.pHit, "worldspawn" ) )
{
// let the bolt sit around for a while if it hit static architecture
pBolt->pev->nextthink = gpGlobals->time + 5.0;
}
else
{
pBolt->pev->nextthink = gpGlobals->time;
}
}
}


extern int gmsgAwpZoom;

void CCrossbow::SecondaryAttack()
{
m_dStart = gpGlobals->time;

if( m_pPlayer->m_iFOV == 0 )
m_pPlayer->m_iFOV = 90; m_dAttack_Time = 0.02;

if( m_pPlayer->m_iFOV > 14 || !m_fInZoom )
{
m_fInZoom = 1; // zoom-flag
m_pPlayer->m_iFOV -= 4; // zoomen
m_dAttack_Time = 0.02;
}

if( (m_dStart - m_dEnd) > 0.65 && m_fInZoom ) // Zurücksetzen des Zoom`s
{
m_pPlayer->m_iFOV = 0;  // 0 means reset to default fov[Field of view]
m_fInZoom = 0; // zoom-flag aus
m_dAttack_Time = 0.2;
}

pev->nextthink = gpGlobals->time + 0.015;
m_flNextSecondaryAttack = gpGlobals->time + m_dAttack_Time;

m_dEnd = gpGlobals->time;
}


void CCrossbow::Reload( void )
{
if ( m_fInZoom )
{
m_dEnd = 0.0;
SecondaryAttack();
}

if (DefaultReload( 5, CROSSBOW_RELOAD, 4.5 ))
{
EMIT_SOUND_DYN(ENT(m_pPlayer->pev), CHAN_ITEM, "weapons/xbow_reload1.wav", RANDOM_FLOAT(0.95, 1.0), ATTN_NORM, 0, 93 + RANDOM_LONG(0,0xF));
}
}


void CCrossbow::WeaponIdle( void )
{
m_pPlayer->GetAutoaimVector( AUTOAIM_2DEGREES );  // get the autoaim vector but ignore it;  used for autoaim crosshair in DM

ResetEmptySound( );

if (m_flTimeWeaponIdle < gpGlobals->time)
{
float flRand = RANDOM_FLOAT(0, 1);
if (flRand <= 0.75)
{
if (m_iClip)
{
SendWeaponAnim( CROSSBOW_IDLE1 );
}
else
{
SendWeaponAnim( CROSSBOW_IDLE2 );
}
m_flTimeWeaponIdle = gpGlobals->time + RANDOM_FLOAT ( 10, 15 );
}
else
{
if (m_iClip)
{
SendWeaponAnim( CROSSBOW_FIDGET1 );
m_flTimeWeaponIdle = gpGlobals->time + 90.0 / 30.0;
}
else
{
SendWeaponAnim( CROSSBOW_FIDGET2 );
m_flTimeWeaponIdle = gpGlobals->time + 80.0 / 30.0;
}
}
}
}



class CCrossbowAmmo : public CBasePlayerAmmo
{
void Spawn( void )
{
Precache( );
SET_MODEL(ENT(pev), "models/w_crossbow_clip.mdl");
CBasePlayerAmmo::Spawn( );
}
void Precache( void )
{
PRECACHE_MODEL ("models/w_crossbow_clip.mdl");
PRECACHE_SOUND("items/9mmclip1.wav");
}
BOOL AddAmmo( CBaseEntity *pOther )
{
if (pOther->GiveAmmo( AMMO_CROSSBOWCLIP_GIVE, "bolts", BOLT_MAX_CARRY ) != -1)
{
EMIT_SOUND(ENT(pev), CHAN_ITEM, "items/9mmclip1.wav", 1, ATTN_NORM);
return TRUE;
}
return FALSE;
}
};
LINK_ENTITY_TO_CLASS( ammo_crossbow, CCrossbowAmmo );


--

zum Seitenanfang zum Seitenende Profil || Suche
002
19.07.2001, 02:56
Retro



LOL - Copy&Paste vom feinsten, Lerneffekt = 0

Na gut, vielleicht funzt es ja, aber der durchblick ist wirklich gleich 0.

###

Das mit den Rechargern dürfte irgendwo in der multiplayer_gamerules.cpp stehn, bei den Waffendamages...

###

Feuerrate kannste in der jeweiligen waffen.cpp nach der FireBullets function ändern... das heißt "m_flNextPrimaryAttack" bei der mp5.cpp ist der normalwert "0.1". Wirste schon finden...

###

Sone art schwebe-funktion gibt es eigentlich heißt "Fly" das ist einfach "noclip" mit ner kollisionsabfrage... aber der Command funzt nicht, müßte man mal suchen ob der im Code deaktiviert ist...
Ansonsten müßte man nen neues Waterlevel dazustezen, wodrin man atmen kann, keine sichtbegrenzung hat... etc nur die bewegungsart beeinflußt wird.

###

So, ich hoffe das war alles =) Naja, der fehler mit dem Crossbow, aber da dafür müßte ich mehr vom Code sehn, und villeicht hat Diablo dein Prob schon gelöst...

--

shielding people from their own stupidity is an evolutionary step backwards anyway.

/* God is dead!............Nietzsche */
/* Nietzsche is dead!......God */
/* Nietzsche is God!.......The Dead */

zum Seitenanfang zum Seitenende Profil || Suche