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



Hallo, weiß jemand, wie ich ein Entity mache, mit dem ich dann für eine kurze einstellbare Zeit bzw. bis es erneut getriggert wird die Steuerung des Spielers deaktivieren kann? (er soll sich nicht umschauen, bewegen, springen und ducken können).

In welchen Dateien (wo genau) muss ich was ändern.
Wäre auch über Link zu einem Tutorial zum erstellen eigener Entities schon ganz zufrieden, genaue Anleitung wäre mir zwar lieber ;-)

--

zum Seitenanfang zum Seitenende Profil || Suche
001
03.12.2001, 16:23
RirA



vielleicht hilft das: pPlayer->EnableControl(FALSE);

--

zum Seitenanfang zum Seitenende Profil || Suche
002
03.12.2001, 16:52
Bobby



Wie erstelle ich ein ganz einfaches Entity, das eine Funktion aufruft?
Habe mir mal das Tut unter http://www.thewall.de/coding/index.php?tutorial=1&id=4 durchgelesen, hat jedoch relativ viel drin was ich wohl nicht brauche.
Das Entity soll gar keine Einstellmöglichkeiten bieten, sondern einfach nur eine Funktion aufrufen, wenn es getrigget wird. Wäre für ein kurzes Beispiel (Auszug für fgd-Datei sowie Änderungen am Quellcode) echt dankbar.

Falls es das schon gibt: Ein einfaches Tut über die Grundlagen der Erstellung eigener Entities (fgd + quellcode) wäre natürlich auch ok.

--

zum Seitenanfang zum Seitenende Profil || Suche
003
05.12.2001, 15:58
Bobby



Ich habe es ausprobiert, funktioniert aber leider nicht - oder Fehler in meinem Code (Bin noch neu im HL-Coding). Deshalb hier mein Code:

In meiner fgd-Datei steht folgendes:
@PointClass base(Targetname) color(255 128 0) = player_control : "Player Control"
[
steuerung(choices) : "Steuerung" : 0 =
[
0 : "Computer"
1 : "Spieler"
]
]

Dann hab ich im Projekt für die hl.dll eine cpp-Datei 'player_control' hinzugefügt:
#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "player.h"
#include "trains.h"
#include "nodes.h"
#include "weapons.h"
#include "soundent.h"
#include "monsters.h"
#include "shake.h"
#include "decals.h"
#include "gamerules.h"
#include "game.h"

class CPlayerControl : public CBaseEntity
{
public:
void KeyValue( KeyValueData *pkvd );
void Spawn( CBasePlayer *pPlayer );
int pc_steuerung;
};

LINK_ENTITY_TO_CLASS( player_control, CPlayerControl );

void CPlayerControl::KeyValue(KeyValueData *pkvd)
{
if (FStrEq(pkvd->szKeyName, "steuerung"))
{
pc_steuerung = atof(pkvd->szValue);
pkvd->fHandled = TRUE;
}
else CBaseEntity::KeyValue( pkvd );
}

void CPlayerControl :: Spawn( CBasePlayer *pPlayer )
{
pPlayer->EnableControl(pc_steuerung);
}

Beim compilen hat er aber keine Fehler angezeigt.
Was mache ich falsch?

--

zum Seitenanfang zum Seitenende Profil || Suche
004
05.12.2001, 18:42
Metew



diablecontrol?

edit:
disablecontrol

oder pPlayer->movetype = none oder so, musst halt suchen wo es sonst im code vorkommen

--

SWCOOPFORCE-TEAM

NEUE HOMEPAGE/SCREENS: SWCOOPFORCE-MOD | Helft mit für Legalisierung!


Dieser Beitrag wurde am 05.12.2001 um 18:44 von Metew bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
05.12.2001, 19:08
hausi



Ich würde zuerst mal überprüfen, ob das Entity wirklich dann aufgerufen wird, wenn du es willst. Mach doch einfach mal anstatt dem EnableControls ein Quellcode:ALERT( at_console, "EnableControls();\n" ); rein. Falls das dann im richtigen Moment ausgeführt wird, weisst du, dass die Funktion noch falsch ist. Also musst das irgendwie anders machen.
BTW: Wie wärs, wenn du das mit dem EnableControls in der USE-Funktion machen würdest? Wäre doch mal eine gute Idee ;)

