Wie macht er denn das Feuerwerk?
Sind das Objekte die erscheinen?
Wie macht er denn das Feuerwerk?
Sind das Objekte die erscheinen?
new bool:VehSpawned[MAX_VEHICLES];
ocmd:veh(playerid,params[]){
new carid,colid1,colid2;
if(sscanf(params,"iii",carid,colid1,colid2)) return SendClientMessage(playerid,COLOR_GREY,"Benutzung: /veh [carid][color1][color2]");
if(PlayerInfo[playerid][pAdminLevel] >= 3){
new Float:pos[4];
GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
GetPlayerFacingAngle(playerid,pos[3]);
new car = CreateVehicle(carid,pos[0],pos[1],pos[2],pos[3],colid1,colid2,13337);
VehSpawned[car]=true;
PutPlayerInVehicle(playerid,car,0);
}else{
SendClientMessage(playerid,COLOR_GREY, "Dies ist ein Adminbefehl, du bist kein Admin.");
}
return 1;
}
ocmd:dest(playerid,params[])
{
for(new i=0;i<MAX_VEHICLES;i++)
{
if(VehSpawned[i]==false) continue;
DestroyVehicle(i);
}
}
In 'SetPVarInt' steckt das Wort Int drin, was die Abkürzung für 'Integer' ist.
Ein Integer ist ein Variablentyp, der ganze Zahlen abspeichern kann.
Koordinaten sind aber keine ganzen Zahlen sondern Kommazahlen, sogenannte Floats.
Also bist du mit GetPVarInt falsch, ich glaube du musst GetPVarFloat benutzen.
ZitatSetPVarInt(i,"X", x);
SetPVarInt(i,"Y", y);
SetPVarInt(i,"Z", z);
Int = Integer
Du brauchst aber Floatvariablen
Ist mir zu kompliziert...
if(!strcmp("/admins",cmdtext,true))
{
new bool:found;
for(new i = 0; MAX_PLAYERS > i;i++)
{
if(!IsPlayerConnected(i)) continue;
if(PlayerInfo[i][pAdminLevel]<1) continue;
if(found==false)
{
found=true;
SendClientMessage(playerid,COLOR_WHITE,"Administratoren online:");
}
format(text,sizeof(text),"%s %s [%d]",AdminRang[PlayerInfo[i][pAdminLevel]],PlayerName(i),i);
SendClientMessage(playerid,COLOR_ADMINS,text);
}
if(found==true) return SendClientMessage(playerid,COLOR_WHITE,"===========================");
SendClientMessage(playerid,COLOR_RED,"Keine Admins online!");
return 1;
}
Alles anzeigen
Spoiler anzeigen if(IsPlayerInAnyVehicle(playerid))
{
if(newkeys & KEY_ANALOG_DOWN)
{
new vhd,engine,lights,alarm,doors,bonnet,boot,objective;
vhd = GetPlayerVehicleID(playerid);
GetVehicleParamsEx(vhd,engine,lights,alarm,doors,bonnet,boot,objective);
if(engine == 0 || engine== -1)
{
SetVehicleParamsEx(vhd,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
GameTextForPlayer(playerid,"~w~Motor: ~g~An",1000,4);
}
else if(engine == 1)
{
SetVehicleParamsEx(vhd,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
GameTextForPlayer(playerid,"~w~Motor: ~r~Aus",1000,4);
}
return 1;
}
}
Dein Fehler:
Du musst engine auf 1 bzw 0 setzen, wenn du den Motor an bzw. aus gemacht hast.
Wie würde das den gehen, bitte erkläre das mal.
Er will Accounts von Offline spielern löschen...
D.h.:
Das Script müsste alle dateien der spieler nacheinander öffnen (da ist das Problem, in samp kannst du nicht herausfinden welche dateien es alle in einem Ordner gibt) und nach dem rang suchen wenn dieser 0 ist file schliessen und löschen.
Ist eigentlich ganz einfach:
Wenn eine Datei erstellt wird, schreibst du diesen Dateinamen in eine neue Datei, z.B. 'Accounts.lst'.
Dann kannst du diese auslesen und die Ränge überprüfen!
public IstSpielerAnATM(playerid)
{
if(!IsPlayerConnected(playerid)) return 0;
if(IsPlayerInRangeOfPoint(playerid,3.0,1807.3879,-1883.2388,13.5813)) return 1;
if(IsPlayerInRangeOfPoint(playerid,3.0,1465.4390,-1749.0569,15.4453)) return 1;
if(IsPlayerInRangeOfPoint(playerid,3.0,1366.1569,-1292.1830,13.5469)) return 1;
if(IsPlayerInRangeOfPoint(playerid,3.0,2126.2576,-1154.0265,23.9997)) return 1;
if(IsPlayerInRangeOfPoint(playerid,3.0,-2029.4968,156.4366,28.9498)) return 1;
return 0;
}
So?
if(dini_Int(pfad,"bought") == 1)
Versuchs mal mit folgendem:
FirmInfo[Firma][fbought]=dini_Int(pfad,"bought")
if(FirmenInfo[Firma][fbought]==1)
{
}
else
{
}
//edit:
Warum dein Compailer einen Warning ausspuckt findest du hier
//edit2:
Mist, findest du nicht. Du musst die 3DTextLabel Variable mit "new Text3D:name" deklarieren.
Glaube dass das so war
Ganz am ende sollte ein 'return 0;' stehen anstatt dem 'return 1;'
Versuchs so:
new string[100],count,AdminName[20][MAX_PLAYER_NAME],AdminLevel[20];
format(string,sizeof(string),"SELECT Name,Admin FROM accounts WHERE Admin > 0");
mysql_query();
mysql_store_result();
count=mysql_num_rows();
for(new i=0;i<count;i++)
{
new lvl[10];
mysql_fetch_row(string);
strmid(AdminName[i],string,0,strfind(string,"|",false));
strmid(lvl,string,strfind(string,"|",false)+1,strlen(string));
AdminLevel[i]=strval(lvl);
}
mysql_free_result();
Das senkt zwar die Prozessorenarbeit doch deutlich,
aber im Endeffekt bleibt das Hauptroblem:
Forschleife in Forschleife. 2000 * MAX_PLAYERS, und dann noch die Abfragen dazwischen.
Das ist das, was viel Rechenarbeit erfordert.
Natürlich geht das rasend schnell.
Prozessoren rechnen mit immer mehr Kernen und Hertz, aber man sollte trotzdem
seine Zeilen so programmieren, dass sie möglichst wenig Prozessorenarbeit verursachen.
Was ist ein Script für ein Script, wenn es 50% langsamer ist?
Danke so funktioniert es einwandfrei.
funktionieren tut es... aber überleg mal:
a) Die schleife geht durch alle Autos (2000x)
b) Jeder Schleifenabruf geht jeden Spieler durch (=2000 * MAX_PLAYERS (100-500)) = 200000 (bei 100))
c) Bei jedem Durchgang wird überprüft ob der Spieler verbunden ist, ob sein Auto mit dem des aktuellen Autos übereinstimmt, und ob er der Fahrer ist oder nicht.
d) Das macht dann 200000*3 Abfragen = 600000
Das überlastet ganz gewiss den Server nicht,
aber man sollte sich Gedanken machen wie das zu lösen ist ohne den großen Rechenaufwand.
Wozu sie dinnlosen Deklairungen?
Um Ressourcen zu sparen! Das ist zwar im Endeffekt mehr Schreibarbeit, mehr Zeilen,
der Prozessor kann das aber deutlich schneller ausrechnen.
Wahrscheinlich habe ich irgendwo einen Denkfehler drin, müsste man halt testen.
new car[MAX_PLAYERS],count;
for(new i=0;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(i)) continue;
if(GetPlayerState(i)!=PLAYER_STATE_DRIVER) continue;
car[count]=GetPlayerVehicleID(i);
count;
}
for(new i=0;i<MAX_VEHICLES;i++)
{
new bool:found;
for(new j=0;j<count;j++)
{
if(i==car[j])
{
found=true;
continue;
}
}
if(found==true) continue;
SetVehicleToRespawn(i);
}
So würd ichs machen.
Ja, danke, und wie mach ich das mit LoadFirma, bzw dass JEDE Firma eine eigene Nummer bekommt?
Versuch das noch ein bisschen näher zu beschreiben, so kann ich dir nicht weiterhelfen.
mysql_SetFloat("Firmen", "Skin", "Name", FirmInfo[i][fX]);
new string[100];
format(string,sizeof(string),"SELECT ... FROM ... WHERE ... = ...");
mysql_query();
mysql_store_result();
etc..