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



Also ich hab wieder ein Prob mit dem Spectator-Mode (*g*) :

Ich habs jetzt so gemacht, dass man wie bei TFC erst observt, also frozen ist und während dessen sein Team / Klasse wählt. Nur wenn ich das Team / Klasse gewählt habe und ich gespawnt bin, steht an der Stelle, an der man observt hat ein Playermodel rum. Was hab ich falsch gemacht ?

Danke !

--

zum Seitenanfang zum Seitenende Profil || Suche
001
01.10.2001, 17:39
thinktank



*G* Also entweder ich mach total die Leichtsinns-Fehler, bei denen keiner Lust hat eine Reply zu schreiben, oder keiner versteht mich :). Ich glaub kaum das es hier an Wissen fehlt ........ ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
002
01.10.2001, 18:00
Basiror



es fehlt aber an wissen schliesslich wissen wir net mal wie du es gecoded hast
poste mal etwas code dann kann auch dir geholfen werden

--

Basiror's Labs Game-Development page

Hifle in form von Tutorials, Artikeln und anderem wird dankbar angenommen

zum Seitenanfang zum Seitenende Profil || Suche
003
02.10.2001, 16:12
thinktank



Sorry, das wird ein bischen viel, dennoch hier ist der Code
von meiner observer.cpp. ( sie ist nach ein paar Tuts gemacht) :

[code]
//=============================================================================
// observer.cpp
//
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "player.h"
#include "weapons.h"

extern int gmsgCurWeapon;
extern int gmsgSetFOV;
extern int gmsgTeamInfo;
extern int gmsgSpectator;

extern void respawn(entvars_t* pev,BOOL fCopyCorpse);

// Spieler wurde zum Spectator, erstmal alles einrichten
// Dies wurde von der player.cpp hierher verschoben.
void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
{
// Alle Client-Side-Entities, die dem Spieler
// zugewiesen wurden, abschalten
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_KILLPLAYERATTACHMENTS );
WRITE_BYTE( (BYTE)entindex() );
MESSAGE_END();

// Alle Waffen wegstecken
if (m_pActiveItem)
m_pActiveItem->Holster( );

if ( m_pTank != NULL )
{
m_pTank->Use( this, this, USE_OFF, 0 );
m_pTank = NULL;
}

// Message Cache des Anzugs löschen,
// damit wir nicht weiterlabern ;-)
SetSuitUpdate(NULL, FALSE, 0);

// Mitteilung an Ammo-HUD, dass der Spieler tot ist
MESSAGE_BEGIN( MSG_ONE, gmsgCurWeapon, NULL, pev );
WRITE_BYTE(0);
WRITE_BYTE(0XFF);
WRITE_BYTE(0xFF);
MESSAGE_END();

// Zoom zurücksetzen
m_iFOV = m_iClientFOV = 0;
pev->fov = m_iFOV;
MESSAGE_BEGIN( MSG_ONE, gmsgSetFOV, NULL, pev );
WRITE_BYTE(0);
MESSAGE_END();

// Ein paar Flags setzen
m_iHideHUD |= (HIDEHUD_HEALTH | HIDEHUD_WEAPONS | HIDEHUD_STAMINA | HIDEHUD_EXPBAR);

m_afPhysicsFlags |= PFLAG_OBSERVER;
//pev->effects = EF_NODRAW;

/*
if (!pev->playerclass) // dont make him transparent if he hasnt chosen a class
{
pev->rendermode = kRenderTransAlpha;
pev->renderamt = 50;
}
else
{
pev->effects = EF_NODRAW;
}
*/
pev->view_ofs = g_vecZero;
pev->angles = pev->v_angle = vecViewAngle;
pev->fixangle = TRUE;
pev->solid = SOLID_NOT;
pev->takedamage = DAMAGE_NO;
pev->movetype = MOVETYPE_NONE;
ClearBits( m_afPhysicsFlags, PFLAG_DUCKING );
ClearBits( pev->flags, FL_DUCKING );
pev->deadflag = DEAD_RESPAWNABLE;
pev->health = 1;

