Diese Funktionen sind bereits vorhanden.
Nichts desto trotz.
einmal korrekt durchlesen
Ach herje... ich steige bei solchem nicht gut durch, zu wirr warr das ganze, bevorzuge kleine Funktionen, die nacheinander aufgerufen werden. Sorry.
Diese Funktionen sind bereits vorhanden.
Nichts desto trotz.
einmal korrekt durchlesen
Ach herje... ich steige bei solchem nicht gut durch, zu wirr warr das ganze, bevorzuge kleine Funktionen, die nacheinander aufgerufen werden. Sorry.
Wählst du auch eine Klasse aus bzw. hast du default Spawn Koordinaten?
Wenn nicht, dann mag es daran liegen, das du die default Spawn Daten nutzt, welche X=0.0, Y=0.0, Z=0.0 sind und du hier unter der Map bist.
Daher kannst du z.B. die Spawndaten für einen Nutzer direkt beim Connecten einmal zuweisen und dann eben die AddClass bzw. RequestClass Daten verwenden.
Alles anzeigenC:\Users\uSER\Desktop\SAR Script.pwn(245) : error 031: unknown directive
C:\Users\uSER\Desktop\SAR Script.pwn(247) : error 021: symbol already defined: "SetGameModeText"
C:\Users\uSER\Desktop\SAR Script.pwn(251) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(252) : error 021: symbol already defined: "DisableInteriorEnterExits"
C:\Users\uSER\Desktop\SAR Script.pwn(261) : error 021: symbol already defined: "CreatePickup"
C:\Users\uSER\Desktop\SAR Script.pwn(314) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(315) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(315) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(316) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(316) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(317) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(317) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(318) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(318) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(319) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(319) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(320) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(320) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(321) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(321) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(322) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(322) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(323) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(323) : error 010: invalid function or declaration
C:\Users\uSER\Desktop\SAR Script.pwn(324) : error 021: symbol already defined: "CreateDynamicPickup"
C:\Users\uSER\Desktop\SAR Script.pwn(324) : error 010: invalid function or declaration
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
26 Errors.
ich komm da nicht weiter?
Ich habe gelernt: 26 Errors sind ein starkes Anzeichen für fehlende Klammer, fehlendes Semikolon what ever.
Schau dir das zuletzt bearbeitete von dir an und du solltest den Fehler finden können.
Falls das nicht der Fall ist: ermittel mittels Text Editoren (oder was auch immer dir recht ist) die Anzahl von geöffneten sowie geschlossenen Klammern. { }
hey
Gibt es ein Maximum für die Spawndisatanz von CreateDynamicCP ?
Gibt es eine Möglichkeit mehr als 1000 Objekte auf ein Punkt zu erstellen ?
Zur Zweiten Frage kann ich soviel sagen: jain.
Möchtest du mehr als 1000 Objekte gleichzeitig sehen, so ist dies nicht möglich, da der Client nicht mehr als 1000 Objekte gleichzeitig gestreamt bekommen kann.
Allerdings ist es möglich, mit einem Punkt, unzwar mit Areas oder Teams, allerdings ist damit wahrscheinlich nicht deine Frage wirklich beantwortet.
Andernfalls lautet die Antwort: nein.
Moin
Ich habe mit SQL Query Strings gerade ein Problem.
Verwendete MySQL BlueG Version: R39-3
Ich möchte eine Abfrage abfeuern, wo ich den Zeitpunkt formatiere bzw. in der Query vorgebe.
Doch ich habe bei folgendem Code in Problem beim Printen des Strings - ich erhalte gar nichts.
Allerdings sind die Werte gegeben (IP und Name)
new ip[16];
GetPlayerIp(playerid,ip,16);
print(ip);
new n[MAX_PLAYER_NAME];
GetPlayerName(playerid,n,MAX_PLAYER_NAME);
print(n);
print("blaaa");
print("blaaa");
mysql_log(LOG_ALL);
format(largeQueryString,sizeof(largeQueryString),"SELECT *,FROM_UNIXTIME(`experation`,'%%Y %%D %%M %%h:%%i:%%s') AS 'tStr' FROM `tbl_bans` WHERE (ip LIKE '%s' OR playername LIKE '%s') AND activ = 1 AND experation > UNIX_TIMESTAMP() ORDER BY experation DESC",ip,n);
Problem found: liegt an einem Plugin:
YSF kurtas version (R16)
Hm, dann zeig doch einmal deine Variablen bzw. Funktionen, wo du den Spieler(playerid) in irgend einer Form nutzt.
Die Meldung kommt, da du ein Fehler hast im Code.
Sprich es ist unklug diese einfach nur weghaben zu wollen.
Wann tritt dies auf? Direkt schon beim Connecten, wenn deine playerid irgendwo als index verwendet wird?
Oder unter einer anderen Aktion, beispielsweise Password eingeben, beim Login.
Lass gemeinsam das problem angehen und lösen, anstelle von einfach nur mit einer Decke unsichtbar machen.
Moin,
OLD:
Ich verwende bei mir im Script das BlueG MySQL Plugig, R35
Dies ist in der Lage ORM sowie Cachings. Allerdings bin ich nun in bedrängnisses von Daten Laden, Speichern und Updaten.
Denn ich benötige manche Daten aus der DB nur einmalig, unzwar eben ob jemand permanent bzw. gebannt ist sowie die Dauer. Danach interessieren mich allerdings diese Infos nicht mehr.
Deswegen ist mein User Objekt auch nicht so bestückt.
Nun kommt die konkrete Frage: wie erhalte ich diese Infos, trotz der nutzung von ORM?
Ich habe ja keine Variable, wodrin ich den Wert abspeichere. Global einfach eine einzige Variable hinstellen sieht für mich nach einer dreckigen Lösung aus und könnte ja eventuell zu fehlern führen.
Erst recht, da ich beim ORM ja die Werte immer kicken müsste aus dem deffinierten ORM.
Gruß
Knolle
EDIT:
http://wiki.sa-mp.com/wiki/MySQL/R33#orm_apply_cache
Verstehe ich die Funktion korrekt?
Kann ich z.B. hier ein undefinierten Select ausführen und dann später einfach den Select darein schieben im sinne von:
SELECT * FROM ...
if(cache_get_int_field(0,"permanentBan") == 1) {
kick(playerid)
} else {
orm_apply_cache(R_GetPlayerORM(playerid));
orm_load(R_GetPlayerORM(playerid)...);
SendClientMessage(playerid,-1,"daten geladen");
}
Gruß
Knolle
Falls du überprüfen möchtest, ob eine "E-Mail Adresse" valide ist, sprich Format Konform ist, so kann ich dir ein Plugin ans Herz legen.
Habe das natürlich auch auf Herz und Nieren geprüft (1.000.000 Durchgänge) und dies ging auch flott von der Hand.
Es handelt sich hierbei um ein RegEx Plugin. Falls dir das etwas sagt, so kann ich dir das wärmstens empfehlen.
http://forum.sa-mp.com/showthr…?t=247893&highlight=regex
So kannst du z.B. mittels einer Include dir Regeln erstellen und easy im normalen Script verwenden.
"IsValidEmail"
"IsValidPassword"
"IsValidWhatever"
Nur so als Notiz am Rande.
Ich finde es persönlich ganz gut.
ich habe mal eine Frage bezüglich des MySQL's.
Frage lautet: Ist es möglich in der MySQL abfrage einzubauen das er prüft ob der Spieler bereits einen Dateneinsatz hat?
Nicht das alles doppelt drinne ist?
geht dies oder muss ich anderes vorgehn?
da bin ich grad etwas übefragt
Nein, du kannst es direkt mit einer einzigen SQL Abfragen erledigen.
Hier der grobe Vorgang (man kann mehrere Varianten verwenden, um ans Ziel zu gelangen. )
Als erstes erstellst du deine Abfrage.
Danach fragst du mittels den gegeben Funktionen ab, wieviele Zeilen du erhalten hast.
Und richtest danach deine Bedingung aus.
if(rows == 1) -> ein datensatz gegeben, keine doppelten
allerdings wenn z.B.
if(rows > 1) -> mehrere accounts vorhanden
Es wäre gut grob zu sagen, was du vor hast.
Wenn du z.B. damit ein "Account Daten Laden" machen möchtest und das MySQL Plugin Version R35+ verwendest, so kannst du z.B. eine effiziente Variante nutzen, die sogar im Wiki dokumentiert ist.
Sagen wir, dein Include sieht folgendermaßen aus
/*
* hier eine kleine beschreibung, falls andere hier auch daran arbeiten können sollen
* deswegen schreibe ich hier kurz im obersten bereich, was hier grundlegend gemacht wird
* author: jack Gerilla
* bla bla bla
*/
stock FunktionsName() {
/*
hier der Algorithmus, der den Rückgabewert bestimmt
*/
return 1;
}
Alles anzeigen
So sieht dann die Include dann mit einem native folgend aus:
/*
native FunktionsName();
*/
stock FunktionsName() {
/*
hier der Algorithmus, der den Rückgabewert bestimmt
*/
return 1;
}
Die Meldung erhälst du, da du das nicht als Kommentar verfasst hast.
Dies ist aber von nöten. Warum und weshabl, das steht im Forum sowie im Wiki.
Wir wollen uns aber nun darauf beschränken.
Wenn du nun die native so definiert hast, wie in meinem Beispiel, so musst du nur dein Script neu öffnen und der Editor sieht die "native" Zeile und kann sie dann vorschlagen.
Kleine Randanmerkung:
Jack, dir ist sicherlich aufgefallen, das du gewisse Funktionen schon mit einem Teiltext vorgeschlagen bekommst, z.B. "GetPla" -> GetPlayerPos.
Dies entstammt aus dem a_samp include, wo eine Zeile mit
native GetPlayerPos(playerid,Float:posX,Float:posY,Float:posZ);
beschrieben ist.
Und wenn du z.B. in einem include von dir selber eine Funktion hast, aber auch dir so schön vorschlagen lassen möchtest, so muss du dann eine Zeile im Include wie folgt beschreiben
/*
native FunktionsName(parameter);
*/
Hier gibt es aber eine Voraussetzung:
Die gewünschte Include Datei muss direkt im pawno/include ordner sein, andernfalls ist der Pawno Editor nicht in der Lage, diese Natives auch lesen zu können.
Beispiel:Wenn er eine Liste von X Clans hat, deren Namen er per Befehl anzeigen will (z.B. Auswahlliste um Details über den Clan zu sehen), dann würde es keinen Sinn machen, jedes mal wenn der Befehl ausgeführt wird die Datenbank anzusprechen, das geht mehr auf die Ressourcen, als die X Clans in ein Array zu speichern, und die Datenbank nur anzusprechen, wenn sich an den Namen etwas ändert.
Gut, so einen Fall hatte ich nicht bedacht. Ich hat nur den einfachsten Fall im Sinne: Werte im Chat wiedergeben.
So ein Fall, wie du ihn beschrieben hast, macht natürlich so mehr sinn.
Diese Sektion des Forums bzw. dieser Thread ist eher ein "Ich brauche Support", allerdings würde ich gerne hinterfragen, warum du direkt von der DB die Werte in eine Variable speichern möchtest.
Ich erkenne den Sinn hier nicht, da man vieles schon z.B. in der DB abarbeiten kann und dies perfomanter ist. Desweiteren sollte man möglichst wenig in das Script hineinladen, um extra/unnötige RAM Nutzung zu minimieren. Gibt da recht gute mittel und wege für.
enum E_JCP {
Float:JCPposX,
Float:JCPposY,
Float:JCPposZ,
...
};
new jailCheckPoints[][E_JCP] = {
{0.0,0.0,0.0},
{0.0,0.0,0.0},
{0.0,0.0,0.0},
{0.0,0.0,0.0},
....
};
new playerJailCheckPoint[MAX_PLAYERS] = {-1,...}; //Hier wird abgespeichert, welcher Benutzer welchen CP gerade hat, Standard für alle: -1
GetRandomJailCheckpoint(current = -1) { //Falls kein Wert angegeben, so verwendet diese Funktion automatisch den Wert -1 für die Variable current
new randomCP;
new size = sizeof(jailCheckPoints); //sizeof -> größe von der Variable, die übergegeben wird
if(current == -1) {
randomCP = random(size);
} else {
do {
randomCP = random(size);
}while(randomCP != current); //hier verhindern wir, dass der zufällig auserwählte CP nicht der gleiche ist, wie der übergebene (current)
}
return randomCP;
}
public OnPlayerEnterCheckPoint(playerid,checkpointid) {
if(playerJailCheckPoint[playerid] == checkpointid) { //Wir überprüfen, ob der CP auch der JailCheckPoint ist, den wir gerade zugewiesen bekommen haben
new pjcp;
playerJailCheckPoint[playerid] = pjcp = GetRandomJailCheckpoint(playerJailCheckPoint[playerid]); //Wir übergeben der Funktion den alten Wert voM Spieler, so das nicht den gleichen CP wieder erhalten
SetPlayerCheckpoint(playerid,jailCheckPoints[pjcp][JCPposX],jailCheckPoints[pjcp][JCPposY],jailCheckPoints[pjcp][JCPposZ],3.0);
}
}
//Und falls du etwas anders das handhaben möchtest, im Objekt Orientierten Stil (nicht so leicht zu verstehen mit wenig kenntnissen, daher ebenfalls eine Erklärung
public OnPlayerEnterCheckPoint(playerid,checkpointid) {
if(playerJailCheckPoint[playerid] == checkpointid) {
new rjCPID = GetRandomJailCheckpoint(playerJailCheckPoint[playerid]); //Hier speichern wir zur Lesbarkeit die die ID ab.
playerJailCheckPoint[playerid] = rjCPID; //
new pjcp[E_JCP]; //Wir beschreiben wir die Variable genauso, wie die Checkpoints beschrieben sind.
pjcp = jailCheckPoints[rjCPID]; //Und nun ist diese ID für uns nicht mehr von nöten
SetPlayerCheckpoint(playerid,pjcp[JCPposX],pjcp[JCPposY],pjcp[JCPposZ],3.0);
}
}
Alles anzeigen
Dir mag die zweite Variante erstmal auf Anhieb nicht gefallen, doch sobald du ein sehr großes Enum hast, so hast du es leichter auf jeden Wert zuzugreifen.
Aber das ist ein anderes Kapitel, welches ich hier nicht aufschlagen werde.
Hi ich habe ein Checkpoint Lauf System gemacht und wollte nun wissen wie ich die Cp´s wiederholen lassen soll
Wie mache ich das?
Als aller erstes wäre es ratsam, die CPs, sofern nicht schon getan, in ein Array zu stecken, wo alle Checkpoints bekannt sind.
Als nächstes denkst du dir ein Algorithmus aus, wie die Checkpoints ausgewählt werden sollen (random oder nach der reihenfolge).
Empfehlenswert: Brech soweit es geht alles herunter, sprich
"GetRandomJailCheckpointID(current)"
"GetNextJailCheckpoint(current)"
Bedenke: current ist in meinem Beispiel/in meiner Vorstellung der Index Eintrag vom Array, wo alle CP pos bekannt sind.
Ergo du musst die ID des CP mMn beim Spieler abspeichern, so das du einen einfacheren zugriff auf die ID bekommst.
Falls du konkreter wissen willst, wie es aussehen könnte, so lass es das Forum/mich wissen.
Moin.
Erneut ich.
Hat jemand ein URLEncode Algorithmus (stock function), die auch gut funktioniert? Ich will damit meine GET/POST Parameter sichern, damit meine API auch richtig greift.
Aber die von DracoBlue sowie die strlib Include funktionieren nicht im krassen ernstfall ("er%_&t6" -> null)
Moin.
Ich habe eine Frage an die erfahrenden Scripter.
Ist es möglich mittels HTTP Requests auch direkt den Server anzusprechen?
Sprich: ich habe eine public function in meinem Script und schicke ne Anfrage an meinen Server (callremotefunction o.ä.), um was am Server zu triggern.
Meinetwegen "OnAccountRegistered" wird getriggert, wenn der Benutzer in seiner Bestätigungs Mail den Link anklickt und mein PHP Server gibt diese Information direkt an mein SA-MP Server weiter.
So wie ich das eben in der letzten halben Stunde recherieren konnte, geht es zurzeit mit dem a_samp Modul nur so, dass das Script eine Anfrage an den Server schickt und dieser ein Callback ausführt.
Allerdings hilft mir dieser Ansatz keineswegs weiter.
EDIT:
Huch, da sucht man etwas anders und findet das hier:
http://forum.sa-mp.com/showthread.php?t=104299
Ergo: ist möglich.
Falls wer suchen sollte, so tage ich kurz paar Stichworte (SEO)
gta sa-mp php
gta samp php
gta sa-mp html
gta samp html
samp php server
gta webserver api
Ich finde diese Funktion nicht gut wartbar.
Empfehlswert wären zwei dinge.
Hinterlege beim Benutzer nur die Informatione, DAS er leader ist.
Denn in deiner jetzigen art und weise ist es möglich, das ich leader der grove bin, aber beim LSPD Leader.
Ergo erhalte ich die LSPD Farben. Bin ich umgekehrt Leader der Grove und Member des LSPD, dann das gleiche Spielchen: Farbe der LSPD.
Desweiteren: Eine Liste, wo jede FraktionsID/TeamID hinterlegt ist sowie die dazugehörige Farbe wäre auch nicht schlecht.
Dann heißt es später nur noch durch iterieren (for Schleife).
Erhöht wesentlich die Lesbarkeit.
Alternative: Ein Switch Case auf die Fraktions/TeamID und dazu dann die Farbe vergeben.
EDIT: Da war wohl jemand schneller, als ich. Sollte wohl mal schneller den Post verfassen und nicht 20min warten.
Alles anzeigenAh perfek, danke dir..
Jetzt nur nächsten Fragen..
Hat jemand eine Idee wie ich anfangen sollte?
-> Ich möchte , nachdem der Spieler gebannt wurde, ein Timer starte der bis 2 Monate zählt.
Wie kann ich das machen, dass er die Timerzeit speichert , wenn der Server offline ist, und dann wenn der Server wieder online ist dass der Timer weiterzählt aber der bestimmten Zeit.
Du kannst ja z.B. einen Timer auf dem Server starten, wenn der Server Online ist.
new upTime=0;
public OnGameModeInit(){
[...]
OnlineTimer();
[...]
}
forward OnlineTimer();
public OnlineTimer(){
mysql_query("UPDATE 'benutzer' SET 'banZeit' = 'banZeit'-1 WHERE permanent=false");
//Hier wird mitgeh
upTime++;
//Hier rufen wir rekursiv den OnlineTimer wieder auf.
//Deshalb ist diese Funktion auch eine Publlic Funktion - Timer können nur Publics aufrufen
SetTimer("OnlineTimer",1000,false);
}
Alles anzeigen
Dieser rechnet dann bei allen gebannten User durchgängig eine Sekunde ab oder eine Stunde, was auch immer du als Maß nimmst.
Das Maß bestimmst du z.B. durch den Timer selbst (alle 60sek ausführen lassen -> Minuten in der DB abgespeichert, kannst du selbst einstellen)
Falls du nicht eine Datenbank verwendest, sondern das auf Dateiebene hast, dann musst du alle Dateien durchgehen und prinzipiel das gleiche tun - Wert erfassen, gewissen Wert abziehen und wieder abspeichern.