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

Position: Grand Theft Auto: San Andreas » Multiplayer » Derby » Druckansicht
G4M3R, 23.02.2009, 12:18
hi leute ich möchte ein derby scripten doch leider komme ich bei den spawnen nicht weiter.
Man kommt mit /derby zum Derby.
Jeder player soll einen eigenen derby spawn haben also z.b keine random spawns weil z.b zwei
spieler den selben random spawn haben könnten und das ist dann nicht gut.
Habe schon hier und im official sa-mp forum geschaut aber leider nix gefunden :(
Kann mir einer helfen?
Rafioso, 23.02.2009, 19:37
Hi,

zeige doch bitte erst, wie dein aktueller Stand aussieht.

MfG
Rafioso
G4M3R, 23.02.2009, 22:17
ok, also ich komme nicht weiter, deshalb ist es nocht nicht fertig^^
also wundert euch net wenn max player in derby 3 sind und derbytime usw. net gezählt wird^^

aber ich poste mal den Stand:

/derby und /derbyexit:
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
<?
   if(strcmp(cmdtext, "/derby",true)==0)
   {
   GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
   format(string, sizeof(string), ">> DERBY << %s ist zum Derby! /derby", playername);
   rand = random(sizeof(RandomColor));
   SendClientMessageToAll(RandomColor[rand][0],string);
   for(new i=0; i<MAX_PLAYERS; i++)
   {
   if(inderby[i] == 3)
   {
   SendClientMessage(playerid,rot,"Es dürfen nur 3 Leute in Derby");
   }
   }
   if(derbytime == 0)
    {
   for(new i=0; i<MAX_PLAYERS; i++)
   {
   inderby[i]++;
        derbycheck[playerid]=1;
   ShowMenuForPlayer(derbymenu,playerid);
   SetPlayerCameraPos(playerid,-2072.1663,-121.7532,35.3296);
   SetPlayerCameraLookAt(playerid,-2072.1663,-121.7532,35.3296);
   SetPlayerPos(playerid,-2072.1663,-121.7532,35.3296);
   TogglePlayerControllable(playerid,0);
        SetTimerEx("DerbyGo",7000,true,"d",playerid);
   }
   }
   if(derbytime == 1)
   {
   }
   return 1;
   }
   
   if(strcmp(cmdtext, "/derbyexit",true)==0)
   {
   for(new i=0; i<MAX_PLAYERS; i++)
   {
   derbycheck[playerid]=0;
   inderby[i]--;
   SetPlayerHealth(playerid,0);
   return 1;
   }
   }
<?



DerbyGo und Teilnehmer:
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
<?
forward DerbyGo(playerid);
public DerbyGo(playerid)
{
   Teilnehmer(playerid);
    SpawnPlayer(playerid);
}

forward Teilnehmer(playerid);
public Teilnehmer(playerid)
{
   for(new i=0; i<MAX_PLAYERS; i++)
   {
   if(sffahrschule[playerid] == 0 && inderby[i] > 1)
   {
    sffahrschule[playerid]++;
   }
   if(sffahrschule[playerid] == 1 && inderby[i] > 1)
   {
   sffahrschule[playerid]++;
   }
   if(sffahrschule[playerid] == 2 && inderby[i] > 1)
   {
   sffahrschule[playerid]++;
   }
   }
}
<?


OnPlayerSpawn:
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
<?
   if(derbycheck[playerid] == 1)
   {
   if(sffahrschule[playerid] == 1)
   {
   new derbycar = CreateVehicle(504,-2058.2822,-107.3824,35.3203,180.00,0,0,60);
   PutPlayerInVehicle(playerid, vid, 0);
   LinkVehicleToInterior(vid, GetPlayerInterior(playerid));
   DerbyDestroy[derbycar] = 1;
   ResetPlayerWeapons(playerid);
   return 1;
   }
   if(sffahrschule[playerid] == 2)
   {
   new derbycar = CreateVehicle(504,-2068.8708,-107.0806,35.3225,180.00,0,0,60);
   PutPlayerInVehicle(playerid, vid, 0);
   LinkVehicleToInterior(vid, GetPlayerInterior(playerid));
   DerbyDestroy[derbycar] = 1;
   ResetPlayerWeapons(playerid);
   return 1;
   }
   if(sffahrschule[playerid] == 3)
   {
   new derbycar = CreateVehicle(504,-2078.1958,-107.0035,35.3203,180.00,0,0,60);
   PutPlayerInVehicle(playerid, vid, 0);
   LinkVehicleToInterior(vid, GetPlayerInterior(playerid));
   DerbyDestroy[derbycar] = 1;
   ResetPlayerWeapons(playerid);
   return 1;
   }
   }
   }
