format (pInfo[playerid][pKey], 64,"%s", Key);
das sollte man besser nicht machen eher strcat benutzen dies ist 2 mal schneller als format
format (pInfo[playerid][pKey], 64,"%s", Key);
das sollte man besser nicht machen eher strcat benutzen dies ist 2 mal schneller als format
Wieso es so ist weiss ich nicht,du musst aber bei der 3 Dimension die Größe der Strings angeben.
Der Thread ist zwar älter jedoch wollte ich auch mal eine unklarheit bei dir aufdecken und zwar sind multidimensionale arrays nicht wirklich alle so wirklich multidimensional wie sie definiert wurden
diese werden zu einem 2 dimensionalem array komprimiert beim compilen im klar text
new array[5][20][40];
wird als
new array[20*40];
compilt
Alles anzeigenBei dem Befehle wird ein Dialog angezeigt. Ich kann ja mal den zeigen:
if(dialogid == DIALOG_BUS)
{
if(response)
{
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 437 || GetVehicleModel(GetPlayerVehicleID(playerid)) == 431)
{
if(listitem == 0)
{
SendClientMessage(playerid,GELB,"Du hast die Buslinie 1 gestartet. N‰chste Haltestelle: Busbahnhof");
BusInfo[playerid][BusAktiv] = true;
BusInfo[playerid][Bus_Checkpoint]=0;
BusInfo[playerid][Bus_ID] = GetPlayerVehicleID(playerid);
BusInfo[playerid][Bus_Linie] = 1;
SetPlayerCheckpoint(playerid,Bus_Stationen_L1[0][Bus_PosX],Bus_Stationen_L1[0][Bus_PosY],Bus_Stationen_L1[0][Bus_PosZ],5.0);
Update3DTextLabelText(LinienBusLabel[BusInfo[playerid][Bus_ID]],HELLBLAU,"Buslinie Los Santos 1");
}
{
}
new Text3D:LinienbusLabel[sizeof(buscar)];
for(new i;i < sizeof(buscar);i++){
LinenbusLabel[i] = Create3DTextLabel("Leerfahrt",WEISS,0,0,0,25,0,1);
Attach3DTextLabelToVehicle(LinenbusLabel[i],buscar[i],0,0,0);
}
if(dialogid == DIALOG_BUS){
if(response){
if(listitem == 0){
new car = GetPlayerVehicleID(playerid);
for(new i; i< sizeof(buscar); ++i){
if(car == buscar[i])
SendClientMessage(playerid,GELB,"Du hast die Buslinie 1 gestartet. N‰chste Haltestelle: Busbahnhof");
BusInfo[playerid][BusAktiv] = true;
BusInfo[playerid][Bus_Checkpoint]=0;
BusInfo[playerid][Bus_ID] = car;
BusInfo[playerid][Bus_Linie] = 1;
SetPlayerCheckpoint(playerid,Bus_Stationen_L1[0][Bus_PosX],Bus_Stationen_L1[0][Bus_PosY],Bus_Stationen_L1[0][Bus_PosZ],5.0);
return Update3DTextLabelText(LinienBusLabel[i],HELLBLAU,"Buslinie Los Santos 1");
}
}
}
}
}
so sollte das passen zu orientier dich bei der größe des arrays an der anzahl deiner busse.
Alles anzeigenHier ein wirklich kleiner Code-Schnipsel
Es ist doch nervig wenn man jemanden wohin Portet und man schreiben muss SetPlayerPos und dann auch noch SetPlayerFacingAngle...
Hier die Lösung xD, ich nenne es die SetPlayerPosF Funktion xD Hier der Schnipsel :
stock SetPlayerPosF(playerid,Float:X,Float:Y,Float:Z,Float:F)
{
SetPlayerPos(playerid,X,Y,Z);
SetPlayerFacingAngle(playerid,F);
return 1;
}
was ist eigentlich so schwierig für solche kleinen Sachen den PreProcessor zu benutzen
#define SetPlayerPosF(%0,%1,%2,%3,%4) SetPlayerPos(%0,%1,%2,%3),SetPlayerFacingAngle(%0,%4)
die benötige ich alle wie kann ich das irgendwie fixxen? das alle bleiben und auch keine errors kommen
siehe mein post oder schau dir nochmal dein code an und vergleiche diesen mal mit andere if abfragen wo logical Operator benutz werden
hau das ganze doch in ein array rein das ist übersichtlicher zu dem hast du noch genug fehler in dem code.
generel schon hier
if(IsPlayerInRangeOfPoint(playerid,3.0,HouseInfo[i][hExitx], HouseInfo[i][hExity], HouseInfo[i][hExitz]) && PlayerInfo[playerid][pLocal] == i)
du schließt direkt die if abfrage
es gibt zwei lösungen entweder du machst aus dem settimer ein settimerex da er den parameter playerid nicht erkannt hat und somit von 0 ausgegangen ist oder du verwendest eine schleife die für alle spieler gilt.
Generel ein Timer dafür zu benutzen ist der größte schwachsinn dafür macht man eine extra funktion und ruft diese beim ändern der jeweiligen variabel auf.
und SetTimerEx also für jeden spieler einen extra Timer ?
Antwort: unnötig , dan ein loop + SetTimer
Dafür gibts auch extra PlayerTextdraws
//edit PlayerTextdraws haben ein anderes Limit als Normale Textdraws , welche per TextDrawCreate erstellt werden.
Daher sind auch beide von den Limit her unabhängig daher benutze PlayerTextdraw
new PlayerText:TextdrawName;
cache_get_row
wenn du die ganezn dateneinträge auslesen willst
cache_get_data(rows, fields);
new i;
for(;i < rows;++i){
cache_get_row(i, 0, ....);
cache_get_row(i, 1, ....);
}
Ahhh! So langsam hab ich geschnallt , vielen Dank ich denke ich habe in etwa verstanden was du meinst!
Hier siehst du nochmal ein beispiel ist jedoch auf dem neuen Plugin von BlueG bassierend jedoch brauchst du dich davon nicht entmütigen lassen es kommt ja nur auf die
SQL-Befehle an ^^.
Jedoch hast du hier nicht viel auswahl möglichkeit im format der Zeit dazu siehe hier mehr http://dev.mysql.com/doc/refman/5.1/de/datetime.html
Grunsätzlich YYYYMMDD wenn du das umgedreht haben willst geht das auch per SQL Befehl DATE_FORMAT
hier nochmal nachzulesen
http://www.electrictoolbox.com…l/format-date-time-mysql/
Jedoch bin ich mir nicht sicher du kannst glaub ich per
DATE_FORMAT(NOW(),'%d-%m-%Y')
im INSERT query das auch als string speichern ich bin mir jedoch nicht sicher.
Das ganze ist auch per SQL-Befehl ganz einfach zu lösen einfach die jeweilige Tabelle auf timestamp dazu noch das format einstellen/umstellen.
Nun kannst du das Registrierungsdatum per NOW() in Verbindung beim neu erstellen des Accounts als wo du den Befehl INSERT ausführst hinzufügen. Nun steht auch das aktuelle Datum in der Tabelle. Dann kannst es bequem auch wieder auslesen (SELECT) und in einem Array (String) speichern und weiter verwenden .
//edit Rechtschreibung verbessert
Problem immer noch nicht gelöst, brauch Hilfe!
Normal sollte eine installation von Redistributable (neuste Version) dies beheben
http://www.microsoft.com/de-de…oad/details.aspx?id=30679
Du kannst mit einer variabel arbeiten wo du beim treffen die id der killers zuweisst für den spieler der getötet wurde und das dort demenstsprechend abfrägst oder
du kannst auf OnPlayerDeath 2mal aufrufen per CallLocalFunction jedoch weiß ich nicht gerade auswendig wie da das GF klar kommt besser ist es
entweder beim einmal töten der spielers OnPlayerDeath zu beginn abbrechen zu lassen und danach nochmal aufzurufen per CallLocalFunction.
//edit 3 möglichkeit beim töten direkt abfragen ob es ein hitman ist
Das mache ich ja alles. Aber es geht immer nur auf das selbe Taxi...
poste deinen /linen Befehl
ein ganz normalen gelben Stern (wie auf Breadfish Roleplay) werden die auch im TextDraw editor angezeigt ?
Ich geh mal davon aus das dieser Stern mit der Font 0 gemacht wurde nur die Farbe der schrift wurde verändert und die größe hier nochmal eine kleine übersicht
http://wiki.sa-mp.com/wiki/TextDrawFont
oben wurde es ja geschrieben wie man solch einen stern hin bekommt mit der eckigen Klammer ]
Es gibt keine Sterne der werden so gemacht " [ " oder " ] "
Es kommt drauf an was für ein Stern es gibt mehrere Sterne xD Polizeisterne(Orden)
Hier bitte
http://forum.sa-mp.com/showthread.php?t=291722
oder du öffnest due .txd datein per txdworkshop
lass dir mal PlayerCar[playerid][Dtc_PlayerKey[playerid]][CarPreis] ausgeben und schreibe den wert davon rein sollte dieser 0 sein so wird der preis des fahrzeugs nicht gespeichert es sei den er wird per array übermittelt jedoch gehe ich mal nicht davon aus . zu dem floatround wird nur bei floats benutzt ein integer wird durch das teilen durch 2 keine Float sondern rundet sich selbst.
den wert von vehID musst du auch verändern der ist grundsätzlich 0 .
Daher solltest du dir ausgeben lassen in welchem Fahrzeug der spieler sitzt von den Bussen.
Daher benutz eine For-schleife geh durch alle Busse durch sollte der spieler in dem jeweiligen buss drinne sein ( if abfrage hier bei IsPlayerInvehicle( buscar[i]))
so breche die schleife ab und setzte dan das jeweilige label auf den jeweiligen text.
//edit
zu dem mit == kannst du keinen wert übergeben sondern nur vergleichen in einer if abfrage daher entferne dort ein gleichzeichen
LinenbusLabel[buscar[i]] == Create3DTextLabel("Leerfahrt",WEISS,0,0,0,25,0,1);
LinenbusLabel[buscar[i]] = Create3DTextLabel("Leerfahrt",WEISS,0,0,0,25,0,1);
stock ShowStats(playerid)
{
new string[128], frakname[20], rangname[25];
switch(GetPVarInt(playerid, "Fraktion")){
case 0:frakname = "Zivilist";
case 1:frakname = "LS Police";
}
if(GetPVarInt(playerid, "Fraktion") == 0){
if(GetPVarInt(playerid, "Rang") == 1) rangname = " - ";
}else if(GetPVarInt(playerid, "Fraktion") == 1){
switch(GetPVarInt(playerid, "Rang") ){
case 1:rangname = "LS Anwärter";
case 2:rangname = "LS Hauptwachtmeister";
case 3:rangname = "LS Polizeimeister";
}
}
format(string, 128, "Name: %s\n\nLevel: %i\nRespektpunkte: %i/15\nFraktion: %s Rang: %s\n", SpielerName(playerid), GetPlayerScore(playerid), GetPVarInt(playerid, "Respektpunkte"), frakname, rangname);
ShowPlayerDialog(playerid, DIALOG_STATISTIK, DIALOG_STYLE_MSGBOX, "Deine Statistiken", string, "Ok", "");
return 1;
}
Also für ein paar Zeichen ein string von der größe 258 ist nur dummheit genau so wie die deklaration von 1024.
Nun gut von dem rest will ich jetzt garnicht anfangen.
Die größe eines strings kannst du dir mit strlen(string[]) ausgeben lassen