Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
29.09.2001, 17:35
BloodySlash



hallo ersma,
also ich möchte das mann nachdem man gestorben ist noch 20 Sekunden in den Spectator Modus kommt bevor mann wieder Respanwed.(natürlich sollte der, der gestorben ist nicht in den Spectator Modus wennn er nur der einzigste ist der noch lebt das wäre ja sonst Schwachsinn oder)
Den Spectator-Modus habe ich schon gecoded.
Könnte mir da einer helfen ???

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
001
02.10.2001, 17:19
hausi



Also:
Quellcode:
Player.h
Class CBasePlayer...
{
  float m_flStartObserver;
...
}
Observer.cpp (oder Player.cpp)
StartObserver( ..... )
{
  m_flStartObserver = gpGlobals->time;
...
}
StopObserver( ..... )
{
  if ( gpGlobals->time < m_flStartObserver + 20 )
    return;
....
}

Wenn du das zweite machen willst, kannst du im StartObserver noch folgende Idee verfolgen:
Schlaufe durch alle Spieler. Wenn einer NICHT im Observer-Mode ist (glaubs pev->iuser1), dann schleife abbrechen und die rest vom neuen code überspringen.
Schleife durch alle Spieler und tiefsten m_flStartObserver raussuchen
Von allen m_flStartObserver die differenz vom tiefsten zu gpGlobals->time abzählen.
Dann wird die Zeit, die der Erste noch warten müsste einfach übersprungen.

P.S: Keine Ahnung, ob so alles funzt. Habs net getestet...

--

zum Seitenanfang zum Seitenende Profil || Suche
002
03.10.2001, 18:46
BloodySlash



Warum steht da immer ...
Was kommt da rein ???
Und das zweite schaff ich bestimmt nicht !
Ich kann kaum C++ tut mir leid ;-(

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
003
03.10.2001, 19:24
Mazze



Die 3 Punkte sind Auslassungszeichen!
Die ganzen Funktionen hast du schon!

Das mit dem "durch-alle-Player-loopen" müsste doch so gehen:
Quellcode:
for ( int i = 1; i <= gpGlobals->maxClients; i++ )
{
CBasePlayer *plr = (CBasePlayer *)UTIL_PlayerByIndex( i );

if(plr->IsAlive())
iPlayersAlive++;

}

// Wenn einer oder mehr alive, dann in den Observer-Mode!
if(iPlayersAlive)
pPlayer->StartObserver();

Ich hab den Code übrigens auch nicht getestet!

--

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

zum Seitenanfang zum Seitenende Profil || Suche
004
04.10.2001, 00:02
hausi



Klingt gut. Sollte eigentlich funzen. Hab etwa 10 Minuten am gpGlobals->maxPlayers überlegt. Hab aber im Moment kein SDK, also konnte ich net nachschauen...

--

zum Seitenanfang zum Seitenende Profil || Suche
005
04.10.2001, 12:24
BloodySlash



Mhhh ich hab erstmal das erste gemacht:
player.h
class CBasePlayer : public CBaseMonster
{
public:
int random_seed;
......
float m_flStartObserver;
}
so dann in der oberserver.cpp

void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
{
m_flStartObserver = gpGlobals->time;

// Alle Client-Side-Entities, die dem Spieler
............
und immer noch in der observer.cpp

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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}

if ( gpGlobals->time < m_flStartObserver + 20 )

return;

}

dann compiled 0 Fehler 0 Warnungen
dann hab ich im spiel "kill" in die console gegeben und konnte aber sofort wieder respawnen?
ich hab das bestimmt falsch eingesetzt oder ?????
könnt ihr mir sagen wo ich das genau einsetzen soll ?
thx

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
006
04.10.2001, 13:01
hausi



Quellcode:
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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}

if ( gpGlobals->time < m_flStartObserver + 20 )

return;

}

ist leider falsch. Du musst die Überprüfung an den Anfang nehmen:
Quellcode:
void CBasePlayer::StopObserver( void )
{
if ( gpGlobals->time < m_flStartObserver + 20 )
return;

// 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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}


}

--

zum Seitenanfang zum Seitenende Profil || Suche
007
04.10.2001, 13:09
Mazze



Du musst das if-statement vor dem hinmachen:
Quellcode:
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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}

Der Zeit-Code ist ein bisschen verwirrend finde ich. Ich mach das immer anders, aber es müsste trotzdem gehen!

[edit]
Da war wohl einer schneller.....
[/edit]

--

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


Dieser Beitrag wurde am 04.10.2001 um 13:10 von Mazze bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
008
04.10.2001, 14:20
BloodySlash



