Das sind Grundlagen
http://wiki.sa-mp.com/wiki/Scripting_Basics#Arrays
if( text[0] == '!') { // Wenn das erste Zeichen ein '!' ist
printf("Text: %s",text[1]); // Wir geben den Text erst aber der 2 Stelle aus.
}
Das sind Grundlagen
http://wiki.sa-mp.com/wiki/Scripting_Basics#Arrays
if( text[0] == '!') { // Wenn das erste Zeichen ein '!' ist
printf("Text: %s",text[1]); // Wir geben den Text erst aber der 2 Stelle aus.
}
Mach es nicht,wie ganzereuro geschrieben hat.
ZitatAber Pawno gibt folgende Fehler aus:
"warning 213: tag mismatch" (gilt für beide letzten Zeilen)..
Nicht wirklich gut beschrieben welche Zeilen gemeint sind.
Du solltest wissen,dass die 3DTexte in PAWN ein brauchen,damit du keine Warnungen erhälst.
new
BotName[MAX_PLAYER_NAME],
Text3D:BotTextLabel[MAX_PLAYERS]; // Text3D: !
BotName = sendername; // ?
GetPlayerName(playerid,BotName,sizeof(BotName)); // vllt brauchst es ja
BotTextLabel[playerid] = Create3DTextLabel(BotName,COLOR_WHITE,0.0,0.0,0.0,70.5,1);
Attach3DTextLabelToPlayer(BotTextLabel[playerid],playerid,0.0,0.0,0.45);
Ist aber eigentlich sinnlos es so "Text3D:BotTextLabel[MAX_PLAYERS]" zu erstellen,wenn du es nicht in einer Schleife benötigst.Es würde sicherlich ausreichen nur "Text3D:BotTextLabel" zu benutzten,aber das musst du wissen.Ich hab ja nicht dein Script vor mir liegen ;).
Das hättest du sogar Googlen können,und du hättest den Fehler erklärt bekommen.
Zitatich habe mich schon Umgesehen etc auch in den tuts hier gegugt aber vll finded jmd ja mein Fehler
Du benutzt aber das Plugin,falls du das Tutorial von mir zur PAWN Code Version von sscanf gelesen hast,ist das klar das du den Fehler nicht findest.Die Plugin - Version unterscheided sich stark von der PAWN - Code Version.
ZitatThe above code should be:
new
str[32],
val;
sscanf("hello\\ there 27", "s[32]i", str, val);
As you can see - the format specifier now contains the length of the target string, ensuring that you can never have your strings overflow and cause problems.
Heisst also, du musst bei Strings die größe mit angeben.In deinem Fall ist "Area_tele" 64 Zellen groß,daher
if(sscanf(params, "s[64]",Area_tele)) {
Das ist eine Neuheit in sscanf2.
Gibt seit kurzem auch ein sscanf 2 ( sscanf 2 = Plugin Version ) Tutorial hier im Forum.
http://forum.sa-mp.de/wbb/san-…torials/50342-sscanf-2-0/
Kannst es ja mal mit Boyletts autoindent versuchen,
http://boylett.com/scripts/autoindent.php
3DText:
Das Tag lautet aber
Text3D:,daher
auch
Text3D:Jonny
Die Warnung besagt nur,dass du zwar Jonny einen Wert zuweist,ihn aber selber nie gebrauchst. Das ist aber nicht gerade schwierig zu verstehen,war dort in Englisch steht.
Create3DTextLabel("Tippe /job", 0xCC9933FF,3.0,362.0108,178.4597,1008.3828,3,false)
http://wiki.sa-mp.com/wiki/Create3DTextLabel
ZitatAlles anzeigen(text[], color, Float:X, Float:Y, Float:Z, Float:DrawDistance, virtualworld, testLOS)
text[] The initial text string.
color The text Color
x X-Coordinate
y Y-Coordinate
z Z-Coordinate
DrawDistance The distance from where you are able to see the 3D Text Label
VirtualWorld The virtual world in which you are able to see the 3D Text
testLOS 0/1 Test the line-of-sight so this text can't be seen through objects
Returns The ID of the newly created 3D Text Label
Jetzt schau mal wie das bei dir ist:
text[] - "Tippe /job"
color - 0xCC9933FF
x - 3.0 ( !!!! )
y - 362.0108 ( Eigentlich X )
z - 178.4597 ( Eigentlich Y )
drawdistance - 1008.3828 ( Eigentlich Z )
virtualworld - 3
testLOS - false
Du hast bei dir Anscheinend die drawdistance an der falschen Stelle als Parameter übergeben.Ordne es wieder in die korrekte Reihenfolge die du im Wiki siehst bzw hier im Post und probier es erneut.
Alles anzeigenif(!strcmp(key,dini_Get(Spielerdatei,"Passwort"),true))
//Ist eine andere Schreibweise für:
if(strcmp(key,dini_Get(Spielerdatei,"Passwort"),true) == 1)
// strcmp gibt den Wert 1 (True) zurück wenn die funktion erfüllt wird, beide strings sich gleichen
//Da man wohl beim erstellen keine lust hatte == 1 dahinter zu schreiben hat man einfach ein ! davor gemacht
//das wie gesagt den selben Effekt hat
Wiki Link zu strcmp: Klick
Ne,es gibt 0 bzw false zurück wenn die Strings identisch sind.
Du solltest das aber dennoch weiter ausbauen.
Denn es ist doch etwas hart wenn man direkt gekickt wird,sobald man 1x ein "schlimmes Wort" benutzt hat.Selbst Admins werden bei dir gekickt,wenn sie ausversehen mal "Noob" schreiben :-O
2. Nein ist nicht das gleiche, das 2te bedeutet wenn sich nicht gleich sind
Quatsch.
if(strcmp(cmdtext, "/befehl", true)==0) // #1
if(!strcmp(cmdtext, "/befehl", true)) // #2
Ist definitiv das Gleiche.
In #1 wird genau so geprüft ob die Funktion 0 returnt wie auch in #2.In #2 ist allerdings das Negations-Zeichen ! vor der Funktion,weshalb es das Gleiche bewirkt wie ein == 0.
Die Funktion strcmp() ist etwas gewöhnungsbedürtig, denn es gibt 0 / false zurück wenn die Strings gleich sind, alles Andere wenn sie nicht gleich sind.
http://wiki.sa-mp.com/wiki/Strcmp
Für die überprüfung ob die ungleich sind,nimmt man:
if(strcmp(cmdtext, "/befehl", true)) // #3
Keine groben Fehler drin,hab aber ein paar Anmerkungen:
// \/ = Lass hier einfach leer.Dann erkennt der Compiler automatisch die größe des Arrays
// \/ 64 ist die maximale String-länge die du angibst.Würde es aber auch leer lassen,denn du benutzt nirgendwo annähernt 64zeichen.
// Der Compiler benutzt dann die Länge des längsten von dir eingesetzten Strings
// Würde dann wegen "Arschloch" 10 sein da "Arschloch" 9 + 1
new word[][]= {
{"Fick"},
{"Opfer"},
{"Nutte"},
{"Stinkt"},
{"Hure"},
{"Arschloch"},
{"Maul"},
{"Kiddy"},
{"Noob"}
};
new string[128], // 128 Zeichen reichen,denn der Output / Input der Chatbox in SA:MP erfasst nicht mehr Zeichen
plname[MAX_PLAYER_NAME]; // 64 ist auch bischen viel,benutzt lieber MAX_PLAYER_NAME ( ist ein define )
ZitatWäre cool wen das an die Pin kommt.
Wohl eher nicht
Nettes Angebot.Ich würde es mir zwar eh nicht kaufen,dennoch sagen Zeilen wenig über ein Script aus.Ebenso ist die Größe relativ unwichtig ( http://pastebin.com/YBBrqJyT ).
Ich kann zwar nichts zum Script selber sagen, aber du hast es wenigstens geschafft das Script gut zu verkaufen im Sinne der Präsentation.
Du kannst INGAME auch einfach /DBL eingeben,dass zeigt dir die vehicleid und noch viel mehr.
new
Text3D:label,
str[30];
for(new i = 0; i<MAX_VEHICLES; i++)
{
format(str, sizeof(str), "GGL - %d", i);
label = Create3DTextLabel(str, 0x0080C000, 0.0, 0.0, 0.0, 30.0, 0, 0);
if( _: label != INVALID_3DTEXT_ID) { // Zur Sicherheit prüfen ob 3DText erstellt wurde
Attach3DTextLabelToVehicle(label, i, 0.0, 0.0, 0.75);
}
}
Du müsstest aber auch wissen,ob es überhaupt ein Fahrzeug mit der vehicleid i gibt.
dcmd_veh(playerid, params[])
{
new v, c1, c2;
if(sscanf(params, "ddd", v, c1, c2))
{
return SendClientMessage(playerid, rot, "Benutzung: /veh FahrzeugID, Farbe, Farbe");
}
GetPlayerPos(playerid, x,y, z);
GetPlayerFacingAngle(playerid, r);
CreateVehicle(v, x, y, z, r, c1, c2, 1);
PutPlayerInVehicle(playerid, v, 1);
return 1;
}
Da ist ja auch der Fehler,dass du niemals in das richtige Fahrzeug gesetzt wirst. Denn du setzt den Spieler in das Fahrzeug mit der VehicleID "v",was bei dir aber vorher als Angabe für die ModelID diente.
dcmd_veh(playerid, params[])
{
new
vehicleid,
v,
c1,
c2;
if(sscanf(params, "ddd", v, c1, c2))
{
return SendClientMessage(playerid, rot, "Benutzung: /veh FahrzeugID, Farbe, Farbe");
}
if( ( v < 400 ) || ( v > 611) ) {
return SendClientMessage(playerid, rot, "Ungültige ModelID");
}
GetPlayerPos(playerid, x,y, z);
GetPlayerFacingAngle(playerid, r);
vehicleid = CreateVehicle(v, x, y, z, r, c1, c2, 1);
PutPlayerInVehicle(playerid, vehicleid, 1);
printf("vehicleid = %d , modelid = %d",vehicleid,v);
return 1;
}
//Edit:
Wow,WLAN ist heute wieder super :/.Füg trotzdem mal Debug-Notes in die Befehl bei dir ein:
dcmd_veh(playerid, params[])
{
printf("dcmd_veh(%d, %s)",playerid,params);
new
vehicleid,
v,
c1,
c2;
if(sscanf(params, "ddd", v, c1, c2))
{
return SendClientMessage(playerid, rot, "Benutzung: /veh FahrzeugID, Farbe, Farbe");
}
if( ( v < 400 ) || ( v > 611) ) {
return SendClientMessage(playerid, rot, "Ungültige ModelID");
}
GetPlayerPos(playerid, x,y, z);
GetPlayerFacingAngle(playerid, r);
vehicleid = CreateVehicle(v, x, y, z, r, c1, c2, 1);
PutPlayerInVehicle(playerid, vehicleid, 1);
printf("vehicleid = %d , modelid = %d",vehicleid,v);
return 1;
}
Denn wenn du sagst Ingame passiert nichts,würde die Funktion nicht aufgerufen werden :-O
Logicaltrue - Angenommen du lädst aus einer config einen Eintrag "b_PrintDebug" kannst du sowohl true als auch false angeben.
Zitatb_PrintDebug = false
Könntest natürlich auch 0 oder 1 anstatt false oder true benutzten. Bei L / l erkennt sscanf aber sowohl"true" als auch "false" als Angabe,ob es bei Logical auch 0 und 1 weiss ich nicht( Müsste man im Sourcecode nachschlagen ).
Außerdem heisst es nur Logical, nicht Logicaltrue.Bei Y_Less sind dort im Post überall keine Leerzeichen zwischen dem Titel und dem ersten Beispiel ;).
Binärcode - Nützlich beim auslesen von Bitflags.
//00000011101111
enum ( <<= 1)
{
e_Flag_Inventory_Health_S = 1,
e_Flag_Inventory_Health_M,
e_Flag_Inventory_Armor_S,
e_Flag_Inventory_Armor_M,
e_Flag_Inventory_Joint,
e_Flag_Inventory_Wine,
e_Flag_Inventory_Beer,
e_Flag_Inventory_Sprunk,
e_Flag_Inventory_Bomb,
e_Flag_Inventory_Detonator,
e_Flag_Inventory_Fight_Normal,
e_Flag_Inventory_Fight_KungFu,
e_Flag_Inventory_Fight_Boxing,
e_Flag_Inventory_Fight_Wrestle
}
Anhand des Binärcodes kann ich auslesen,welche Flags enthalten sind ( e_Flag_Inventory_Health_S , e_Flag_Inventory_Health_M , e_Flag_Inventory_Armor_S , e_Flag_Inventory_Armor_M , e_Flag_Inventory_Wine, e_Flag_Inventory_Beer, e_Flag_Inventory_Sprung ) .
Das ist aber ein riesen Kapitel,sehr sehr Nützlich.Nutzt aber leider kaum einer :/.
"g" heisst wie es dort auch steht IEEE Float / IEEE Gleitkommazahl.Ist Platzhalter "f" + ein paar besondere Zahlen wie NaN,Unendlich ( INFINITY ) .Die können dann als Text "NaN" oder "INFINITY" ausgelesen werden und richtig in einer Variable gespeichert werden.
In der Tabell ist "u" 2x angegeben.
Bei "z" solltest lieber schreiben dass dieser unnötiger ist,da alles über Großschreibung Optional wird und die später im Tutorial darauf ein gehst.
Finde du solltest nochmal etwas zu den Quiet Sections schreiben und zeigen wie man den p - Platzhalter benutzt.Denn Ich glaube du hast nirendwo erwähnt,dass man nun das Trennsymbol zwischen < und > setzt.
p<,>
Finde die Farbwahl für dein Beispiel auch etwas grell,musste wirklich genau hingucken :(.
Boah fast nur negatives geschrieben,sollte Ich wohl noch etwas abrunden.
Nee,gefällt mir dass hier wenigstens einer das sscanf Plugin benutzt.Wollte auch schon seit langem mal mein Tutorial mit sscanf v2 erweitern, hab aber nie Zeit gefunden es fertig zu schreiben.Eventuell solltest du auch überlegen nicht noch leichtere Beispiele anzugeben,denn Ich glaube kaum,dass jeder auf den ersten Blick versteht was du genau machst.
An sonsten,gutes Tutorial
Kannst ja auch bischen selber mitdenken.
Zitat0,0025V = 2,5 * 10 ^ -3 aber hier hast du doch keine Vorsatzsilbe benutz ?
10 ^ -3 hab Ich oben geschrieben bedeutet milli ( m ). Also 2,5mV
Zitat127mA = 0,127A Woher sind die Zahlen ?
Die stehen da vllt?
127 * ( 10 ^ - 3 ) A , da ja ( 10 ^ - 3 ) milli ist.
e) 2^-3 = 1 / 2 ^ 3 = 1/8 oder [2] -> [EXP] -> [-] -> [3]
h) 3,5 ^ -5 , 10^5 * 3 , 10 ^ 5 * 105
j) kp was damit gemeint ist. k steht immer für kilo , also 1000. Heisst also 11 * 1000 ( K ) * A , 11000. Milli ist * 0.001 ( * 10 ^ -3 )
k) Umgekehrter quatsch. 1200V -> 1,2kV ; 0,0025V = 2,5 * 10 ^ -3 ; 127mA = 0,127A
c) Ist einfach so x)
new geld[MAX_PLAYERS];
Diese variable hat 501Slots, die for schleife zählt auch bis zu den 501 slots,und gibt jedem slot den Wert 100 (also 100$).
Da das setzen der Variable länger braucht als das abfragen ob der Spieler Online ist sollte man also lieber abfragen und die schleife den slot einfach überspringen lassen, bei wenig Variablen bringt das zwar kaum was aber später wenn man erstmal ziemlich viel zeugs hat bringt es eben doch was.
LG
Erzähl mal,wie kommst du auf 501 ?
Die meisten Funktionen in SA:MP haben bereits intern einen IsPlayerConnected check.Anfängs in 0.1b gab es nämlich deshalb viele crashes soweit Ich weiss,wenn man Funktionen an SpielerIDs anwendete,die nicht benutzt sind.
public PayDay() {
for(new i ; i < MAX_PLAYERS ; i++) {
GivePlayerMoney(i,1000);
}
return 1;
}
Ist daher auch problemlos möglich,erspart den IsPlayerConnected check,da sich dieser nochmal in GivePlayerMoney befindet.
Würde aber der übersich halber dort immer den IsPlayerConnected check lassen.
public PayDay() {
for(new i ; i < MAX_PLAYERS ; i++) {
if( IsPlayerConnected(i) ) {
GivePlayerMoney(i,1000);
}
}
return 1;
}
Deshalb kann man auch super so abfragen ob ein Spieler connected ist:
if( GetPlayerName(i,sName,sizeof(sName) ) { }
Kleiner Exkurs
Du stellst dir das etwas falsch vor.
Man erstellt für den Streamer das Objekt einmalig mit diversen Information, wie zB X,Y,Z oder der DrawDistance / Distanz.Der Streamer ( Egal welcher ) weiss dann für sich intern, dass man ein Objekt erstellt haben möchte.
Wann das Objekt letztendlich für den Spieler erstellt wird, berechnet der Streamer anhand der Distanz die man für ein bestimmte Objekt angegeben hat.Will man,dass ein Objekt von 1000 Units entfernt gestreamt wird, dann wird es für den Spieler nur erstellt sobald man sich innerhalb dieser 1000 Units Abstand befindet.
Und für das zerstören umgekehrt,ist das Objekt für den Spieler erstellt,er befindet sich aber nicht mehr in den 1000 Units Umkreis,so wird es zerstört.
Mit diesem Include erhälst du letztendlich die DrawDistance / Distanz , ab wann das Objekt in GTA selber erst angezeigt wird.Denn GTA erstellt dir selbstverständlich keine Objekte die sich in LV befinden ( Eigentlich doch,aber dass sind LOD Objekte die eine sehr niedrige Auflösung haben und kaum Resourcen fressen ) ,wenn du aber in LS bist.Das würde sonst die Resourcen höher treiben :p.
kenn mich nicht so gut aus, aber wenn da jetzt jedes mal
wen ein objekt erstellt wird eine schleife 13000 mal läuft
das geht doch auf die ressourcen oder
Da hast du auch recht.Nur hatte Ich bisher keine Zeit eine Include auszusuche für BinTrees womit das viel schneller funktionieren würde.
Seh da aber auch kein wirklich großes Problem drin,da du bzw die meisten ihre Objekte direkt beim Start ( OnGameModeInit() ) erstellen und dies dann ja einmalig ist.Bei mir dauert der StartUp mit etwas mehr als 4000Objekte 1.1 Sekunden,da es ja nur bei OnGameModeInit passiert,ist das für mich kein Problem.
Ich glaube aber,Ich werde es etwas abändern,sodass zwar das Array im Script wächst,allerdings kein Loop mehr benötigt wird.Man wird also direkt über den Index auf die Distanz zugreifen können.
//Edit
Hab es mal getestet.In der Version aus dem Post oben,brauch man ~12500ms um jede ModelID 1x auszulesen. Das bei einer AMX Größe von 138kb,die lediglich aus dem Streamer und dem Testlauf besteht. Dagegen jetzt bei einer AMX Größe von 193kb ( 55kb größer ) nur noch ~5ms bei der FAST_VERSION( Keine prinft() Infos ) und ~1041ms bei der Normalen Version.
//Edit2:
Noch etwas verbessert, nun 145kb bei nur noch ~5ms bei der FAST_VERSION( Keine prinft() Infos ) und ~1041ms bei der Normalen Version.
Wenn du den Streamer von Incognito benutzt,dann ja.