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



Eine Splittergranate ist eine Handgranate die, wenn sie explodiert, einige Splitter um 720° in alle Richtungen sprengt, die eigentliche Explosion ist sehr klein.

Sowas möchte ich für Half-Life machen, als Beispiel könnte man diese komische Nagelgranate aus TeamFortress nehmen, die Nägel um 180° verschießt, nur:

1. Die Splitter sollen alle gleichzeitig fliegen, rundherum.
2. Man soll die Splitter nicht sehen können, aber ihre Decals an den Wänden.
3. Der eigentliche Schaden geht von den Splittern aus, die Explosion ist minimal.

Hab leider noch keine Idee wie ich das umsetzen soll, der Quelltext von TF wäre schon mal nicht schlecht :)
Jemand eine Idee?

--

zum Seitenanfang zum Seitenende Profil || Suche
001
02.03.2003, 15:46
Retro



mach jeden splitter einfach wie nen schuss von ner waffe.. fertig.

--

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
02.03.2003, 16:52
doener



Ja, aber ich bekomm das mit den 720° nicht hin, dass die "Schüsse" zu allen Seiten gehen, rundherum eben, und dann auch noch zufällig. Sowas gibt's in Half-Life nicht, das ist wäre der dritte Parameter von CBaseEntiy:: FireBullets, nämlich "vecDir": In Half-Life gibt es dafür immer ein Ziel, z.B. vecDirToEnemy, aber die Schüsse sollen bei meiner Granate OHNE Ziel abgehen, einfach gerade um die 720° der Granate wegfliegen, bis sie in die nächste Wand einschlagen.

Hülfeee!

--

zum Seitenanfang zum Seitenende Profil || Suche
003
02.03.2003, 17:06
Onkel Dittmeyer



Ja und? vecDir ist die Richtung und damit auch indirekt das Ziel. In die Richtung dieses Vektors geht halt der Schuss - er hört nicht bei diesem Vektor auf sondern geht so lange weiter bis er auf was trifft. Und diesen Vektor kannst du dementsprechend randomisieren. Dann das ganze in ne Schleife gepackt für so 30 Splitter und dann hastes.

--

zum Seitenanfang zum Seitenende Profil || Suche
004
02.03.2003, 17:07
Grom



ganz doofe Frage:

Könnte man nicht theoretisch dann unsichtbare Ziele erschaffen, auf die die Schüsse zufliegen? Also Theoretisch könnte man das doch so lösen, oder!?

--

zum Seitenanfang zum Seitenende Profil || Suche
005
02.03.2003, 17:46
Retro



natürlich, vecdir oder was auch immer muss ja kein gegenstand sein, es ist ja idr. nur die richtung oder position des ziels.

vielleicht sollte man dir auch mal sagen dass es 720° garnicht gibt, es würde 0°/360° entsprechen.

--

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
006
02.03.2003, 17:47
doener



@Onkel Dittmeyer: Ok, danke, ich werd mal ein bissl rumspielen...
@Grom: Ja, aber das wären dann doch statische Ziele oder?
@Retro: Oh, das wusste ich nicht, hab immer gedacht das setzt sich aus 360° X-Achse und darauf nochmal 360° Y-Achse zusammen:


/Edit2: Mist, X und Y in der Skizze vertauscht...

--


Dieser Beitrag wurde am 02.03.2003 um 18:08 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
02.03.2003, 18:12
Grom



Kann man die nicht zufällig spawnen lassen ala Random?

--

zum Seitenanfang zum Seitenende Profil || Suche
008
02.03.2003, 18:16
doener



Sorry, das ist doch Scheiße, komplizierter geht's garnicht, jedesmal wenn wer so eine Granate wirft erstmal unsichtbare Ziele spawnen lassen, die dann von den Schüssen angeflogen werden, was ein Aufwand und wie das laggen würde...

--

zum Seitenanfang zum Seitenende Profil || Suche
009
02.03.2003, 18:22
Grom



Entschuldigung das ich nach einer Möglichkeit gesucht habe dir deine Frage zu beantworten...
Ich muss mir keine Gedanken über deine Probleme machen, du musst es nur sagen.

