GTAvision.com - Forum - Grand Theft Auto News, Downloads, Community and more...

Position: Grand Theft Auto: San Andreas » Multiplayer » Scripte und kleine Codes » Distanz » Druckansicht
Robdeflop1, 12.11.2009, 19:49
Hi

Ich wollte ma fragen wie ich die distanz zwichen 2 punkten auf der karte rausbekommen kann. Ich
hatte volgende theorie:

Pos 1 = X + Y + Z = XYZ

Pos 2 = X2 + Y2+ Z2 = XYZ2 oda so

Dann die größere von den beiden zusammengemixxten poshaufen minus die kleiner = distanz zwichen den
beiden punkten.
Das stimmt aber leider nit

Kann mir einer helfen wie ich das machen kann? in pawno

*edit: oda zumindestens sagen wie ich das am besten rechnen kann/muss, den rest kann ich dann
alleine.

MFG, RoB
Nico, 13.11.2009, 12:52
d = SQRT((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)

Gruß Nico
Robdeflop1, 13.11.2009, 15:10
HI

Schonma danke^^
Wofür steht das SQRT?
Meinst du damit floatsqroot?

MFG, RoB
Recycler, 13.11.2009, 15:56
Ja, floatsqroot ist an dieser Stelle die richtige Funktion (Quadratwurzel), wenn auch langsam. Eine
mögliche Implementierung ohne floatpower (ebenfalls eine langsame Funktion) wäre zum Beispiel:

Code:
1
floatsqroot(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)) + ((z1 - z2) * (z1 - z2)));


Einfache Multiplikation der Faktoren.

MfG
Recycler
Robdeflop1, 13.11.2009, 16:45
Hi

Funzt das so recycler??
Ich dachte das muss mit wurzel gemacht werden, sonst bekommt man iwie probleme bei diagonalen
strecken.

Un da steht nirgendwo floatpower^^

MFG, RoB
Recycler, 13.11.2009, 17:17
Das funktioniert wie in dem Beispiel. Und hier kommt die Quadratwurzel zum Einsatz, meinetwegen
auch die "normale" Wurzel als Umkehrung des Quadrats x².

floatpower benutze ich in dem Code nicht und das ist wie gesagt eine Verbesserung. Viele Scripte
benutzen diese Potenzfunktion und nehmen dann als Exponenten die 2. Equivalent habe ich den Faktor
mit sich selbst multipliziert. Das ist schneller als floatpower mit 2, jedenfalls in PAWN.

MfG
Recycler
Robdeflop1, 14.11.2009, 16:45
Hi

Achsöö^^
Danköö, ich hätte in mathe besser aufpassen sollen :D
Vielleicht hab ich demnächst nochma ne frage zu dem thema, bin nämlich grad selber n km/h tacho am
machen, den ich nit soo einfach finde^^
Aber jetzt wo ich ja die formel hab sollte es eig kein prob sein.

MFG, RoB
Recycler, 14.11.2009, 18:07
Seit SA-MP 0.3 gibt es eine extra Funktion um die Geschwindigkeit des Spielers zu ermitteln. Der
Distanzalgorithmus ist nicht mehr nötig. So etwas sollte reichen:

Code:
1
speed = (X + Y + Z) * 100 * 1.61


(ungetestet)

Die Konstanten am Ende sind irgendwelche schlauen Werte die die GTA Einheit in eine halbwegs
realistische KM/H Einheit umrechnen. Ohne 1.61 hat man MPH. X, Y und Z sind die Werte aus
GetPlayerVelocity bzw. GetVehicleVelocity.

MfG
Recycler
Robdeflop1, 14.11.2009, 18:36
achsoo :D

Wusste ich noch garnit.
Also rechnet der das schon mit wurzel usw automatisch oda was?

MFG, RoB

*EDIT:

Was is daran falsch?:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public TachoUpdate(playerid)
{
      for(new i = 0;i<MAX_PLAYERS;i++)
      {
         if(IsPlayerInAnyVehicle(playerid))
         {
             Tacho2 = TextDrawCreate(300, 200, "Km/h:---");
            TextDrawLetterSize(Tacho2, 0.4, 1.1);
            TextDrawFont(Tacho2, 1);
            TextDrawSetShadow(Tacho2, 2);
            TextDrawSetOutline(Tacho2,1);
            
            
            new vid = GetPlayerVehicleID(playerid);
             new Float:X,Float:Y,Float:Z;
             new Float:newX,Float:newY,Float:newZ;
            GetVehiclePos(vid, X, Y, Z);
            
         
             new Float:distance,geschwindigkeit;
            distance = floatsqroot(((lastX[playerid]-X) * (lastX[playerid]-X)) + ((lastY[playerid]-Y
) * (lastY[playerid]-Y)) + ((lastZ[playerid]-Z) * (lastZ[playerid]-Z)));
         
            geschwindigkeit = floatround(distance * 22000);
         
            new TachoString2[100];

              format(TachoString2,sizeof(TachoString2),"Km/h: %d", floatround(geschwindigkeit / 6400
0));
              TextDrawSetString(Tacho2, TachoString2);
              TextDrawShowForPlayer(playerid, Tacho2);

            TachoTacho(playerid);

              GetVehiclePos(vid, newX, newY, newZ);
              lastX[playerid] = newX;
              lastY[playerid] = newY;
              lastZ[playerid] = newZ;
         }
      }
   return 1;
}


