ich habe einige Scripte bekommen wo zeug drin ist das man hier noch nie gesehen hat
Proof? Zeig doch mal im Showroom paar Systeme ![]()
ich habe einige Scripte bekommen wo zeug drin ist das man hier noch nie gesehen hat
Proof? Zeig doch mal im Showroom paar Systeme ![]()
Was genau ist das denn ist das für ein neuen Compeiler habe ich was verpasst ?
Die Rede ist vom Zeex Compiler: https://github.com/pawn-lang/compiler/releases
Das ermöglicht viele neue Möglichkeiten, gerade in Kombination mit YSI ![]()
ursprünglich war diese mit weggelöscht aber ich habe die removeobject zeile wieder entfernt
Geh in den MapEditor lösch nochmal diese Straße und schau, dass du keinen der RemoveObject Codes mehr verwendest, vermutlich sind es einfach mehrere und einige sind noch bei dir vorhanden ![]()
Eine Idee wie ich auf den "Packer" Fahrzeuge mehr oder weniger attachen kann.
AttachVehicleToVehicle gibts ja nicht. Ich habe überlegt, ob man das vllt mit einem Timer und setposition hinbekommt oder mit Objects die die Fahrzeuge festhalten.
Kp ob dafür eine Lösung existiert.
Tatsächlich existiert keine sehr schöne Lösung dafür.
Natürlich könnte man das mit den Positionen so machen..ist aber auch etwas unschön, gerade da man mit mehreren Rotationsachsen arbeiten müsste, diese aber nicht gesetzt, nur abgefragt (https://team.sa-mp.com/wiki/GetVehicleRotationQuat.html) werden können.
Alternativ einfach Objekte nehmen, die aussehen wie Fahrzeuge (mit entsprechender Textur o.ä.) und diese attachen.
Oder einfach Fahrzeuge drauffahren und dann per Objekt "einklemmen". ![]()
Aber wenn du näher ran gehst, wird dir der Boden angezeigt? 😅
Okay, also in diesem Fall hast du wohl ein nicht so gutes Modell Objekt erwischt, darf man fragen welche modelid das Objekt hat? ![]()
PS: Gerne auch mal von einem Boden Objekt den CreateDynamicObject Code posten ![]()
von etwa 10m gestreamt, weshalb ich nichtmal sehe was direkt vor meiner Nase steht.
Gerne mal dahin stellen und F5 drücken und den screen hier posten, dann kann ich dir da mehr zu sagen ![]()
Aber grundsätzlich gibt es sowohl die stream, als auch die draw-distance, beide könnten erhöht werden für diesen Zweck.
Allerdings könnte es noch an etwas anderem liegen.
Achso, ja dann geht es noch einfacher:
Wäre dann halt wieder die Frage ob man format texte auch in ein define setzen kann oder wie man das am besten macht.
Für format, kannst du den Text quasi als Template nutzten:
#define MSG(%0,%1) gMessages[%1][PlayerInfo[%1][pLang]]
stock const gMessages[][][] =
{
{"Hallo","Hello","Hola"},
{"Hallo %s (%d), wie geht es dir?", "Hello %s (%d), how are you?", "Hola %s (%d), cómo estás?"}
};
//Und dann für die erste Nachricht ohne format:
SCM(playerid,-1,MSG(playerid, 0));
//Und mit format:
new string[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,MAX_PLAYER_NAME);
format(string,sizeof(string),MSG(playerid,1),name,playerid);
SCM(playerid,rot,string);
//Noch einfacher mit einer SCME Funktion:
#define SCME(%0,%1,%2,%3) format(string,sizeof(string),%2,%3),SCM(%0,%1,string)
//Und dann nur:
new string[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,MAX_PLAYER_NAME);
SCME(playerid,rot,MSG(playerid,1),name,playerid);
Alles anzeigen
Und noch ein Profi Tipp:
Wenn du Speicher sparen willst, kannst du konstante Texte (also Texte die nicht in ein format kommen) mit einem ! davor schreiben, in meinem Beispiel dann so:
stock const gMessages[][][] =
{
{!"Hallo",!"Hello",!"Hola"},
{"Hallo %s (%d), wie geht es dir?", "Hello %s (%d), how are you?", "Hola %s (%d), cómo estás?"}
};
Nutzen lässt es sich exakt gleich, aber diese Strings verbrauchen jetzt nur noch ein Viertel an Speicher! ![]()
Nun zu meinem Anliegen.
Ich habe vor alle vom Script ausgehenden Texte in mehreren Sprachen anzubieten, also mit Übersetzung.
Hatte die Idee das ganze per DEFINES zu machen und dann halt eine sprachabfrage zu machen, sodass ich die texte beispielsweise in einem include übersetzen kann.Wie würdet ihr das ganze umsetzen. Für mich klingt das nicht nach der besten Lösung.
Gibt eine heftige YSI-Lib dazu: https://github.com/pawn-lang/YSI-Includes
Leider ist sie nicht (mehr) gut dokumentiert und schwer sich reinzuarbeiten.
Spontan würde mir sowas einfallen:
enum
{
LANG_GERMAN,
LANG_ENGLISH,
LANG_SPAIN
};
//Weist dem Spieler dann eine Sprache zu:
PlayerInfo[playerid][pLang] = LANG_GERMAN;
stock SCML(playerid, color, const ger[], const eng[], const spain[])
{
switch(PlayerInfo[playerid][pLang])
{
case LANG_GERMAN: SCM(playerid,color,ger);
case LANG_ENGLISH: SCM(playerid,color,eng);
case LANG_SPAIN: SCM(playerid,color,spain);
}
return 1;
}
//Und dann einfach so nutzen:
SCML(playerid,-1,"Hallo","Hello","Hola");
Alles anzeigen
Wenn du öfters den Selben Satz verwendest, sowas wie z.B. "Du bist kein Admin!"
Leg dir dafür konstanten an:
stock const NO_ADMIN_MSG_GER[] = "Du bist kein Admin!";
stock const NO_ADMIN_MSG_ENG[] = "You're not an admin!";
stock const NO_ADMIN_MSG_SPN[] = "No eres un admin!";
//Und dann an entsprechender Stelle einfach:
if(!IsAdmin(playerid,5)) return SCML(playerid,rot,NO_ADMIN_MSG_GER,NO_ADMIN_MSG_ENG,NO_ADMIN_MSG_SPN);
Dadurch wird nämlich nur 1x der Speicher reserviert ![]()
Was passiert denn?
Was gibst du ein?
Was siehst du?
Hast du mal ein paar prints gesetzt...einfach nur zu sagen "es geht nicht", bringt niemandem etwas ![]()
CMD:warn(playerid,params[])
{
new pID, grund[64], string[128];
if(sscanf(params,"us[64]", pID, grund)) return SCM(playerid, GELB, "[ Verwendung ] /warn [playerid] [Grund]");
if(!IsPlayerConnected(pID)) return SCM(playerid,GRAU,"Dieser Spieler ist nicht online!");
SCME(playerid, ORANGE,"Du hast den Spieler %s verwarnt Grund: %s", PlayerInfo[pID][pName], grund);
SCME(pID, LROT,"Du wurdest von %s verwarnt Grund: %s", PlayerInfo[playerid][pName], grund);
PlayerInfo[pID][pWarns]++;
new query[256];
mysql_format(handle, query, sizeof(query),"UPDATE users_warns SET name='%s', grund='%s' WHERE id = '%i'", PlayerInfo[playerid][pName], grund, PlayerInfo[playerid][p_id]);
mysql_pquery(handle, query);
if(PlayerInfo[pID][pWarns] == 3)
{
Dialog_Show(playerid, DIALOG_MAXWARNS, DIALOG_STYLE_MSGBOX,"{FF0000}Maximale Anzahl an Warns erreicht", "Du wurdest gebannt da du die Maximale Anzahl an Warns erhalten hast\nSolltest du weitere Fragen haben oder es nicht korrekt sein, bitte melde dich bei einem Head-Adminstrator!", "Okay", "");
}
return 1;
}
Alles anzeigen
Der Error/Warning Text ist schon sehr präzise was das angeht "invalid expression - expression has no effect".
Das ist wie, wenn du im Mathe Unterricht anstatt x = 5 nur = 5 schreibst...da fragt man sich doch, was ist 5?!?!
stock FraktionsRangName(playerid)
{
new fraktion = PlayerInfo[playerid][pFraktion], string[64];
switch(PlayerInfo[playerid][pFRang])
{
case 1: strcat(string, FrakInfo[fraktion][_rang1]);
case 2: strcat(string, FrakInfo[fraktion][_rang2]);
case 3: strcat(string, FrakInfo[fraktion][_rang3]);
case 4: strcat(string, FrakInfo[fraktion][_rang4]);
case 5: strcat(string, FrakInfo[fraktion][_rang5]);
case 6: strcat(string, FrakInfo[fraktion][_rang6]);
default: string = "Kein Rang";
}
return string;
}
Alles anzeigen
Neu bauen hat nicht geholfen?
Evtl einfach NodeJS updaten?
Aus diesem Kommentar (https://stackoverflow.com/ques…mbol-node-module-register) geht hervor, dass es ab 11.11 integriert wurde.
Wichtig ist, dass du so nur einzelne Charakter annimmt, somit müsstest du eine Schleife darum bauen.
Oder einfach das format anpassen:
Ne in besitzer steht doch nur die db Id
cInfo[id][besitzer]=PlayerInfo[playerid][p_id]
Ah, das hatte ich nicht gesehen.
Ich würde einfach das enum für cInfo erweitern.
Füg einfach sowas wie c_Owner[MAX_PLAYER_NAME] hinzu.
Und dann einfach createPlayerCar abändern zu:
createPlayerCar(playerid,modelid,Float:x,Float:y,Float:z,Float:r)
{
new pName[MAX_PLAYER_NAME];
GetPlayerName(playerid,pName,MAX_PLAYER_NAME);
for(new i,id,string[128]; i<sizeof(cInfo); i++)
{
id = getFreeCarID();
if(cInfo[id][id_x]!=0)continue;
cInfo[id][besitzer]=PlayerInfo[playerid][p_id];
cInfo[id][c_x]=x;
cInfo[id][c_y]=y;
cInfo[id][c_z]=z;
cInfo[id][c_r]=r;
cInfo[id][model]=modelid;
format(cInfo[id][c_Owner],MAX_PLAYER_NAME,pName);
cInfo[id][id_x] = CreateVehicle(modelid,x,y,z + 5,r,1,1,-1);
format(string,sizeof(string),"Du hast erfolgreich den %s gekauft. Dieser steht ab sofort an der Ausgabestelle bereit. ID: %d",getVehicleName(modelid) , id);
SendClientMessage(playerid,COLOR_GREEN,string); //Wieso vorher SendClientMessageToAll?! wtf :D
saveCarToDB(playerid,id);
return 1;
}
return 1;
}
Alles anzeigen
Deswegen lösche ich doch Zeichen 3 -64
Das ist gar nicht notwendig, kannst auch einfach nur die ersten Zeichen abfragen.
Im format einfach:
format(kennzeichen,16,"%c%c",cInfo[id][c_Owner][0],cInfo[id][c_Owner][1]); //Gibt dir die ersten 2 Zeichen des Namens als Kennzeichen
Ein Spielername muss immer mind. 3 Zeichen lang sein, also ist das problemlos machbar. (Natürlich vorher immer prüfen, dass der String nicht leer ist)
Aber ich weiß nicht ob es überhaupt Funkt oder gut so ist
Nein, das wird nicht funktionieren, da PVars, wie der Name schon sagt, Spieler bezogen sind, also ein SetPVar(carid wird nicht funktionieren bzw. zwangsläufig zu Fehlern führen.
Verstehe die Notwendigkeit von dem PVar auch gar nicht, da der Name vom Besitzer des Fahrzeuges ja schon in cInfo[carid][besitzer] steht. Aber wie Maho schon anmerkte, wäre das eh viel zu Lange, also den Spielernamen sollte man faktisch nicht als Nummernschild verwenden.
Ein cronjob könnte dafür auf dem System selbst auch eingesetzt werden ![]()
#Handy
Viel Spaß ![]()
Mach das if und das return 1 weg ![]()