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



Ich hab grad mal das Radar nach dem Tutorial gecodes, und es funktioniert auch...

Ich möchte das Radar aber auch im Singleplayer einsetzen, also nicht das man alle Monster sieht sondern nur die Soldaten.
Am besten währe es wenn man den Grunts noch einen Key dazu gibt, mitdem man festlegen kann ob sie im Radar zu sehen sind...

Aber wie kann ich das so umbauen das nicht die Player im MP gezeigt werden, sondern bestimmte Monster in SP?

[EDIT]
Arg! Ist das nicht machbar, oder so schwierig? Oder schlafen alle Coder schon? hehe

--

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
001
27.05.2001, 12:36
Prefect



Naja, so schwer wird das doch nicht sein dass man nicht selber drauf kommt, oder?

Du hast doch sicher in dem MP-Radar irgendwo eine Schleife, in der alle Spieler durchgeloopt werden und dann deren Koordinaten an den Client geschickt werden.
Jetzt erweiterst du einfach die Schleife so, dass nicht nur die Player, sondern alle Entities durchgeloopt werden. Damit du nicht alle Entities wie func_doors etc... an den Client schickst mußt du natürlich bestimmte Entities durch ein if() aussortieren. Dafür gibt's zwei Lösungsmöglichkeiten, eine schnelle und eine gute:

Die schnelle Lösung ist, dass du einfach pev->classname (also den Entitytypnamen) z.B. mit monster_hgrunt vergleichst. Wenn der classname gleich ist, zeigst du die Entity auf dem Radar, in dem du sie an den Client schickst, ansonsten läßt du die Entity einfach weg.

Die gute Lösung ist, dass du in CBaseEntity eine neue Funktion einbaust, die ungefähr so aussieht:
virtual int ShowOnRadar(CBasePlayer *pPlayer); // in cbase.h
Und dann irgendwo in cbase.cpp:
int CBaseEntity::ShowOnRadar(CBasePlayer *pPlayer)
{
return 0;
}

Dann rufst du in deiner Schleife durch alle Entities einfach für jede Entity diese Funktion auf (also pEnt->ShowOnRadar(this) wenn pEnt die Entity ist und du gerade im CBasePlayer bist - wenn du damit Probleme hast geb ich auf), und wenn sie einen Wert ungleich 0 (also true) zurück gibt, schickst du die Entity zum Radar, wenn nicht dann halt nicht.
Natürlich werden, wenn du es jetzt dabei beläßt, gar keine Entities auf dem Radar gezeigt. Deswegen mußt du die Funktion in den Klassen, die auf dem Radar erscheinen sollen, überschreiben, z.B. in CHGrunt würdest du die Funktion zuerst im class { }-Block nochmal anbringen:
virtual int ShowOnRadar(CBasePlayer *pPlayer);
und dann im eigentlichen Code:
int CHGrunt::ShowOnRadar(CBasePlayer *pPlayer)
{
return 1;
}
Und schon werden alle grunts auf dem Radar angezeigt!

Jetzt fragst du dich sicher, wozu soll ich den pPlayer als Parameter übergeben. Nun, das muß nicht unbedingt sein, aber du kannst damit sicher ein paar nette Sachen anstellen, z.B. könntest du je nach Spieler (falls du MP-Coop mit Monstern machst) bestimmte Monster zeigen oder auch nicht. Oder du kannst das ganze gleich auf Multiplayer erweitern, in dem du ShowOnRadar zum CBasePlayer hinzufügst:
int CBasePlayer::ShowOnRadar(CBasePlayer *pPlayer)
{
if (IsDeathmatch() || IsTeammate(pPlayer)) return 1;
return 0;
}
(Die Funktionsnamen sind so nicht richtig, ich hab schon ewig nicht mehr mit dem originalen Teamplaycode gearbeitet). Dann würden z.B. im Teamplay nur Teammates auf dem Radar erscheinen, und im Deathmatch würden alle Spieler auf dem Radar erscheinen.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
27.05.2001, 14:59
Retro



Ja, verstanden hab ich jetzt soweit alles!
Erstmal thx für den langen Text! =)

Ich werd da lieber die Elegantere lösung nehmen. Leider hab ich jetzt das Radar schon wieder aus dem Code entfernt, weil ich so dumm war und nicht mehr auf eine Antwort gehofft hab... *g*

Na gut, kommts halt wieder rein und zwar mit deinen tipps! Thx - eigentlich dürfte ich das hinkrigen, bin halt nur relativer Newbie in HL-Coding bzw. C++

--

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