ich hatte es vorher auch iwie so, aber nie gehts nimmer. Hab iwas geändert, weiß aber nichmehr was.
Der Server schmiert ab wenn ich ig gehe un in ein car einsteige.

MFG, RoB
Recycler, 14.11.2009, 18:49
Lass doch diese alte Berechnung weg und mach es wie ich es vorgeschlagen habe. Das ist um einiges
schneller und einfacher!

MfG
Recycler
Robdeflop1, 14.11.2009, 18:55
ok

Muss ich das dann auch mit nem timer usw machen?

MFG, RoB
Recycler, 14.11.2009, 18:58
Ja, das musst du dann wohl auch mit einem Timer machen. Nur die Berechnung ist einfacher geworden.

MfG
Recycler
Robdeflop1, 14.11.2009, 18:58
ok thx, ich werds dann so machen :)

MFG, RoB
Robdeflop1, 14.11.2009, 19:16
HI

Nu hab ich das raus:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public TachoUpdate(playerid)
{
      for(new i = 0;i<MAX_PLAYERS;i++)
      {
         if(IsPlayerInAnyVehicle(playerid))
         {
             new TachoString2[256];
             new Float:X, Float:Y, Float:Z;
             GetVehicleVelocity(GetPlayerVehicleID(playerid), X, Y, Z);
            new Float:geschwindigkeit = (X + Y + Z) * 100 * 1.61;
            format(TachoString2,sizeof(TachoString2),"Km/h: %d", floatround(geschwindigkeit));
            TextDrawSetString(Tacho2, TachoString2);
                TextDrawShowForPlayer(playerid, Tacho2);
         }
      }
   return 1;
}


Aber das funzt net ganz^^
Da steht jenachdem in welche richtung man fährt n minus vor der geschwindigkeit.
Der timer is 0,5 sekunden.

*EDIT: Un bei diagonaler fahrrichtung gibts auch probleme, da zeigt der an dass man langsamer
fährt, manchmal sogar 0.


MFG, RoB
Recycler, 14.11.2009, 21:08
Scheint doch nicht so zu funktionieren wie ich das dachte. Hier ist die richtige Formel zur
Berechnung der Geschwindigkeit:

Code:
1
speed = floatsqroot(X*X + Y*Y + Z*Z) * 100 * 1.61


Passiert mir immer wieder und ist wohl der schlimmste Fehler den man machen kann -> das Quadrat
einer Summe ist nicht gleich der Summe der Quadrate :shock:

MfG
Recycler
Robdeflop1, 14.11.2009, 22:10
aso, k ty^^
ich werds testen.
Ich könnte es eig wissen wenn ich in der schule aufgepasst hätte :D
Meine lehrerin wüsste aber glaube ich auch wie man sowas macht, weil die glaube ich C++ kann :D
Naja, erstmal danke, hast mir sehr geholfen

MFG, RoB
Robdeflop1, 15.11.2009, 00:15
Hi

Nu hab ichn anderes prob :D

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public TachoUpdate(playerid)
{
      for(new i = 0;i<MAX_PLAYERS;i++)
      {
         if(IsPlayerInAnyVehicle(playerid))
         {
             new vid = GetPlayerVehicleID(playerid);
             GetVehicleHealth(vid, CarInfo[vid][Schaden]);
             new TachoString2[256] ,TachoString[256], TachoString1[256], TachoString3[256], TachoStr
ing4[256];
             new Float:X, Float:Y, Float:Z;
             GetVehicleVelocity(GetPlayerVehicleID(playerid), X, Y, Z);
            new Float:geschwindigkeit = floatsqroot(X*X + Y*Y + Z*Z) * 100 * 2.5;
            

            
            new Float:schaden;
              new Float:carschaden;
              GetVehicleHealth(vid, carschaden);
              schaden = 1000 - carschaden;
             new Float:Schaden = floatdiv(schaden,10);
            
            format(TachoString2,sizeof(TachoString2),"Km/h: %d", floatround(geschwindigkeit));
            format(TachoString,25,"Tank: %d/%d",CarInfo[vid][Tankinhalt], CarInfo[vid][Tankvolumen]);
            format(TachoString1,25,"CarID: %d",CarInfo[vid][ID]);
            format(TachoString3,25,"KM: %d",CarInfo[vid][KM]);
            format(TachoString4,25,"Schaden: %.0f%", Schaden);

            TextDrawSetString(Tacho2, TachoString2);
                TextDrawShowForPlayer(playerid, Tacho2);

            TextDrawSetString(Tacho,TachoString);
              TextDrawShowForPlayer(playerid, Tacho);

              TextDrawSetString(Tacho1,TachoString1);
              TextDrawShowForPlayer(playerid, Tacho1);
              
              TextDrawSetString(Tacho3,TachoString3);
              TextDrawShowForPlayer(playerid, Tacho3);
              
              TextDrawSetString(Tacho4,TachoString4);
              TextDrawShowForPlayer(playerid, Tacho4);
         }
      }
   return 1;
}


