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



1.) Kann mir mal einer sagen, wie man eine neue Zone in den Code bringt? (brush-entity).
2.) Kann man im FGD-File unter den Map-Properties eine neue Eigenschaft einfügen? Wenn ja: wie fragt man das dann im Code ab?

--

Play HL and have fun

zum Seitenanfang zum Seitenende Profil || Suche
001
01.02.2001, 14:19
apfelkorn



zu 2.: du suchst im code nach einem entity mit namen worldspawn und dann suchst du nach den key-values. Da kannst du was neues einfügen, was du auch in deiner fgd-datei für worldspawn eingibst...

--

zum Seitenanfang zum Seitenende Profil || Suche
002
01.02.2001, 14:46
Prefect



zu 1) Schau dir den Code für Trigger an, besonders CBaseTrigger::InitTrigger() (glaub ich), das ist der generelle Spawncode, da ist dann sowas wie

pev->effects |= EF_NODRAW;
pev->solid = SOLID_TRIGGER;
SET_MODEL(edict(), pev->modelname);
UTIL_SetOrigin(pev, pev->origin);

oder so ähnlich. Dann mußt du noch eine Touch()-Funktion einfügen. Diese Funktion wird jedesmal aufgerufen, wenn der Spieler ein Inputpacket an den Server schickt (also wenn der PM-code auf dem Server ausgeführt wird) - die Aufrufgeschwindigkeit ist also von der Netzwerk-Framerate, NICHT von der Server-Framerate abhängig - und natürlich nur dann, wenn besagter Spieler innerhalb des Brushes ist.
Die touch()-Funktion wird also durchaus öfters aufgerufen, nicht nur dann wenn der Spieler den Brush zum ersten Mal betrifft.

Gameplay-Zonen die bestimmte Flags setzen sollen (z.B. Buyzones - NEIN CS-Klon *g*) sind am Besten so zu realisieren:
- eine neue Variable m_fInXXXZone wird zu CBasePlayer hinzugefügt
- in der CBasePlayer::PreThink() wird diese Variable am Ende der Funktion auf FALSE gesetzt
- in der Touch()-Funktion deiner Zone muß natürlich überprüft werden, ob der Toucher ein Spieler ist, wenn ja wird im entsprechenden CBasePlayer-Objekt die m_fInXXXZone auf TRUE gesetzt

Das funktioniert deshalb, weil die Engine bei jedem Inputpacket-Recv eines Clients zunächst PlayerPreThink() aufruft, dann PM_Move(), und dann PlayerPostThink().

zu 2) fgd editieren wie beschrieben. Abrufen kannst du die Keyvalues (wie bei allen Entities) in der CWorld::KeyValue()-Funktion...

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
003
01.02.2001, 20:01
UniSol07



Danke viel mal.

--

Play HL and have fun

zum Seitenanfang zum Seitenende Profil || Suche