--

zum Seitenanfang zum Seitenende Profil || Suche
006
05.12.2001, 19:24
Another1



Zitat:

void CPlayerControl :: Spawn( CBasePlayer *pPlayer )
{
pPlayer->EnableControl(pc_steuerung);
}

seit wann kann ne spawn function nen argument haben? kann sie zwar, wird dann aber natürlich nicht aufgerufen, also deinen player pointer musst du schon irgendwo anders herbekommen. die spawn muss void sein, evtl packst du das lieber in ne Use function (wenn das entity getriggert wird oso)

--

Another1

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

zum Seitenanfang zum Seitenende Profil || Suche
007
10.12.2001, 19:18
Bobby



Für was ist die Spawn-Funktion (Constructor?)
Wird die Use-Funktion dann automatisch ausgelöst, wenn das Entity getriggert wird?
Dan ganze soll nachher so ähnlich sein, wie im Intro von Opposing Force (Spieler kann sich nicht ducken, springen, laufen). Drehen kann er zwar noch, sollte er aber bei mir nachher nicht mehr können.

--

zum Seitenanfang zum Seitenende Profil || Suche
008
26.12.2001, 12:46
Bobby



Ich habe meine Code jetzt etwas überarbeitet. Der Spieler kann jetzt schon nicht mehr laufen, springen, ducken. Doch wie kann ich verhindern, dass er sich umschauen kann?
Mein Code sieht jetzt so aus:

#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "player.h"

class CPlayerControl : public CBaseEntity
{
public:
void KeyValue( KeyValueData *pkvd );
void Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
int steuerung;
};
LINK_ENTITY_TO_CLASS( player_control, CPlayerControl );

void CPlayerControl::KeyValue(KeyValueData *pkvd)
{
if (FStrEq(pkvd->szKeyName, "steuerung"))
{
steuerung = atof(pkvd->szValue);
pkvd->fHandled = TRUE;
}
else CBaseEntity::KeyValue( pkvd );
}

