Dann passt es ja so ![]()
Beiträge von Kaliber
-
-
//korrekt oder ist daran etwas falsch ?
Ist korrekt

Nennt sich ternary operator:
https://forum.sa-mp.com/showthread.php?t=612076
https://forum.sa-mp.com/showthread.php?t=663153
https://forum.sa-mp.com/showthread.php?t=523462 -
Also soll es ein generelles Inventar System werden oder geht es nur um diese Karte?
Man wird halt nicht so schlau aus deinem Text, das sind sehr wenige Infos.
Gibt auch 1000 Arten sowas umzusetzen, je nachdem, was für "Features" man halt benötigt.
Ich kann es mal grob erklären, also im Endeffekt ist es nur wesentlich z.B. die SQLid von Spieler A dem Item A zuzuordnen.
Denn Wenn Spieler B das Item bekommt, wird die SQLid von Spieler A auch Spieler B zugewiesen.
Somit kann Spieler B über diese "Referenz SQLid (kurz refID)" auf das Konto von Spieler A zugreifen.
Ich habe mal ein kleines Skript in den Spoiler gepackt (weder getestet, noch optimiert oder sonst was).
Musst es also noch stark anpassen und evtl als Include oder so aufbereiten.
Ging mir erstmal nur um die grobe Vermittlung meiner Idee.Aber so ganz grob, kann man sich das vorstellen. wie ich mir das ungefähr vorgestellt habe.
Dem Objekt werden dann auch all diese Attribute zugewiesen. Somit kann dann, wenn jemand das Objekt aufhebt durch die refID auf Spieler A zugreifen.Und an der Bank musst du dann halt evtl checken, dass er mit der anderen Karte zahlen kann.
Wobei das System aktuell so geschrieben ist, dass er sogar mehrere Karten haben könnte.
Musste halt loopen und evtl die Namen aus der Datenbank auslesen, die hinter den SQLids stehen, damit ihm angezeigt wird, von dem wer die Konten abräumen kann.Das System, gerade, wenn es so offen bzw "dynamisch" geschrieben ist, ist halt nicht so trivial umzusetzen.
C
Alles anzeigen#if !defined MAX_INV_OBJ #define MAX_INV_OBJ 50 //Wie viele Objekte maximal erstellt werden #endif #if !defined MAX_INV_SLOT #define MAX_INV_SLOT 10 //Wie groß das Inventar ist #endif /******************************************************************************/ enum { INV_EMPTY, //Alle Items unter dem hier INV_CARD, INV_DEAGLE, //Alle Items über dem hier INV_MAX_ID }; /******************************************************************************/ stock const e_inv_objs[] = { //Jeder Slot muss ein Objekt Model haben (auch wenn es nie verwendet wird) 1581, //Some Card 348 //Deagle }; /******************************************************************************/ enum _e_inv { _e_ref, _e_name }; enum _e__obj { _e_item, _e_item_ref, _e_objID }; new Inventar[MAX_PLAYERS][MAX_INV_SLOT][e_inf], Inv_Obj[MAX_INV_OBJ][_e__obj]; /******************************************************************************/ stock GivePlayerItem(playerid,item,sqlid=0) //sqlid = PlayerID in Database | Damit Konto & Karte z.B. verknüpft sind (optional) { if(item < 0 || item >= INV_MAX_ID) return 0; new slot = GetFreeItemSlot(playerid); if(slot == -1) return -1; Inventar[playerid][slot][_e_name] = item, Inventar[playerid][slot][_e_ref] = sqlid; return 1; } stock RemoveItemFromPlayer(playerid,slot) { if(slot < 0 || slot >= MAX_INV_SLOT) return 0; Inventar[playerid][slot][_e_ref] = Inventar[playerid][slot][_e_name] = 0; return 1; } stock StealItemFromPlayer(playerid,forplayer,slot) //To rob player { if(item < 0 || item >= INV_MAX_ID) return 0; if(!Inventar[playerid][slot][_e_name]) return 0; new c = GetFreeItemSlot(forplayer); if(c == -1) return -1; Inventar[forplayer][c][_e_ref] = Inventar[playerid][slot][_e_ref], Inventar[forplayer][c][_e_name] = Inventar[playerid][slot][_e_name], RemoveItemFromPlayer(playerid,slot); return 1; } stock CreateObjectFromItem(playerid,slot) { if(!Inventar[playerid][slot][_e_name]) return 0; new o = GetFreeObjSlot(); if(o == -1) return -1; new Float:x,Float:y,Float:z; GetObjectPos(playerid,x,y,z), Inv_Obj[o][_e_item] = Inventar[playerid][slot][_e_name], Inv_Obj[o][_e_item_ref] = Inventar[playerid][slot][_e_ref], Inv_Obj[o][_e_objID] = CreateObject(e_inv_objs[Inv_Obj[o][_e_item]-1],x,y,z,0,0,0), //Sollte zu CreateDynamicObject (oder nutze Pickups) RemoveItemFromPlayer(playerid,slot); return 1; } stock GivePlayerItemFromObject(playerid,o) { if(!Inv_Obj[o][_e_item]) return 0; new slot = GetFreeItemSlot(playerid); if(slot == -1) return -1; Inventar[playerid][slot][_e_name] = Inv_Obj[o][_e_item], Inventar[playerid][slot][_e_ref] = Inv_Obj[o][_e_item_ref]; DestroyObject(Inv_Obj[o][_e_objID]); //Evtl DestroyDynamicObject | Oder DestroyPickup Inv_Obj[o][_e_item] = Inv_Obj[o][_e_item_ref] = 0; return 1; } /******************************************************************************/ stock GetFreeItemSlot(playerid) { for(new i; i<MAX_INV_SLOT; i++) if(!Inventar[playerid][i][_e_name]) return i; return -1; } stock GetFreeObjSlot() { for(new i; i<sizeof(Inv_Obj); i++) if(!Inv_Obj[i][_e_item]) return i; return -1; }Mal hier bisschen Pseudo-Code für die Nutzung:
GivePlayerItem(playerid, INV_DEAGLE); //Muss keine SQLid angegeben werden.
GivePlayerItem(playerid, INV_CARD, PlayerInfo[playerid][pSQLid]);Als Parameter siehst du oft slot.
Da jemand ja mehrere Items haben kann, muss natürlich immer der richtige slot ausgewählt werden.
Musst halt durch den Spieler loopen und dann z.B. schauen, ob _e_item == INV_CARD && _e_ref == PlayerInfo[playerid][pSQLid]
Dann weißt du z.B. auch wenn er andere Kreditkarten hat, das wäre seine xDMusst halt noch etwas Arbeit da rein stecken, aber ich denke, das Prinzip sollte klar sein.
Ansonsten einfach nochmal Fragen.Die Speicherung von den Items kannst du ungefähr so machen: (Die table dann halt eben so aufbauen, denke das ist obvious? xD)
C//Zum Speichern des User-Inventars ("DELETE FROM `inventar` WHERE `userID`='%d'",PlayerInfo[playerid][pSQLid]) for(new i; i<MAX_INV_SLOT; i++) { if(!Inventar[playerid][i][_e_name]) continue; ("INSERT INTO `inventar` (`userID`,`ref_ID`,`item`) VALUES ('%d','%d','%d')",PlayerInfo[playerid][pSQLid],Inventar[playerid][i][_e_ref],Inventar[playerid][i][_e_name]) }Zum Laden dann:
C("SELECT * FROM `inventar` WHERE `userID`='%d'",PlayerInfo[playerid][pSQLid]) //und dann halt loopen for(new i; i<rows; i++) { Inventar[playerid][i][_e_name] = cache_get_int(i, "item"); //Pseudo-Code Inventar[playerid][i][_e_ref] = cache_get_int(i, "ref_ID"); //Pseudo-Code }Für die Objekte
C("DELETE FROM `inv_obj`") //Damit Tabelle Clear is! Beim Beenden des Servers for(new o; o<sizeof(Inv_Obj); o++) { if(!Inv_Obj[o][_e_item]) continue; ("INSERT INTO `inv_obj` (`item`,`ref`,`x`,`y`,`z`,`r1`,`r2`,`r3`) VALUES ('%d','%d','%f','%f','%f','%f','%f','%f')", Inv_Obj[o][_e_item], Inv_Obj[o][_e_item_ref], x,y,z,r1,r2,r3); //x,y,z GetObjectPos & r1,r2,r3 GetObjectRot (id haste ja) }Erstellen der Objekte beim Laden ist dann trivial oder?
#ZuFaul -
Die Schleife ist korrekt.
Was gibt n das print da so aus?

-
aber es steht immer noch Test als fraktion also die frak id 1 ist test aber wenn ich den spieler 0 setze steht immer noch test.
Wie sieht die Variable/Funktion denn aus?

-
die //makierungen lesen
Hier ein paar Fragen:
- Verändert sich das, wenn du SpawnPlayer an das Ende des Befehls setzt?
- Wieso nutzt du überhaupt fID? Nutze doch einfach direkt frak
-
Ja...also pack eine Abfrage davor...
Ansonsten greift er ja auf den index -1 dazu.#Handy
-
Pack es mal in ein
window.onload = function () {
//Hier der Code
};#Handy
-
currentClub ist vermutlich -1.
Da musst du n check machen, dass der das nicht ist.#Handy
-
Am Besten einfach mal schauen, wie es Andere gelöst haben:
https://forum.sa-mp.com/showthread.php?t=599907
https://forum.sa-mp.com/showthread.php?t=169284
https://forum.sa-mp.com/showthread.php?t=284484
https://forum.sa-mp.com/showthread.php?t=229181
und ja, du musst das über die Distanz / SpeedUp lösen...gibt ja keine anderen Variablen, die sich auf den Tank auswirken würden xD
-
Klar, so nutze ich das ganze.
- Du nutzt dort vehicleid, in deinen Funktionen wird aber nach der playerid verlangt.
- %0.0f macht nicht soviel Sinn, da du ja einen Integer hast und keinen Float. Ergo nutze %d.
- Printe eventuell was PlayerVehicle zurückgibt? Ist das ein Makro..oder wieso nicht einfach GetPlayerVehicleID?
-
VectorSize ist schneller:
Cstock GetVehicleSpeed(vehicleid) { new Float:x,Float:y,Float:z; GetVehicleVelocity(vehicleid,x,y,z); return floatround(floatmul(VectorSize(x,y,z),200.0)); }
Anyway das Problem ist wohl, dass du diese falsch nutzt.Kannst du uns zeigen, wie du die Funktionen aufrufst und das prüfst?

