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



Wie einige alten Hasen wissen, war es in einer früheren Half-Life Version (WON-Zeiten) möglich, fließendes Wasser zu erzeugen in Kombination mit einem trigger_push. In der Demo (Uplink) und auch in Opposing Force wird der Spieler weiterhin im Wasser in eine bestimmte Richtung gedrückt. In Half-Life ist das nicht mehr möglich. Dieser unnötige ( und nie beseitigte ) Bug schränkt einige tolle gametechnische Möglichkeiten ein. Er besteht vermutlich seit der SDK Version, die es dem Modder ermöglicht, auf die Move-Funktionen (pm_shared.c) der Engine Einfluss zu nehmen.
Leider konnte ich bis heute keinen einzigen Hinweis im Netz (mehr) finden, dass dieses Problem auch nur im Ansatz angegangen wurde. Vielleicht hängt das damit zusammen, dass viele diesen Effekt gar nicht mehr kennen und daher auch nicht vermissen können. Aus der Not habe ich mich aber mal rangesetzt und versucht eine Lösung zu finden. Ich muss nochmal dazu sagen, dass ich eigentlich nicht programmieren kann und die Lösung deswegen eventl. "ungünstig" sein könnte. Jedoch sind bei mir noch keine Fehler aufgetaucht.
Quellcode:void PM_WaterMove (void)
{
    int        i;
    vec3_t    wishvel;
    float    wishspeed;
    vec3_t    wishdir;
    vec3_t    start, dest;
    vec3_t  temp;
    pmtrace_t    trace;

    float speed, newspeed, addspeed, accelspeed;

    vec3_t basevec; //NEW
    float basevel; //NEW
//
// user intentions
//

    VectorCopy (pmove->basevelocity, basevec); //NEW
    basevel = VectorNormalize(basevec); //NEW

    for (i=0 ; i<3 ; i++)
    {
        wishvel[i] = pmove->forward[i]*pmove->cmd.forwardmove + pmove->right[i]*pmove->cmd.sidemove;
    }
    
    // Sinking after no other movement occurs
    if (!pmove->cmd.forwardmove && !pmove->cmd.sidemove && !pmove->cmd.upmove && !basevel) // ( && !basevel) IS NEW
        wishvel[2] -= 60;        // drift towards bottom
    else  // Go straight up by upmove amount.
        wishvel[2] += pmove->cmd.upmove;

    // Copy it over and determine speed
    VectorCopy (wishvel, wishdir);
    wishspeed = VectorNormalize(wishdir);

    // Cap speed.
    if (wishspeed > pmove->maxspeed)
    {
        VectorScale (wishvel, pmove->maxspeed/wishspeed, wishvel);
        wishspeed = pmove->maxspeed;
    }
    // Slow us down a bit.
    wishspeed *= 0.8;

    //VectorAdd (pmove->velocity, pmove->basevelocity, pmove->velocity); // ENTRY MOVED DOWN
    //Water friction
    VectorCopy(pmove->velocity, temp);
    speed = VectorNormalize(temp);
    if (speed)
    {
        newspeed = speed - pmove->frametime * speed * pmove->movevars->friction * pmove->friction;

        if (newspeed < 0.1f)
            newspeed = 0;
        VectorScale (pmove->velocity, newspeed/speed, pmove->velocity);
    }
    else
        newspeed = 0;

//
// water acceleration
//

    ////BASED ON HL2 Code:
    if (wishspeed >= 0.1f)
    {
        addspeed = wishspeed - newspeed;
        if (addspeed > 0)
        {

            VectorNormalize(wishvel);
            accelspeed = pmove->movevars->accelerate * wishspeed * pmove->frametime * pmove->friction;
            if (accelspeed > addspeed)
                accelspeed = addspeed;

            for (i = 0; i < 3; i++)
            {
                pmove->velocity[i] += accelspeed * wishvel[i];
            }

        }
    }
    VectorScale (pmove->basevelocity, 0.3, pmove->basevelocity);// NEW
    VectorAdd (pmove->velocity, pmove->basevelocity, pmove->velocity);//NEW

// Now move
// assume it is a stair or a slope, so press down from stepheight above
    VectorMA (pmove->origin, pmove->frametime, pmove->velocity, dest);
    VectorCopy (dest, start);
    start[2] += pmove->movevars->stepsize + 1;
    trace = pmove->PM_PlayerTrace (start, dest, PM_NORMAL, -1 );
    if (!trace.startsolid && !trace.allsolid)    // FIXME: check steep slope?
    {    // walked up the step, so just keep result and exit
        VectorCopy (trace.endpos, pmove->origin);
        return;
    }
    
    // Try moving straight along out normal path.
    PM_FlyMove ();
}
Das Ergebnis: Der Spieler wird wie bei OPF und alten Versionen von Half-Life im Wasser "geschoben" wenn er sich gleichzeitig in einem trigger_push befindet. Getestet haben ich das an einer eigenen Map und an der HL SP Map c2a4b. Zudem sinkt er nicht ab, wenn er von einem trigger_push geschoben wird.
Jedoch unterscheidet sich der "Effekt" dennoch vom Original, aber dazu bei Interesse mehr. Es wäre schön, wenn jemand (wenn es noch Coder hier gibt) es selbst testen könnte und eventl. sogar Verbesserungen hat.
Die "Maken" sind wie beim Original fast die dieselben ;)

--


Dieser Beitrag wurde am 20.04.2013 um 18:36 von Snut bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche