-
-
Du musst überlegen, sie her: Du willst erst dann wissen welche Waffen der Spieler hat(te), wenn er die Arena betreten will. Es leutet also ein, dass man auch erst dann einen, vielleicht sogar selbst geschriebenen, Callback dazu benutzt die nötigen Informationen zu ermitteln und diese in irgendwelchen spielerbezogenen Variablen zu speichern, damit man dann damit arbeiten kann.
-
Am Ende musst du die Waffen ja wieder hinzufügen..
-
Die Sache immer ruhig und mit Köpfchen angehen. Folgendermaßen sollte der ganze Ablauf gestaltet sein:
- Spieler gibt den Befehl zum Betreten der Arena ein (/pbenter)
- Alle Waffen, die der Spieler momentan besitzt, werden ermittelt, in spielerbezogenen Variablen gespeichert und anschließend dem Spieler entfernt
- Spieler betritt die Arena (was dann passiert entscheidest du)
- Spieler verlässt die Arena (/pbexit)
- Alle Waffen, die der Spieler vor dem Betreten hatte, werden ihm zurückgegeben (hierfür dienen die spielerbezogenen Variablen)
Wir sollten uns nun auf Nummer 2 und 5 beschränken, darum geht's schließlich.
#define Function%0(%1) forward%0(%1); public%0(%1)
new PlayerWeapon[MAX_PLAYERS][13][2];
Function SavePlayerWeapons(playerid)
{
for(new weaponslot = 0; weaponslot < 13; weaponslot++)
{
GetPlayerWeaponData(playerid, weaponslot, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
}
return 1;
}Dieser Callback "SavePlayerWeapons" bewirkt das Speichern der Waffen in der spielerbezogenen Variable PlayerWeapon, die ich zuvor über ein multi-dimensional Array deklariert habe. Einsetzen kannst du diesen Callback nun im ganzen Script. Wie man dem Spieler Waffen gibt (nach /pbexit - GivePlayerWeapon - aus den Variablen auslesen) oder wegnimmt (nach /pbenter - ResetPlayerWeapons ) schaffst du mit Hilfe des Wiki's sicherlich auch ohne uns.
Viel Glück beim Testen ;).
-
Na, da musst du aber schon auch alles sauber einbauen ...
-
Hb das gerade auch mal in meinem script eingefügt, mir zeigt er null warnings und errors an, aber hier mal die funktion in nem stock
stock SavePlayerWeapons(playerid)
{
new PlayerWeapon[MAX_PLAYERS][13][2];
for(new weaponslot = 0; weaponslot < 13; weaponslot++)
{
GetPlayerWeaponData(playerid, weaponslot, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
}
return 1;
} -
firestormZ: Du solltest die Variablen nicht lokal deklarieren, sondern global. Andernfalls kannst du sie außerhalb des stock nicht verwenden.
Pablo_Escobar96: Deine Fehler sind unabhängig von stock oder public (wie in meinem Fall), solltest du hier die Lösung des Problems suchen.
-
Stimmt, mein Fehler, aber deine Version, so wie du sie Gepostet hast, klappt bei mir auch ohne irgendwelche fehlermeldungen
-
Gib uns mal die Zeile wo der Error ist.
-
Das sollte so nicht stimmen. Wie oben schon mehrmals erwähnt, musst du das PlayerWeapon Array global definieren. Du solltest dir also erstmal den Unterschied zwischen globalen und lokalen Variablen klar machen.
Globale Variablen:
Sie stehen außerhalb von irgendwelchen Funktionen, vorzugsweise ganz Oben im Script.
Sie können in allen Funktionen benutzt werden.Lokale Variablen:
Sie stehen in einer Funktion, oder in einem Teil einer Funktion (auch if, for, while,...).
Sie können nur in dem Teil, in dem die Variable deklariert wurde benutzt werden. Außerdem werden sie nach Beendigung der (Teil-) Funktion automatisch gelöscht.Mfg,
UncleSub//Edit:
Außerdem geht dasGivePlayerWeapon(playerid, PlayerWeapon[playerid][..][0], PlayerWeapon[playerid][..][1]); // Stimmt das?
nicht.
Du musst die Waffen in einer Schleife (z.B. for Schleife) speichern und laden / geben.
-
Hier, Pablo_Escobar96, wie in der PN besprochen habe ich dir mal den Code zusammengeschustert. Wenn du bei einer Zeile (oder mehreren) Verständnisprobleme hast, melde dich bitte.
Spoiler anzeigen
#define Function%0(%1) forward%0(%1); public%0(%1)Spoiler anzeigen new PlayerWeapon[MAX_PLAYERS][13][2];Spoiler anzeigen Function SavePlayerWeapons(playerid) // Funktion um die aktuellen Waffen samt Munition in die Spielervariablen zu speichern
{
for(new weaponslot = 0; weaponslot < 13; weaponslot++)
{
GetPlayerWeaponData(playerid, weaponslot, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
}
return 1;
}Spoiler anzeigen Function GivePlayerWeaponEx(playerid) // Funktion um dem Spieler die vorher gespeicherten Waffen samt Munition wieder zu geben
{
for(new weaponslot = 0; weaponslot < 13; weaponslot++)
{
GivePlayerWeapon(playerid, PlayerWeapon[playerid][weaponslot][0], PlayerWeapon[playerid][weaponslot][1]);
}
return 1;
}Spoiler anzeigen CMD:pbenter(playerid)
{
if(!IsPlayerInRangeOfPoint(playerid, 2.0, 1421.74, -1179.36, 25.32))return SendClientMessage(playerid, 0xFF0000FF, "Fehler! Du befindest dich nicht an der Arena!");
// ------------------------------------------------------------------------
new var = random(sizeof(pbSpawns));
SetPlayerPos(playerid, pbSpawns[var][0], pbSpawns[var][1], pbSpawns[var][2]);
SetPlayerInterior(playerid, 10);
// ------------------------------------------------------------------------
GivePlayerMoney(playerid, -500);
SendClientMessage(playerid, 0xFF0000FF, "Du bist der Arena beigetreten! [Kosten: 500$]");
for(new id = 0; id < GetMaxPlayers(); id++)
{
if(Spieler[id][Paintball] == 1)
{
new str[128];
format(str, 128, "[Arena]: %s hat die Arena betreten!", GetPlayerNameEx(playerid));
SendClientMessage(i, 0xFF0000FF, str); // Schickt jedem in der Arena die Nachricht, dass ein Spieler beigetreten ist
}
}
// ------------------------------------------------------------------------
SavePlayerWeapons(playerid); // Waffen speichern
ResetPlayerWeapons(playerid); // Waffen löschen
GivePlayerWeapon(playerid, 24, 150);
GivePlayerWeapon(playerid, 27, 80);
GivePlayerWeapon(playerid, 34, 50);
// ------------------------------------------------------------------------
Spieler[playerid][Paintball] = 1;
return 1;
}Spoiler anzeigen CMD:pbexit(playerid)
{
if(Spieler[playerid][Paintball] != 1)return SendClientMessage(playerid, 0xFF0000FF, "Fehler! Du befindest dich nicht in der Arena!");
// ------------------------------------------------------------------------
/*
* Spielerposition setzen, etc.
*/
// ------------------------------------------------------------------------
GivePlayerWeaponEx(playerid); // Waffen wieder geben
// ------------------------------------------------------------------------
Spieler[playerid][Paintball] = 0;
return 1;
}
/Edit: Zitat aus dem PN-Verlauf
Na ganz einfach, das Array ...
new PlayerWeapon[MAX_PLAYERS][13][2];
... hat eine bestimmte Größe, nämlich 13. Nun benötigst du eine bedingte Wiederholung, die 13 Mal ausgeführt wird und dabei jedes Mal eines weiterspringt. Bei jedem Durchgang wird jetzt dem Spieler die Waffe mit der richtigen Munitionsanzahl gegeben:
GivePlayerWeapon(playerid, PlayerWeapon[playerid][..][0], PlayerWeapon[playerid][..][1]); // .. steht für die Variable, die jedes Mal um den Wert 1 (bis Maximal 13) erhöht wird
-
Ich benutze zcmd, du benutzt allerdings ocmd. Deshalb das Warning. Ändere CMD zu ocmd, dann funktioniert auch schon alles ;).
-
breadfish.de
Hat das Thema geschlossen.
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