Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
24.08.2001, 01:55
Retro



Hallo, es geht mir darum, das ich den schaden eines Schusses auf die entfernung weniger tödlich machen möchte...

Aber ich weis nicht ob das überhaupt möglich ist.
Denn soweit wie ich bisher gedacht habe, geht es imo schlechter:

Man findet zuerst raus, wie weit die Kugel fliegen wird, und reduziert dementsprechend die Damage, aber was ist nun wenn nen gegner direkt vor den Lauf springt? Wird die entfernung dann geupdatet, oder kann man nur die entfernung bis zum nächsten World-Brush herauskrigen?

Aber der laser_spot vom RPG haftet ja auch an den Playern wenn man drauf ziehlt...

Aber wie krige ich die entfernung zum nächsten Hindernis in der Schußbahn raus? Also als Zahlenwert?

--

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
001
24.08.2001, 02:40
The_Overmind



also
1.) beim Abschuß die Koordinate speichern *z.B. vecSrc*
2.) beim Aufprall die Endkoordinate speichern *z.B. vecEnd*
3.) Entfernung:
Quellcode:
float XDifferenz, YDifferenz, ZDifferenz, FirstDistanz, FinalDistanz;

if ( vecSrc.x > vecEnd.x )
        XDifferenz = vecSrc.x - vecEnd.x;
else
        XDifferenz = vecEnd.x - vecSrc.x;

if ( vecSrc.y > vecEnd.y )
        YDifferenz = vecSrc.y - vecEnd.y;
else
        YDifferenz = vecEnd.y - vecSrc.y;

if ( vecSrc.z > vecEnd.z )
        ZDifferenz = vecSrc.z - vecEnd.z
else
        ZDifferenz = vecEnd.z - vecSrc.z;

/* Wir setzen die Abschußkoordinate als Mittelpunkt in einem Imaginärem Koordinatensystem und ermitteln nun die Koordinaten des Aufschlagpunktes dadrinne */

Bild dazu hier
Quellcode:
FirstDistanz = sqrt( ( XDifferenz * XDifferenz ) + ( YDifferenz * YDifferenz) );

/* Die Entfernung zwischen dem X und dem Y Punkt des Aufschlagspunkt. Er gibt eine Linie, die im rechten Winkel zur ZDifference verläuft */

FinalDistanz = sqrt( ( FirstDistanz * FirstDistanz ) + ( ZDifferenz * ZDifferenz ) );

Bild dazu hier!

Soooo
FinalDistanz is nun die Entfernung in Units *Inches*
Willst du die in Metern haben, musst du die nur noch durch 40 teilen

Damit kannst du dann deinen neuen Schaden umrechnen.

Falls du das nicht verstehst, meine ICQ is 38138527 ;)

MfG
[-XHP-]The Overmind

--


Dieser Beitrag wurde am 24.08.2001 um 02:42 von The_Overmind bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
002
24.08.2001, 03:34
anothergb02



Hää warum denn so sehr merkwürdig kompliziert ! ne length func gibs schon längs

also einfach

#define MAX_SHOOT_DISTANCE 8000

float finalDamage = MaxDamage-(MaxDamage*(vecStartShoot-vecEndShoot).Length()/MAX_SHOOT_DISTANCE)));

vecStartShoot ... kannst du ganz einfach kriegen musste mal unter TraceAttack beim Player oder so gucken !

geht bestimmt auch noch einfacher aber habe jetzt kein Lust !

--

Being in john Malkovich
.....


Dieser Beitrag wurde am 24.08.2001 um 03:38 von anothergb02 bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
24.08.2001, 06:23
The_Overmind



Muuuuuuuuuuuh!!!!!!!
Ich hab das imma mit der trigonometrie ausgrechnet *NOIN!!!*
Scheisse
Hab grad eben ne client-side Hud funktion gemacht die die Geschwindigkeit des Spielers ermittelt und der Befehl hät nicht schlecht geholfen
naja 2 1/2 Stunden *4 am -> 6.20am* unnütz

*halskrieg*

--


Dieser Beitrag wurde am 24.08.2001 um 06:36 von The_Overmind bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
24.08.2001, 12:22
DarKnight



LOL! Man sollte sich vorher schon die Vektorfunktionen in HL anschauen.... =)

--

void CHudSayText :: EnsureTextFitsInOneLineAndWrapIfHaveTo( int line ) -- Aja?

zum Seitenanfang zum Seitenende Profil || Suche
005
24.08.2001, 14:06
thinktank



