Du musst die Geschwindigkeit ganz klein machen. z.B. auf 0.01 .
Bsp.:
MoveObject(Xpos, Ypos, Zpos+0.001, 0.01, 0, 0, 90);
Du musst die Geschwindigkeit ganz klein machen. z.B. auf 0.01 .
Bsp.:
MoveObject(Xpos, Ypos, Zpos+0.001, 0.01, 0, 0, 90);
Benutz MoveObject. Beachte außerdem, dass du das Object minimal verschieben musst, damit es rotiert. Also kannst du einfach z.B. die Z Achse minimal verändern, und hinterher einfach wieder auf den normalen Wert setzen.
Mfg,
UncleSub
P.S.: Es reicht ein Thema für ein Problem zu öffnen.. (http://forum.sa-mp.de/san-andr…nke-rotation-geht-schief/)
Hallo zusammen,
ich habe ein Problem mit der sscanf Split Funktion. Mein Problem ist, dass eine Variable nicht richtig gesplittet wird!
Ich benutze die Funktion bei einer MySQL Abfrage. Eigentlich müsste alles so stimmen, dennoch wird eine Variable falsch gesplittet!
Mein Pawn Code:
new data[550];
mysql_query("SELECT * FROM Shops");
mysql_store_result();
shop_count = 0; //Ja habe ich Global definiert..
while(mysql_fetch_row(data))
{
printf("Raw Shop Data: \"%s\"", data);
sscanf(data, "e<p<|>iis[32]s[64]fffii>", Shop[shop_count]);
printf("sscanf Shop Data: \nID: %i | Type: %i | Name: %s (%s) | Owner: %s \nXYZ: %f.%f.%f | Kasse: %i | Preis: %i",
Shop[shop_count][sID], Shop[shop_count][sTyp], Shop[shop_count][sName], GetShopTypName(Shop[shop_count][sTyp]), Shop[shop_count][sOwner], Shop[shop_count][sX], Shop[shop_count][sY],
Shop[shop_count][sZ], Shop[shop_count][sKasse], Shop[shop_count][sPreis]);
if(strcmp(Shop[shop_count][sOwner], "Niemand", true))
{
format(data, 200, "\n%s \n%s \nBesitzer%s", GetShopTypName(Shop[shop_count][sTyp]), Shop[shop_count][sName], Shop[shop_count][sOwner]);
Shop[shop_count][sPickup] = CreateDynamicPickup(19130, 0, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 0);
Shop[shop_count][sLabel] = CreateDynamic3DTextLabel(data, 0xFFFFFF, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 15);
}
else
{
format(data, 200, "\n%s zu verkaufen! \nPreis: %i$", GetShopTypName(Shop[shop_count][sTyp]), Shop[shop_count][sPreis]);
Shop[shop_count][sPickup] = CreateDynamicPickup(1274, 0, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 0);
Shop[shop_count][sLabel] = CreateDynamic3DTextLabel(data, 0xFFFFFF, Shop[shop_count][sX], Shop[shop_count][sY], Shop[shop_count][sZ], 15);
}
shop_count++;
}
mysql_free_result();
Ich habe bereits die Rohen Daten von der Abfrage, sowie die Gesplitteten Daten printen lassen. Das Ergebnis kommt mir aber echt spanisch vor.
Auszug aus dem Log:
[17:52:38] Raw Shop Data: "1|1|Buyable Shop|Niemand|1534.71|-1667.83|5.89062|0|122"
[17:52:38] sscanf Shop Data:
ID: 1 | Type: 1 (Burger Shot) | Name: Buyable Shop | Owner: Niemand
XYZ: -0.000005.1534.709960.-1667.829956 | Kasse: 0 | Preis: 122
Wie man sieht, wird der X Wert falsch geplittet, obwohl er richtig ausgelesen wurde! Weiß jemand weiter?
Achso, ich benutze die neueste sscanf Version.
Mfg,
UncleSub
Nunja gut. Hab ich mir doch fast gedacht ^^. Dann wars das jetzt mit den Fragen
Danke für die Antworten
Alles klar, danke für die Infos. Dennoch habe ich dann noch ein paar kleine Fragen.
mit SetPlayerVirtualWorld sogar.
Wenn ich dann also einen NPC in mehreren Virtuellen Welten haben wollte, wie würde das gehen? Man kann ja nicht SetPlayerVirtualWorld(playerid, -1) oder so machen. Könnte man das so machen?:
for(new i; i < vworldsanzahl; i++)
{
SetPlayerVirtualWorld(playerid, i);
}
Würde für mich eigentlich keinen Sinn ergeben, denn dann wird der Spieler/Bot ja immer in die Welt geswitcht, bleibt dort aber nicht, oder?
Zu den SAMP Extensions, hört sich echt nett an, schaue ich mir mal näher an.
if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
{
{
{
GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
PlayerInfo[playerid][pLevel] = mysql_GetInt("accounts","Level", "Name",PlayerInfo[playerid][pName]);
PlayerInfo[playerid][pAdmin] = mysql_GetInt("accounts","AdminLevel","Name",PlayerInfo[playerid][pName]);
//...
printf("Spielerdaten vom Spieler %s erfolgreich aus der Datenbank geladen",SpielerName(playerid));
}//end while
}
Lösch mal die unnötigen Klammern..
Mfg
Danke für die Antwort!
Zu deiner 2ten Frage,jeder Bot bekommt Automatisch eine ID zugewiesen.Das heißt das sie Automatisch als ein Normaler Spieler Connecten.
Ja das ist mir bewusst. Deswegen Frage ich dazu ja auch, ob es ein Plugin gibt, wo dies nicht der Fall ist. Ich habe mich letztens mal mit der Plugin Entwicklung beschäftigt und ich denke schon, dass es möglich wäre (z.B. durch Memory Hacking). Aber ich bin da auch noch nicht so der Experte.
EDIT: Push
if(HOLDING(KEY_UP | KEY_SPRINT) && PRESSED(KEY_JUMP))
Probier es mal so. Und nein, du hast ja durch die Defines im Pre-Processor alles geregelt.
Mfg
Ich werde aus deiner Klammersetzung irgendwie nicht schlau:
if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
{
{
{
GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME);
PlayerInfo[playerid][pLevel] = mysql_GetInt("accounts","Level", "Name",PlayerInfo[playerid][pName]);
PlayerInfo[playerid][pAdmin] = mysql_GetInt("accounts","AdminLevel","Name",PlayerInfo[playerid][pName]);
//...
printf("Spielerdaten vom Spieler %s erfolgreich aus der Datenbank geladen",SpielerName(playerid));
}//end while
}
3x Klammer auf und 2x Klammer zu für ein if? Erklär mir das.
Mfg,
UncleSub
Zeig uns mal den Code beim Login Dialog. (OnDialogResponse)
Mfg
Erstmal brauchst du das hier oben irgendwo (optional, ist aber einfacher und besser):
// PRESSED(keys)
#define PRESSED(%0) \
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))
// HOLDING(keys)
#define HOLDING(%0) \
((newkeys & (%0)) == (%0))
// RELEASED(keys)
#define RELEASED(%0) \
(((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))
Dann gehst du zu OnPlayerKeyStateChange und machst dort eine if Abfrage. Also du möchtest ja, dass wenn der Spieler rennt und springt, er hinfliegt. Er muss also die Leertaste und die W Taste gedrückt halten und Shift drücken.
Also:
if(!IsPlayerInAnyVehicle(playerid)) //Natürlich nur wenn er On Foot ist
{
if(HOLDING(KEY_UP) && HOLDING(KEY_SPRINT) && PRESSED(KEY_JUMP))
{
//Hier deinen Code z.B. ApplyAnimation, such dir eine schöne Animation aus (z.B. ApplyAnimation(playerid, "PED", "KO_shot_stom", 4.1, 0, 0, 0, 0, 0); )
//Oder noch eine Variable setzen, dass er einmal springen darf.
}
}
Mfg,
UncleSub
for(new i = 0; i < sizeof(iRows); i++)
Ohne sizeof. Ist ja nur ein Integer, also würde es als Länge nicht den Wert, der in der Variable steht, zuückgeben.
Mfg,
UncleSub
Ich erkläre dir mal ein bisschen an deinem Code, was du tust.
for(new Kord = 0; Kord < sizeof(ATMs); Kord++)
{
if(IsPlayerInRangeOfPoint(playerid, 7.0, ATMs[Kord][0], ATMs[Kord][1], ATMs[Kord][2])) //Bis hierher: Du hast das Grundprinzip verstanden, ist aber nicht ganz richtig danach.
{
// Dialog anzeigen
} else {
SendClientMessage(playerid, GRAU, "Du bist an keinem Bankautomaten."); //Du würdest gespamt werden mit "Du bist an keinem Bankautomat"
}
break; //Das break; macht, dass die Schleife SOFORT beendet wird. Also kommt er immer nur bis zu den ersten Coords im Array.
}
Pack das ganze in abgeänderter Form in ein Stock (z.B. IsPlayerAtATM). Anstatt, dass du dem Spieler Nachrichten, oder den Dialog zeigst arbeitest du mit return 1/0.
Also:
stock IsPlayerAtATM(playerid)
{
for(new Kord = 0; Kord < sizeof(ATMs); Kord++)
{
if(IsPlayerInRangeOfPoint(playerid, 7.0, ATMs[Kord][0], ATMs[Kord][1], ATMs[Kord][2]))
{
return 1;
}
}
return 0;
}
Hoffe ich konnte helfen,
UncleSub
Alles soweit richtig, bis auf die markierte Zeile.
Änder diese zu:
if(!strcmp(MD5_Hash(inputtext),speicher, false))
Noch was zum Nachlesen dazu: Strcmp.
Außerdem noch ein Tipp:
Warum fragst du alle Daten vom Account ab, wenn du nur das Passwort benötigst?
format(query, sizeof(query), "SELECT * FROM `accounts` WHERE `Name` = '%s'", PlayerName(playerid));
Trage dort statt dem * den Spaltennamen vom Passwort ein.
Mfg,
UncleSub
Kommt drauf an, welche Version du nutzt. Im Prinzip kann man nicht sagen, dass durch ein altes Plugin nichts mehr funktioniert. Es hat ja einmal funktioniert.
Das einzige was man sagen kann, dass in neueren Plugins natürlich entdeckte Bugs entfernt wurden. Außerdem ändern sich auch Befehle und es kommen neue hinzu. Zum Beispiel das MySQL Plugin von BlueG unterstützt ab R7 nur noch Threaded Querys und hat komplett neue Funktionen.
Generell würde ich dir raten, immer die aktuellste Version zu benutzen, da dort am wenigsten Bugs sind. Außer halt beim genannten Beispiel von BlueG's Plugin. Musst dann abwägen, was du nutzen möchtest und am besten für dich geeignet ist.
Mfg,
UncleSub
Schau dir die Funktionen mal an:
GetVehicleZAngle
SetVehicleZAngle sollte für dein Problem ausreichen.
Mfg,
UncleSub
new MySQL:handle;
public OnFilterScriptInit()
{
handle = mysql_init(LOG_ONLY_ERRORS, 1);
mysql_connect(SQL_HOST,SQL_USER,SQL_DATABASE,SQL_PASSWORD);
return 1;
}
So sollts gehen. Kannst dir hier alle Funktionen anschaun, die das Plugin hat.
Mfg,
UncleSub
#include <rft_mysql>
Weg damit. Wie ich schon sagte, immer nur eine Include für ein Plugin nutzen!
Mfg
Alles anzeigenZitat von »UncleSub«
Zitat von »TimTom«
Woher weis ich welche Includes die richtigen Sind?...ich hab erst heut angefangen zu scripten...bzw ich will ein SelfMade scripten, ich kenne mich nicht so gut aus..
Geh auf die Seite von dem Plugin, das du nutzen möchtest und lade dir die Datein davon herunter. Diese Datein musst du nutzen, also dieso Include und das Plugin.
Also es liegt bei dir was du nutzen möchtest:
BlueG's
Strickenkids
ADreNaLiNe 's
Mfg
Bist du zufällig Scripter?
Wonach siehts denn aus? Also ja ich bin Scripter und kenne mich auch ein wenig in der Plugin Entwicklung aus.
Zu deinem Problem:
Was wird denn nicht geladen?
Mfg,
UncleSub
Woher weis ich welche Includes die richtigen Sind?...ich hab erst heut angefangen zu scripten...bzw ich will ein SelfMade scripten, ich kenne mich nicht so gut aus..
Geh auf die Seite von dem Plugin, das du nutzen möchtest und lade dir die Datein davon herunter. Diese Datein musst du nutzen, also dieso Include und das Plugin.
Also es liegt bei dir was du nutzen möchtest:
BlueG's
Strickenkids
http://ADreNaLiNe 's
Mfg