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



Wie erstelle ich eigene Entities?
Habe mir mal das Tut unter http://www.thewall.de/coding/index.php?tutorial=1&id=4 durchgelesen, ist jedoch fast nur Code ohne Erklärungen. Ich will eigentlich nicht nur copy & paste sondern auch verstehen, was ich mache!

Kann mir vielleich jemand erklären, was die einzelnen Funktionen und includes machen? Falls es das schon gibt bitte url posten. Danke schon mal im voraus.

--


Dieser Beitrag wurde am 04.12.2001 um 18:41 von Bobby bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
04.12.2001, 19:34
Retro



Guck dir mal die bestehenden Entities an, z.B. jenes, von dem du dein neues Entity ableiten willst.

Nun c&p's du den gesamten Entity-Code in eine neue .cpp und änderst den Code nach deinen Vorstellungen.

--

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
002
04.12.2001, 19:36
SeconD



Also ich verstehe das so das dieses Entity dazu dient verschiedene Models darzustellen also z.B. eine Flagge einen Baum oder so.

Das kann der Mapper aber selber definieren was das Entity darstellen soll/kann.

Verbessert mich wenn das falsch ist :).

--

Bier macht dick, Schnaps macht krank ich bin Kiffer, Gott sei Dank.
Man kann hier auch Suchen...

zum Seitenanfang zum Seitenende Profil || Suche
003
04.12.2001, 20:39
Bobby



Ich verstehe schon die Funktion dieses Entities, ich meinte die C++-Funktionen. Ich will ein Grundgerüst für eine C++-Datei eines entites (dieses soll / braucht gar keine Parameter haben, die z.B. in Worldcraft eingestellt werden können!). Ich will einfach nur ein entity, das ich triggern kann. Dieses soll dann eine Funktion aufrufen, in der einfach folgendes stehen soll:

pPlayer->EnableControl(FALSE);

--

zum Seitenanfang zum Seitenende Profil || Suche
004
05.12.2001, 16:20
anothergb02



Schau welch wundersames Tier:

Schau ich kann hellsehen, du willst bestimmt, das die Funk aufgerufen wird, wenn man das Entity berühert.

// fockers simple func
BOOL IsTeam(int focker1,int focker2)
{
return focker1 == focker2 ? TRUE : FALSE;
}

class CGott : public CBaseEntity
{

// worldcraft implemtation
void KeyValue( KeyValueData *pkvd );

void Spawn();
void SwitchState(CBasePlayer*);

void Touch(CBaseEntity*);
void Use( CBaseEntity*, CBaseEntity*, USE_TYPE,float);
};

void CGott :: KeyValue( KeyValueData *pkvd )
{
if (FStrEq(pkvd->szKeyName, "Trick"))
{
pev->team = atoi(pkvd->szValue)
}
else
CBaseEntity::KeyValue( pkvd );

}

void CGott :: Spawn()
{
pev->movetype = MOVETYPE_PUSH;
pev->solid = SOLID_TRIGGER;
}

void CGott :: SwitchState(CBasePlayer* pPlayer)
{
if(!pPlayer)
return;

pPlayer->pev->flags & FL_FROZEN ? pPlayer->EnableControl(TRUE) : pPlayer->EnableControl(FALSE);

}

// damit use funktioniert musst man (glaube ich) noch irgand was einstellen
void CGott::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{
if(pCaller && IsActive(pCaller) && IsTeam(pev->team, pCaller->pev->team))
SwitchState(pCaller);
}

void CGott :: Touch(CBaseEntity* Sklave)
{
if(!Skalave)
return;

if(!Sklave->IsPlayer())
return;

if(IsActive(Sklave))
SwitchSate();
}

// Keine Ahnung ob das jetzt alles so hinhaut, muss aber offf harhar :P

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
005
05.12.2001, 16:46
Bobby



Warum meinst du?
Sieht nach Code für Multiplayer aus (Teamabfrage)? Brauche das ganze für ein SP-Intro. Aber danke trotzdem. Ich muss den Code halt noch ein bischen anpassen (Teamabfrage rausschmeißen) ;-)

Was spricht man eigentlich über pev an (scheint recht wichtig zu sein, so oft wie es vorkommt *g*)? Code erst seit ein paar Tagen.

--


Dieser Beitrag wurde am 05.12.2001 um 17:12 von Bobby bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
006
05.12.2001, 19:26
Another1



im sogenannten pev pointer (typ entvars_t = entity variablen struktur) sind alle variablen drinne die auch die engine kennt, und nur an diese kommt die engine auch ran, alle die außerhalb des "pev" für ein entity definiert sind (d.h. alle klassen und deren variablen) sind für die engine nicht erreichbar.
Is übrigens noch ausser quake engine =)

--

Another1

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

zum Seitenanfang zum Seitenende Profil || Suche
007
06.12.2001, 23:10
TheTinySteini



Wenn du sowas machen willst wie ein Entity, das einfach nur ein Model anzeigt, möglichst auch animiert und so, dann nimm dies hier:
Quellcode:/*===============================================
         -= http://www.poke646.com =-
The same old trouble in a brand new environment

GENERIC MODEL (model_generic)
Simple entity to display models without having
to mess with monster_generic and stuff.

STATUS: testing...

TheTinySteini
===============================================*/

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

#define GM_ANIMATE 1

class CGenericModel : public CBaseAnimating
{
char m_szSequence[128];

void KeyValue(KeyValueData *pkvd)
{
if (FStrEq(pkvd->szKeyName, "sequencename"))
{
strcpy( m_szSequence, pkvd->szValue );
pkvd->fHandled = TRUE;
}
else
CBaseEntity::KeyValue( pkvd );
}
void Spawn( void )
{
Precache( );
SET_MODEL(ENT(pev), (char*)STRING(pev->model));
pev->movetype = MOVETYPE_FLY;
pev->solid = SOLID_NOT;
if( pev->spawnflags & GM_ANIMATE )
{
pev->sequence = LookupSequence( m_szSequence );
pev->animtime = gpGlobals->time;
pev->framerate = 1.0;
}
InitBoneControllers();
}
void Precache( void )
{
PRECACHE_MODEL ((char*)STRING(pev->model));
}
};

LINK_ENTITY_TO_CLASS(model_generic, CGenericModel);

Ziemlich kurzes Teil, aber die Mapper werden dich dafür lieben =)
Leider wieder keine Kommentare, ich kann's nochmal näher erklären, aber jetzt muss ich erstmal off... vielleicht morgen.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
008
07.12.2001, 16:06
Another1



nur eine frage tiny:
warum nich einfach nen env_sprite nehmen? *gg*

--

Another1

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

zum Seitenanfang zum Seitenende Profil || Suche
009
07.12.2001, 16:44
anothergb02



ähmm tiny ?

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
010
07.12.2001, 16:49
anothergb02



Scheint ganz so als ob mein Pc gerade kleinere Probleme mit der Verbindung hat :( (2xpost)

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
011
07.12.2001, 17:38
Retro



omg gb2 was wolltest du uns nun mitteilen?! du bist echt dumm, wenn man mal deine intressen und sig anschaut muss man sich doch an den kopf fassen... was soll der scheiss?

--

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
012
07.12.2001, 19:44
TheTinySteini



@Another1:
Simple Sache: Ich wüsste net, dass ein env_sprite Models anzeigen (nun, das kann schon sein) und vor allem die Model-Animationen richtig abspielen kann (das kann net sein). Jedenfalls nicht dann, wenn's mehrere Animationen gibt.

@ the other another:
Höh?

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
013
07.12.2001, 20:21
hausi



Hehe. Goile Ausrede mit dem Doppelpost. Schon mal auf die Uhr gekuckt?
Ich glaube auf jeden Fall nicht, dass dein PC für die paar Bytes 3 Minuten braucht ;).

--

zum Seitenanfang zum Seitenende Profil || Suche
014
07.12.2001, 20:32
Another1



na logo geht das
einfach "sequence" und "framerate" dazu, und feddig,
naja egal, das model_generic war ja auch nich sooo viel arbeit =)

--

Another1

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

zum Seitenanfang zum Seitenende Profil || Suche
015
08.12.2001, 15:01
Bobby



@TheTinySteini: Danke für deine Mühe, aber bei mir hat er leider keiné Animationen angezeigt, also habe ich eben die Datei gman.cpp etwas verändert. Hier mein Code:

#include "extdll.h"
#include "util.h"
#include "cbase.h"
#include "monsters.h"
#include "schedule.h"
#include "weapons.h"

class CHumanSoldier : public CBaseMonster
{
public:
void Spawn( void );
void Precache( void );
void SetYawSpeed( void );
void KeyValue(KeyValueData *pkvd );

char m_sequence[128];
int m_bodygroup0;
int m_bodygroup1;
int m_bodygroup2;
int m_bodygroup3;
};
LINK_ENTITY_TO_CLASS( monster_hgrunt, CHumanSoldier );
LINK_ENTITY_TO_CLASS( monster_hgrunt_medic, CHumanSoldier );
LINK_ENTITY_TO_CLASS( monster_hgrunt_opfor, CHumanSoldier );
LINK_ENTITY_TO_CLASS( monster_hgrunt_torch, CHumanSoldier );

void CHumanSoldier::KeyValue(KeyValueData *pkvd)
{
if (FStrEq(pkvd->szKeyName, "sequence"))
{
strcpy( m_sequence, pkvd->szValue );
pkvd->fHandled = TRUE;
}
else if (FStrEq(pkvd->szKeyName, "bodygroup0"))
{
m_bodygroup0 = atof(pkvd->szValue);
pkvd->fHandled = TRUE;
}
else if (FStrEq(pkvd->szKeyName, "bodygroup1"))
{
m_bodygroup1 = atof(pkvd->szValue);
pkvd->fHandled = TRUE;
}
else if (FStrEq(pkvd->szKeyName, "bodygroup2"))
{
m_bodygroup2 = atof(pkvd->szValue);
pkvd->fHandled = TRUE;
}
else if (FStrEq(pkvd->szKeyName, "bodygroup3"))
{
m_bodygroup3 = atof(pkvd->szValue);
pkvd->fHandled = TRUE;
}
else
CBaseEntity::KeyValue( pkvd ); // Abfrage beenden
}

void CHumanSoldier :: SetYawSpeed ( void )
{
int ys;

switch ( m_Activity )
{
case ACT_IDLE:
ys = 150;
break;
case ACT_RUN:
ys = 150;
break;
case ACT_WALK:
ys = 180;
break;
case ACT_RANGE_ATTACK1:
ys = 120;
break;
case ACT_RANGE_ATTACK2:
ys = 120;
break;
case ACT_MELEE_ATTACK1:
ys = 120;
break;
case ACT_MELEE_ATTACK2:
ys = 120;
break;
case ACT_TURN_LEFT:
case ACT_TURN_RIGHT:
ys = 180;
break;
case ACT_GLIDE:
case ACT_FLY:
ys = 30;
break;
default:
ys = 90;
break;
}

pev->yaw_speed = ys;
}