Hmm ich kenn mich da ja nicht so aus , aber ich glaub anothergb will doch den Anteil von dem Distancevektor an der MaxShootDistance ausrechnen und dann diesen mal den MaxDamage nehmen. Also das Stückle hier :

(MaxDamage*(vecStartShoot-vecEndShoot).Length()/MAX_SHOOT_DISTANCE);

Aber wird da ned erst MaxDamage mal die Length genommen ?
Also wie bei der Punkt-vor-Strich-Regel ?

Hab ich was falsch verstanden ;) ?

--

zum Seitenanfang zum Seitenende Profil || Suche
006
24.08.2001, 14:47
Another1



nope is alles in ordnung

[EDIT]
doch nit, es is bei anothergb's code so das die kugel stärker wird je weiter sie weg is, das müsste man natürlich noch invertieren!

--

Another1

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


Dieser Beitrag wurde am 24.08.2001 um 14:48 von Another1 bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
24.08.2001, 15:16
anothergb02



a1 du Trottel mal bidde richtig gucken !! da ist ein - !!! also wird der Wert immer KLEINER !!! 8000-8000 = 0 du puper

--

Being in john Malkovich
.....

zum Seitenanfang zum Seitenende Profil || Suche
008
24.08.2001, 15:18
m.a.b.b.b



so verdient man sich den Respekt der Community....garantiert nicht...

--

-=B.L.Ä.N.D.E.R=-

zum Seitenanfang zum Seitenende Profil || Suche
009
24.08.2001, 15:57
Retro



Jo... =\ Immer ruhig Blut @gb02!

Also bisher gefällt mir die Methode von Overmind besser, weil ich sie verstehe:)

Die andere ist mir zwar auch soweit klar, aber da ich noch nichtmal #define MAX_SHOOT_DISTANCE finde, schätze ich mal das ich den Code neu erstellen muss, aber wohin damit?

Also Overminds Code würde ich ja eigentlich in waffe.cpp setzen, aber grad habe ich nochmal geguckt, und der Damage-Wert der Waffe (der ja im SP aus der skill.cfg geladen wird) garnicht in den FireBullets erwähnt wird, wie kann ich also den Wert übergeben?
Oder versuch ich den Code in ne 'falsche' .cpp zu setzen?

Das Prinzip ist mir jetzt klar, die Umsetzung noch nicht =\

--

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
010
24.08.2001, 17:07
TheTinySteini



LOL, erm, *räusper* tschuldige, dass ich lache *kicher*

*wiederernstwerd*

Mach dies hier:
Ganz oben in der combat.cpp definierst du das MAX_SHOOT_DISTANCE. Zum Beispiel so:
#define MAX_SHOOT_DISTANCE 2048

Dann in der CBaseEntity::FireBullets() schreibst du dann für jede Waffe, bei der der Distanzcheck sein soll, statt diesem hier:
Quellcode:case BULLET_PLAYER_9MM:
pEntity->TraceAttack(pevAttacker, gSkillData.plrDmg9MM, vecDir, &tr, DMG_BULLET);
break;

sowas hier:
Quellcode:case BULLET_PLAYER_9MM:
float distDamage = gSkillData.plrDmg9MM * ((tr.vecEndPos - vecStart).Length() / MAX_SHOOT_DISTANCE);
distDamage = (distDamage > gSkillData.plrDmg9MM) ? gSkillData.plrDmg9MM : distDamage;
pEntity->TraceAttack(pevAttacker, distDamage, vecDir, &tr, DMG_BULLET);

--

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

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



Grr... danke für auslachen! :P
Aber jetzt hab ichs auch verstanden! lol

Thx, aber eins versteh ich immer nor nicht ganz:
Ich gebe MAX_SHOOT_DISTANCE an, wenn man das mal übersetzt ergibt das ja sowas wie maximale Reichweite.
Ich möchte aber das der Schaden mir anwachsender Strecke abnimmt, und nicht nach (bsp.) 2048 Units ganz 'verschwindet'.
Oder habe ich da was in den falschen Hals gekrigt?

--

Also:
DistanzSchaden = GrundSchaden * Distanz / 2048.

Und wenn der 'neue' Schaden größer ist, als der Maximale, dann wird er halt auf den Wert in der skillvar zurück gesetzt.

Aber:
DistanzSchaden = GrundSchaden * Distanz / 2048.
DistanzSchaden = 20 * 2000 Units / 2048 = 19.53