--


Dieser Beitrag wurde am 02.03.2003 um 18:23 von Grom bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
02.03.2003, 18:29
doener



Ok, tut mir Leid, ich finde es nett das du dir Gedanken über meine Idee machst, aber der Vorschlag ist nun wirklich nicht sehr genial ;)

--


Dieser Beitrag wurde am 02.03.2003 um 18:30 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
011
02.03.2003, 18:30
Spill



hmm, ich würde in das Model ne "explode-Animation" einbauen, bei der die Splitter wegfliegen. Im Code würde ich dann mehrere Radien (die Umkreise x >= 180 || x <= -180) und y >=0 || y<= 180 vom Model) um das explodierende Model erstellen, in denen mit Abstufungen die Healthpunkte abgezogen werden. Z.B. Im Umkreis von 5m 100HP´s, 10m 70HP´s usw. .

--

Hompage

zum Seitenanfang zum Seitenende Profil || Suche
012
02.03.2003, 18:30
Grom



k... naja ich versteh nicht viel vom coden, darum kann ich hier nicht mit Begriffen um mich schmeissen wie "vecDir" oder was weiss ich...

--

zum Seitenanfang zum Seitenende Profil || Suche
013
02.03.2003, 18:36
doener



@Spill: Nein Nein Nein, genau das will ich ja nicht machen: Es sollen die Splitter sein, die den eigentlichen Schaden machen, dadurch wirkt das ganze gefährlicher, da die Granate unberechenbarer wird. Außerdem ist es genauer, z.B. geht der Schaden dann nicht durch Fenster, Türen bzw. kleine Ritzen etc... kurzum realistischer.

--

zum Seitenanfang zum Seitenende Profil || Suche
014
02.03.2003, 18:37
Retro



@doener: nee, da musst du schon zwei verschiedene winkel angeben! stell dir mal vor x = 30° und y = 70°, würdest du daraus 100° machen. 100° könnte aber genauso gut x = 50° und y = 50° bedeuten, von daher ist es keine zuverlässige angabe.

du willst ja einfach dass z.b. 60 splitter bei der expolsion erzeugt werden.. hab lang nichtsmehr mit hl gemacht, deshalb isses nur nen beispielcode:

for (i = 0; i < 60; i++)
{
ZielVector = Vector(RandomX, RandomY, RandomZ);
FireBullets(ZielVector);
}

ich glaub hl nimmt werte im bogenmaß..

--

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
015
02.03.2003, 18:43
doener



Cool danke! Werd's mal probieren, und was den Winkelkrams angeht, du hast ja Recht, das mit den 720° hab ich noch von ner Homeworld oder Descent Reklame im Kopf: "Maximale Action in 720°" ;)

/Mal ne Frage: wäre in meinem Fall vecSpread und vecDir nicht das gleiche? Die Richtungen der Splitter sollen ja Random sein, wäre das nicht doppelt-gemoppel?

--


Dieser Beitrag wurde am 02.03.2003 um 18:56 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
016
02.03.2003, 19:19
Onkel Dittmeyer



Im Prinzip, ja. Das is halt der eigentliche Zielvektor und dann noch ein Streuvektor damits net so präzise is. Also kannste den ignorieren...

--

zum Seitenanfang zum Seitenende Profil || Suche
017
02.03.2003, 19:28
doener



So eine Scheiße, das darf nicht wahr sein!! :'(
Wie ging das nochmal mit Random, erstmal float x, y, z, dann x=RANDOM_FLOAT(+0,-0), aber wie groß dürfen die xyz Vektoren sein, +/-255?

--

zum Seitenanfang zum Seitenende Profil || Suche
018
02.03.2003, 19:39
Onkel Dittmeyer