void CHumanSoldier :: Spawn()
{
Precache();
SET_MODEL( ENT(pev), (char*)STRING(pev->model)); //SET_MODEL( ENT(pev), "models/hgrunt_opfor.mdl" );
UTIL_SetSize(pev, VEC_HUMAN_HULL_MIN, VEC_HUMAN_HULL_MAX);

pev->solid = SOLID_SLIDEBOX;
pev->movetype = MOVETYPE_STEP;
m_bloodColor = BLOOD_COLOR_RED; //m_bloodColor = DONT_BLEED;
pev->health = 100;
m_flFieldOfView = 0.5;// indicates the width of this monster's forward view cone ( as a dotproduct result )
m_MonsterState = MONSTERSTATE_NONE;

pev->sequence = LookupSequence( m_sequence ); // <<<
SetBodygroup( 0, m_bodygroup0);
SetBodygroup( 1, m_bodygroup1);
SetBodygroup( 2, m_bodygroup2);
SetBodygroup( 3, m_bodygroup3);

MonsterInit();
}

void CHumanSoldier :: Precache()
{
PRECACHE_MODEL ((char*)STRING(pev->model)); //PRECACHE_MODEL( "models/hgrunt_opfor.mdl" );
}

Es funktioniert alles wunderbar, nur die ausgewählte animation zeigt er nicht an (es wird immer die standard-idle-animaton angezeigt. Ich habe mir dann mal mit ALERT (at_console, "%Animation: %s\n", m_sequence); den Inhalt der Variablen anzeigen lassen, doch an der Konsole erschien nur 'Animation:', d.h. irgendwie kennt er die Variable nicht mehr. Was mache ich falsch?

--

zum Seitenanfang zum Seitenende Profil || Suche
016
08.12.2001, 15:26
anothergb02



Superhausi (3 min Unterschied):
Ahh ok du glaubst also wirklich ich bin so bescheuert einen Post mit 3 Minuten Versetzung 2x zu machen ´?? ähhh
schau ich habe 56k :( und wenn ich 2 Dateien auf einmal runterlade und dabei auch noch im Forum rumgucke dann dauert das erstmal ne Ewigkeit, bis ich den Thread öffnen kann und wenn ich was poste dann geht das in etwa so ............ . . . . . . . . . . . . . . . . . wart wart :(
Und leider kann ich meine Antworten nicht selber löschen, wenn sowas passiert.
Also nochmals Entschuldigung für diese 3 Posts :(

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
017
08.12.2001, 16:12
TheTinySteini



Bobby:

Mein Code geht... aber ich hab vergessen, dass du dann in die fgd-Datei folgendes einfügen musst:
Quellcode:@PointClass size(-16 -16 -16, 16 16 16) base(Targetname,RenderFields,Angles) = model_generic : "Generic model"
[
model(studio) : "Model"
sequencename(string) : "Sequence Name" : "idle"
skin(integer) : "Skin" : 0
body(integer) : "Body" : 0
spawnflags(flags) =
[
1: "Animate" : 0
]
]

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
018
08.12.2001, 18:12
Bobby



Schon gut, aber warum funktioniert mein Code nicht? Die Variable m_sequence ist in Spawn() leer. Warum? Muss ich die KeyValue()-Funktion irgendwie manuell aufrufen, oder was mache ich falsch?

--

zum Seitenanfang zum Seitenende Profil || Suche
019
09.12.2001, 16:00
anothergb02



Bobby du musst deine KeyValue func ändern, du kannst nicht einfach die String so copieren, da sie nicht als Strings verwaltet werden ....
hier:
......
int m_iszsequenze;
.....
m_iszsequenze = ALLOC_STRING(pkvd->szValue);

um den Int wieder in einen String umzuwandeln musst du das benutzen:
(char*)STRING(m_iszsequenze);

--

Being in john Malkovich
.....


Dieser Beitrag wurde am 09.12.2001 um 16:08 von anothergb02 bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
10.12.2001, 19:13
Bobby



Irgendwie will es bei mir nicht klappen. Ich habe den Code so wie du sagtest abgeändert (so hatte ich ihn früher schon mal ;-)), hat aber nicht funktioniert, was mache ich nur falsch?

--

zum Seitenanfang zum Seitenende Profil || Suche