// Status-Bar ausschalten
m_fInitHUD = TRUE;

// Team Status updaten
pev->team = 0;
MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo );
WRITE_BYTE( ENTINDEX(edict()) );
WRITE_STRING( "" );
MESSAGE_END();

// Dem Spieler alles wegnehmen
RemoveAllItems( FALSE );

// Zur neuen Position bewegen
UTIL_SetOrigin( pev, vecPosition );

// Einen Spieler finden, den wir angucken
m_flNextObserverInput = 0;
Observer_SetMode(OBS_CHASE_LOCKED);

// Allen Clients mitteilen, dass der Spieler jetzt Spectator ist
MESSAGE_BEGIN( MSG_ALL, gmsgSpectator );
WRITE_BYTE( ENTINDEX( edict() ) );
WRITE_BYTE( 1 );
MESSAGE_END();
}

// Observermodus verlassen
void CBasePlayer::StopObserver( void )
{
// Spectator-Modus abschalten
if ( pev->iuser1 || pev->iuser2 )
{
// Allen Clients mitteilen, dass der Spieler kein Spectator
// mehr ist.
MESSAGE_BEGIN( MSG_ALL, gmsgSpectator );
WRITE_BYTE( ENTINDEX( edict() ) );
WRITE_BYTE( 0 );
MESSAGE_END();
m_iHideHUD &= ~(HIDEHUD_HEALTH | HIDEHUD_WEAPONS);
m_iHideHUD &= ~HIDEHUD_STAMINA;
m_iHideHUD &= ~HIDEHUD_EXPBAR;
pev->renderamt = 255;
pev->rendermode = kRenderNormal;
pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}
}

// Den nächsten Client finden, den der Spieler anschaut
void CBasePlayer::Observer_FindNextPlayer( bool bReverse )
{
// MOD AUTOREN: Hier die Logik ändern, wenn ihr den Observer nur
// bestimmte Spieler beobachten lassen wollt, beispielsweise
// nur Teammitglieder.

int iStart;
if ( m_hObserverTarget )
iStart = ENTINDEX( m_hObserverTarget->edict() );
else
iStart = ENTINDEX( edict() );
int iCurrent = iStart;
m_hObserverTarget = NULL;
int iDir = bReverse ? -1 : 1;

do
{
iCurrent += iDir;

// Durch alle Clients loopen
if (iCurrent > gpGlobals->maxClients)
iCurrent = 1;
if (iCurrent < 1)
iCurrent = gpGlobals->maxClients;

CBaseEntity *pEnt = UTIL_PlayerByIndex( iCurrent );
if ( !pEnt )
continue;
if ( pEnt == this )
continue;
// Keine unsichtbaren Spieler oder andere Observer beobachten
if ( ((CBasePlayer*)pEnt)->IsObserver() || (pEnt->pev->effects & EF_NODRAW) )
continue;

// MOD AUTOREN: Hier die Überprüfungen einfügen

m_hObserverTarget = pEnt;
break;

} while ( iCurrent != iStart );

// Ziel gefunden?
if ( m_hObserverTarget )
{
// Ziel in pev speichern damit die Bewegungs-DLL dran kommt
pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() );
// Zum Ziel bewegen
UTIL_SetOrigin( pev, m_hObserverTarget->pev->origin );

ALERT( at_console, "Now Tracking %s\n", STRING( m_hObserverTarget->pev->netname ) );
}
else
{
ALERT( at_console, "No observer targets.\n" );
}
}

// Tastatur-Eingaben für den Observermodus...
void CBasePlayer::Observer_HandleButtons()
{
// Mouse-Clicks verlangsamen
if ( m_flNextObserverInput > gpGlobals->time )
return;

// Springen wechselt zwischen den Modi
if ( m_afButtonPressed & IN_JUMP )
{
if ( pev->iuser1 == OBS_ROAMING )
Observer_SetMode( OBS_CHASE_LOCKED );
else if ( pev->iuser1 == OBS_CHASE_LOCKED )
Observer_SetMode( OBS_CHASE_FREE );
else
Observer_SetMode( OBS_ROAMING );

m_flNextObserverInput = gpGlobals->time + 0.2;
}

// Attack wechselt zum nächsten Spieler
if ( m_afButtonPressed & IN_ATTACK && pev->iuser1 != OBS_ROAMING )
{
Observer_FindNextPlayer( false );

m_flNextObserverInput = gpGlobals->time + 0.2;
}

// Attack2 wechselt zum vorherigen Spieler
if ( m_afButtonPressed & IN_ATTACK2 && pev->iuser1 != OBS_ROAMING )
{
Observer_FindNextPlayer( true );

m_flNextObserverInput = gpGlobals->time + 0.2;
}
}

// Versuche, Observer-Modus zu wechseln
void CBasePlayer::Observer_SetMode( int iMode )
{
// Abbrechen, wenn wir bereits im gewünschten Modus sind
if ( iMode == pev->iuser1 )
return;

// Wechsle zu Roaming?
if ( iMode == OBS_ROAMING )
{
// MOD AUTOREN: Wenn ihr kein Roaming-Modus in eurem Mod wollt,
// dann brecht hier einfach ab
pev->iuser1 = OBS_ROAMING;
pev->iuser2 = 0;

ClientPrint( pev, HUD_PRINTCENTER, "#Spec_Mode3" );
pev->maxspeed = 320;
return;
}

// Wechsle zu ChaseLock?
if ( iMode == OBS_CHASE_LOCKED )
{
// Sicherstellen, dass wir ein Ziel haben
if ( m_hObserverTarget == NULL )
Observer_FindNextPlayer( false );

if (m_hObserverTarget)
{
pev->iuser1 = OBS_CHASE_LOCKED;
pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() );
ClientPrint( pev, HUD_PRINTCENTER, "#Spec_Mode1" );
pev->maxspeed = 0;
}
else
{
ClientPrint( pev, HUD_PRINTCENTER, "#Spec_NoTarget" );
Observer_SetMode(OBS_ROAMING);
}

return;
}

// Wechsle zu ChaseFree?
if ( iMode == OBS_CHASE_FREE )
{
// Sicherstellen, dass wir ein Ziel haben
if ( m_hObserverTarget == NULL )
Observer_FindNextPlayer( false );

if (m_hObserverTarget)
{
pev->iuser1 = OBS_CHASE_FREE;
pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() );
ClientPrint( pev, HUD_PRINTCENTER, "#Spec_Mode2" );
pev->maxspeed = 0;
}
else
{
ClientPrint( pev, HUD_PRINTCENTER, "#Spec_NoTarget" );
Observer_SetMode(OBS_ROAMING);
}

return;
}
}

void CBasePlayer:: StartObserving( void )
{
if (observerflag)
return;

EnableControl(FALSE);

m_iHideHUD |= HIDEHUD_STAMINA;
m_iHideHUD |= HIDEHUD_EXPBAR;

pev->health = 1; // do this or the player is dead and the view is erm .. wierd ;)

observerflag = TRUE;

RemoveAllItems( TRUE );

edict_t *pSpot, *pNewSpot;
int iRand;

if ( pev->view_ofs == g_vecZero )
{
// don't accept subsequent attempts to StartObserving()
return;
}

pSpot = FIND_ENTITY_BY_CLASSNAME( NULL, "info_intermission");

if ( !FNullEnt( pSpot ) )
{
// at least one intermission spot in the world.
iRand = RANDOM_LONG( 0, 3 );

while ( iRand > 0 )
{
pNewSpot = FIND_ENTITY_BY_CLASSNAME( pSpot, "info_intermission");

if ( pNewSpot )
{
pSpot = pNewSpot;
}

iRand--;
}

UTIL_SetOrigin( pev, pSpot->v.origin );
}
else
{
// no intermission spot. Push them up in the air, looking down at their corpse
TraceResult tr;
UTIL_TraceLine( pev->origin, pev->origin + Vector( 0, 0, 128 ), ignore_monsters, edict(), &tr );
UTIL_SetOrigin( pev, tr.vecEndPos );
return;
}
}