DistanzSchaden = 20 * 1000 Units / 2048 = 9.77

Hmm, also wird der Schaden ja geringer, wenn das Ziel näher an mir dran ist?!
Oder habe ich schon wieder etwas falsch verstanden?

--

P.S.: Nachdem ich mal über die Rechnung nachgedacht habe, ist mir klar geworden was MAX_SHOOT_DISTANCE angibt, vorher dachte ich die maximale Reichweite, aber es hat ja doch eher mit der Rechung zu tun;)

--

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
24.08.2001, 17:52
TheTinySteini



Argh, sorry, da ist mir der Fehler passiert, den Another1 vorher meinte!
Es muss natürlich heißen:
Quellcode:float distDamage = gSkillData.plrDmg9MM - gSkillData.plrDmg9MM * ((tr.vecEndPos - vecStart).Length() / MAX_SHOOT_DISTANCE);
distDamage = (distDamage < 0) ? 0 : distDamage;

Bin mir nicht sicher, ob man die < 0 Überprüfung braucht, aber ich glaube, dass das von der TraceAttack nicht überprüft wird, sprich, es könnte sein, dass man dem Gegner dann Lebenspunkte HINZUGIBT, wenn man ne negative Zahl hat... wäre bisschen blöd =)

--

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

zum Seitenanfang zum Seitenende Profil || Suche
013
24.08.2001, 18:04
Killing Me Softly



die von anothergb02 vorgeschlagene "Grundformel" hieß:

float finalDamage = MaxDamage-(MaxDamage*(vecStartShoot-vecEndShoot).Length()/MAX_SHOOT_DISTANCE)));

also:
DistanzSchaden = GrundSchaden - GrundSchaden * Distanz / 2048

womit wir das Problem, das bei wachsender Distanz der Schaden zunimmt schonmal gelöst hätten. Ich bevorzuge allerdings die Schreibweise:
DistanzSchaden = GrundSchaden * (1.0 - Distanz / 2048)

Wenn man das Ganze eh in die FireBullets() reinbaut, dann könnte man auf MAX_SHOOT_DISTANCE auch gleich verzichten und stattdesen flDistance (wird als Parameter übergeben) verwenden. Der Parameter gibt übrigens wirklich die maximale Reichweite der Waffe an. Die Überprüfung auf negativen Schaden kann man sich dann nämlich auch schenken.

--

Der Horizont vieler Menschen ist ein Kreis mit Radius Null - und das nennen sie ihren Standpunkt.

zum Seitenanfang zum Seitenende Profil || Suche
014
24.08.2001, 18:08
Retro



Hmm, deine Formel versteh ich wieder net so ganz... aber was TTT gesagt hat gefällt mir schon ganz gut und ist für mich auch logisch...

Also:
DistanzSchaden = GrundSchaden - (GrundSchaden * Distanz / 2048)

DistanzSchaden = 20 - (20 * 2000 Units / 2048) = 0.47
DistanzSchaden = 20 - (20 * 1500 Units / 2048) = 5.35
DistanzSchaden = 20 - (20 * 1000 Units / 2048) = 10.23
DistanzSchaden = 20 - (20 * 500 Units / 2048) = 15.12

Ich schätze das funzt genauso gut, oder? @KMS?
Aso, und das die Waffe über ner gewissen Distanz garkeinen schaden mehr macht, hab ich schon eingebaut.

Wenn die Damage-Werte mal anders seien sollen gibts ja noch die MAX_SHOOT_DISTANCE zum anpassen... Oder man definiert noch ne zweite.

Oder hab ich wieder nen Denkfehler gemacht? lol bin heute net gut drauf! :p

Thx!

--

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 */


Dieser Beitrag wurde am 24.08.2001 um 18:14 von Retro bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
24.08.2001, 18:21
TheTinySteini



Naja, was Killing Me Softly da geschrieben hat, ist im Prinzip das gleiche. Er hat schon recht, es ist bisschen besser vom Stil her.
Aber dass es echt das gleiche ist, zeigt sich, wenn du die Klammer hinten einfach mal ausmulitplizierst:
Quellcode: DistanzSchaden = GrundSchaden * (1.0 - Distanz / 2048)
= GrundSchaden * 1.0 - GrundSchaden * Distanz / 2048
= GrundSchaden - GrundSchaden * Distanz / 2048

... und genau das hatte ich geschrieben, nur halt mit den entsprechenden HL-Variablen.

--

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

zum Seitenanfang zum Seitenende Profil || Suche