Was is daran falsch?
der zeigt folgendes an:

Code:

1
2
3
4
5
6
7
F:\Rockstar Games Server\GTA San Andreas 0.3\gamemodes\SARL.pwn(2297) : warning 219: local variable "
Schaden" shadows a variable at a preceding level
F:\Rockstar Games Server\GTA San Andreas 0.3\gamemodes\SARL.pwn(2303) : warning 213: tag mismatch
F:\Rockstar Games Server\GTA San Andreas 0.3\gamemodes\SARL.pwn(2297) : warning 204: symbol is assig
ned a value that is never used: "Schaden"
Pawn compiler 3.2.3664           Copyright (c) 1997-2006, ITB CompuPhase


3 Warnings.


Das hat alles mit dem schaden zu tun.
Hab kp warum das so is oO
Ich hab doch alles richtig gemacht oda?

MFG, RoB
Robdeflop1, 15.11.2009, 13:00
Hi

Hab das problem gelöst. Es lag daran dass ich bei Autodateien ne enum namens Schaden hatte.
Deswegen kamen die fehler :D

Jetzt hab ich aber ein neues prob.
Ich will eine schadensanzeige machen, die von 0 - 100% geht.
0 is kein schaden, un 100 is MS (motorschaden).
Meine bisherige Rechnung is so:

(Maximalerschaden(1000) - Vehiclehealth) / 10

Dann ist der wagen aber schon bei 75 prozent kaputt, und nicht bei 100.
Wie muss ich das rechnen?

MFG, RoB
Recycler, 15.11.2009, 13:19
Code:
1
100 - (Vehiclehealth / 10)


So müsste das gehen. Dann hast du den Schaden in Prozent wenn 100% gleich Totalschaden
(Vehiclehealth = 0)

MfG
Recycler
Robdeflop1, 15.11.2009, 13:26
Ah, ok, ich werds testen.

Achja, der Tacho funzt einwandfrei! Vielen dank!

MFG, RoB
Robdeflop1, 15.11.2009, 13:38
Hmm, ne funzt net.
Habs so gemacht:

Code:
1
2
3
4
5
6
7
8
9
10
                new Float:carschaden;
            new Float:schaden;
            GetVehicleHealth(vid, carschaden);
            schaden = 100 - (carschaden / 10);

format(TachoString4,25,"Schaden: ~y~%d", floatround(schaden));[code]

Explodiert wieder bei 75 schaden.

MFG, RoB
Recycler, 15.11.2009, 13:50
Das liegt daran dass ein Fahrzeug bei 250 oder weniger Health explodiert. So ist das in GTA San
Andreas festgelegt worden. Du könntest die 100% ja auf eine Health-Skala von 250 - 1000 beziehen.

MfG
Recycler
Robdeflop1, 15.11.2009, 13:58
HI

Jo, das is ja mein problem :*(
Wie mach ich sone healthskala?
Muss ich da für jeden Prozent schaden das festlegen?

z.B. so:

Code:
1
2
3
4
5
6
7
8
9
10
11
if(GetVehicleHealth(vid) = 1000)
{
   CarInfo[vid][Schaden] = 0;
}
else if(GetVehicleHealth(vid) = 996)
{
   CarInfo[vid][Schaden] = 1;
}
.
.
.


Oda geht das einfacher?

MFG, RoB
Recycler, 15.11.2009, 14:13
Code:
1
prozent = (vhealth < 250) ? 100 : floatround((100 - (vhealth / 10)) * (4 / 3));


MfG
Recycler
Robdeflop1, 15.11.2009, 14:27
Hi

Der zeigt 0 und 100 schaden problemlos an, aber dazwichen sins nur fette zahlen.
Also so 8 oda 10 stellige, hab aber nit nachgezählt.
Wofür steht das ? un der : ?
Der zeigt mir auch ein warning in der zeile an, Tag mismatch.

MFG, RoB
Recycler, 15.11.2009, 14:31
Code:
1
new Float:prozent = (vhealth < 250.0) ? 100.0 : ((100.0 - (vhealth / 10.0)) * (4.0 / 3.0));


Dann benutz das erstmal ohne floatround und wende den Wert dann wie in deinem Code an. Stell
sicher, dass du den richtigen Datentyp anzeigen lässt -> floatround(prozent) -> Integer %d.

In diesem Fall benutze ich den Bedingungsoperator...lies hier nach:

http://www.imb-jena.de/~gmueller/kurse/c_c++/c_operbd.html

MfG
Recycler
Robdeflop1, 15.11.2009, 14:40
Hi

Geil, danke es funzt!
Den integer %d hab ich vorher auch die ganze zeit benutzt.

Und floatround musste rein, ohne gings nit^^
Ty, hast mir sehr geholfen :D
Vielleicht hab ich gleich nochn paar fragen zu KM zähler xD

MFG, RoB

Vielen dank :-)
Robdeflop1, 15.11.2009, 15:24
Hmm, wie ichs mir gedacht hab, hab ich auch probleme mit dem KM zähler^^