void CBasePlayer::StopObserving( bool bShouldSpawn )
{
if (!observerflag)
return;

m_iHideHUD &= ~HIDEHUD_STAMINA;
m_iHideHUD &= ~HIDEHUD_EXPBAR;

EnableControl(true);

pev->deadflag = DEAD_NO;
observerflag = FALSE;

pev->button = 0;
m_iRespawnFrames = 0;

if (bShouldSpawn)
{
respawn(pev, !(m_afPhysicsFlags & PFLAG_OBSERVER) );
}
pev->nextthink = -1;
}
[/code]

--

zum Seitenanfang zum Seitenende Profil || Suche
004
02.10.2001, 17:00
hausi



Hatte mal das selbe Problem. Weiss aber net mehr, wie ich es gelöst habe.
Versuch mal im StartObserver den Rendermode auf NODRAW zu setzen und bei Stop UTIL_Remove(...).
Vielleicht hilft das ein bisschen.
P.S: StandarT ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
005
02.10.2001, 18:00
thinktank



ok , werds versuchen, aber NODRAW darf ich ned setzen, da ichs noch brauch fürs Spiel :). Das mit dem UTIL_Remove ist eine gute Idee gleich ausprobieren ....
P.S. : StandarT ist so ein weit verbreiteter Fehler :), hab ihn sogar im ThWboard gefunden (im admin-center (also bei "meinem eigenen")).

Danke

--


Dieser Beitrag wurde am 02.10.2001 um 18:00 von thinktank bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
02.10.2001, 18:11
thinktank



