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 ]
|
|
Profil || Suche
|
001
02.10.2001, 17:19
hausi
|
Also:
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...
--
|
|
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 ]
|
|
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:
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/
|
|
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...
--
|
|
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 ]
|
|
Profil || Suche
|
006
04.10.2001, 13:01
hausi
|
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:
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; }
}
--
|
|
Profil || Suche
|
007
04.10.2001, 13:09
Mazze
|
Du musst das if-statement vor dem hinmachen:
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.
|
|
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.
|
|
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 ]
|
|
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:
if (iPlayerAlive) ... else ALERT( at_console, "No players alive. -> Respawn!\n" );
Dann sollte eine Nachricht kommen, wenn niemand mehr lebt.
--
|
|
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 ]
|
|
Profil || Suche
|
012
04.10.2001, 15:28
hausi
|
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)
Das mit dem "durch-alle-Player-loopen" müsste doch so gehen:
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...
--
|
|
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 ]
|
|
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/
|
|
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 ]
|
|
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/
|
|
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 ]
|
|
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/
|
|
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
class CBasePlayer : public CBaseMonster { public: int random_seed; float m_flStartObserver;
Nun Observer.cpp
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
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.
|
|
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?
--
|
|
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 ]
|
|
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
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...
--
|
|
Profil || Suche
|