jo thx leute
funzt nett ;-(
also wenn ich das so mache und alleine zogge und sterbe müsste er wieder respawnen oder:

void CBasePlayer::StopObserver( void )
{

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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}

if ( gpGlobals->time < m_flStartObserver + 20 )

return;

// 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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}
}

und wenn ich das:
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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}
weglassse müsste er doch in den spectator kommen obwohl er nur der einzigste ist oder. ??
funzt aber nett habe ich sonst noch was falsches gemacht z.b. in der player.h die oben steht ???

OMK !!!!!!!!!!!
Bin ich doooooooooof
sorry

--

[ portfolio ] [ deviantart ]
[ we can make you ]


Dieser Beitrag wurde am 04.10.2001 um 14:32 von BloodySlash bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
04.10.2001, 14:36
BloodySlash



So ist das durch-alle-player-loopen da schon mit drinn, denn wenn ich das so mache wie superhausi und mazze dads beide gesagt haben
also so
void CBasePlayer::StopObserver( void )
{
if ( gpGlobals->time < m_flStartObserver + 20 )
return;

// Spectator-Modus abschalten
if ( pev->iuser1 || pev->iuser2 )
dann respawned er sofort weil ich alleine bin also denke ich die durch-alle-player-loop funktion is da schon drin wenn nicht hab ich was falsch gemacht

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
010
04.10.2001, 14:38
hausi



Dazu haben wir doch noch ne Thread *g*...
Nee.
Mal ne Frage: Wieso hast du das If-Statement immer noch NACH dem Obs-Mode-Verlass-Code? :D
Das, dass du in den Observer kommst, müsste an der Schleife liegen. Warscheinlich ist der Fehler dort drin...
Ich vermute, du hast zwei mal StartObserver-AUfruf im PlayerKilled. Dann kommt er IMMER in den Obs-Mode.
Versuch mal nach der Schleife (Oben) einfach folgendes:
Quellcode:
if (iPlayerAlive)
...
else
ALERT( at_console, "No players alive. -> Respawn!\n" );

Dann sollte eine Nachricht kommen, wenn niemand mehr lebt.

--

zum Seitenanfang zum Seitenende Profil || Suche
011
04.10.2001, 14:47
BloodySlash



jetzt versteh ich nix mehr ;-0
also in der observer.cpp steht nix von if (iPlayerAlive)
und ich hab das If-Statement doch vor dem zeug oder nicht hier:
void CBasePlayer::StopObserver( void )
{

if ( gpGlobals->time < m_flStartObserver + 20 )
return;

// 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();

pev->iuser1 = pev->iuser2 = 0;
m_hObserverTarget = NULL;
}
}

und die funktion void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
sieht so aus:

