Positionen / Daten von 1 und 2 sind irgendwie identisch? ![]()
mach ich doch nicht oder?
AutohausInfo[i][ah_ID] = CreatePickup
dini_IntSet(path, "aa_ID", AutohausInfo[i][ah_ID]);
Daraus folgt aa_ID = eine Pickupid ![]()
Positionen / Daten von 1 und 2 sind irgendwie identisch? ![]()
mach ich doch nicht oder?
AutohausInfo[i][ah_ID] = CreatePickup
dini_IntSet(path, "aa_ID", AutohausInfo[i][ah_ID]);
Daraus folgt aa_ID = eine Pickupid ![]()
Wenn ich diese entferne habe ich ein Klammerfehler...
Ja..die Klammer für das case ist ja auch richtig...
Aber halt die anderen beiden nicht...und
Das sieht so aus..als hättest du nur die Hälfte von etwas kopiert xD
oder etwas gelöscht...denn da fehlt ja irgendwas..des else und der Code darunter..kommt ja irgendwie aus dem Nichts xD
Es macht wenig Sinn, die Pickupids als AutohausID zu verwenden ![]()
Da diese von anderen Pickups abhängig sind und sich immer ändern xD
Dann printe...doch mal, was die Datein so ausspucken und ob alles richtig geladen wird ![]()
Also ich bin so gar kein Freund von dini ![]()
Deshalb würde ich dir persönlich zu SQLite raten oder zu einem schnelleren File-System ![]()
Aber naja...hast du dir das mal beim Speichern geprintet oder in die Files geschaut, steht da der richtige Name drinnen?
strmid(AutohausInfo[i][aa_Name], dini_Get(path, "aaName"), false, strlen(dini_Get(path, "aaName")), 40);
Diese Zeile ist übrigens eine Katastrophe xD
Also strmid ist eigentlich so garnicht dafür gedacht.
Verwende mal format:
format(AutohausInfo[i][aa_Name],40, dini_Get(path, "aaName"));
Willst nicht noch mehr leere Klammern drüber setzen? ![]()
Der Fehler kommt, weil du nur eine leere Klammer hast und dann ein else verwendest...
Aber ohne if-Abfrage, kann es auch keine else-Abfrage geben ![]()
Also, wenn du sicher bist, dass er jetzt die richtige Farbe verwendet und die Positionen richtig sind und er dir einen vernünftigen String gibt und du sicher an dieser Position bist...dann muss es gehen ![]()
Wenn es nicht geht, ist einer der oben stehen Punkte nicht erfüllt oder du hast schon ein Limit von 1024 3DTextLabels überschritten!
Dann zeig mal wie du es lädst und speicherst, ohne Code können wir dir schlecht helfen ![]()
0xFAFAFA00
Das hier ist der Fehler ![]()
00 am Ende steht für den Alpha Kanal, also für die Transparenz. 00 bedeutet, dass es total transparent ist..deshalb siehst du es nicht, so transparent ist es xD
Also einfach mal auf FF z.B. ändern ![]()
von der verkackten NSA weil discord ein amerikanisches unternehmen ist
Genau, da die NSA sich nur um amerikanische Unternehmen kümmert ![]()
Wie hast du denn weiß definiert?
5 als DrawDistance ist bisschen wenig xD
Und deine Virtuelle Welt ist auch sicher 0? ![]()
Gibt doch bestimmt super viele Anwendungen dafuer
Wo man einen Index in einer sortieren Liste finden muss? ![]()
Ich denke..eher nicht so ![]()
...du musst natürlich auch über phpmyadmin oder einem ähnlichen Panel deine MySQL Datenbank konfigurieren, dass sie genau dieses Passwort besitzt ![]()
...der genaue Log wäre natürlich von Vorteil mit einem bla bla kann man nicht wirklich arbeiten xD
Aber ich würde mal vermuten, dass du ein falsches Passwort verwendest bzw gar keins ![]()
Setz mal eins oder überprüfe es.
Nein, das bedeutet dass du in beiden Arrays die selben IDs hast xD
Irgendwas stimmt da mit deiner Zuweisung nicht ![]()
Aber wie gesagt, eigentlich musst du Money pickups nicht extra definieren nur alle anderen ![]()
Hallo, kann mir jemand verraten warum der 2 Sting nicht an gesendet wird? Im Spiel ist nur eine Leerzeile im Chat dann
Hier, probier mal folgendes:
ocmd:ooc(playerid,params[])
{
if(!IsPlayerGM(playerid,2)) return 1;
new string[128];
format(string,sizeof(string),"%s %s hat den OOC Chat %s!", GetGMRang(playerid),getPlayerName(playerid),((OOChat)?("geschlossen"):("geöffnet (/o )")));
SendClientMessageToAll(FARBE_ROT,string);
OOChat = !OOChat;
return 1;
}
Da sparste dir einiges ![]()
Habe ich da was falsch gemacht?
Also 2 Dinge:
1. 0 zu returnen ist nicht gut, da auch das 1. Element im Array mit 0 indexiert ist.
2. mit l und r gibst du die Array Positionen an und nicht die Elemente.
Also deine müsste z.B. so aussehen:
binsearch(MoneyPickups,pickupid,0,sizeof(MoneyPickups)-1);
Hier, mach es mal so:
new mres = binsearch(pickupid,MoneyPickups,sizeof(MoneyPickups));
if(mres != -1) return index=mres,MONEY_TYPE;
printf("ID: %d mres: %d",pickupid,mres);
//Funktion:
stock binsearch(x, v[], n)
{
new low, high = n-1, mid;
while(low < high)
{
mid = (low + high) / 2;
if(x <= v[mid]) high = mid;
else low = mid+1;
}
return (x == v[low]) ? low : -1;
}
Alles anzeigen
Quicksort wäre schneller als Heapsort ![]()
Und du müsstest genau dann das Array neu sortieren, wenn sich etwas ändert, also genau unter:
MoneyPickups[index]=-1;
Wenn dein Hauptbestandteil aus money Pickups besteht, dann kannst du es smarter machen und brauchst diese gar nicht definieren.
Dann sind die MoneyPickups alle INVALID_PICKUP_TYPE, das funktioniert solange du alle anderen definierst ![]()
Dann suchst der nur in den anderen und wenn er es dort nicht findet, weiß er instant, dass es ein money pickup sein muss ![]()
Eine Binäre Suche funktioniert leider nur mit geordneten Arrays. Also wenn sie sortiert wären, würde das gehen..sind sie aber hier leider nicht, da ja in der Mitte zum beispeil ein Pickup verschwinden könnte... ![]()
//Edit:
Zitatbestimmt 600-700 Zeilen mit einem # inzwischen
Das sind aber ganz schön viele...da könntest du bestimmt etwas vereinfachen ![]()
Wie wäre es, wenn du das ein bisschen übersichtlicher gestaltest.
Also, es würde funktionieren, wie Pr0x das gezeigt hat, aber nur unter der Vorraussetzung, dass du entweder ActorPickups oder MoneyPickups hast.
Falls noch eine weitere Art Pickup hinzukommt, wird das als money interpretiert...
Also hier mal ein kleines Beispiel wie man sowas aufbauen könnte:
//Hier alle Pickuptypen
enum
{
INVALID_PICKUP_TYPE,
MONEY_TYPE,
ACTOR_TYPE
};
//Hier deine Pickup-Arrays:
new money_pickups[100], actor_pickups[50];
//Dann der Callback
public OnPlayerPickUpPickup(playerid, pickupid)
{
new index;
switch(GetPickupType(pickupid,index))
{
case INVALID_PICKUP_TYPE:
{
//Wenn es weder Money noch Actor ist...(also nicht definiert)
}
case MONEY_TYPE:
{
maxmoney -= 1;
GivePlayerMoney(playerid, 1000);
printf("ID picked up: %d",maxmoney);
//Sehr wichtig, dass du auch das Pickup im Array clearst
money_pickups[index]=-1;
DestroyPickup(pickupid);
}
case ACTOR_TYPE:
{
ShowMenuForPlayer(shopmenu,playerid);
TogglePlayerControllable(playerid,false);
//Könntest z.B. mit actor_pickups[index] auf das im Array zugreifen
}
}
return 1;
}
//Und dann die Funktion (ohne Makro)
stock GetPickupType(pickupid, &index)
{
for(new i; i<sizeof(money_pickups); i++)
{
if(money_pickups[i] == pickupid) return index=i,MONEY_TYPE;
}
for(new i; i<sizeof(actor_pickups); i++)
{
if(actor_pickups[i] == pickupid) return index=i,ACTOR_TYPE;
}
return INVALID_PICKUP_TYPE;
}
/*
Da das immer das selbe im Endeffekt ist, kann man das auch zusammenfassen mit einem Makro und sich so Schreibarbeit sparen:
*/
#define CheckForPickupType(%0,%1); for(new i; i<sizeof(%0); i++) if(%0[i] == pickupid) return index=i,%1;
stock GetPickupType(pickupid, &index)
{
CheckForPickupType(money_pickups,MONEY_TYPE);
CheckForPickupType(actor_pickups,ACTOR_TYPE);
return INVALID_PICKUP_TYPE;
}
Alles anzeigen
Nur so als Anregung bzw Idee, damit du es übersichtlicher hast
Musst halt auch schauen, dass du im Callback immer das Richtige Array verwendest, welches du unten angibst, da sich daran der Index anpasst ![]()
//Edit:
Parameter übergibst du mit SetTimerEx //Wiki Code buggt.lel
volatile existiert in Pawn nicht, da das alles in einer VM ausgeführt wird und nicht direkt auf der Hardware.