Wie funktionieren diverse Sachen für mehrere Spieler???

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo,


    Also ich weiß das ist denke ich mal leicht und ich denke mal ich weiß auch die Lösung aber bei mir funzt das nicht.
    Ich habe mir mit Hilfe von verschiedenen Threads was gebastelt und zwar das man ne Rampe Spawnen kann. So jetzt funktioniert das aber nicht. Wenn ich jemand anders eine spawnt kommt diese bei mir.


    Also ich würde gerne mal wissen ob es da ne "Regel" gibt wo man überall "i" oder "playerid" nutzen muss.


    Hier mal das was ich alles zu dem "Befehl" habe.



    new DesRamp[MAX_PLAYERS];
    new bool: rampe[MAX_PLAYERS];
    new bool: gesprungen[MAX_PLAYERS];
    forward DestroyRamp(playerid);


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_ACTION)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(rampe[i] == true && gesprungen[i] == false)
    {
    new Float:angle, Float:x, Float:y, Float:z;
    GetPlayerPos(i, x, y, z);
    angle = GetXYInFrontOfPlayer(playerid, x, y, GetOptimumRampDistance(playerid));// das hatte ich jetzt nur von i in playerid geändert aber noch nicht getestet
    if (angle < 0.0) angle += 360.0;
    z += 0.5;
    DesRamp[i] = CreateObject(1632, x, y, z - 0.5, 0.0, 0.0, angle);
    SetTimer("DestroyRamp", 2000, 0);
    gesprungen[i] = true;
    }
    else
    {

    }
    }
    }
    return 1;
    }


    public DestroyRamp(playerid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(gesprungen[playerid] == true)
    {
    DestroyObject(DesRamp[i]);
    gesprungen[i] = false;
    }
    }
    }


    Float:GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
    {
    new Float:a;
    GetPlayerPos(playerid, x, y, a);
    if (IsPlayerInAnyVehicle(playerid)) GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
    else GetPlayerFacingAngle(playerid, a);
    x += (distance * floatsin(-a, degrees));
    y += (distance * floatcos(-a, degrees));
    return a;
    }
    Float:GetOptimumRampDistance(playerid)
    {
    new ping = GetPlayerPing(playerid), Float:dist;
    dist = floatpower(ping, 0.25);
    dist = dist*4.0;
    dist = dist+5.0;
    return dist;
    }


    CMD:rampe(playerid, params[])
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(rampe[i] == false)
    {
    TextDrawHideForPlayer(playerid, RampenTextOff);
    TextDrawShowForPlayer(playerid, RampenTextOn);
    rampe[i] = true;
    }
    else if(rampe[i] == true)
    {
    TextDrawHideForPlayer(playerid, RampenTextOn);
    TextDrawShowForPlayer(playerid, RampenTextOff);


    rampe[i] = false;
    }
    }
    return 1;
    }


    ich habe schon mit den for schleifen rumprobiert und geguckt wie und was geht. Aber ich weiß nicht vielleicht bin ich zu dumm.


    Wäre auch sehr nett wenn mir jemand mal ein Tutorial dazu geben könnte mit den Schleifen bzw. wie das geht das mehrer Spieler z.B. einen timer nutzen können oder wie auch immer. Damit ich das für die zukundt lernen kann.


    MfG
    Xtreame

  • Hallo Xtreame!


    Also ich muss zunächst mal sagen, dass ich Dein Problem noch nicht
    so richtig einsehe und auch Deiner Beschreibung nicht richtig folgen kann.


    Soweit ich es eingesehen habe, versuchst Du für einige Spieler Rampen
    zu spawnen, die aber nicht für alle Spieler erscheinen sollen... Richtig?


    Kennst Du den Unterschied zwischen i und playerid nicht, dann
    hast Du hier eine ganz kurze und simple Erklärung:


    (1)


    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    ...
    }


    (2)


    function ...(playerid)
    {
    ...
    }
    Im ersten Fall durchläuft der Server eine Schleife, welche alle auf
    dem Server befindlichen Spieler betrifft, d.h. mit diesem Verfahren
    kannst Du Aktionen durchführen, die alle Spieler auf dem Server betreffen.


    Im zweiten Fall wird nur der Spieler, also nur die Spieler ID,
    benutzt/verwendet, die, in diesem Falle, diese Funktionen verwendet/ausführt.
    D.h. nur der Spieler, der eben diese Funktion ausführt, ist von allen darin
    befindlichen Funktionen oder Befehlen, bzw. Variablen betroffen.



    Ich hoffe ich konnte Dir zumindest etwas helfen, auch wenn ich mir noch
    nicht ganz im klaren bin, ob das überhaupt Deine Frage war...


    (Bitte entschuldigt die simple/umständige Erklärung, aber wie denn sonst?!)



    Freundliche Grüße


    4#Future - Fake | Philip

  • Hi,


    OK ich danke dir für deine Erklärung und denke das ich es verstanden habe.


    Also fast richtig Ich habe das was du oben siehst und möchte es aber das es jeder nutzen kann. Nur das kriege ich nicht hin.
    Ich werde nochmal drüber gucken und überlegen.

  • Ok Dann dürfte das ja jetzt so Richtig sein oder?



    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys & KEY_ACTION)
    {
    if(rampe[playerid] == true && gesprungen[playerid] == false)
    {
    new Float:angle, Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    angle = GetXYInFrontOfPlayer(playerid, x, y, GetOptimumRampDistance(playerid));
    if (angle < 0.0) angle += 360.0;
    z += 0.5;
    DesRamp[playerid] = CreateObject(1632, x, y, z - 0.5, 0.0, 0.0, angle);
    SetTimer("DestroyRamp", 2000, 0);
    gesprungen[playerid] = true;
    }
    else
    {


    }
    }
    return 1;
    }
    public DestroyRamp(playerid)
    {
    if(gesprungen[playerid] == true)
    {
    DestroyObject(DesRamp[playerid]);
    gesprungen[playerid] = false;
    }
    }
    CMD:rampe(playerid, params[])
    {
    if(rampe[playerid] == false)
    {
    TextDrawHideForPlayer(playerid, RampenTextOff);
    TextDrawShowForPlayer(playerid, RampenTextOn);
    rampe[playerid] = true;
    }
    else if(rampe[playerid] == true)
    {
    TextDrawHideForPlayer(playerid, RampenTextOn);
    TextDrawShowForPlayer(playerid, RampenTextOff);
    rampe[playerid] = false;
    }
    return 1;
    }

  • nur mal so ne Anmerkung;
    Du musst nicht unbedingt i verwenden, du kannst das auch x oder Oma nennen. Musst du dann dementsprechend auch in den anderen Zeilen ändern.
    i wurde damals im Wiki nur als Beispiel verwendet (soweit ich weiß), es kann aber genau so gut langervariablenname oder sonst irgendwas sein.