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?
Waffe nach Tod als CreatePickup
- Dachdecker
- Geschlossen
- Erledigt
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
-
-
er erhält eine Shotgun ...
-
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.
-
ok.. wenn ich deinen Enum benutze ,dann müsste ich doch eine for schleife machen aufgrund der [300] oder? Also:
for(new i = 0; i<300; i++)
{}
-
Ich habe dazu vor langer Zeit mal im englischen Forum einen Release gemacht:
http://forum.sa-mp.com/showthread.php?t=252128Viel Spaß damit!
-
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.
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 CompuPhase1 Warning.
for(new i = 0; i<sizeof(WeaponPickups); i++)
{
WeaponPickups[i][WeaponPickupID] == GetWeaponPickup(waffe); //Zeile 778
} -
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;
}
} -
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;
}
} -
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?
-
DestroyPickup ist alter Code, und der Timer zeigt nur ein TextDraw an.
Verstehe ncht ganz was du meinst?
-
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;
}
}
} -
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;
}
}
} -
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.
-
Macht das Sinn:
if(pickupid == WeaponPickups[i][WeaponPickupID])
-
Die Verwendund von WeaponPickupID ja. Einfach ausprobieren.