void CPlayerControl :: Use ( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{
((CBasePlayer *)pActivator)->EnableControl(steuerung);
}

PS: Wozu ist eigentlich das save und restore - Zeugs in manchen Dateien?

--


Dieser Beitrag wurde am 26.12.2001 um 14:00 von Bobby bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
26.12.2001, 14:09
Rockefeller



oh je... :D
ich weiss nicht genau, aber du könntest in CBasePlayer ne Variable "bool m_locked" oder so einfügen, und dann überprüfst du in PreThink(), ob der Player gelocked ist, und dann setzt du pev->angles auf einen festen Wert, am besten merkst du dir die Richtung des Players, bevor du ihn einfrierst.
Das müsste funktionieren.

Das Save- und Restore-Zeugs ist für den Single-Player, wenn du von einer Entity mehr Sachen speichern musst als nur die pev-Daten. D.h. wenn z.B. ein Spieler auf einem Train steht und ihn bedient, muss dieser nach dem Laden (=Restore :D) den Train ja immer noch bedienen, und das musst du extra speichern (war glaub ich nen doofes Beispiel :-)

--

zum Seitenanfang zum Seitenende Profil || Suche
010
26.12.2001, 15:21
Bobby



Ich habe jetzt in player.h folgendes eingefügt: BOOL m_locked;
In meiner player_control.cpp habe ich eine Variable m_viewlock angelegt.
In der Use Funktion habe ich folgendes hinzugefügt:
if (steuerung == 1) m_viewlock = FALSE;
else m_viewlock = TRUE;
((CBasePlayer *)pActivator)->m_locked = m_viewlock;

Was genau und wo in player.cpp muss ich das mit dem pev->angles einfügen?

--


Dieser Beitrag wurde am 26.12.2001 um 15:22 von Bobby bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
011
26.12.2001, 20:28
Rockefeller



Ich bin mal nett heute :D

Also ich würde das hier zu CBasePlayer hinzufügen:

BOOL m_locked;
Vector m_lockview;

und dann in CBasePlayer::PreThink(), am besten direkt vor dem Zeug mit den Trains:

if (m_locked)
{
pev->angles = pev->v_angle = m_lockview;
}

Und dann musst du in deiner Entity nur noch beim Einfrieren
{
pPlayer->m_lockview = pPlayer->angles;
pPlayer->m_locked = true;
}
machen.

--

zum Seitenanfang zum Seitenende Profil || Suche
012
27.12.2001, 09:25
Bobby



Ich habe es ausprobiert und bekam eine Fehlermeldung; war schnell behoben in meinem Entity statt pPlayer->angles musste ich wohl pPlayer->pev->angles schreiben. Fehlermeldung bekam ich keine mehr, hat aber trotzdem nicht funktioniert.
Bei env_shake wird doch die view des Players erschüttert, oder? Hat jemand eine Ahnung, wie man es hinbekommen kann das auch die view einer Kamera erschüttert wird? PS: Spielersteuerung deaktivieren war nur eine Abhilfe, aber die view der Kamera selbst zu erschüttern wäre natürlich genial!

--


Dieser Beitrag wurde am 27.12.2001 um 09:26 von Bobby bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
013
27.12.2001, 14:37
Rockefeller



ups ja da hab ich das pev vergessen, aber wieso geht das nicht? hmm mal überlegen....

oh ich dussel:

if (m_locked)
{
pev->angles = pev->v_angle = m_lockview;
pev->fixangle = 1;
}

Das bitte noch einfügen.

--

zum Seitenanfang zum Seitenende Profil || Suche
014
27.12.2001, 21:31
Bobby



Vielen Dank hat funtioniert!
Hat vielleicht jemand ne Idee (Lösungsansatz) für mein 2. Problem (eigentlich ja das gleiche, oder wie auch immer *g*). Ich hab mal ein bisschen im SDK rumgesucht. Gehe ich richtig in der Annahme, dass ich da was in der util.cpp im Abschnitt ändern muss?

Quellcode:id UTIL_ScreenShake ( ... )
[...]
Hat sowas jemand von euch schonmal gemacht? Wäre für Code sehr dankbar.

--


Dieser Beitrag wurde am 27.12.2001 um 21:40 von Bobby bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
31.12.2001, 18:43
Bobby



Weis niemand wie sowas geht (bei env_shake auch den view einer Kamera erschüttern)? Funktioniert mein Ansatz? Irgendwelche Ideen, Vorschläge oder Anregungen?

--

zum Seitenanfang zum Seitenende Profil || Suche
016
02.01.2002, 02:12
Rockefeller



Ich weiss nich ob das überhaupt mit Cams geht, aber du könntest in UTIL_ScreenShake überprüfen, ob ein Spieler grad "in" einer Kamera steckt, und dann anstatt
MESSAGE_BEGIN( MSG_ONE, gmsgShake, NULL, pPlayer->edict() );
das hier versuchen:
MESSAGE_BEGIN( MSG_ONE, gmsgShake, NULL, pCam->edict() );

Aber wie gesagt, das kann sein, dass das mit Cams garnicht geht.

--

zum Seitenanfang zum Seitenende Profil || Suche
017
02.01.2002, 10:50
Bobby



Wie bekomme ich in util.cpp einen Pointer auf die aktivierte Kamera? Klingt für euch vielleicht blöd, aber ich hab echt keinen Schimmer.

--

zum Seitenanfang zum Seitenende Profil || Suche
018
02.01.2002, 16:14
Rockefeller



Ich auch nich, musst du dir wohl bei Aktivierung der Cam nen Pointer auf die Cam merken.

--

zum Seitenanfang zum Seitenende Profil || Suche
019
02.01.2002, 16:35
Bobby



Hab ich mir auch gedacht, habs aber nicht hinbekommen. Könntest du mir vielleicht mal als Hilfe sagen, was in die player.h rein muss (Definition des Pointers)? Wäre echt nett!

--

zum Seitenanfang zum Seitenende Profil || Suche
020
03.01.2002, 00:28
Rockefeller



Ja da machste die halt ein
CTriggerCamera m_PlayerView;

Und dann setzt du in CTriggerCamera::Use() das Ding auf this und dann wenn die Camera deaktiviert wird halt wieder auf NULL.

Und dann musst du nur noch testen, ob (m_PlayerView != NULL) ist, und wenn ja ist m_PlayerView die Camera-Entity.

--


Dieser Beitrag wurde am 03.01.2002 um 00:28 von Rockefeller bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche