ArrayName war doch nur ein Beispiel. Du sollst ein Array finden mit der Größe 302.
new IRGENDWASHIER[302];
Du sprengst ein Array mit der Größe 302 mit dem Index 391. Dazu müssten wir wissen welches deiner Arrays die Größe 302 hat.
ArrayName war doch nur ein Beispiel. Du sollst ein Array finden mit der Größe 302.
new IRGENDWASHIER[302];
Du sprengst ein Array mit der Größe 302 mit dem Index 391. Dazu müssten wir wissen welches deiner Arrays die Größe 302 hat.
Was macht denn dein /restart? Startet es den Server neu?
Falls ja, solltest du die Verbindung beim GMX trennen und danach wieder aufnehmen (OnGameModeInit).
Am Besten auch keine Queries senden, wenn der Server neu gestartet wird.
Welches Array hast du denn mit "302" deklariert?
Das müsste so aussehen:
new ArrayName[302];
Poste bitte den ArrayName davon.
Nimm den "root" Benutzer ohne Passwort. Localhost solltest du nehmen, wenn die Datenbank auf dem gleichen Server liegt:
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASS ""
#define MYSQL_DATA "DATENBANKNAME"
Das ist in 99% aller Fälle standardmäßig so eingestellt.
Dein user "samp" wird nicht die richtigen Berechtigungen haben, das ist auf localhost (dein Rechner) so eingestellt, standardmäßig zumindest.
Deshalb benutze, wie ich oben geschrieben habe, den root - User ohne Passwort, der hat ALLE Berechtigungen. Dem kannst du später auch, je nach Client, ein Passwort geben.
Da musst du die Position neben dem Bot herausfinden, das machst du mit Sinus und Cosinus.
Gleiches Prinzip wie hier: http://forum.sa-mp.de/gta-multiplayer-mods/san-andreas-multiplayer/scripting-base/18-nützliche-codeschnipsel-56#post1890617
Nur dass du eben nicht die Position vor dem Spieler sondern daneben willst, da musst due sin/cos Funktionen ändern, ich kann es grade nicht testen, versuche dich daran mal selbst. Wenn du es bis Sonntag nicht schaffst, dann kann ich es am Abend für dich machen. (Schick mir eine PN mit dem Link zu dem Thema hier dann)
Die Kamera muss sich dann von GetPosNebenSpieler zu GetPosVorSpieler von der pos neben Spieler bewegen.
_____________________________________________________________________________________________________________________
EDIT:
//pID = Spieler dessen Kamera sich bewegt
//playerid = Bot
new Float:a, Float:x, Float:y, Float:z;
if(IsPlayerInAnyVehicle(playerid)) GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
else GetPlayerFacingAngle(playerid, a);
GetPlayerPos(playerid, x, y, z);
x += (5.0 * -floatcos(a, degrees)); //5.0 = Abstand zur Seite (wenn du die andere Seite willst, mach das "-" weg, bei beiden.
y += (5.0 * -floatsin(a, degrees));
new Float:pos1x, Float:pos2x, Float:pos1y, Float:pos2y;
pos2x = x + (70.0 * floatsin(-a, degrees)); //End-Position (vorne)
pos2y = y + (70.0 * floatcos(-a, degrees)); //70.0 = Abstand vom Bot nach vorne
pos1x = x - (-20.0 * floatsin(-a, degrees)); //Start-Position (hinten)
pos1y = y - (-20.0 * floatcos(-a, degrees)); //-20.0 = Abstand vom Bot nach hinten (- = nach vorne)
GetPlayerPos(playerid, x, y, z);
InterpolateCameraPos(pID,pos1x,pos1y,z,pos2x,pos2y,z,14010,CAMERA_MOVE);
InterpolateCameraLookAt(pID,x,y,z,x + (300.0 * floatsin(-a, degrees)),y + (300.0 * floatcos(-a, degrees)),z,14010, CAMERA_MOVE); //300.0 = Abstand den sich die Kamera-LookAt Position verändert.
Und es sieht so aus:
Sieht nicht genau gleich aus, aber das kannst du mit den Abständen so einrichten wie du das willst. Ich finde es so für das Motorrad ganz gut.
Wenn du die ID speichern willst benötigst du ein Array, da die ID ja für jeden Spieler anders ist.
Also ja, du brauchst ein Array.
case 0: { if(GetPlayerMoney(playerid) < 5000) return SendClientMessage(playerid, 0xAA3333AA, "Du hast nicht genug Geld um die Deagle zu kaufen!"); else return GivePlayerWeapon(playerid,24,500);}
case 1: { if(GetPlayerMoney(playerid) < 1000) return SendClientMessage(playerid, 0xAA3333AA, "Du hast nicht genug Geld um die Deagle zu kaufen!"); else return SetPlayerArmour(playerid,100);}
public sekunde(){
new string[128],getFormat[6];gettime(getFormat[0],getFormat[1],getFormat[2]),getdate(getFormat[3],getFormat[4],getFormat[5]);
format(string,128,"%02d:%02d:%02d",getFormat[0],getFormat[1], getFormat[2]);
TextDrawSetString(uhrzeitLabel,string),TextDrawShowForPlayer(playerid,uhrzeitLabel);
format(string,128,"%02d.%02d.%d",getFormat[5],getFormat[4],getFormat[3]);
return TextDrawSetString(datumLabel,string),TextDrawShowForPlayer(playerid,datumLabel);
}
Du musst den Timer auch starten.
SetTimer("sekunde", 1000, 1);
Bei OnGameModeInit.
Das sscanf Plugin ist eine Alternative. Davon bin ich aber kein Freund, ich mache es lieber nach dieser Methode, da weiß ich, dass es funktioniert, und zwar immer.
Ja, splitten.
Die while-Schleife (und alles was darin ist) entfernen und das an die Stelle setzen:
strins(string, "|", strlen(string));
new oldi=0;
new count=0;
for(new i=0; i<strlen(string); i++)
{
if(string[i]=='|')
{
count++;
new tmpstring[sizeof(string)]; tmpstring=string;
strdel(tmpstring, i, strlen(tmpstring));
strdel(tmpstring, 0, oldi+1);
switch(count)
{
case 1: id = strval(tmpstring);
case 2: format(name, sizeof(name), "%s", tmpstring);
case 3: x = floatstr(tmpstring);
case 4: y = floatstr(tmpstring);
case 5: z = floatstr(tmpstring);
case 6: a = floatstr(tmpstring);
case 7: interior = strval(tmpstring);
//usw...
}
oldi=i;
}
}
Dann bei den case's deine Variablen (sStats[playerid][sSQLID], etc) an die richtige Stelle setzen und mit strval (Integer), format (String) oder floatstr (Float) auslesen.
Nicht vergessen das vorherige "result" zu "string" umzubenennen, oder andersrum.
Kann mir mal jemand erklären was passiert wenn ich es auf 2 stelle?
Das ist ein Zwischending zwischen AN und AUS. Es kompensiert nur den Lag der Position, nicht den der Drehung des Spielers. Die Position wird dann, sagen wir mal "richtiggerechnet" die Drehung jedoch nicht.
In wie fern das Sinn macht muss man für sich selbst bestimmen, am Besten ausprobieren.
Bei 0 ist beides aus.
Bei 1 ist beides kompensiert.
Ich gebe dir ein paar gute Tipps wie du dir es selbst sehr gut beibringen kannst, so habe ich es zumindest vor fast 5 Jahren gelernt.
Du solltest dich zu aller erst mit den Grundlagen der Programmierung beschäftigen, bevor du anfängst einen vorhandenen Gamemode zu "vergewaltigen", dazu gehört nämlich ein Grundwissen, welches bei dir offensichtlich fehlt.
Ich erkläre dir mal wie du am besten lernen kannst, damit du in Zukunft auch verstehst, was ein Code ist, und wann du welchen Code benutzen musst, weil so hat das doch recht wenig Sinn, wenn du nicht mal weißt welchen Code du uns zeigen sollst um das Problem zu beheben.
Also ich habe PAWN gelernt, indem ich mir den LAdmin4v2 (damals sehr neu) genommen habe, und versucht habe, die einzelnen Teile zu verstehen. Dann habe ich einfach losgelegt, und überlegt, welcher Teil das tut, was ich will. Den Code hab ich mir dann angeschaut, und so für den neuen Code verändert, dass er seinen Zweck erfüllt hat.
Wichtig: Fang klein an, jeder tut das, nimm nicht gleich einen Gamemode und verunstalte den, du wirst nichts kapieren. Ich arbeite nun über 4 1/2 Jahre mit PAWN und mein Wissen ist noch lange nicht komplett, im Gegenteil.
Falls dir jemand sagt, du sollst dir die PAWN Doc durchlesen, lass es, genauso rate ich dir davon ab das wiki in allen Einzelteilen durchzulesen. Du wirst es nicht verstehen. Das kannst du in 3 Jahren machen, wenn du es verstehst, und selbst dann wirst du den Großteil in der Pawn Doc nicht auf Anhieb verstehen.
Noch was: Ausprobieren. Du kannst nichts kaputt machen. Das einzige was passieren kann, ist dass du Errors bekommst. Na und? Für was gibt es STRG+Z. Einfach probieren, wenn du nicht weiter kommst, lass es, oder frag nach Hilfe, sofern es im kleinen Bereich ist.
Learning By Doing nennt sich das. Nicht aufgeben, einfach machen machen machen. Das muss nicht immer perfekt sein, und muss auch nicht immer Sinn ergeben, hauptsache du machst was. Zum Anfang kannst du dir z.B. vornehmen, einen FilterScript der hier im Forum veröffentlicht wurde (einen einfachen) nachzumachen. Musst ihn ja nicht auch veröffentlichen, aber nur zur Übung einfach nachmachen. Wenn du hängst, kannst du ja nachsehen, was falsch ist.
Meiner Meinung nach besser als alles andere.
Wie machst du das?
Du suchst dir einen Filterscript der irgendwas macht, sei es ein Auto Spawn Menu.
Schau dir zuerst mal an, was der FilterScript denn machst (z.B. ein Auto-Menu, um Auto's zu spawnen). Dann überlegst du, was du denn alles dafür brauchst, suchst dir die Funktionen zusammen (Google, SAMP Wiki) und legst los so ein Menu zu erstellen. Wenn du irgendwo hängst, kannst du einen Blick in den Code werfen, und ein paar Zeilen, die du denkst zu verstehen abschreiben, dann siehst du ja was passiert.
Am Besten ist es aber, wenn du es ganz ohne in den Code zu schauen hin bekommst, deshalb fang mit leichten Dingen an.
Bis du erst mal richtig rein findest vergehen mit Sicherheit 1-3 Monate! Also nicht verzagen, du wirst am Anfang ziemlich oft stecken bleiben und auf die Nase fallen (ist wie laufen lernen). Ich weiß das von mir. Wenn du einmal drinne bist, dann gehts jeden Tag besser.
PS: Ich hab es ganz alleine gelernt. Die einzige Hilfestellung die ich damals hatte war ein /kill Command aus 6 Zeilen code, den mir jemand gemacht hat. Den gebe ich dir auch:
if(strcmp(cmdtext, "/kill", true) == 0)
{
SetPlayerHealth(playerid, 0.0);
SendClientMessage(playerid, 0xFF0000FF, "Du hast dich selbst getötet.");
return 1;
}
Probiere aus, mit diesem Code klar zu kommen.
Das fügst du im callback OnPlayerCommandText ein. Dann auf den Compiler drücken, und Server neu starten.
Wenn du damit klar kommst, gehe weiter und versuche Dinge selbst zu erstellen.
Und am wichtigsten: Immer dranbleiben!
Viel Erfolg!
Vielleicht lädst du das noch wo anders, oder du hast den Wert bei OnPlayerDisconnect nicht zurück gesetzt.
Sieh dir bitte den Beispielcode an, den ich dir oben verlinkt habe, damit solltest du klar kommen.
Gut!
Jetzt kannst du die ganze while-Schleife weg machen.
Dann nimm dir genau diesen Post als Beispiel: MYSQL Lädt falsche werte
string in dem Post entspricht "result" bei dir, musst entweder "result" zu "string" umbenennen, oder andersrum.
Dann bei den case's die jeweiligen Variablen setzen.
EDIT:
0 = id
1 = Name
2 = Passwort hash
etc... (du weißt ja wie deine DB aufgebaut ist.)
Wenn du einen Wert nicht auslesen willst, lasse die case ID einfach aus.
Ok wäre sehr gut wenn du mal kurz auf meine PN eingehst
Ich habe keine PN von dir bekommen.
Du musst es ja auch zu 0 setzen. 1 schält die neue Hitbox an, 0 macht sie aus.
Füge mal nach dem mysql_store_result() in deinem SpielerLaden das hier ein:
new result[256];
mysql_fetch_row(result);
print(result);
Wird das geprintet? Wenn ja, könntest du es darüber splitten (sscanf oder manuell).
Die Anführungszeichen gehören da nicht hin, ErikSon hat das schon richtig gemacht.
Probiere es einfach aus.
Eine Farbe ist ein HEX Wert, der in einen Integer umgewandelt wird. Passt so. Es ist KEIN String.
MySQL Debug anschalten, Code debuggen lassen und crashdetect Plugin nutzen.
Dann mal posten was im Server Log steht.