Mir ist noch etwas aufgefallen:
Externe Links werden nicht mehr in einem neuen TAB geöffnet. Das sollte wieder eingestellt werden, das ist wesentlich komfortabler.
Beiträge von Jeffry
-
-
Du hast einige male mit killerid ein Array gesprengt, wenn es INVALID_PLAYER_ID war, was es ist, wenn du dich selbst tötest.
Ich habe dir die Abfrage eingebaut.Versuche es so:
http://pastebin.com/PrA8Dgug -
Nutze http://wiki.sa-mp.com/wiki/SetSpawnInfo vor TogglePlayerSpectating zu 0.
[wiki]SetSpawnInfo[/wiki]
-
Nein, ich meinte die beiden fehlenden Floats hier:
Sowie das Komma anstatt der Klammer nach IsPlayerInRangeOfPoint und die fehlende Klammer am Ende der Zeile hier:
Beide Fehler hat auch [DT]Sniper in seinem Post.
Zwecks deiner Frage:
Du kannst es dir auch so vorstellen:C
Alles anzeigenfor(new p:p<MAX_PLAYERS;p++) { new Float:pX,Float:pY,Float:pZ; GetActorPos(MyActor[p], pX, pY, pZ); if(IsPlayerInRangeOfPoint(playerid, 3.0, pX, pY, pZ)) { SendClientMessage(playerid, ROT, "Geld bekommen"); //Bekomme ich unzählige Male return 1; } } SendClientMessage(playerid, ROT, "Niemand da"); //EbenfallsDas return beendet die Ausführung der Funktion bzw. des Callbacks.
Das macht meinstens mehr Sinn, da der gewünschte Code ja ausgeführt wurde. Alternativ kann man es mit goto lösen, dann spart man sich die Variable im Gegensatz zu break:C
Alles anzeigenfor(new p:p<MAX_PLAYERS;p++) { new Float:pX,Float:pY,Float:pZ; GetActorPos(MyActor[p], pX, pY, pZ); if(IsPlayerInRangeOfPoint(playerid, 3.0, pX, pY, pZ)) { SendClientMessage(playerid, ROT, "Geld bekommen"); //Bekomme ich unzählige Male goto AFTERCHECK; } } SendClientMessage(playerid, ROT, "Niemand da"); //Ebenfalls AFTERCHECK: //mehr Code...Kommt im Endeffekt auf's Gleiche raus.
-
Der Code war syntaktisch falsch, den kannst du gar nicht kompiliert haben können.
Versuche es so:
Cfor(new p:p<MAX_PLAYERS;p++) { new Float:pX,Float:pY,Float:pZ; GetActorPos(MyActor[p], pX, pY, pZ); if(IsPlayerInRangeOfPoint(playerid, 3.0, pX, pY, pZ)) { return SendClientMessage(playerid, ROT, "Geld bekommen"); //Bekomme ich unzählige Male } } SendClientMessage(playerid, ROT, "Niemand da"); //Ebenfalls -
Kannst du das bitte in einem Quellcode Tag posten? So ist es kaum lesbar.
-
Könntest du das bitte in einem Quellcode Tag posten? So ist es schwer etwas zu erkennen, vor allem am Ende.
-
Erstelle bitte einen neuen Thread und poste dort dein OnPlayerDeath und dein OnPlayerSpawn (nehme ich an), und markiere dort den Teil, der den Spieler ins Krankenhaus setzt.
-
So, ich habe dir jetzt mal ein paar Dinge zusammengestellt, ich hoffe dass du damit klar kommst und darauf aufbauen kannst, und vor allem dass keine Fehler drin sind, da ich schon lange nicht mehr mit dieser alten Version arbeite und den Code ohne Compiler geschrieben habe. Falls doch Probleme oder Fehler drin sind, sag einfach Bescheid.
Diese mysql_SetInt Funktionen habe ich bewusst nicht genommen, da sie sehr unperformant sind. Die Erstellung der Tabellenstruktur habe ich etwas geändert, aber den Weg mit ALTER so gelassen wie du es angefangen hast. Du könntest es auch in einem Query schreiben, aber das bleibt dir überlassen.
Unter den Includes die Deklarationen:
C
Alles anzeigen#define MAX_PKAMMER sizeof(pkInfo) new tmpID[MAX_PLAYERS]; enum pk_enum { Float:pk_x, Float:pk_y, Float:pk_z, p_schlagstock, p_9mm, p_mp5, p_m4, p_armor, } new pkInfo[][pk_enum] = { {221.1156,108.2433,1003.2188} };
Der stock um die Tabelle zu erstellen und mit Daten zu füllen.C
Alles anzeigenstock CreatePKammer() { mysql_query("CREATE TABLE IF NOT EXISTS `PoKammer` (`id` int(11) AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); mysql_query("ALTER TABLE `PoKammer` ADD `schlagstock` int(11) NOT NULL DEFAULT 0"); mysql_query("ALTER TABLE `PoKammer` ADD `9mm` int(11) NOT NULL DEFAULT 0"); mysql_query("ALTER TABLE `PoKammer` ADD `mp5` int(11) NOT NULL DEFAULT 0"); mysql_query("ALTER TABLE `PoKammer` ADD `m4` int(11) NOT NULL DEFAULT 0"); mysql_query("ALTER TABLE `PoKammer` ADD `armor` int(11) NOT NULL DEFAULT 0"); new query[128]; for(new i=0; i<MAX_PKAMMER; i++) { //Die Lösung ist zwar etwas unschön, aber besser als für jeden Datensatz einen Select auszuführen format(query, sizeof(query), "INSERT INTO PoKammer (id) VALUES ('%d')", i); mysql_query(query); } return 1; }
Die beiden Stocks um die Daten zu speichern:C
Alles anzeigenstock SavePKammer(i) { //Ein Update Query, das die Daten speichert. new query[256]; format(query, sizeof(query), "UPDATE PoKammer SET schlagstock = %d, 9mm = %d, mp5 = %d, m4 = %d, armor = %d WHERE id = %d", pkInfo[i][p_schlagstock], pkInfo[i][p_9mm], pkInfo[i][p_mp5], pkInfo[i][p_m4], pkInfo[i][p_armor], i); mysql_query(query); return 1; } stock SaveAllPKKammern() //z.B. bei OnGameModeExit oder in einem Timer. { for(new i=0; i<MAX_PKAMMER; i++) SavePKammer(i); return 1; }
Der stock um die Daten aus der Datenbank zu laden (muss dann bei OnGameModeInit aufgerufen werden):C
Alles anzeigenstock LoadPKammern() { //Zum Laden der Kammern. new i, tmp[64]; mysql_query("SELECT * FROM PoKammer"); mysql_store_result(); while(mysql_retrieve_row()) { mysql_fetch_field_row(tmp, "schlagstock"); pkInfo[i][p_schlagstock] = strval(tmp); mysql_fetch_field_row(tmp, "9mm"); pkInfo[i][p_9mm] = strval(tmp); mysql_fetch_field_row(tmp, "mp5"); pkInfo[i][p_mp5] = strval(tmp); mysql_fetch_field_row(tmp, "m4"); pkInfo[i][p_m4] = strval(tmp); mysql_fetch_field_row(tmp, "armor"); pkInfo[i][p_armor] = strval(tmp); i++; } //Result Leeren nicht vergessen! mysql_free_result(); return 1; }
Der Test-Befehl:C
Alles anzeigenocmd:fkammer(playerid) { if(Spieler[playerid][Fraktion] != 0) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist nicht in Fraktion 0."); for(new i=0; i<MAX_PKAMMER; i++) { //Schleife durch alle Kammern, wenn der Spieler in der Nähe ist dann den Dialog anzeigen und KammerID (i) speichern. if(IsPlayerInRangeOfPoint(playerid,2.0,pkInfo[i][pk_x], pkInfo[i][pk_y], pkInfo[i][pk_z])) { new str[256]; format(str, sizeof(str), "Schlagstock(%d)\n9mm(%d)\nmp5(%d)\nM4(%d)\nArmor(%d)", pkInfo[i][p_schlagstock], pkInfo[i][p_9mm], pkInfo[i][p_mp5], pkInfo[i][p_m4], pkInfo[i][p_armor]); ShowPlayerDialog(playerid,DIALOG_PKAM,DIALOG_STYLE_LIST,"Fraktions Kammer",str,"Wählen","Abbrechen"); tmpID[playerid] = i; return 1; } } return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist nicht nahe einer PKammer."); }
Und für OnDialogResponse:C
Alles anzeigenif(dialogid == DIALOG_PKAM) { if(!response)) return 1; new i = tmpID[playerid]; switch(listitem) { case 0: { pkInfo[i][p_schlagstock]--; //GivePlayerWeapon... } //... } SavePKammer(i); return 1; }
Wie gesagt, wenn Probleme auftauchen einfach nochmal Bescheid sagen. -
Versuche es so:
C
Alles anzeigenpublic OnPlayerEnterDynamicVehicle(playerid, vehicleid, ispassenger) { for(new i=0; i<MAX_AUTOHAUSCA; i++) { printf("vehicleid: %d | fahrzeugerstellt: %d", vehicleid, AInfo[i][fahrzeugerstellt]); if(vehicleid == AInfo[i][fahrzeugerstellt]) { new stringauto[512]; printf("%d -> %s",vehicleid, VehicleName[GetVehicleModel(vehicleid)-400]); format(stringauto,sizeof(stringauto),"{C30000}Fahrzeugname: {FAFAFA}%s\n{C30000}Preis: {FAFAFA}%.2f$\n{C30000}Tankvolumen: {FAFAFA}%.2f\n{C30000}Tankart: {FAFAFA}%s\n\nWillst du dieses Fahrzeug kaufen?",VehicleName[GetVehicleModel(vehicleid)-400],AInfo[i][fahrzeugpreis],GetGasMax(GetVehicleModel(vehicleid)),GetPlayerVehicleType(vehicleid)); ShowPlayerDialog(playerid,DIALOG_KAUFAUTO,DIALOG_STYLE_MSGBOX,"Autohaus",stringauto,"Kaufen","Abbrechen"); break; } } return 1; }
Wenn das nicht klappt, poste bitte was im Server Log steht. -
Ahh, du hast es bei OnPlayerEnterVehicle drin.
Der Code muss in OnPlayerEnterDynamicVehicle stehen, um dem Dialog anzuzeigen. Das dürfte der Grund für die Verschiebung sein. -
Wie erstellst du die Fahrzeuge?
Poste dazu bitte nochmal den aktuellen Code.Hast du die Schleife geändert?
-
Mir ist kein Wetter bekannt, das die Schatten komplett entfernt und dabei noch normal aussieht, sorry.
-
for(new i=1; i<MAX_AUTOHAUSCA; i++)
zu:
for(new i=0; i<MAX_AUTOHAUSCA; i++) -
Wo kommt der Fehler? Im Befehl? Kopiere es so:
C
Alles anzeigenocmd:afk(playerid,params[]) { new str[128]; if(Tot[playerid] == 1) { SCM(playerid,COLOR_RED,"Du bist nicht in der Lage dies zu tun!"); return 1; } if(AFKCD[playerid] > 0) { SCMF(playerid,COLOR_RED,"Du musst noch %i Sekunden warten bis du den Befehl wieder nutzen kannst!",AFKCD[playerid]); return 1; } if(AFK[playerid] == 0) { format(str,sizeof (str),"[AFK] %s ist in den AFK-Modus gegangen!",SpielerName(playerid)); TogglePlayerControllable(playerid,0); AFKLabel[playerid]=Create3DTextLabel("*Spieler ist AFK*", COLOR_ORANGE, 30.0, 40.0, 50.0, 40.0, 0, 0); Attach3DTextLabelToPlayer(AFKLabel[playerid],playerid,0,0,0.5); GetPlayerHealth(playerid, AFKLeben[playerid]); s_SetPlayerHealth(playerid,0x122E0); SCMTA(COLOR_ORANGE,str); AFK[playerid] = 1; AFKCD[playerid] += 30; return 1; } if(AFK[playerid] == 1) { format(str,sizeof (str),"[AFK] %s ist vom AFK-Modus zurück!",SpielerName(playerid)); SCMTA(COLOR_ORANGE,str); Delete3DTextLabel(AFKLabel[playerid]); AFK[playerid] = 0; s_SetPlayerHealth(playerid,AFKLeben[playerid]); TogglePlayerControllable(playerid,1); AFKCD[playerid] += 30; AFK[playerid] = 0; return 1; } return 1; }Wenn nicht dort, wo dann? Poste den Code bitte.
-
Versuche es so:
Cif(AFKCD[playerid] > 0) SCMF(playerid,COLOR_RED,"Du musst noch %i Sekunden warten bis du den Befehl wieder nutzen kannst!",AFKCD[playerid]), return 1;Zwecks dem OnPlayerText:
Du musst dort return 0 einfügen, wenn die Meldung ausgegeben wird. Return 0 lässt die Chat Nachricht nicht anzeigen. -
Die sind serverweit zu spüren, da es die CPU deines Servers ist, die langsamer arbeitet.
-
-
Gut, dann füge unter den Includes:
#pragma dynamic 100000
ein.
Erhöhe die Zahl, falls die Meldung nicht weg geht. -
Ok, das heißt du hast meherere Kammern?
Wie wird denn so eine Kammer erstellt? Kannst du davon mal den Code posten?Oder soll es nur eine PoKammer geben?