Sorry, das UTIL_remove(this); hat nichts gebracht..... ;(

--

zum Seitenanfang zum Seitenende Profil || Suche
007
04.10.2001, 16:14
thinktank



Jetzt hab ich den Code gepostet und noch immer kann mir keiner helfen ;(,
fehlt es doch an Lust auf so nen Thread zu antworten :( !
Bitte helft mir ! ( Ich will diesen "$%&§/& Spec-Mode mal fertig bekommen :D !)

--

zum Seitenanfang zum Seitenende Profil || Suche
008
04.10.2001, 16:24
Mazze



Hm.....ok ich versuchs!
Wenn du im Spiel bist. Alleine. Dann gehst du in den Observer-Mode. Steht dann ein Model rum?

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
009
04.10.2001, 17:14
thinktank



Danke ! Also es funktioniert so :
Am Anfang ist man im "Observing-Mode". In diesem kann man nichts machen (also wie bei TFC oder cstrike am Anfang, wenn man ins Game kommt). Dann kann man halt die Klasse etc. auswählen. Wenn ich dann an die Stelle zurückgehe, an der ich im Observing-Mode war, ist dort ein Player(-model ?)
runtergefallen. Dieses hat noclip etc. Es macht rein gar nichts, sieht nur blöd aus.

--

zum Seitenanfang zum Seitenende Profil || Suche
010
04.10.2001, 18:17
Mazze



Ich denke mal, dass du nach der Auswahl deiner Klasse mit pPlayer->Spawn(); im Spiel erscheinen willst!
Hast du da vorher schon pPlayer->StopObserver(); gemacht?

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
011
04.10.2001, 18:52
thinktank



Also beide werden aufgerufen, also sowohl StopObserving als auch StopObserver. Der Player wird dann automatisch gespawnt von PlayerDeathThink(); denk ich.

--

zum Seitenanfang zum Seitenende Profil || Suche
012
05.10.2001, 15:51
hausi



Oder versuch folgendes:
Player.cpp wird irgendwo die Funktion respawn(...) aufgerufen. Dort ist der 2. Parameter, ob der Körper bleibt. Frag dort nochmal von Hand ab (ev. eine neue Variable deklarieren), ob die "Leiche" bleiben soll.
Oder ein zweiter Lösungsvorschlag:
Setz die Position vor dem Spawn auf irgend einen Punkt, der sicher ausserhalb des Levels ist.
UTIL_Remove kann leider nicht gehen. Sorry. Weil der Spieler gar nicht entfernt werden kann und die Leiche schon zur "Welt" gehört.

--

zum Seitenanfang zum Seitenende Profil || Suche
013
05.10.2001, 15:58
[GOD]ShadowLord



player-model oder HL SUIT??? (sieht fast genauso aus)

--

they come in peace - and go in pieces

zum Seitenanfang zum Seitenende Profil || Suche
014
05.10.2001, 16:52
thinktank



Also es ist das Playermodel, da wenn ich mein Model ändere (mit Konsolenbefehl "model zombie" z.B.), dann ändert sich das des RumStehundNichtsTu-Models auch .

--

zum Seitenanfang zum Seitenende Profil || Suche
015
06.10.2001, 12:21
thinktank



Mazze, könntest du vielleicht dein Code vom Spectator-Mode posten, oder zumindest die Unterschiede zwischen meinem Code und deinem ?
Bitte ....

--

zum Seitenanfang zum Seitenende Profil || Suche
016
06.10.2001, 13:19
Mazze



Ich glaube nicht, dass es an diesem Code liegt!
Ich hatte auch schon das Problem, dass das Playermodel rumsteht. Allerdings weiß ich nicht mehr wie ich das gelöst habe!
Ich glaube aber, dass es hier mehrere gibt, die auch dieses Observer-Tutorial gemacht haben!
Vielleicht können die ja ihren Code posten, oder wenigstens was dazu sagen!

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
017
06.10.2001, 13:42
Another1



es ist 100000% ein aufruf von
respawn, wo als 2. parameter true (e.g.: respawn(player->edict(),true)) übergeben wird, änder das in allen respawn() sachen, die mit observer zusammenhängen zu false!

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
018
06.10.2001, 19:19
thinktank



Danke !
Another1 sei gepriesen !! ;)

Vielen Dank !!

P.S. : Schau mal bitte öfters ins Forum ;) !

--

zum Seitenanfang zum Seitenende Profil || Suche
019
07.10.2001, 21:19
hausi



Hab ich doch auch schon gesacht... Aber keiner wollte glauben... :(

--

zum Seitenanfang zum Seitenende Profil || Suche
020
08.10.2001, 16:56
thinktank



Hmm sorry ;( , ich les Another1s Replies immer besser durch :D .
Sorry !

--

zum Seitenanfang zum Seitenende Profil || Suche
021
09.10.2001, 09:45
hausi



:Das (Hmm Smilie oder Text?) glaub ich gerne. Another1's und Perfect's replies werden glaub ich immer 2-3 mal durchgelesen. Auch ich habe vieles von ihnen gelernt, was HL-Coding angeht...

--

zum Seitenanfang zum Seitenende Profil || Suche
022
09.10.2001, 13:04
Mazze



Perfect ?
Kenn ich gar nicht den Typ!
Ich kenn halt einen Prefect, der ziemlich gut programmieren kann.

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
023
09.10.2001, 14:51
Another1



und immer wieder der gleiche typo,

@prefect: das is absicht, oder? so eine art vorheraussortierverfahrennurwermichmitrichtigemnamenansprichtkommtdurch *gg* =)

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
024
09.10.2001, 22:37
hausi



Uups... Hab ich ganz übersehen. War ja schliesslich auch bei der Arbeit *g*...
Man könnte doch mal machen, dass im ganzen Forum die Perfects durch Prefects ersetzt werden... Wär sicher noch lustig...

--

zum Seitenanfang zum Seitenende Profil || Suche