Wie kann ich einen realistichen KM zähler mit

Code:
1
new Float:geschwindigkeit = floatsqroot(X*X + Y*Y + Z*Z) * 100 * 2.5;


machen?

Ich bekomme sogut wie immer fette zahlen raus.

MFG, RoB
Recycler, 15.11.2009, 19:12
So funktioniert das nicht. Die Berechnung der Geschwindigkeit in KM/H lässt du mal wie ich sie
gepostet habe. Der Rest ist nur noch Logik - die Geschwindigkeit wird per Timer in einem bestimmten
Intervall abgerufen. Geht man davon aus, dass in dieser Zeit die Geschwindigkeit konstant bleibt,
kann man die Strecken errechnen.

Bei einem Timer von 200ms wäre die Berechnung in etwa:

Code:
1
KMzaehler += (geschwindigkeit / 3600) / 0.2


Verständlich?

MfG
Recycler
Robdeflop1, 16.11.2009, 21:59
Hi

Gut, funzt alles, ty^^

Hab nu aber n neues prob.
Ich habn car system. Von jedem car wird ne datei gemacht, wenn ich ein car erstelle.
Aber wenn ich ein car lösche, dann is das car zwar im ersten moment weg (also die datei im ordner),
aber wenn ich den server ausmache, dann sin die gelöschen dateien wieder da :shock:
Aber warum?

das is im /delcar cmd drinne:

Code:
1
2
3
4
5
6
7
8
9
10
11
format(string10, sizeof(string10), "/Autos/%d.cer", GetPlayerVehicleID(playerid));
                if(fexist(string10))
                {
                  DestroyVehicle(GetPlayerVehicleID(playerid));
                  fremove(string10);
                  SendClientMessage(playerid, COLOR_YELLOW, "Fahrzeug wurde gelöscht!");
               for(new i = 1; i < MAX_VEHICLES; i++)
               {
                   CarSave(i);
               }
                }


Das sollte doch funktionieren oda nit?

MFG, RoB
Robdeflop1, 17.11.2009, 16:05
Hi

Oder wie kann ich die datei per script umbenennen?
Geht das mit den einfachen funktionen in der file.inc?
Weil ich das dann einfach zu 0 umbenenne, un in Gamemodeexit is ein command, der alle cars löscht
die dann den dateinamen 0 haben.
(der dateiname is die ID von dem car)

MFG, RoB
Robdeflop1, 21.11.2009, 14:31
HI

So, der server crasht immer, wenn ich in ein fahrzeug einsteige.
Das liegt an der schadensanzeige.
Wie kann ich machen dass der nimmer crasht?
Hast du noch ne idee?

Pls help^^

MFG, RoB
Robdeflop1, 21.11.2009, 22:40
Hi

Is nu egal^^ machs ohne Schadensanzeige, da das ja sowieso contra RL is ;-)

Nu hab ich aber das proble, dass die Textdraws vom tacho bei mir daheim aufm server angezeigt
werden, aber nit wenn ich auf den server vom Hoster angezeigt werden, obwohl es das selbe script is.
Daheim funzt auch ein Spawnsystem un ein TO-System einwandfrei, aber iwie net auf dem server vom
hoster -.-
Dieses prob hab ich schon ein bissl länger und finde einfach keine lösung :*(
Kann mir keiner helfen?

MFG, RoB
GTAvision.com :: Forumregeln :: FAQ :: Impressum :: Kontakt :: RDRvision.com :: LANOIREvision.com :: MaxPayneVision.com
NetVisionWork.NET
.: © 2006-2014 by GTAvision.com :.

Rockstar GamesTake-Two Interactive Deutschland

Free Grand Theft Auto Downloads