<?


Menu:
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
<?
if (Current == derbymenu)
{
switch(row)
{
case 0:
{
new string[256];
for(new i=0; i<MAX_PLAYERS; i++)
{
if(derbycheck[i] == 1)
{
sffahrschule[playerid]++;
GetPlayerName(playerid, playername, sizeof(playername));
format(string, sizeof(string), "%s select SF Driveschool", playername);
SendClientMessage(i,gelb,string);
return 1;
}
}
}
case 1:
{

}
}
}
<?


so, um nochmal das Problem anzusprechen, also wenn die player gespawnt werden, dann wird die
sffahrschule variable zur einer playerid ++ gezählt, ich weis auch warum, weil nur die playerid ja
++ bekommt, aber nicht jede playerid, deshalb bleibt es immer bei 1 und nicht bei 2 oder 3...

wie ihr seht habe ich es bisschen "austricksen" wollen, wie ihr bei dem public Teilnehmer sieht,
hat aber nicht geklappt...

danke schonmal :)
dödel, 23.02.2009, 22:54
ZitatG4M3R hat folgendes geschrieben:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
forward Teilnehmer(playerid);
public Teilnehmer(playerid)
{
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(sffahrschule[playerid] == 0 && inderby[i] > 1)
    {
     sffahrschule[playerid]++;
    }
    if(sffahrschule[playerid] == 1 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    if(sffahrschule[playerid] == 2 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    }
}
?>


Da du einfach nur if verwendest, wird das Ergebnis immer sffahrschule = 3 sein, denn es wird erhöht
und dann sofort abgefragt welche stufe es hat, ohne weiteres wird aus

sffahrschule = 0
dann
sffahrschule = 3

( Hoffe ist verständlich gewesen )
Da ich aber jetzt nicht alles gelesen habe, sondern nur diesen Teil (zumal da ich müde bin und ich
mich gleich hinlegen werde), kann ich dir nur diesen code geben, sofern ein anderer Probleme
aufweist, werde ich jetzt nichts in diesem machen.

> Kurz gesagt:
public Teilnehmer(playerid)

sollte vermutlich so aussehen:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
forward Teilnehmer(playerid);
public Teilnehmer(playerid)
{
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    else if(sffahrschule[playerid] == 0 && inderby[i] > 1)
    {
     sffahrschule[playerid]++;
    }
    else if(sffahrschule[playerid] == 1 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    else if(sffahrschule[playerid] == 2 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    }
}
?>
Rafioso, 23.02.2009, 22:59
Du verwendest innerhalb deiner for-Schleifen playerid, was du nicht brauchst, da du ja für die
ID-Gewinnung ja extra die for-Schleife erstellt hast.
Ersetze also alle playerids innerhalb der for-Schleifen gegen die initialisierte Variable, z.B. i.

-----


Zitatdödel hat folgendes geschrieben:

sollte vermutlich so aussehen:

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
forward Teilnehmer(playerid);
public Teilnehmer(playerid)
{
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    else if(sffahrschule[playerid] == 0 && inderby[i] > 1)
    {
     sffahrschule[playerid]++;
    }
    else if(sffahrschule[playerid] == 1 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    else if(sffahrschule[playerid] == 2 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    }
}
?>


Kleiner Fehler... ;)

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?
forward Teilnehmer(playerid);
public Teilnehmer(playerid)
{
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(sffahrschule[playerid] == 0 && inderby[i] > 1)
    {
     sffahrschule[playerid]++;
    }
    else if(sffahrschule[playerid] == 1 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    else if(sffahrschule[playerid] == 2 && inderby[i] > 1)
    {
    sffahrschule[playerid]++;
    }
    }
}
?>



dödel, 23.02.2009, 23:11
Wenn ich das gerade etwas genauer betrachte, wäre das einfachte wohl

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?

new inderby;

//_______________________________________
//

forward Teilnehmer(playerid);
public Teilnehmer(playerid)
{
    if(sffahrschule[playerid] == 0 && inderby[i] > 1) sffahrschule[playerid]++;
    else if(sffahrschule[playerid] == 1 && inderby[i] > 1) sffahrschule[playerid]++;
    else if(sffahrschule[playerid] == 2 && inderby[i] > 1) sffahrschule[playerid]++;
}

//_______________________________________
//

if (Current == derbymenu)
{
switch(row)
{
case 0:
{
new string[256];
sffahrschule[playerid]++;
GetPlayerName(playerid, playername, sizeof(playername));
for(new i=0; i<MAX_PLAYERS; i++)
{
if(derbycheck[i] == 1)
{
format(string, sizeof(string), "%s select SF Driveschool", playername);
SendClientMessage(i,gelb,string);
return 1;
}
}
}
case 1:
{

}
}
}

//______________________________________
//

    if(strcmp(cmdtext, "/derby",true)==0)
    {
    GetPlayerName(playerid, playername, MAX_PLAYER_NAME);
    format(string, sizeof(string), ">> DERBY << %s ist zum Derby! /derby", playername);
    rand = random(sizeof(RandomColor));
    SendClientMessageToAll(RandomColor[rand][0],string);
    if(inderby == 3)
    {
    SendClientMessage(playerid,rot,"Es dürfen nur 3 Leute in Derby");
    }
    if(derbytime == 0)
     {
    inderby++;
        derbycheck[playerid]=1;
    ShowMenuForPlayer(derbymenu,playerid);
    SetPlayerCameraPos(playerid,-2072.1663,-121.7532,35.3296);
    SetPlayerCameraLookAt(playerid,-2072.1663,-121.7532,35.3296);
    SetPlayerPos(playerid,-2072.1663,-121.7532,35.3296);
    TogglePlayerControllable(playerid,0);
        SetTimerEx("DerbyGo",7000,true,"d",playerid);
    }
    if(derbytime == 1)
    {
    }
    return 1;
    }
    
    if(strcmp(cmdtext, "/derbyexit",true)==0)
    {
    derbycheck[playerid]=0;
    inderby--;
    SetPlayerHealth(playerid,0);
    return 1;
    }

?>


Du scheinst for-Schleifen zu nutzen, ohne ihre genauen Auswirkungen zu kennen, zB. hast du an einer
Stelle den selben Timer 200 mal gestartet.
G4M3R, 23.02.2009, 23:18
öhm, ich hatte zuerst inderby ohne einer schleife genutzt, aber ich dachte es liegt daran, dass ihm
kein spawn zugewiesen wird.

achja, bei SetTimerEx("DerbyGo",7000,true,"d",playerid); muss es zu
SetTimerEx("DerbyGo",7000,false,"d",playerid); sonst startet der immer wieder ist mir grad
aufgefallen.


/EDIT:
Habe es mal mit 2 Leuten getestet.
Also wenn ich /derby mache, spawne auf den ersten spawn (sffahrschule == 1).
Wenn ein anderer /derby macht, wo ich schon drin bin, wird er zum zweiten spawn gespawnt
(sffahrschule == 2). und wenn der andere /derby macht, wo wir beide drin sind, spawnt er auf den
anderen player...
kann mir einer weiterhelfen?
G4M3R, 25.02.2009, 12:43
so srry 4 doppelpost, ich hab jetzt das problem gelöst.

aber dennoch gibt es ein problem und zwar wenn ich z.b als test jetzt das Auto verlasse, dann wird
ja das derby für mich (wenn ich jetzt aussteige) beendet und wenn nur noch einer drin ist, gewinnt
er.

aber wenn ich dann wieder /derby mache und spawne, wird mir und den anderen immer die sffahrschule
= 3 zugewiesen.

habs nur als onplayerexitvehicle getestet.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?
public OnPlayerExitVehicle(playerid, vehicleid)
{

   if (DerbyDestroy[vehicleid] == 1)
   {
   DestroyVehicle(vehicleid);
   DerbyDestroy[vehicleid] = 0;
   }

   if(derbycheck[playerid] == 1)
   {
   new string[256];
   GetPlayerName(playerid,playername, sizeof(playername));
   format(string, sizeof(string), "%s ist aus dem Auto ausgestiegen", playername);
   SendClientMessageToAll(gelb, string);
   inderby--;
   derbycheck[playerid]=0;
   teilnahmezaehler[playerid]=0;
   sffahrschule[playerid]=0;
   RemovePlayerFromVehicle(playerid);
   SpawnPlayer(playerid);
   if(inderby == 1)
   {
   for (new i=0; i<MAX_PLAYERS; i++)
   {
   if (IsPlayerConnected(i) && derbycheck[i] == 1)
   {
   GetPlayerName(i,playername, sizeof(playername));
   format(string, sizeof(string), "%s hat das Derby gewonnen. Neue Runde /derby", playername);
   SendClientMessageToAll(rot, string);
   KillTimer(derbytimer);
   //GivePlayerCash(i,1000);
   RemovePlayerFromVehicle(i);
   inderby=0;
   derbytime=0;
   derbycheck[i]=0;
   sffahrschule[i]=0;
   teilnahmezaehler[i]=0;
   SpawnPlayer(i);
    return 1;
   }
   else if(inderby == 0 && derbycheck[i] == 0)
   {
   SendClientMessageToAll(rot, "Keiner hat das Derby gewonnen, neue Runde /derby");
   KillTimer(derbytimer);
   inderby=0;
   derbytime=0;
   derbycheck[i]=0;
   sffahrschule[i]=0;
   teilnahmezaehler[i]=0;
   RemovePlayerFromVehicle(i);
   return 1;
   }
   }
   }
   }
   return 1;
}
?>



public Teilnehmer(playerid)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?
forward Teilnehmer(playerid);
public Teilnehmer(playerid)
{
for(new i=0; i<MAX_PLAYERS; i++)
{
teilnahmezaehler[playerid]=1;
if(sffahrschule[playerid] == 0 && teilnahmezaehler[i] == 1)
{
sffahrschule[playerid]++;
}
else if(sffahrschule[playerid] == 1 && teilnahmezaehler[i] == 1)
{
sffahrschule[playerid]++;
}
else if(sffahrschule[playerid] == 2 && teilnahmezaehler[i] == 1)
{
sffahrschule[playerid]++;
}
SpawnPlayer(i);
}
}
?>



Hoffe ihr könnt mir helfen. :)
Rafioso, 25.02.2009, 20:53
Wo ist da bitteschön sffahrschule = 3?

MfG
Rafioso
G4M3R, 25.02.2009, 21:11
/EDIT:

So, dass hat sich erledigt^^

aber habe eine kleine Frage, da ich schon bald mit meinem Derby fertig bin, möchte ich wissen, wie
man es macht, dass allem die variable zugewiesen wird, die als letztes betätigt wurde.

Beispiel: Ich wähle im Menu als Map SF Fahrschule aus und ein anderer hmm, sagen wir mal Flughafen.
Und dass dann die Variable Flughafen als Derbymodi betätigt wird, weil sie zuletzt ausgewählt wurde.

Hoffe ich habe es gut erklärt ^^
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