-
Meh, ich sehe gerade für das progressbar2 Include benötigt man YSI.
Versuch mal:
#define ITER_NONE (cellmin)
Ganz oben in das Include zu setzen...
Ansonsten...mal nach progressbar 1 googlen xD
-
die Balken auch von der Höhe anders gestalten
Na klar

CreatePlayerProgressBar(playerid, Float:x, Float:y, Float:width = 55.5, Float:height = 3.2, colour, Float:max = 100.0, direction = BAR_DIRECTION_RIGHT)
Da haste doch direkt die Höhe als Parameter

aber irgendwie läuft das nicht.. immer Unknown Command
Da musste wohl mal crashdetect laden und in den server log schauen, was da nicht so klappt :c
-
Den unteren Teil kannst du so schreiben:
C//Ondialogresponse case D_DELCOPCAR: { new vID = GetPVarInt(playerid, "delRadCopCar"); DeletePVar(playerid, "delRadCopCar"); if(!response) return 1; AdminLog(playerid, "delcopcar", "entfernt ein Polizei Fahrzeug. [VehID: %d, CarIndex: %d, SQL: %d]", GetVehicleModel(vID), vID, Vehicle[vID][vSQL]); DestroyCopCar(vID), SCM(playerid, COLOR_LIGHTBLUE, "Du hast das Polizei Fahrzeug erfolgreich entfernt."); }Das ist doch die VehicleID und nicht nur ein index

-
Die VehicleID im VehicleIndex muss ich aber trotzdem zwischenspeichern für Funktionen aus einem bestimmten Radius^^
Zeig mal deine Funktion, dann kann ich dir zeigen, wie man es ohne macht

-
Vehicle[cachedVehicle][vVehicle] = cachedVehicle,
Das ist ganz schönes Doppelgemoppel.
Wenn der index schon die vehicleid ist, wieso nochmal den Wert speichern, denn um an den Wert zu kommen, brauchst du ja den index

if(Vehicle[i][vVehicle])continue;
Diese Zeile ist falsch. Weil, wieso denn i?
Macht keinen Sinn, es kann kein Index doppelt indexiert werden, da das Fahrzeug einen eindeutigen Rückgabewert liefert, also lösch diese Zeile in beiden Schleifen

-
LoL

Der Thread wurde gelöscht...wieso auch immer..dafuq xD
Aber dank des Internet Archives, kannst du noch drauf zugreifen:
https://web.archive.org/web/20…m/showthread.php?t=113443
Das dein Include, viel Spaß

Das Github-Repo existiert noch: https://github.com/Southclaws/progress2
-
Ich bin irgendwie neugierig, um was handelt es sich denn?

-
Jetzt mal no joke...aaaaaber fahr doch einfach in die Werkstatt
