Da kann ich The_OTTO nur Recht geben.
Ein dynamisches Vehiclesystem zu scripten, dass ohne Bugs einwandfrei bei bis zu 500 Spielern läuft ist nicht gerade leicht.
Du brauchst erstmal ein Konzept, sprich du denkst dir aus "Was soll das System können" und fängst dann an.
Wenn du nicht mal weißt wie du anfangen sollst, dann am besten garnicht.
Ohne Erfahrung bei enum, Arrays, Schleifen, dini usw. hast du keine Chance.
Also lass dich lieber auf was Leichtereres ein
Beiträge von Rafelder
-
-
Klar kann man Tasten abfragen, nur nicht z.B. "c", sondern "ducken" (auch wenn ducken auf c liegt..).
http://wiki.sa-mp.com/wiki/GetPlayerKeys -
Ich seh dein Problem nicht. Du hast doch alles definiert:
// clickedplayerid ist der Spieler der angeklickt wurde
new ClickedPlayer[MAX_PLAYERS]; // nur ein Beispiel, am besten baust dus in PlayerInfo mit ein ;Dpublic OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
ClickedPlayer[playerid] = clickedplayerid;
return 1;
}
Also speicherst du einfach die ID vom amgeklickten Spieler in einer Variable von dem Spieler, der ihn angeklickt hat, und rufst diese dann beim Sms Dialog wieder auf
PlayerInfo[ClickedPlayer[playerid]][pPnumber] // Das ist die Nummer -
ich hab ja alles neu dedownlaoded und es gfeht nciht, weil einer mir früher so 2 Include.txt sachen geschickt hat !
Wenn du wirklich den neusten Server (nicht Client!) geladen hast, dann kann es garnicht sein, dass die Includes fehlen, da z.B. die Dialoge in der a_samp enthalten sind.. -
Wieso prüfst du ob der Spieler online ist der gerade den Befehl eingibt ?
Dein Fehler war, dass du eine folgende Schleife erstellt hast:
for(new car=91; car>=90; car++)
// Wird so durchgerechnet:
// Schleife fängt bei 91 an und addiert jedes mal 1 (wegen car++) bis "car" nicht meht mit der zweiten Anweisung übereinstimmt (car>=90)
// Und da es unendlich viele Zahlen über 90 gibt hört die Schleife nie auf..
So funktionierts:
if((!strcmp(cmd, "/deleteallcars", true)) || (!strcmp(cmd, "/dac", true)))
{
if(PlayerInfo[playerid][Level] >= 4)
{
new bool:unwanted[MAX_VEHICLES];
for(new player=0; player<MAX_PLAYERS; player++)
{
if(IsPlayerInAnyVehicle(player)) unwanted[GetPlayerVehicleID(player)] = true;
}
for(new car=91; car<MAX_VEHICLES; car++)
{
if(!unwanted[car]) DestroyVehicle(car);
}
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid, pname, MAX_PLAYER_NAME);
format(string, sizeof(string), "SERVER: All unused cars deleted by %s.", pname);
SendClientMessageToAll(COLOR_WHITE,string);
}
else
{
SendClientMessage(playerid, red, "you are not authorized to use this command!");
}
return 1;
} -
Aufjedenfall mit einem TextDraw und einem Timer, währe aber ganz interessant wie sowas geht.
Wieso würds dich interessieren, wenn du schon gesagt hast wies geht ? -
Nur dass es in nem normalen Timer weder playerid noch weaponid gibt..
Du musst ganz einfach bei OnPlayerUpdate das hier machen: (Woher soll denn dein Scipt wissen welche Waffe du willst ??)
public OnPlayerUpdate(playerid)
{
UpdateTextdraws(playerid, GetPlayerWeapon(playerid));
return 1;
} -
Zwei Funktionen, die zwar nich wirklich aufwendig sind, aber nützlich..
Man spar lediglich ein paar Zeichen, die man nicht wirklich braucht ;D
stock strfindex(source[], string[]) // Um zu prüfen ob source[] string[] beinhaltet
{
if(strfind(source, string, true, 0) != -1) return true;
return false;
}stock strcmpex(source[], comp[]) // Um zwei Strings zu vergleichen
{
if(!strcmp(source, comp, true)) return true;
return false;
} -
Also ich hab mich eben ma hingesetzt und n bisschen was zusammen geschrieben (Sorry |-|auke, deins war echt total verbuggt & hätte nicht funktioniert), was eigentlich funktioneren müsste.
Ich konnte es nich testen da ich ja grad ma keine Leute auf ienen Server hab also wird auch nichts angezeigt.
Einen neuen Admin usw. kannst du in OnGameModeInit erstellen (einfach mal nachschauen)
#include <a_samp>#define ServerOwner 0
#define Administrator 1
#define SuperModerator 2
#define Moderator 3#define GroupID 1337
#define groupsize 10new a_name[MAX_PLAYER_NAME];
enum a_admins
{
name[MAX_PLAYER_NAME],
bool:online
}// Gruppe / Anzahl / Stringsize
new Admins[4][groupsize][a_admins];new Groups[4][20] = {"-> Server Owner", "-> Adminstrator", "-> Supermoderator", "-> Moderator"};
public OnGameModeInit()
{
format(Admins[ServerOwner][0][name], MAX_PLAYER_NAME, "YourName"); // ServerOwner 1
format(Admins[ServerOwner][1][name], MAX_PLAYER_NAME, "YourName"); // ServerOwner 2
format(Admins[Administrator][0][name], MAX_PLAYER_NAME, "YourName"); // Admin 1
format(Admins[Administrator][1][name], MAX_PLAYER_NAME, "YourName"); // Admin 2
format(Admins[SuperModerator][0][name], MAX_PLAYER_NAME, "YourName"); // SuperMod 1
format(Admins[SuperModerator][1][name], MAX_PLAYER_NAME, "YourName"); // SuperMod 2
format(Admins[Moderator][0][name], MAX_PLAYER_NAME, "YourName"); // Mod 1
format(Admins[Moderator][1][name], MAX_PLAYER_NAME, "YourName"); // Mod 2
// Also Admins[ Gruppe ][ 0-9 ][ name (stehen lassen) ]
return 1;
}public OnPlayerConnect(playerid)
{
for(new a=0; a<4; a++)
{
for(new i=0; i<groupsize; i++)
{
if(!strcmp(PlayerName(playerid), Admins[a][i][name], true))
{
Admins[a][i][online] = true;
}
break;
}
}
return 1;
}public OnPlayerDisconnect(playerid, reason)
{
for(new a=0; a<4; a++)
{
for(new i=0; i<groupsize; i++)
{
if(!strcmp(PlayerName(playerid), Admins[a][i][name], true))
{
Admins[a][i][online] = false;
}
break;
}
}
return 1;
}public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/admins", true))
{
new b_string[256];
for(new i=0; i<4; i++)
{
format(b_string, sizeof(b_string), "%s\n", Groups[i]);
for(new a=0; a<groupsize; a++)
{
if(Admins[i][a][online] == true)
{
format(b_string, sizeof(b_string), "%s%s\n", b_string, Admins[i][a][name]);
}
}
}
ShowPlayerDialog(playerid, GroupID, DIALOG_STYLE_MSGBOX, "Admins", b_string, "Ok", "Cancel");
//ShowPlayerDialog(playerid, GroupID, DIALOG_STYLE_LISTBOX, "Admins", b_string, "Ok", "Cancel");
return 1;
}
return 0;
}stock PlayerName(playerid)
{
GetPlayerName(playerid, a_name, MAX_PLAYER_NAME);
return a_name;
} -
Innenräume erstellen is kamm sogut wie jeder Anfänger
Du gehst in MTA -> Objecte -> Buildings , und scrollst dann ganz nach unten . Dort siehst du einige Innenräume . Du setzt einen hoch in die Luft , und schon hast du einen Wenn du ihn z.B. als Fraktionsspawn haben willst , dann empfehle ich dir Modsobeit . Da man in MTA kein /save machen kann , gehst du in MTA in den Innenraum mit "Test" und schreibst dir die Koordianten auf , die rechts unten im Modsobeit Fenster stehen
Oder du googelst : "GTA Innenräume". Dann werden auch verschiedene Innenräume angezeigtmfg
Oder man macht es sich nicht ganz so schwer & setzt einfach z.B. ein Pickup in den Raum & ließt die Koordinaten aus der Datei aus.. -
public OnPlayerText(playerid, text[])
{
new SpielerFarbe = GetPlayerColor(playerid);
new string[256];
format(string,sizeof(string),"%s",text);
SendClientMessageToAll(SpielerFarbe,string);
return 0;
}Sollte so eigentlich funzeln...
Er wollte aber doch genau das Gegenteil: Nicht die Farbe die er dem Spieler gegeben hat & außerdem fehlt der Name..
public OnPlayerText(playerid, text[])
{
new string[256], name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(string, sizeof(string), "%s: %s", name, text);
SendClientMessageToAll(0x/*DeineFarbe*/,string);
return 0;
} -
ups, stimmt xD
Hmm, aber dann sollte doch trotzdem alles richtig sein oO Aber es kommen immernoch die errors/warns
Ich überleg nochma n bisslMFG, Robdeflop®
Meines Wissens nach kannst du doch nich eine Länge eines unbekannten Strings abfragen..
Auch wenn du du dann einen String zuweißt klappt das nicht, genau so wenig wie du ein Array mit einer Größe einer Variable (damit meine ich nicht Definitionen!) erstellst
new bla[GetPlayerVehicleID(1)]; // Error!
Also nimm als Länge einfach eine festgelegte Größe ;D -
Also:
strtok enfernen die ganze zeile von strtok.
2. Defenire in zeile 14352 "mod" anders mit zb "mod2"
Ja und wenn er genau das macht läuft n bisschen was falsch..
Er muss auch noch die restlichen "mod"'s in mod2 ändern ;D -
if(strcmp(cmd, "/polizei", true) == 0 || strcmp(cmd, "/p", true) == 0)
{
for(new y=0;y>MAX_PLAYERS;y++)
{
if(Team[i] == TEAM_POLIZEI)
{
GetPlayerName(playerid, sendername, sizeof(sendername));
new s[120];
format(s,sizeof(s),"Polizist %s: %s",sendername,cmdtext);
SendClientMessage(i, COLOR_DBLUE, s);
}
else
SendClientMessage(playerid, COLOR_LIGHTRED, "Du bist kein Polizist");
}
return 1;
}bittesehr
EDIT:// Maddin deins nit richtig
SendClientMEssage muss schon richtig sein.Seit wann gibt es keinen Unterschied mehr zwischen "y" und "i" ?
Und so ganz nebenbei würde dann da stehen: "Polizist Name: /polizei Mein Text" ..
Drüber nachdenken & nochmal ;D -
Mein Handy (nur in weiß)
-
new ran = random(4); // eine zahl von 0-3 wird zufällig gewählt & bei case einzeln abgerufen
switch(ran)
{
case 0: { // Strecke 1
}
case 1: { // Strecke 2
}
case 2: { // Strecke 3
}
case 4: { // Strecke 4
}
}
// Geht auch kürzer & anders aber ich denk ma das ist für dich am leichtesten verständlich & für alles anzuwenden ;)
// Wenns nur um Variablen geht, die eine zufällige Zahl wollen, dann so : z.B. mit deinem auftrag[playerid]:
auftrag1[playerid] = random(4); -
Oh mein Gott.. übersetz den Error doch einfach mal
Du hast COLOR_BLUE einfach 2x definiert - in deinem Script oder noch iwo in einer Include oder so.. -
Schön dass wir die Zeilen von den Errors wissen.. leider stehn die auch nur in den Errors..
Ich würd ma sagen du hast in ieinem Array die Größe des Arrays überschritten => Zeile => Zählen -
Das geht indem man den stand des fahrzeugs mit einem timer immer überprüft. Andere funktion gibt es natürhlich auch.
also
new Float:vhealth,ID;
ID = GetPlayerVehicleID(playerid);
vhealth = GetVehicleHealth(ID,vhealth);if(health > 1000) { SetVehicleHealth(ID,1000); }
else { }Auf Non-Pawn: Wenn Autoleben mehr als 1000 dann auf 1000 setzen ?
Was hat das mit repair zu tun ?
Außerdem ein Fehler drin ;D
new Float:vhealth, ID;
ID = GetPlayerVehicleID(playerid);
GetVehicleHealth(ID, vhealth);
if(vhealth <= 200) SetVehicleHealth(ID, 1000); -
ich weiss nich genau wie der berechnet wirdDistance zwischen zwei Punkten.. lernt man auch im Matheunterricht ;D