void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
{
m_flStartObserver = gpGlobals->time;

// 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( );

u.s.w.
ich weis nicht was du meinst ????

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
012
04.10.2001, 15:28
hausi



Zitat:

Wenn du das zweite machen willst, kannst du im StartObserver noch folgende Idee verfolgen:
Schlaufe durch alle Spieler. Wenn einer NICHT im Observer-Mode ist (glaubs pev->iuser1), dann schleife abbrechen und die rest vom neuen code überspringen.
Schleife durch alle Spieler und tiefsten m_flStartObserver raussuchen
Von allen m_flStartObserver die differenz vom tiefsten zu gpGlobals->time abzählen.
Dann wird die Zeit, die der Erste noch warten müsste einfach übersprungen.

(2. Post)
Zitat:

Das mit dem "durch-alle-Player-loopen" müsste doch so gehen:
Quellcode:
for ( int i = 1; i <= gpGlobals->maxClients; i++ )
{
CBasePlayer *plr = (CBasePlayer *)UTIL_PlayerByIndex( i );

if(plr->IsAlive())
iPlayersAlive++;

}

// Wenn einer oder mehr alive, dann in den Observer-Mode!
if(iPlayersAlive)
pPlayer->StartObserver();


Das hab ich gemeint.
Ohne diesen Teil kommst du immer in den Obs-Mode. Also nur noch das hinzufügen.
Sry, aber oben war es noch hinten dran. Deshalb hab ich nochmal gesagt...

--

zum Seitenanfang zum Seitenende Profil || Suche
013
04.10.2001, 15:40
BloodySlash



ich versteh immer noch nichts
also dieses:

for ( int i = 1; i <= gpGlobals->maxClients; i++ )
{
CBasePlayer *plr = (CBasePlayer *)UTIL_PlayerByIndex( i );

if(plr->IsAlive())
iPlayersAlive++;

}

// Wenn einer oder mehr alive, dann in den Observer-Mode!
if(iPlayersAlive)
pPlayer->StartObserver();

das hab ich noch nirgends eingefügt also müsste er doch immer in den Spectator MOdus gehen macht er aber nicht !!!!!
Also muss ich ja wohl was falsch gemacht haben !!!!!

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
014
04.10.2001, 16:02
Mazze



OK!
Also jetzt mal gaaanz langsam!
Wenn du stirbst willst du in den Observer-Mode?
Hast du das überhaupt in die PlayerKilled Funktion geschreiben?

PS: Mein Loop-Code war übrigens nur proforma!
So wird er wahrscheinlich abstürzen, weil er auf Spieler zeigt, die es gar nicht gibt!
Die Zeile müsste so heißen:
if(plr && plr->IsAlive())
.....

--

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

zum Seitenanfang zum Seitenende Profil || Suche
015
04.10.2001, 16:12
BloodySlash



Brrrrrrrr
Ja genauso möchte ich das aber ich hab noch nix reingeschrieben bis auf das was ihr mir da gesagt habt mhhh. Am besteb nochmal von vorne.
Was muss ich wooo reinschreiben bitte sagt mir genau in welche datei und welche funktion oder zeile sonst weiss ich nicht wo?
Und am besten gebt ihr mir nicht so ne Code fetzen denn damit kann ich nix anfangen (Bin halt noch nen C++ Noob)
thx

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
016
04.10.2001, 16:22
Mazze



Sorry!
Ich kann nicht den ganzen HL-Code posten!
In dem Tutorial, das du gemacht hast steht doch was drin, wie man in den Spectator-Mode kommt!
Diesen Code einfach kopieren und in der PlayerKilled Funktion einfügen!

--

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

zum Seitenanfang zum Seitenende Profil || Suche
017
04.10.2001, 16:48
BloodySlash



und was sollte dann das da oben mit diesem ganzen zeug ?????

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
018
04.10.2001, 18:13
Mazze



Ja dieses ganze "Zeugs" ist dafür da, dass du 20 sek. im Observer-Mode bleibst, so wie du es wollstest!

--

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

zum Seitenanfang zum Seitenende Profil || Suche
019
05.10.2001, 14:38
BloodySlash



Ja aber es funzt nett. Also hab ich wohl was falsch gemacht ;-(
Würdest du so lieb sein mein Freund ;-)
und nochmal gucken was ich falsch gemacht habe fände ich nett von dir ??
Also so sieht das alles bei mir aus:
Player.h
Quellcode:class CBasePlayer : public CBaseMonster
{
public:
int random_seed;
float m_flStartObserver;

Nun Observer.cpp
Quellcode:void CBasePlayer::StartObserver( Vector vecPosition, Vector vecViewAngle )
{
m_flStartObserver = gpGlobals->time;

        // 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();
...............

und

Quellcode:void CBasePlayer::StopObserver( void )
{

if ( gpGlobals->time < m_flStartObserver + 20 )

return;

// Spectator-Modus abschalten

        if ( pev->iuser1 || pev->iuser2 )
        {
.......

Das ist alles was ich gemacht habe. War doch alles was ihr gesagt habt oder???

Danke für eure Gedult Leute !!!

--

[ portfolio ] [ deviantart ]
[ we can make you ]


Dieser Beitrag wurde am 05.10.2001 um 14:41 von BloodySlash bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
05.10.2001, 15:45
hausi



Und noch das im CBasePlayer::PlayerKilled(...) (Player.cpp), wie ich schon die ganze Zeit versuche zu erklären.
Kommst du eigentlich in den OBS-Mode, wenn du gekillt wirst?

--

zum Seitenanfang zum Seitenende Profil || Suche
021
05.10.2001, 17:31
BloodySlash



So wie es jetzt ist komme ich nicht rein wenn ich sterbe.
Naja gekillt nicht gerade ich gebe kill inne console ;-)

--

[ portfolio ] [ deviantart ]
[ we can make you ]

zum Seitenanfang zum Seitenende Profil || Suche
022
06.10.2001, 16:22
hausi



Ich würde mal mit Debugging beginnen.
Mach in verschiedenen Funktion (z.B. PlayerKilled, StartObserver, PlayerDeadThink und StopObserver) eine Zeile wie
Quellcode:
ALERT( at_console, "CBasePlayer::PlayerKilled();\n" );

rein.
Dann siehst du, was er macht, wenn du Kill eingibst. Somit kannst du das Problem auf ein paar Zeilen Code beschränken. (z.B: StartObserver kommt, aber er geht nicht in den OBS-Mode => StartObserver() posten).
Dann können wir dir warscheinlich besser helfen...

--

zum Seitenanfang zum Seitenende Profil || Suche