Billigrad, Schach oder Dart wie willst du das mit der etwas älteren Engine umsetzen?
Damit geht es ganz gut: http://forum.sa-mp.com/showthread.php?t=446286
Sieht dann z.B. so aus: https://www.youtube.com/watch?v=yOtlNQvgJ6Q
Billigrad, Schach oder Dart wie willst du das mit der etwas älteren Engine umsetzen?
Damit geht es ganz gut: http://forum.sa-mp.com/showthread.php?t=446286
Sieht dann z.B. so aus: https://www.youtube.com/watch?v=yOtlNQvgJ6Q
Und wie verbinde ich jetzt die Datenbank mit dem script(login etc..)?
Wofür? ![]()
Wenn du dein ganzes Skript umschreiben willst, dann schau dir Tutorials zu MySQL an...ansonsten wenn es nur um die Abfrage geht, kannst du das so lassen ![]()
kann ich das auch mit strcmd machen?
Was? ![]()
dass wir ein Script haben welches nur einige Feinschliffe benötigt
Nur zur Klarstellung, denn ich denke das wird die meisten interessieren.
Handelt es sich bei diesem Skript um ein Selfmade von euch oder um ein GF-Edit? ![]()
Schreib den Befehl doch einfach so, dann musst du nichts einrücken (daher kommt der Warning):
ocmd:gmx(playerid)
{
if (!(PlayerInfo[playerid][pAdmin] == 7 || PlayerInfo[playerid][pAdmin] == 8)) return SendClientMessage(playerid,-1,"Sie besitzen nicht die notwendigen Rechte dafür!");
SaveStuff(),Fight_Close(),SaveWars();
TextDrawShowForAll(GMXCOME);
TextDrawShowForAll(GMXCOME1);
return SetTimer("GMXCOME5",10000,0),1;
}
Zeig uns doch mal deinen Code aus dem Filterscript, dann können wir dir besser helfen ![]()
Verwende diesen Streamer: http://forum.sa-mp.com/showthread.php?t=102865
Benutze in deinem Skript immer CreateDynamicObject, nie CreateObject!
Damit sparst du Slots und dann wird dir mehr angezegit.
Schau dir einfach die Parameter von CreateDynamicObject an und wenn dir Objekte erst zu spät angezeigt werden, dann erhöhe die DrawDistance (default ist 300.0).
mfg. ![]()
Du kannst auch einfach eine kleine .sql Datei anlegen wo das gut geht.
Hier mal ein Beispiel:
//Oben im Skript:
new DB:handle;
//Dann unter OnGameModeInit
handle = db_open("Admins.db");
db_query(handle,"CREATE TABLE IF NOT EXISTS `Admins` (`Name`,`Rang`)");
//Dann beim makeadmin:
new string[128];
GetPlayerName(pID,string,MAX_PLAYER_NAME); //pID = Der Typ der Admin werden soll
format(string,128,"INSERT INTO `Admins` (`Name`,`Rang`) VALUES ('%s','%d')",string,rang); //Hier rang von dem der Admin werden soll
db_query(handle, string);
//Wenn er schon ein Adminlevel hat und du das z.B. erhöhst musst du es updaten:
new string[128];
GetPlayerName(pID,string,MAX_PLAYER_NAME); //pID = Der Typ der ein höheres Adminlevel bekommt
format(string,128,"UPDATE `Admins` SET `Rang`='%d' WHERE `Name`='%s'",rang,string); //Hier rang von dem der Admin werden soll
db_query(handle, string);
//Wenn Adminlevel = 0 bzw wenn man den Adminposten verliert:
new string[128];
GetPlayerName(pID,string,MAX_PLAYER_NAME); //pID der Typ der Adminrang 0 bekommt
format(string,128,"DELETE FROM `Admins` WHERE `Name`='%s'",string);
db_query(handle, string);
//Und hier dann auflisten alle admins:
ocmd:admins(playerid)
{
new DBResult:result,string[512] = "{FFFFFF}",l;
result = db_query(handle,"SELECT * FROM `Admins`"),l=db_num_rows(result);
if(!l) return SendClientMessage(playerid,-1,"* Es wurden noch keine Admins eingetragen!"),db_free(result);
for(new i,rang[11],name[MAX_PLAYER_NAME]; i<l; i++) {
db_get_field(result,0,name,MAX_PLAYER_NAME);
db_get_field(result,1,rang,MAX_PLAYER_NAME);
format(string,512,"%sName: %s (Rang: %d) - %s{FFFFFF}",string,name,strval(rang),CheckOnline(name));
db_next_row(result);
}
db_free(result);
ShowPlayerDialog(playerid,999,DIALOG_STYLE_MSGBOX,"Admin Liste",string,"Bestätigen","");
return 1;
}
stock CheckOnline(const n[])
{
new name[MAX_PLAYER_NAME];
static const online[] = "{00FF00}Online",offline[] = "{FF0000}Offline";
for(new i=GetPlayerPoolSize(); i!=-1; i--) if(GetPlayerName(i,name,MAX_PLAYER_NAME) && !strcmp(name,n)) return Online;
return offline;
}
mfg. ![]()
//Edit: Update Query
Für rotationen brauchst du einen ganz geringen speed.
Nimm mal: 0.0001
if(!strcmp(l_name,l_PlayerName, true))
Da sollte der True Parameter raus...weil es gibt viele Spaßvögel die sich ähnlich nennen, wie z.B. ShoXi oder shoXi ...
Nicht dass man da den falschen auswählt ![]()
Da das Skript in einem Thread läuft...glaubst du wirklich 30 Funktionsaufrufe dauern da so lange wie einer?!
...das erschließt sich mir nicht so wirklich ![]()
So springt das Script von Funktion zu Funktion und gut ist.
Was von Funktion zu Funktion.
...dauert:
[15:51:03] 1x - 3ms
[15:51:03] 20x - 30ms
dann haste schon wieder viel mehr Platz.
Der Platz in der .pwn ist nebensache.
Es ist schneller Code direkt auszuführen als über schleifen...in diesem Fall sollte er es so lassen, da das schneller ist ![]()
mfg. ![]()
Du solltest Fehler bzw Warnings einbauen, wo es mehrere Möglichkeiten gibt diese zu lösen und dann schauen, wie effizient man diese dann auch gelöst hast ![]()
Ich meine...wenn man z.B. sowas hat:
for(new i; i<GetMaxPlayers(); O++)
{
SendClientMessage(i,-1,"Opfer");
}
Dann wird da ein Fehler kommen und zwar ist ja O nicht deklariert.
Wenn man es jetzt so macht:
new i;
SendClientMessage(i,-1,"Opfer");
Dann ist ja kein Fehler mehr da...aber das ist nicht das...was wirklich gefordert war und auch wenn man es so löst:
for(new i; i<GetMaxPlayers(); i++)
{
SendClientMessage(i,-1,"Opfer");
}
Ist es nicht sehr effizient.
Es gibt jetzt hier mehrere Möglichkeiten das gut zu lösen, wenn man unbedingt diese Funktion nutzen will und es am effizientesten machen will und mal die Reihenfolge außer acht lässt, da sie hier trivial ist:
for(new i=GetMaxPlayers(); i!=-1; i--)
{
SendClientMessage(i,-1,"Opfer");
}
Das wäre hier definitiv die beste Lösung.
Alternativen wären auch noch folgende, die aber langsamer sind, da man immer auf eine Variable zugreifen muss:
for(new i,l=GetMaxPlayers()+1; i<l; i++)
Wichtig ist hier das +1...wenn man das z.B. vergessen hätte...würde man den letzten index nicht beachten und hätte somit ja einen Fehler.
Da kann man einige anspruchsvolle Aufgaben stellen, die nicht so pille palle sind wie mal eben kurz paar Errors fixxen ![]()
mfg. ![]()
Was steht bei dir unter OnPlayerRequestClass ? ![]()
Das kommt auf das Objekt an, aber eigentlich sollte es gehen, mit dem letzten parameter einfach auf center setzen: https://wiki.sa-mp.com/wiki/SetObjectMaterialText
Hmm dein System wird so gar nicht funktionieren...diese Zeile ist sehr falsch:
new pID = listitem;
Das stimmt nicht.
//Edit: Sorry keine Zeit mehr dafür...
Aber schau dir evtl paar Beispiele an: Ticket System
http://forum.sa-mp.com/showthread.php?t=158674
Wie kann ich das mit dem /sup (Nach dem der Report geöffnet wurde) dass Supporter und Spieler zusammen kommunizieren können am besten scripten?
Einfach unter OnPlayerText schauen ob der Spieler ein Ticket hat...und ob der Admin online ist...dann dem senden und umgekehrt ![]()
und ist auch nicht gedacht um damit herum zu Fahren
Achsoo ![]()
Dann kannst du das so lösen ![]()
Auch das kann man gut verwalten in dem man sich ein Controller schreibt und die hocking methode mit state nutzt
Das ist egal.
Ich rede von der Ausführungszeit wenn es große Funktionen sind.
Dann wirst du es nie schaffen, ohne Zeitversetzung die Funktionen (bzw Callbacks) aufzurufen...und das Problem ist einfach je mehr du das machst desto später werden sie logischerweise aufgerufen...
Bei 30x...und jeder Callback muss 20ms verarbeitet werden hast du schon beim letzten mehr als 600ms delay... ![]()
wie kann ich das Object dann Bewegen ?
oder wieder Unattachten ? aber halt an dieser Stelle lassen ?
Nun...gar nicht attachen.
Erstelle das Objekte und dann musst du in dein MoveObject die Position vom Auto + Geschwindigkeit halt berücksichtigen...damit sich das immer updatet ![]()
Also...das ist alles andere als einfach, das gut hinzubekommen ![]()
Aber versuchs mal so (ungtestet aus dem Kopf geschrieben):
new obj;
ocmd:test(playerid)
{
new Float:x,Float:y,Float:z,v=GetPlayerVehicleID(playerid);
GetVehiclePos(v,x,y,z);
obj = CreateObject(1430,x,y,z+0.75,0,0,0);
MoveObject(obj,x,x-0.225,y-0.5,z+0.75,10.0,-121.499946);
}
und dann theoretisch unter OnObjectMoved...prüfen ob sich das auto bewegt und dann permanent die Achsen anpassen ![]()
Aber...das ist ziemlich bescheuert..und kompliziert..denk dir lieber was anderes aus ![]()