Die Vektoren musst du abhängig zum Origin der Granate berechnen. Ich würd das so ungefähr machen:
Quellcode:vecSrc = grenade->pev->origin;
vecDir.x = RANDOM_FLOAT(vecSrc.x - 100, vecSrc.y + 100);
vecDir.y = RANDOM_FLOAT(vecSrc.y - 100, vecSrc.y + 100);
if (grenade->pev->flags & FL_ONGROUND)
vecDir.z = RANDOM_FLOAT(vecSrc.z, vecSrc + 100);
else
vecDir.z = RANDOM_FLOAT(vecSrc.z - 100, vecSrc + 100);
/edit Oder so ähnlich, hab jetzt net groß drüber nachgedacht oder es ausprobiert aber es sollte so ungefähr funktionieren =)

--


Dieser Beitrag wurde am 02.03.2003 um 19:43 von Onkel Dittmeyer bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
019
02.03.2003, 20:34
doener



So, ich komm nicht weiter, hier was ich geändert habe, unten die Fehlermeldung:

handgrenade.cpp:Quellcode:// just threw last grenade
            // set attack times in the future, and weapon idle in the future so we can see the whole throw
            // animation, weapon idle will automatically retire the weapon for us.
            m_flTimeWeaponIdle = m_flNextSecondaryAttack = m_flNextPrimaryAttack = UTIL_WeaponTimeBase() + 0.5;// ensure that the animation can finish playing
        }
        
        
        CGrenade *pGrenade = GetClassPtr( (CGrenade *)NULL );
        vecSrc = pGrenade->pev->origin;
        vecSrc.x = RANDOM_FLOAT(vecSrc.x - 100, vecSrc.y + 100);
        vecSrc.y = RANDOM_FLOAT(vecSrc.y - 100, vecSrc.y + 100);
        if (pGrenade->pev->flags & FL_ONGROUND)
        vecSrc.z = RANDOM_FLOAT(vecSrc.z , vecSrc.z + 100);
        else
        vecSrc.z = RANDOM_FLOAT(vecSrc.z - 100, vecSrc.z + 100);
        CGrenade::FireBullets(20, vecSrc, vecSrc, 0, 2000, BULLET_MONSTER_12MM, 2, 0, NULL);
        
        return;
    }
    else if ( m_flReleaseThrow > 0 )
    {
        // we've finished the throw, restart.
weapons.h:Quellcode:public:
    void Spawn( void );

    typedef enum { SATCHEL_DETONATE = 0, SATCHEL_RELEASE } SATCHELCODE;

    static CGrenade *ShootTimed( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity, float time );
    static CGrenade *ShootContact( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity );
    static CGrenade *ShootSatchelCharge( entvars_t *pevOwner, Vector vecStart, Vector vecVelocity );
    static CGrenade *FireBullets(ULONG cShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker );
    static void UseSatchelCharges( entvars_t *pevOwner, SATCHELCODE code );

    void Explode( Vector vecSrc, Vector vecAim );
    void Explode( TraceResult *pTrace, int bitsDamageType );

Zitat:
--------------------Configuration: hl - Win32 Release--------------------
Compiling...
handgrenade.cpp
Linking...
Creating library .\Releasehl/hl.lib and object .\Releasehl/hl.exp
handgrenade.obj : error LNK2001: unresolved external symbol "public: static class CGrenade * __cdecl CGrenade::FireBullets(unsigned long,class Vector,class Vector,class Vector,float,int,int,int,struct entvars_s *)" (?FireBullets@CGrenade@@SAPAV1@KVV
ector@@00MHHHPAUentvars_s@@@Z)
.\Releasehl/hl.dll : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

hl.dll - 2 error(s), 0 warning(s)

Hülfeee!

--


Dieser Beitrag wurde am 02.03.2003 um 20:36 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
02.03.2003, 22:02
Onkel Dittmeyer



Erstmal ist es _sehr_ wichtig dass du das nächste mal auch den Funktionsheadder sagst, sonst kann keine wissen was du genau machst =)
Also, die Klasse CHandGrenade kannste eigentlich so lassen wie sie is, es sei denn du willst irgendein Wurfverhalten ändern oso. Auch die Klassendeklaration von CGrenade kannste so lassen wie sie is. Geh in die ggrenade.cpp zur Funktion Explode( TraceResult *pTrace, int bitsDamageType ) und kommentier da den RadiusDamage aus. Dann kannste das dafür einsetzen:
Quellcode:Vector vecSrc, vecDir;
    vecSrc = pev->origin;

    for (i = 0; i < 30; i++)
    {
        vecDir.x = RANDOM_FLOAT(vecSrc.x - 100, vecSrc.y + 100);
        vecDir.y = RANDOM_FLOAT(vecSrc.y - 100, vecSrc.y + 100);
        if (pev->flags & FL_ONGROUND)
        vecDir.z = RANDOM_FLOAT(vecSrc.z, vecSrc + 100);
        else
        vecDir.z = RANDOM_FLOAT(vecSrc.z - 100, vecSrc + 100);

        FireBullets(1, vecSrc, vecDir, Vector(0,0,0), 8192, BULLET_MONSTER_12MM, 2, 0, pevOwner);

    }
