TDCoins3
Zu
TDCoins3[playerid]
Und unter den Includes:
new PlayerText:TDCoins3[MAX_PLAYERS];
TDCoins3
Zu
TDCoins3[playerid]
Und unter den Includes:
new PlayerText:TDCoins3[MAX_PLAYERS];
Nein, ihr habt es beide falsch verstanden. @iEnerqie:
Die id ist nur ein Zwischenspeicher. Dann wird der Index des bool Arrays (entsprechend der id) auf true gesetzt, sprich man weiß über den Index des Arrays ob das Objekt erstellt worden ist oder nicht.
Das spart an Ressourcen, da man es direkt über den Index abfragen kann.
komme leider damit nicht klar
Sorry, hatte deinen damaligen Post übersehen.
Mit was genau kommst du denn nicht klar? Hast du denn schon einen Code?
Möglicherweise ist das Array zu klein für deine ganzen Objekte.
Ändere das mal zu:
new bool:ObjectCreatedInFS[100000];
Klappt es dann?
Oh ja, stimmt. Der Code von mir hat nicht gepasst, als ich deinen Code verglichen habe, habe ich dann auch dein Prinzip verstanden, was du eigentlich vor hast damit. Ich hätte es mit zwei Variablen gemacht, aber du geht es auch, etwas kompliziert eben.
Ich habe meinen Code nochmals geändert, so dürfte es auch klappen. Aber wenn du es hast passt es ja, das war ja das Ziel. Super!
Ja hab ich grad auch schon gelesen nach dem ich abgesendet habe Öm ja denn weiß ich gerade auch nicht tut mir leid
Ich hab doch die Lösung schon in Post #2 hingeschrieben...
Wie kann man das sinvoll lösen, ohne die Farbe in jede Zeile zu schreiben
Für jeder neuen Zeile nochmal den Color code
Genau das will er doch nicht machen.
//includes
#include <a_samp>
#include <streamer>
#pragma tabsize 0
//new
new BT_buswand[21];
new bool:ObjectCreatedInFS[MAX_OBJECTS];
new id;
public OnPlayerConnect(playerid)
{
RemoveBuildingForPlayer(playerid, 706, 301.0859, -1115.3750, 79.9141, 0.25);
RemoveBuildingForPlayer(playerid, 706, 252.9063, -1156.1953, 77.7656, 0.25);
return 1;
}
public OnFilterScriptInit()
{
id = CreateDynamicObject(3522, 1752.5, -1768.6, 12.6, 0, 0, 268.918); ObjectCreatedInFS[id] = true;
id = CreateDynamicObject(3522, 1756.9, -1768.6, 12.6, 0, 359.608, 268.918); ObjectCreatedInFS[id] = true;
id = CreateDynamicObject(3522, 1761.3, -1768.7, 12.6, 0, 0, 268.918); ObjectCreatedInFS[id] = true;
id = CreateDynamicObject(1359, 1725.1, -1768.1, 13.2, 0, 0, 0); ObjectCreatedInFS[id] = true;
new objects;
objects = Streamer_CountItems(STREAMER_TYPE_OBJECT,1);
for(new i; i<objects; i++) Streamer_SetFloatData(STREAMER_TYPE_OBJECT, i,E_STREAMER_DRAW_DISTANCE, 800.0);
Streamer_VisibleItems(STREAMER_TYPE_OBJECT,1000);
printf("%i Gemappte Objecte Geladen",objects);
return 1;
}
public OnFilterScriptExit()
{
for(new i=0; i<MAX_OBJECTS; i++)
{
if(ObjectCreatedInFS[i] == true)
{
DestroyDynamicObject(i);
ObjectCreatedInFS[i] = false;
}
}
return 1;
}
Schreibe es mal so, geht es dann? Kommt der print "%i Gemappte Objecte Geladen"?
Wenn du die Objekte lädst musst du dich kurz bewegen, sonst siehst du die Objekte nicht.
ohne die Farbe in jede Zeile zu schreiben, oder geht das nicht?
new str[40] = "{ffffff}test\ntest";
new color[9];
format(color, sizeof(color), str);
for(new i=0; i<strlen(str); i++)
{
if(str[i] == '\n')
{
strins(str, color, i+1);
}
}
Oder falls dir das lieber ist:
Immer gut darauf achten, dass "str" auch groß genug ist. Lieber etwas mehr, wenn du dir nicht sicher bist.
Hmm, nicht wirklich.
So?
for(new i=0;i<=sizeof(topTimes)/2;i++)
{
if(tick-MapTimeDM < topTimes[i] || topTimes[i] == 0)
{
for(new p=4; p>=i; p--)
{
topTimes[p] = topTimes[p-1];
topTimes[p+5] = topTimes[p+4];
}
topTimes[i] = tick-MapTimeDM;
topTimes[i+5] = 1; //Hier die User ID eintragen
format(str, sizeof(str), "DM/%s/toptimes.xml", currentMapFolder);
new File:editTopTimes = fopen(str,io_write);
if(editTopTimes)
{
new fwritestring[400];
format(fwritestring, sizeof(fwritestring), "<toptimes>\n<first>\n<user>%d</user>\n<time>%d</time>\n</first>\n<second>\n\
<user>%d</user>\n<time>%d</time>\n</second>\n<third>\n<user>%d</user>\n<time>%d</time>\n\
</third>\n<fourth>\n<user>%d</user>\n<time>%d</time>\n</fourth>\n<fifth>\n<user>%d</user>\n\
<time>%d</time>\n</fifth>\n</toptimes>", topTimes[5],topTimes[0],topTimes[6],topTimes[1],topTimes[7],topTimes[2],topTimes[8],topTimes[3],topTimes[9],topTimes[4]);
fwrite(editTopTimes,fwritestring);
}
fclose(editTopTimes);
SendFormatToAll(-1,"{FF6347}[ TOP TIME ] {FFFFFF}%s made a new %d. Top Time! (%02d:%02d:%03d)", ReturnPlayerName(playerid),i-4,rMin, rS, rMS);
break;
}
}
DestroyDynamicObject(i);
Erstellst du die Objekte mit dem Streamer oder nicht? Du kannst nicht beides gleichzeitig auf die gleichen Variablen anwenden.
Poste mal den gesamten Filterscript (ohne die Objekte, nur so 2-3) und den Befehl zum laden der Objekte.
for(new i=4; i>=1; i--)
{
topTimes[i+1] = topTimes[i];
topTimes[i+5] = topTimes[i+5];
}
Das würde den Wert von 4 auf 5 verschieben, den Wert von 3 auf 4, von 2 auf 3 und von 1 auf 2, sodass du bei 1 den neuen Wert setzen kannst und der bei 0 bleibt gleich. Jeweils das selbe mit den Positionen +5.
Ist das was du willst?
Poste bitte den ganzen Code dazu.
Falls ich etwas einwenden darf... Ich frage mich die ganze Zeit, warum du einen Timer anstatt OnPlayerTakeDamage verwendest?
Danke für den Hirnanstoß, stimmt natürlich. An das Callback hatte ich gar nicht gedacht.
Habe meinen Code geändert.
Er hat mir übrigens schon in PN geschrieben, dass der Code keine Errors gibt, das war auf den Post über meinem bezogen.
Oben unter die Includes kommt die Deklarierung:
new PlayerText:TDLeben[MAX_PLAYERS];
In OnPlayerConnect erstellen wir das Textdraw:
TDLeben[playerid] = CreatePlayerTextDraw(playerid, 564.000000, 67.000000, "0%");
PlayerTextDrawBackgroundColor(playerid, TDLeben[playerid], 255);
PlayerTextDrawFont(playerid, TDLeben[playerid], 3);
PlayerTextDrawLetterSize(playerid, TDLeben[playerid], 0.320000, 0.699999);
PlayerTextDrawColor(playerid, TDLeben[playerid], -1);
PlayerTextDrawSetOutline(playerid, TDLeben[playerid], 1);
PlayerTextDrawSetProportional(playerid, TDLeben[playerid], 1);
PlayerTextDrawShow(playerid,TDLeben[playerid]);
In OnPlayerDisconnect löschen wir es:
PlayerTextDrawDestroy(playerid, TDLeben[playerid]);
Und das Textdraw für alle Spieler aktualisierien:
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart)
{
new lstring[5];
new Float:energie;
GetPlayerHealth(playerid, energie);
format(lstring,sizeof(lstring),"%d",floatround(energie));
PlayerTextDrawSetString(playerid, TDLeben[playerid], lstring);
return 1;
}
Ich hoffe du kommst damit klar.
Falls nicht, darfst du gerne nachfragen!
EDIT:
@iEnerqie: Würdest du beim nächsten Mal bitte nicht den kompletten Post mit allen Codes und Zitaten zitieren? Das ist nicht der Sinn der Zitierfunktion. Danke!
@DieChickenfighter: Hier lesen!
Für das Grundprinzip von MySQL ist das ausreichend, ja. Wenn du später mehr lernen willst, dann würde ich dir folgendes raten auch mal in die neuen Releases (R39-2 zur Zeit) einen Blick zu werfen, diese sind von der Performance besser, allerdings für Anfänger schwerer zu verstehen, daher ist es gut, wenn du mit diesem Tutorial anfängst und dann weiter machst.
Zum einen das im Post über mir, und die Warnung bekommst du, weil du hour und minute global deklariert hast, dann darfst du es nicht nochmal in einer Funktionsdeklaration verwenden.
forward OnServerTime(pHour, pMinute);
public OnServerTime(pHour, pMinute)
{
hour = pHour;
minute = pMinute;
Entweder so, oder du änderst eben alle Vorkommen von hour und minute zu pHour und pMinute.
Möglicherweise bricht der Ladevorgang ab.
Lädst du den Filterscript mit den Objekten vor dem mit dem Tor?
Ändere mal:
tor = CreateObject(980, 310.40039, -1175.8701, 82.7, 0, 0, 221.737);
zu:
print("Lade das TOR");
tor = CreateObject(980, 310.40039, -1175.8701, 82.7, 0, 0, 221.737);
Steht der print in dem Server Log, wenn du den Server startest?
Wenn nein, poste mal dein OnFilterScriptInit des Objekte-Filterscripts.
Ja genau!
Füge unter die Includes das hier ein:
#pragma dynamic 100000
Falls die Meldung nicht weg geht, erhöhe die Zahl etwas.
Dann sollte der Befehl gehen.