Wie gesagt, benutze das Streamer Plugin. Bei dem kannst du die Virtual World von Objekten einstellen.
EDIT: Obiger Post wurde im Nachhinein editiert.
Wie gesagt, benutze das Streamer Plugin. Bei dem kannst du die Virtual World von Objekten einstellen.
EDIT: Obiger Post wurde im Nachhinein editiert.
Das geht nur mit dem Streamer Plugin: http://forum.sa-mp.com/showthread.php?t=102865
Wie funktioniert das?
Es benutzt Player-Objects, das heißt ein Objekt wird für einen Spieler nur dann angezeigt, wenn er sich in der Virtual World befindet. Du kannst das auch selber machen, das Plugin ist aber einfacher und hat einen Streamer dabei.
Ach Leute.
ShowPlayerDialog(playerid, ADMINTELEPORT, DIALOG_STYLE_LIST,"{368452}Adminteleports","{368452}Los Santos\nSan Fierro\nLas Venturas\nBurger Shot Nord\nZivilistenspawn","Benutzen","Abbrechen");
So.
Beim Start kann das durchaus normal sein und ist auch kein Problem, da ist ja keiner auf dem Server, somit bemerkt es auch keiner. Jedoch kommt es darauf an, was du alles lädst. Wenn du nur 3 Autos lädst, und die brauchen 1,2 Sekunden ist das mies. Wenn du 30000 hast sieht das anders aus.
Wenn du ohne killer stirbst, gibt OnPlayerDeath killerid = INVALID_PLAYER_ID zurück, was dein Array "sprengt".
public OnPlayerDeath(playerid, killerid, reason)
{
if(killerid != INVALID_PLAYER_ID)
{
if(SpielerInfo[playerid][sEingeloggt] == true && SpielerInfo[killerid][sEingeloggt] == true)
{
SpielerInfo[playerid][sTode]++;
//SpielerInfo[playerid][sTod] = 120;
SpielerInfo[killerid][sMorde]++;
SendClientMessage(killerid, C_Rot,"Du hast ein Verbrechen begangen (Vorsätzlicher Mord). Zeuge: Niemand");
}
}
return 1;
}
Das sieht ganz danach aus, dass du ein Spawn System hast, das nicht die "normalen" Spawn Buttons verwendet. Du hast dann wohl TogglePlayerSpectating benutzt, damit die Buttons weg sind.
Das musst du, bevor du die Position setzt, wieder beenden: http://wiki.sa-mp.com/wiki/TogglePlayerSpectating (also auf 0 setzen).
Das das beim einen zwei mal kommt liegt wohl daran, dass du das ganze zwei mal aufrufst, so wie hier:
if(IsPlayerNPC(playerid))
{
SpielerInfo[playerid][sEingeloggt] = true;
SpawnPlayer(playerid);
}
Es ist nicht sehr vorteilhaft bei OnPlayerSpawn SpawnPlayer aufzurufen, da SpawnPlayer wieder OnPlayerSpawn aufruft.
Setze mal:
SetSpawnInfo(playerid, playerid, GetPlayerSkin(playerid), 1690.5719,1452.8687,11.7662,271.0359, 0, 0, 0, 0, 0, 0);
vor SpawnPlayer.
Das Selbe nur mit den anderen Koordinaten bei LS.
Für den Fall das immer noch nicht funktioniert, kannst du uns dann sagen, in welcher Reihenfolge deine prints geprintet werden?
if(strcmp(cmd, "/suspect", true) == 0 || strcmp(cmd, "/su", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(OnDuty[playerid] != 1 && PlayerInfo[playerid][pMember] == 1)
{
SendClientMessage(playerid, COLOR_GREY, "Du bist nicht im Dienst!");
return 1;
}
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_GRAD2, "Benutzung: /su [Spieler ID/ Name] [Anzahl] [Verbrechen]");
return 1;
}
giveplayerid = ReturnUser(tmp);
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
{
SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /su [Spieler ID] [Anzahl] [Verbrechen]");
return 1;
}
new WantedAnzahl;
WantedAnzahl = strval(tmp);
if (gTeam[playerid] == 2 || IsACop(playerid))
{
if(IsPlayerConnected(giveplayerid))
{
if(giveplayerid != INVALID_PLAYER_ID)
{
if(PlayerInfo[giveplayerid][pJailed] > 0)
{
SendClientMessage(playerid, COLOR_GRAD1, "Der Spieler ist im Gefängnis!");
return 1;
}
if (gTeam[giveplayerid] != 2 && !IsACop(giveplayerid))
{
GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
GetPlayerName(playerid, sendername, sizeof(sendername));
new length = strlen(cmdtext);
while ((idx < length) && (cmdtext[idx] <= ' '))
{
idx++;
}
new offset = idx;
new result[64];
while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
{
result[idx - offset] = cmdtext[idx];
idx++;
}
result[idx - offset] = EOS;
if(!strlen(result))
{
SendClientMessage(playerid, COLOR_GRAD2, "Benutzung: /su [Spieler ID / Name] [Anzahl] [Verbrechen]");
return 1;
}
if(WantedLevel[giveplayerid]+1 > 50)
{
//Hier machst du rein, was passieren soll, wenn er das 51. wanted bekommen würde.
}
else
{
WantedLevel[giveplayerid] += WantedAnzahl;
format(string, sizeof(string), "Du hast ein Verbrechen begangen ( %s ). Zeuge: %s.",result,sendername);
SendClientMessage(giveplayerid, COLOR_LIGHTRED, string);
format(string, sizeof(string), "Vergebene Wanteds: %d. Neues Wantedlevel: %d", WantedAnzahl, WantedLevel[giveplayerid]);
SendClientMessage(giveplayerid, COLOR_YELLOW, string);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(IsACop(i))
{
format(string, sizeof(string), "HQ: Alle Einheiten: Reporter: %s, Vergebene Wanteds: %d",sendername, WantedAnzahl);
SendClientMessage(i, TEAM_BLUE_COLOR, string);
format(string, sizeof(string), "HQ: Verbrechen: %s, Gesuchter: %s, Aktuelle Wanteds: %d",result,giveplayer, WantedLevel[giveplayerid]);
SendClientMessage(i, TEAM_BLUE_COLOR, string);
}
}
}
return 1;
}
else
{
SendClientMessage(playerid, COLOR_GRAD2, "Du kannst keinen Polizisten anklagen!");
}
}
}
else
{
format(string, sizeof(string), "%d ist kein aktiver Spieler.", giveplayerid);
SendClientMessage(playerid, COLOR_GRAD1, string);
return 1;
}
}
else
{
SendClientMessage(playerid, COLOR_GRAD2, "Du bist kein Polizist!");
}
}
return 1;
}
Achso, aber von 186 würde er doch dadurch gar nicht mehr auf 190 kommen ohne 'Boost' oder habe ich gerade einen Denkfehler?
Ja, aber das Auto wird sehr schnell langsamer, daher fällt es wieder unter die 180 und bekommt wieder einen Schub, ich fand die Schübe sonst etwas zu stark. Es wird besser je näher die einzelnen Werte aneinander liegen, ich wollte aber keine 100 else if's machen.
So wie ich das sehe sind viele an etwas Besserem hier Interessiert, was einfacher zu benutzen ist und noch genauer funktioniert. Ich werde in den nächsten Tagen oder Wochen, sofern ich Zeit habe, mich damit auseinandersetzen, ob sich da eine möglichst einfach zu benutzende Include machen lässt.
Finde es gut
Bremsen funktioniert auch
Was mich nur bisschen stört das driften
wenn ich mit 135 drifte driftet das ding total lange
Das liegt daran, dass das Auto ja nur auf die bestimmte Geschwindigkeit begrenzt ist, der script macht es aber schneller als vom Spiel her erlaubt, das führt dazu, dass es beim driften extrem lange driftet, da es länger braucht, bis die Geschwindigkeit wieder erreicht ist, bei der das Auto zu langsam ist um zu driften.
Jeffrey, deine Abfragen verwirren mich.
Die Variable 'speed' wird abgefragt von 170 bis 175, 180 bis 185 und 190 bis 195? Was ist mit den 5er Lücken?
Ich hab das so gemacht, weil der script sonst das Auto die ganze Zeit auf der Maximalgeschwindigkeit hält, würde an manchen Stellen etwas komisch aussehen. Man kann es sicher auch ohne die Lücken machen, ob das aber einen merklichen Unterschied macht weiß ich nicht. Müsste man ausprobieren, was besser läuft.
Nur ich habe mich versucht durchzuschlagen seit 3 Wochen sitze ich JEDEN
Tag ununterbroch daran und checks net.... Dabei kommt dann das raus, wo mir auch keiner helfen kann....
Nr 1. <- Klick Pls
Nr 2. <- Klick Pls
Nr 3. <- Klick Pls
Ich kann dir nur vorschlagen, wenn dir eh keiner helfen kann, mach alles aus dem Code nochmal raus, und geh das Tutorial noch einmal von oben an durch, einfach alles neu machen was MySQL benutzt. Musste ich mit was anderem vor paar Jahren auch mal machen, da muss man halt in den sauren Apfel beißen.
ODER, viel besser (IMO): Files anstatt MySQL. Wesentlich weniger problemanfällig. Ich verzichte auch so gut wie möglich auf MySQL.
Danke
einfach so ins script einfügen?
Wie schnell läuft das ding nun?
Ja.
Genau so schnell wie du es wolltest.
Es ist extrem Ressourcenlastig. Ich würde lieber einen Timer abfragen, der jede 3 Sekunden oder so läuft. OnPlayerUpdate saugt die Leistung deines Servers raus.
Nur weil es OnPlayerUpdate benutzt ist es nicht gleich extrem Ressourcenlastig. Ich hab es bei mir auf dem PC getestet, meine CPU ist noch intakt. OnPlayerUpdate hat einfach einen schlechten Ruf, ich benutze es gerne für kleine Dinge und hatte noch nie nur einen Lag damit. Man muss nur wissen wie man es benutzt.
Ich habe mit Absicht auf einen Timer verzichtet, weil es ungenau wird. Wie gesagt, es ist nicht perfekt, wer es besser machen will darf das gerne machen. Aber nur rumnörgeln ist nicht nötig, das hilft keinem.
Teddybaer:
Ich habe nun einen kleinen FS entworfen, der bei Weitem nicht perfekt ist, aber er tut das, was du willst. Ich hab es probiert, es funktioniert.
#include <a_samp>
new bool:GibtGas[MAX_PLAYERS];
public OnPlayerUpdate(playerid)
{
if(IsPlayerNPC(playerid)) return 1;
/*new str[128];
format(str, sizeof(str), "%d", GetPlayerSpeed(playerid));
SendClientMessageToAll(-1, str);
//^debug^
*/
if(IsPlayerInAnyVehicle(playerid) && GibtGas[playerid])
{
new id = GetPlayerVehicleID(playerid);
new model = GetVehicleModel(id);
if(model == 596) //LSPD
{
new speed = GetPlayerSpeed(playerid);
if(speed <= 175 && speed > 170)
{
new Float:x1, Float:y1, Float:z1, Float:a;
GetVehicleVelocity(id, x1, y1, z1);
GetVehicleZAngle(id, a);
SetVehicleVelocity(id, x1*202.0/175.0, y1*202.0/175.0, z1);
}
else if(speed <= 185 && speed > 180)
{
new Float:x1, Float:y1, Float:z1, Float:a;
GetVehicleVelocity(id, x1, y1, z1);
GetVehicleZAngle(id, a);
SetVehicleVelocity(id, x1*202.0/185.0, y1*202.0/185.0, z1);
}
else if(speed <= 195 && speed > 190)
{
new Float:x1, Float:y1, Float:z1, Float:a;
GetVehicleVelocity(id, x1, y1, z1);
GetVehicleZAngle(id, a);
SetVehicleVelocity(id, x1*202.0/195.0, y1*202.0/195.0, z1);
}
}
}
return 1;
}
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(newkeys & KEY_SPRINT) GibtGas[playerid] = true;
else GibtGas[playerid] = false;
return 1;
}
stock GetPlayerSpeed(playerid) //Credits an Michael@Belgium
{
new Float:ST[4];
if(IsPlayerInAnyVehicle(playerid))
GetVehicleVelocity(GetPlayerVehicleID(playerid),ST[0],ST[1],ST[2]);
else GetPlayerVelocity(playerid,ST[0],ST[1],ST[2]);
ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 179.28625;
return floatround(ST[3]);
}
Falls das jemand als Inspiration sieht dies zu perfektionieren, darf er gerne den Code benutzen, abändern oder neu veröffentlichen, ist mir völlig egal.
Auf Anfrage per PM mir diesen Thread anzusehen:
Es ist eigentlich egal welches Plugin du benutzt. Die bekannten zwei sind ziemlich gleich. Falls es dich interessiert: http://forum.sa-mp.com/showthread.php?t=161726
Wenn du dem Tutorial von maddin folgst, hast du eigentlich alles was du brauchst. Per TS3 gebe ich keinen "Unterricht", da ich die Zeit dazu nicht habe, und wenn ich es bei einem anfange, dann stehen sofort 10 Stück Schlange.
Ich denke mal das ist nicht das was du hören willst, aber es ist das Richtige.
Warum? Dein Server, daher solltest du die Arbeit machen, und es nicht dir machen lassen. Das Tutorial ist das Beste das ich kenne, wenn du dem Schritt für Schritt folgst, wirst du keine Probleme haben, das kann auch jemand machen, der zum ersten mal vor dem PC sitzt, ist fast idiotensicher
Versuch es doch einfach mal, nimm dir die Zeit und arbeite es durch, Schritt für Schritt, wenn dich jemand einweisen soll, dann musst du jemanden finden, der dir das besser als das Tutorial erklärt, sonst bringt es ja nichts, da wirst du kaum einen finden. Und wenn es dir nur jemand macht, dann weißt du gar nichts am Ende.
Einen Script runterladen wird dir nicht viel bringen, mach es selbst.
Bei SavePlayer:
new query[140];
zu:
new query[400];
Die Zeile ist bereits 178 Zeichen lang, ohne das etwas eingetragen wird.
Ja das sagt dir doch schon alles was du wissen musst:
Zitat(error #1054) Unknown column 'autoschein' in 'field list'
Unbekannte Spalte "autoschein" in der Felder Liste.
Bedeutet: Es gibt in der Tabelle keine "autoschein" Spalte, entweder vergessen, oder verschrieben.
Diese Callback wird aufgerufen, wenn ein Spieler in einer Tuning Garage sein Auto tunt.
Du kannst durchaus das Geld abfragen, was der Spieler bezahlt hat, kommt aber ganz auf dein Anti-Money-Hack an, wie du das machen musst. Aber es ist theoretisch möglich.
Ok, sieht doch alles ganz gut aus.
Mach mal:
SavePlayer(playerid)
{
if(sInfo[playerid][eingeloggt] == 0)return 1;
new query[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
format(query,sizeof(query),"UPDATE User SET level='%i',Geld='%i',skinid='%i',adminlevel='%i',fraktion='%i' WHERE username='%s'",GetPlayerScore(playerid),GetPlayerMoney(playerid),sInfo[playerid][ID],sInfo[playerid][skinid],sInfo[playerid][adminlevel],sInfo[playerid][fraktion],name);
printf("1) %s",query);
mysql_function_query(dbhandle,query,false,"","");
printf("2) %s",query);
return 1;
}
Dann zeig bitte was ausgegeben wird.
Zudem schau bitte noch in den Debug Log oder Error log deines MySQL Plugins, bzw. mach den Debug Mode an, falls er aus ist, und gib uns das, was dort gezeigt wird.
Überprüf auch nochmal, ob du alle Felder richtig geschrieben hast, im Query sowie in der Datenbank.
Geladen werden die Stats aber, oder?
Wenn ja, kannst du mal dein OnPlayerDisconnect zeigen, sofern SavePlayer(playerid) dort aufgerufen wird.
(Ich antworte mit Absicht hier und nicht in der PM die du mir geschickt hast, weil hier kann den Fortschritt jeder sehen und jeder kann einen Fehler finden, ich sehe auch nicht alles ^^)