Ich habs net getestet und gar nix aber wie schon oft erwähnt, es sollte ungefähr so gehen =)

--


Dieser Beitrag wurde am 02.03.2003 um 22:04 von Onkel Dittmeyer bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
021
02.03.2003, 22:46
doener



Jetzt geht's soweit, aber jetzt "verschießt" die Granate wenn sie explodiert 60 Schuss an einen Punkt, und immer im selben Winkel: Weil die Granate immer auf der Seite liegen bleibt :) Außerdem gilt das ja jetzt für alle Grenades, muss ich nochmal ne dedizierte Funktion machen.
Naja, denke den Rest bekomm ich alleine hin, werde mir nochmal shotgun.cpp angucken, jedenfalls danke für eure Hilfe!

/ROFL, das ist sooo geil, der Streukreis ist jetzt ziemlich groß, aber noch nicht rundum, jedenfalls macht das voll Bock: Wenn man mit der MP5 ne Granate auf nen Scientist schießt, dann macht das endlich mal nen guten Sound und es sieht voll echt aus... 8)

--


Dieser Beitrag wurde am 02.03.2003 um 23:05 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
022
03.03.2003, 01:41
Gott



wenn ich morgen wieder im büro bin kann ich dir helfen

--

millirem und bequerel , kleine kinder sterben schnell

Arsch für alles bei War in Europe
www.warineuropemod.com

zum Seitenanfang zum Seitenende Profil || Suche
023
03.03.2003, 07:15
Onkel Dittmeyer



Achja, ich hab nen kleinen Denkfehler: In der Schleife musst du noch den random Seed mit dem Counter ändern, da die random Funktionen ja mit der Zeit arbeiten und wenn man die Sache in einer Schleife macht, bleibt die Zeit ja immer gleich und dementsprechend auch die Vektoren. Wies genau geht hab ich jetzt kA, aber guck dir mal n Paar Referenzen im Code zu den Random Funktionen an, bin sicher da findeste was zu.

--

zum Seitenanfang zum Seitenende Profil || Suche
024
03.03.2003, 16:02
Onkel Dittmeyer



Ich habs mal aus Fun getestet und das scheint ganz gut zu gehen:
Quellcode:for (int i = 0; i < 300; i++)
    {
        vecDir.x = UTIL_SharedRandomFloat(i, vecSrc.x - 1000, vecSrc.y + 1000);
        vecDir.y = UTIL_SharedRandomFloat(i, vecSrc.y - 1000, vecSrc.y + 1000);
        vecDir.z = UTIL_SharedRandomFloat(i, vecSrc.z - 1000, vecSrc.z + 1000);

        FireBullets(1, vecSrc, vecDir, Vector(0,0,0), 8192, BULLET_NONE, 0, 20, pevOwner);

    }
Allerdings ist es selbt bei 300 Splittern sehr selten dass der Spieler getroffen wird und je höher man zählt, umso Performance fressender wird die Sache...
/edit Und bei 3 Granaten gehen schon die Frames bei mir wegen der vielen Decals runter.

--


Dieser Beitrag wurde am 03.03.2003 um 16:09 von Onkel Dittmeyer bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche