Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
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 :
Quellcode:
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.
zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende 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.

zum Seitenanfang zum Seitenende 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.
zum Seitenanfang zum Seitenende Profil || Suche