000
01.05.2002, 17:46
thinktank
|
Ich probier gerade ein Ent zu machen, dass einfach Scahden verrursacht, wenn es getoucht wird, nur ich hab noch Probleme mit der Größe. Hier der Code :
void CTriggerSpellHurt :: Spawn(int iSpell, int iSpellGrade, vec3_t origin) { switch (iSpell) { case SPELL_FIREWALL: fDamageBit |= DMG_BURN; m_flDuration = gpGlobals->time + 5.0; //TODO: Add a iSpellGrade based factor here pev->dmg = gSkillData.plrDmgFirewall; UTIL_SetSize(pev, Vector(500,500,500), Vector(500,500,500)); break; }
// ALERT(at_console,"Origin of SpellHurtTrigger : %f, %f, %f \n",origin.x,origin.y,origin.z);
if (pev->angles != g_vecZero) SetMovedir(pev); pev->solid = SOLID_TRIGGER; pev->movetype = MOVETYPE_NONE; SET_MODEL(ENT(pev), STRING(pev->model)); // set size and link into world pev->effects |= EF_NODRAW; SetTouch ( HurtTouch ); UTIL_SetOrigin( pev, origin ); // Link into the list
SetThink(RemoveThink);
pev->nextthink = gpGlobals->time; }
void CTriggerSpellHurt :: RemoveThink( void ) { if (m_flDuration <= gpGlobals->time) { ALERT(at_console,"Kill me !\n"); MESSAGE_BEGIN(MSG_BROADCAST, gmsgKillClEnt); WRITE_BYTE(ENTINDEX(edict())); MESSAGE_END();
REMOVE_ENTITY(edict()); } else { pev->nextthink = gpGlobals->time + 0.1; } }
void CTriggerSpellHurt :: HurtTouch(CBaseEntity *pOther) {
ALERT(at_console, "Someone touches me .... \n"); float fldmg;
if ( !pOther->pev->takedamage ) return;
// HACKHACK -- In multiplayer, players touch this based on packet receipt. // So the players who send packets later aren't always hurt. Keep track of // how much time has passed and whether or not you've touched that player if ( g_pGameRules->IsMultiplayer() ) { if ( pev->dmgtime > gpGlobals->time ) { if ( gpGlobals->time != pev->pain_finished ) {// too early to hurt again, and not same frame with a different entity if ( pOther->IsPlayer() ) { int playerMask = 1 << (pOther->entindex() - 1);
// If I've already touched this player (this time), then bail out if ( pev->impulse & playerMask ) return;
// Mark this player as touched // BUGBUG - There can be only 32 players! pev->impulse |= playerMask; } else { return; } } } else { // New clock, "un-touch" all players pev->impulse = 0; if ( pOther->IsPlayer() ) { int playerMask = 1 << (pOther->entindex() - 1);
// Mark this player as touched // BUGBUG - There can be only 32 players! pev->impulse |= playerMask; } } } else // Original code -- single player { if ( pev->dmgtime > gpGlobals->time && gpGlobals->time != pev->pain_finished ) {// too early to hurt again, and not same frame with a different entity return; } }
// If this is time_based damage (poison, radiation), override the pev->dmg with a // default for the given damage type. Monsters only take time-based damage // while touching the trigger. Player continues taking damage for a while after // leaving the trigger
fldmg = pev->dmg * 0.5; // 0.5 seconds worth of damage, pev->dmg is damage/second
if ( fldmg < 0 ) pOther->TakeHealth( -fldmg, fDamageBit ); else pOther->TakeDamage( pev, pev, fldmg, fDamageBit );
// Store pain time so we can get all of the other entities on this frame pev->pain_finished = gpGlobals->time;
// Apply damage every half second pev->dmgtime = gpGlobals->time + 0.5;// half second delay until this trigger can hurt toucher again }
Der Code ist größtenteils aus CTrigggerHurt. Das iSpell etc. tut nichts zur Sache. Wenn ich die Größen bei UTIL_SetSize ändere ändert sich die Größe nicht ! Also toucht der Player das Ent nur, wenn er genau den Origin trifft.
Wie kann ich das ändern ? Oder Soll ich RadiusDamage(...) verwenden :/ ?
[edit]
Mir ist gerade engefallen, dass ich das auch einfach mit einer TraceLine machen kann. Aber woran liegts hier ?
[/edit]
--
Dieser Beitrag wurde am 01.05.2002 um 17:49 von thinktank bearbeitet.
|
|
Profil || Suche
|
001
01.05.2002, 17:51
Archangel
|
ähm, du kannst Spawn nich einfach so überladen.. wo setzt du iSpell, iSpellGrad und origin ? mach die doch als member-variablen von CTriggerSpellHurt, die in der KeyValue gesetzt werden..
--
Mar 01 01:10:13 <voice> jo Mar 01 01:10:40 <voice> bis dann ^^ Mar 01 01:11:20 <Archangel> jo **** ENDING LOGGING AT Tue Mar 1 01:58:13 2005
|
|
Profil || Suche
|
002
01.05.2002, 17:57
Killing Me Softly
|
noch'n Tipp: UTIL_SetSize(pev, Vector(-500,-500,-500), Vector(500,500,500)); (wobei 500 imho etwas übertrieben ist).
--
Der Horizont vieler Menschen ist ein Kreis mit Radius Null - und das nennen sie ihren Standpunkt.
|
|
Profil || Suche
|
003
01.05.2002, 18:02
thinktank
|
Hmm inzwischen ist mir eine andere viel bessere Lösung für das Problem eingefallen ( genial , gerade nach dem Post ). Das Problem ist folgendes: Ich will eine Feuerwand machen, die natürlich Schaden verursacht. Mein erster Gedanke ging an TriggerHurtm, aber jetzt ist mir eingefallen, dass man das VIEL besser mit einer TraceLine in der Richtung der Wand machen könnte. Also der Post ist eigentlich überflüssig =(. Aber wenn ich Probs mit der neuen Lösung hab werd ich die hier hin schreiben.
Wieder einmal hätte sich der Grundsatz "Think before you post" bewährt. Sorry .
@Archangel: Sorry hab vergessen zu sagen, dass das Entity im Code createt wird, also nicht vom Mapper eingesetzt wird.
BTW : Warum kann man eigentlich seine eigenen Posts nicht löschen ?
--
Dieser Beitrag wurde am 01.05.2002 um 18:03 von thinktank bearbeitet.
|
|
Profil || Suche
|