Waffe nach Tod als CreatePickup

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
  • Denkaufgabe:
    Spieler B wird von Spieler C erschossen und hat eine Desert Eagle gedroppt mit 24 Schuss. Spieler B erschiesst irgendwann 5 Minuten spaeter den Spieler A der eine Shotgun mit 50 Schuss in der Hand hat. Das Shotgun Pickup wird erstellt. Wenn Spieler B jetzt zum Pickup von Spieler A hinrennt, welche Waffe bekommt Spieler B?

  • Nein, tut er nicht. Wenn Spieler B stirbt und seine Desert Eagle droppt, dann wird in seine PVar geschrieben "Desert Eagle" und "24 Schuss". Wenn er jetzt ein Pickup aufhebt (irrelevant welches), dann fragt er in SEINER PVar ab, welche Waffe mit wie viel Schuss drinnen steht. Verstehst Du jetzt worauf ich hinaus will? Das mit PVars kann nie klappen.

  • sizeof(WeaponPickups) tut es auch und ist besser, wenn Du mal die Groesse des Arrays veraendern willst. Ich wuerde Dir trotzdem jetzt raten das Filterscript nicht zu verwenden. Nicht weil ich Jeffry's Filterscript schlecht finde, sondern weil Du jetzt schon fast fertig bist und wenn Du es fertig programmiert hast, Du ein Erfolgserlebnis haben wirst und die Arbeit von mir und von Dir nicht umsonst war.

  • @Jeffry ich bedanke mich rechtherzlich, aber ich möchte es doch lieber selber schaffen ohne Filterscript, danke für die Bereitstellung.



    @Slider


    Warningcode:
    E:\Grand Theft Auto San Andreas\Server\gamemodes\Selfmade.pwn(778) : warning 215: expression has no effect
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase




    1 Warning.



    for(new i = 0; i<sizeof(WeaponPickups); i++)
    {
    WeaponPickups[i][WeaponPickupID] == GetWeaponPickup(waffe); //Zeile 778
    }

    Mit freundlichen Grüßen,
    Dachdecker

  • Schau Dir Zeile 3 an und überleg mal nach. Es ist jeden Falls nach dem WeaponPickupID. Und denk ans Schleife abbrechen und abfragen ob WeaponPickupID 0 ist. Weil sonst schreibst Du in alle 300 Felder des rein.

  • das == war falsch :)


    nach der Abfrage jetzt ein break; sollte das break; auch bei
    WeaponPickupWeaponID,
    WeaponPickupAmmo hin?


    Ach so ja, die abfrage binde ich gleich noch mit ein und zeige dir das "Ergebnis".



    for(new i = 0; i<sizeof(WeaponPickups); i++)
    {
    if(WeaponPickups[i][WeaponPickupID] == 0)
    {
    WeaponPickups[i][WeaponPickupID] = GetWeaponPickup(waffe);
    break;
    }
    }

    Mit freundlichen Grüßen,
    Dachdecker

  • Wenn Du break einmal aufrufst in einer Schleife, wird an dieser Stelle unterbrochen. Deshalb sollte das break moeglichst nach der Zuweisung von der Weapon ID, Pickup ID und Ammo passieren. Bedenke aber, in PickupID musst Du den Wert, der von CreatePickup zurueckkommt, speichern. WeaponPickupWeaponID ist die Antwort wenn Du den Inhalt von GetWeaponPickup speichern willst. Du musst auch noch die Ammo speichern. Im Endeffekt hast Du 3 Zuweisungen und darunter ein break;


  • for(new i = 0; i<sizeof(WeaponPickups); i++)
    {
    if(WeaponPickups[i][WeaponPickupID] == 0)
    {
    WeaponPickups[i][WeaponPickupID] = GetWeaponPickup(waffe);
    WeaponPickups[i][WeaponPickupWeaponID] = waffe;
    WeaponPickups[i][WeaponPickupAmmo] = ammo;
    break;
    }
    }



    if( GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_DUCK )
    {
    DestroyPickup(WaffendurchTot);
    SetTimerEx("Waffeauf", 1000, false, "i", playerid);
    for(new i = 0; i<sizeof(WeaponPickups); i++)
    {
    GivePlayerWeapon(playerid, WeaponPickups[i][WeaponPickupWeaponID], WeaponPickups[i][WeaponPickupAmmo]);



    WeaponPickups[i][WeaponPickupID] = 0;
    WeaponPickups[i][WeaponPickupWeaponID] = 0;
    WeaponPickups[i][WeaponPickupAmmo] = 0;
    break;
    }
    }

    Mit freundlichen Grüßen,
    Dachdecker

  • Das DestroyPickup(WaffendurchTot) ist sicherlich noch alter Code oder? Wozu ist der Timer da? Wenn Du die Schleife so stehen laesst, dann bekommt der Spieler bei dem Pickup von irgend einem Pickup (egal ob Infopunkt oder Waffen Pickup) den Daten vom Index 0 des Arrays. Warum ist das so?

  • Dann entfern das DestroyPickup mal. Naja Du iterierst ohne jegliche Abfrage ob die Pickup ID, die der Spieler aufhebt, aequivalent mit der aus dem Array ist. Aktuell bedeutet der Code: Starte eine Iteration, gib dem Spieler die Waffe aus dem aktuellen Index (was immer 0 sein wird weil Du direkt die Schleife abbrichst) und das wars. Wenn jetzt 2 Pickups rumliegen, eins mit ner Deagle und eins mit ner Shotgun und Du in irgend eins reinlaeufst, dann bekommst Du aktuell die Waffe von dem Pickup, das zuerst erstellt wurde. Das sagt Dein Code aus.

  • also soll das break da raus ok. und wie mach das jz wegen PickupID und WeaponPickupID...



    Hab das jetzt mal so gemacht:



    if( GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_DUCK )
    {
    SetTimerEx("Waffeauf", 1000, false, "i", playerid);
    for(new i = 0; i<sizeof(WeaponPickups); i++)
    {
    if(pickupid == GetWeaponPickup(WeaponPickups[i][WeaponPickupWeaponID]))
    {
    GivePlayerWeapon(playerid, WeaponPickups[i][WeaponPickupWeaponID], WeaponPickups[i][WeaponPickupAmmo]);



    WeaponPickups[i][WeaponPickupID] = 0;
    WeaponPickups[i][WeaponPickupWeaponID] = 0;
    WeaponPickups[i][WeaponPickupAmmo] = 0;
    }
    }
    }

    Mit freundlichen Grüßen,
    Dachdecker

  • Das break war schon richtig. Nur die Abfrage fehlte. Das break muss in die Abfrage mit rein, unter der letzten Anweisung muss es stehen. In pickupid von dem Callback steht die erstellte PickupID und nicht das Pickup Modell! Deswegen ueberpruefe nochmal Deine Abfrage. Die wird so nicht funktionieren.

  • if( GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_DUCK )
    {
    SetTimerEx("Waffeauf", 1000, false, "i", playerid);
    for(new i = 0; i<sizeof(WeaponPickups); i++)
    {
    if(GetWeaponPickup(WeaponPickups[i][WeaponPickupWeaponID]) == WeaponPickups[i][WeaponPickupID])
    {
    GivePlayerWeapon(playerid, WeaponPickups[i][WeaponPickupWeaponID], WeaponPickups[i][WeaponPickupAmmo]);



    WeaponPickups[i][WeaponPickupID] = 0;
    WeaponPickups[i][WeaponPickupWeaponID] = 0;
    WeaponPickups[i][WeaponPickupAmmo] = 0;
    break;
    }
    }
    }

    Mit freundlichen Grüßen,
    Dachdecker

  • Die Abfrage macht keinen Sinn. Nochmal: pickupid ist der Wert des Pickups des Du aufhebst. Das heisst, da Du ja auch die Pickup ID speicherst, musst Du eben durch iterieren durch das Array und den Index im Array finden, der die Pickup ID gespeichert hat, die in pickupid drinnen steht.