Sorry, aber so ganz verstehe ich deine Sätze nicht..
Wenn du einen Einstieg in Pawn suchst, dann kann ich dir empfehlen, dir erstmal das Serverpack runterzuladen (sa-mp.com/downloads)
und dir dann ein paar Standart-Gamemodes (lvdm) anzuschauen.
Es gibt hier im Forum zahlreiche Anfängertutorials, in welchen die grundlegendsten Funktionen erklärt werden.
(Autos einfügen; Menüs erstellen; Messages ausgeben ... usw)
Beiträge von FACE
-
-
Was soll daran bitte nicht funktioniere??
public OnPlayerDeath(playerid, killerid, reason)
{
SendDeathMessage(killerid, playerid,reason);
GameTextForPlayer(killerid,"Gangwarkill",2000,1);//Die Message ist doch für den Killer gedacht
GivePlayerMoney(killerid,500);//Der Killer soll doch das Geld bekommen, nicht das Opferif(GetPlayerWantedLevel(killerid)<=5){SetPlayerWantedLevel(killerid,GetPlayerWantedLevel(killerid)+1);} //Sonst könnten die Wanteds über 6 hinauswachsen
if(GetPlayerWantedLevel(killerid)==6)
{
new mwstr[64],mwname[MAX_PLAYER_NAME];//Der String braucht nicht sooo lang zu sein | Habe mal den Namen anstat der ID eingesetzt.
GetPlayerName(killerid,mwname,MAX_PLAYER_NAME);
format(mwstr,sizeof(mwstr),"%s ist Most Wanted",mwname);
GameTextForAll( mwstr, 2500, 0);
}
return 1;
} -
Dann ist wohl dein Filterscript verbuggt.
Vielleicht ist es ja schon älter oder ist halt wirklich einfach schlecht/fehlerhaft geschrieben -
Zum Beispiel..
Oder nimm erstmal einen leeren Gamemode und schau, ob das Filterscript überhaupt funktioniert. -
Dann beißt sich das.
Stell dir mal vor, ein Gamemode erstellt ein Auto und färbt es rot und das zugehörige Filterscript färbt ein Auto mit der selben VehicleID grün.
Das Auto kann ja nun nicht beide Farben haben.
Irgendeine doppelte Definition, die im Filterscript und im Gamemode vorgenommen wurde,
könnte also einen negativen Effekt auslösen. -
-
Vielleicht hebt sich das Filterscript durch den Gamemode auf.
Hau mal einen leeren Gamemode rein und lade das Filterscript. -
Es gibt durchaus mehrere "Räume" die in einem Interior, sprich mit derselben InteriorID, vorhanden sind.
Von daher ist eine Interior-Abfrage sinnfrei.
Löst es lieber, wie bereits oben genannt, über eine Variable (z.B. Boolean), welche Aussage geben kann, ob der Spieler sich im Gefängnis befindet. -
Ja, wie soll das denn auch funktionieren?
Du hast ein Array daraus gebastelt.
Du musst, wenn du pname als Array definierst, auch die Abfrage dementsprechend anpassen:
GetPlayerName(playerid,pname[playerid],MAX_PLAYER_NAME);Dies sagt übrigens auch der Error. Die Anzahl der Eigenschaften des Arrays ist nicht korrekt
-
Es geht zum Beispiel um das Auslesen von Statistiken und daraus folgende Vergleiche. (Zum Beispiel: Spieler mit den meißten...)
Dazu kommt noch, dass mein System ein wenig anders aufgebaut ist..
Ich Lege ein File (in einem extra PlayerFiles-Ordner) für jeden Account an, diese sind jedoch auf IDs bezogen und haben nichts mit dem Namen zutun.
Dadurch entfallen Probleme beim Namechange und noch diverse andere.Die Tabelle, die den Spielernamen mit der FileID verknüpft, ist also zwingend notwendig, um auf das File zuzugreifen.
Das Beispiel aus dem Sa-mp Wiki ist ja maximal begrenzt auf 64 Zeichen. Gut den String könnte an noch vergößern,
jedoch ist das auch nur in Grenzen möglich.Hier mal den Code aus dem Wiki:
new string[64]; // Create the string to store the read text in
new File:example = fopen("Startup.txt", io_read); // Open the file
while(fread(example, string)) //reads the file line-by-line
{
if(strcmp(string, "Ban", true) == 0) //if any of the lines in the file say "Ban" the system will ban the player
{
Ban(playerid); //bans the player
}
}
fclose(example);Annahme: Der Spieler steht "dummerweise" ganz hinten in der Liste und vorher müssten über 10.000 Zeichen ausgelesen werden.
Frage am Rande. Inwiefern "dämmen" packed Strings das Problem ein ?
Eine nach oben hin unbegrenzte Methode wäre ja Ziel der Sache. -
Guten Abend,
mich laust momentan die Frage, wie es möglich ist, ein "beliebig" großes File komplett auszulesen.Ich verwende das Standart-Filesystem und habe mir daraus eine kleine Datenbank zusammengeschnipselt.
Da man ja zum auslesen einen String benötigt, diese aber nur begrenzt groß sein können, bin ich der Meinung, dass dieses "System"
doch relativ schnell an seine Grenzen stoßen könnte.Ein Beispiel zum Aufbau der Auflistung im Spieler-Verzeichnis:
Dieses File dient lediglich als Verknüpfung von ID zum Namen.
Jedoch liegt die aktuelle maximale Stringlänge bei 2048 Chars (Global).Für einen standartmäßigen Spielernamen + ID + Leerzeichen kämen wir dann auf ~25 Zeichen (nicht jeder Spieler hat einen sooo langen Namen; die IDs gehen aber schnell in hohen Stellen)
(mit 25 lässt es sich auch einfach sehr gut rechnen )Bei einem 500 Spieler-Server bedeutet das foglich eine benötigte Länge von: 12500 Zeichen. (Und das "nur" für die Spieler, die gerade online sind)
Hätte jemand evtl. Lösungsvorschläge zum Umbau der "Datenbank" oder zur Umstrukturierung?
Vorneweg: Ich habe nicht vor auf Dini, noch Mysql oder Ähnliches umsteigen.Gruß, FACE
-
Zum Tuning: Es gibt ein Callback namens "OnVehicleMod" (http://wiki.sa-mp.com/wiki/OnVehicleMod)
Dies wird aufgerufen, wenn ein Spieler sein Fahrzeug tunet. (Genau dann, wenn er ein Teil anbringt und das Geld loswird)
Beim Betreten eines Tuningshops speicherst du also sein Geld in einer Variable zwischen (Callback: http://wiki.sa-mp.com/wiki/OnEnterExitModShop )
Wenn der Spieler nun das Fahrzeug tunet, gibst du ihm einfach jedes mal das Geld zurück.Oben im Script also:
new TuneMoney[MAX_PLAYERS];
[pwn]Dann beim betreten des Shops
[pwn]
public OnEnterExitModShop(playerid, enterexit, interiorid)
{
if(enterexit == 0) // 0== raus
{
TuneMoney[playerid]=0;//Geld zurücksetzen um Komplikationen zu vermeiden
}
else //1== betreten
{
TuneMoney[playerid]=GetPlayerMoney(playerid);
}
return 1;
}Wenn der Spieler tunet:
public OnVehicleMod(playerid,vehicleid,componentid)
{
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid,TuneMoney[playerid]);
return 1;
}Pay'n'Spray ist ein wenig kniffeliger, aber das kriegst du dann alleine hin
-
hmm...penn vielleicht mal ne Nacht drüber
-
Frage halt vor dem Command ab, ob der Spieler in der passenden Stellung (Fraktion, Level oder sonstwas) ist, um den CMD durchzuführen..
Wir führen dann den CMD aus und lassen einen Loop durch alle Spieler laufen.
Jeder der Online, in der passenden Fraktion und Stellung ist, bekommt dann den Marker gesetzt.
(Spezieller halt noch in Abhängigkeit von der Distanz). -
Versuchs mal so ähnlich wie im Beispiel im Sa-mp wiki.
Dort heißt es wie folgt:
public OnPlayerDeath(playerid,killerid,reason)
{
new gunname[32], string[64], fName[MAX_PLAYER_NAME], sName[MAX_PLAYER_NAME];
GetWeaponName(reason,gunname,sizeof(gunname));
GetPlayerName(playerid,fName,MAX_PLAYER_NAME);
GetPlayerName(killerid,sName,MAX_PLAYER_NAME);
format(string, sizeof(string), "%s has wasted %s using a %s.", sName, fName, gunname);
SendClientMessageToAll(0xFFFFFFAA,string);
return 1;
}Auf deine Problematik bezogen wäre das dann in etwa:
new pID, munition, string[128],string2[128], wid, weaponstr[32];
...//Beim auslesen der Weapon ID aus dem Command kannst du direkt den Waffennamen im string "weapon" speichern, oder alternativ die ID zwischenspeichern
//und diese dann hier durch einen Waffennamen ersetzen..
//Für den zweiten Fall nehmen wir an, du hättest die WaffenID gespeichert in der Variable "wid"//Die Syntax für die Funktion "GetWeaponName" ist übrigens (weaponid, const weapon[], len)
GetWeaponName(wid,weaponstr,sizeof(weaponstr));format(string,sizeof(string),"Du hast %s eine %s mit %i Munition gegeben.",SpielerName(pID),weaponstr,munition);
SendClientMessage(playerid,GREY,string);...
Ich glaube das sollte einigermaßen eingägig sein
-
Also das Distanz Gedöns kannst du deutlich einfacher haben..
Nutze doch bitte die "GetPlayerDistanceFromPoint" Funktion:
public UpdateRadar(playerid)
{
for ( new j = 0; j < MAX_PLAYERS; j++ )
{
if(!IsPlayerConnected(j)) continue;
if(playerid==j) continue; //Unterbricht den Durchlauf für Fall playerid=j
if(!(Spieler[j][pFraktion] == 1 || Spieler[j][pFraktion] == 2)) continue;
//Die Verneinung müsste ggf. überarbeitet werden; Weiß nicht, wie die Fraks bei dir definiert sind..//Jetzt unsere Marker setzen..
new Float:X,Float:Y,Float:Z;
GetPlayerPos(j,X,Y,Z);
if(GetPlayerDistanceFromPoint(playerid,X,Y,Z)<= 200){SetPlayerMarkerForPlayer(i,j,(GetPlayerColor(j)& 0xFFFFFF00));}
else{SetPlayerMarkerForPlayer(playerid,j,GetPlayerColor(j));}
}
return 1;
}
"i" war doch nie definiert. Wir gehen hier doch von einer Spieler Funktion aus, welche durch einen Spieler ausgelöst wird. Der Parameter im Callback wäre dann also playerid (oder etwas ähnliches)
Außerdem: Warum zwei loops??!!"Why do you always make these things so complicated .. "
-
Zeig mal bitte den Abschnitt in deiner Serverconfig bezüglich der Filterscripts.
Achja und beim Start des Serverprogramms, gibt es da eine Meldung wie "x Filterscripts loaded" ? (x durch eine Zahl ersetzen) -
Es gibt eine GetPlayerDistanceToPoint Funktion (http://wiki.sa-mp.com/wiki/GetPlayerDistanceFromPoint)
Als Koordinate halt die vom Objekt nehmen.
(Eine ähnliche existiert auch für Fahrzeug zu Koordinate, oder von Spieler zu Spieler, ...) -
Wieviele Filterscripts hast du denn schon auf den Server geladen?
-
Zu dem Werte einsetzen: Nein! Du erblickst das glaube gerade nicht ganz..
Du musst die Drehrichtung des Autos auslesen und in dieser dann die Velocity neu setzen + der, die bereits besteht.
Anderenfalls würde das Auto angehalten werden und nur geradeaus beschleunigen.Das mit dem Pickup versteh ich nicht ganz..
Btw: Ich war so frei und hab mal die ersten paar Treffer bei Google für "sa-mp boost" aus den gängigen Foren rausgeschrieben:
http://forum.sa-mp.com/showthread.php?t=95064
http://forum.sa-mp.com/showthread.php?t=341731Und man findet nichts bei Google ?!?!