Beiträge von JanFxtw

    Ich kann dir Enterprise sehr empfehlen.


    Ich bin vor kurzer Zeit (letze Woche) umgezogen und habe dort zwei Mal (also für zwei Wohnungen) ein Kleintransporter gemietet. Hat 2x um die 40€ gekostet. PKWs sind meist immer teurer - ist aber sicherlich bei jeder Fahrzeugvermietung so.
    Ich hab einen 5€ Rabatt erhalten, da noch ein paar Plastikverpackungen im Auto lagen und der Tank nur zu 1/4 gefüllt war.
    Vom Service super - Verfügbarkeit hier super


    Glaube man hat da einen Jungfahrer oder Neufahrerzuschlag - weiß nicht genau, wie das genau heißt. Ob das eine prozentuale oder absolute Zahl ist siehst du sicherlich in der Auswahl.


    Ich wiederhole - ich habe ein Transporter gemietet - die sind immer günstiger. Habe primär davon gesprochen, dass ich den Preis super fand und die MitarbeiterInnen super professionell und freundlich waren.

    BOAR das wäre geil mit Fahrzeugskins..


    Oder Fahrzeugschäden / dreck, könnte man tolle Funktionen reinbringen!...

    Wenn das nicht noch kommen sollte, wird es mit sehr großer Sicherheit bald ein Filterscript oder Include dazu geben.
    Die Funktion "http://wiki.sa-mp.com/wiki/AttachObjectToVehicle" ermöglicht dir genau das :)


    Zur Theorie: Automodell erstellen, dass größer als ein Model ist, in die Mitte hinzufügen.
    Dann im Gamemode die spezifischen Funktionen eben nichtmehr verwenden oder modifizieren (sowas wie GetVehicleModel abhängig von der VehicleID statt dem Model machen) und du hast dein fancy Fahrzeugskin.

    Naja, dein Problem liegt offensichtlich darin begründet, dass du dein verwendetes Script nicht (komplett) selbst geschrieben hast.
    In der Regel sollte jedes Script eine serverseitige Geldvergabe besitzen, in der das Geld auch als Variable abgespeichert wird.
    Falls du ein Geldsystem mit Gleitkommastelle besitzt, wird dir da niemand helfen, da das relativ komplex ist. Falls es das Standard GTA-Geldsystem ist, einfach die angezeigte Geldsumme an der Variable festmachen und diese dann abgleichen.


    Kurz gesagt: Erstelle eine Funktion, sowas wie "EditPlayerMoney(playerid, summe)" und returne verscheidene Zahlen, z.B. 0 für "kein Bankkonto", 1 für "nicht genug Geld", 2 für [...] und eben bsp. 5 für "alles ok".


    Wenn du sowas für zu schwer hälst, kannst du auch in jede Funktion "if(PlayerInfo[playerid][BankKontoVariable] > 10000) ..." einbauen.

    Ich kann dir keine Garantie darauf geben, aber bei uns wird in öffentlichen Schwimmbädern immer jemand gesucht.
    Du bekommst dann so (bei ca 4-8 Arbeitsstunden/Tag) pro Stunde 10 €. Meist eben am Wochenende.
    Du putzt eben den Eingangsbereich, kassierst Leute ab und hast 'n netten gekühlten Raum und WLAN. Also, wieder von hier gesprochen :P


    Ist übrigens auch eher für Studenten/Abiturienten nach'm Abi bzw. Schüler in den Ferien attraktiv

    Wie kann ich dann die ersten Einträge machen ? Brauchen nicht dynamisch

    Wenn du mit einer Datenbank arbeitest, musst du 5x die Koordinaten abspeichern und abfragen. Wenn du das unter dynamisch verstehst, dann hast du dir das gespart.


    Wie oben schon gezeigt, kannst du das einfach so machen:


    Code
    Fraktion[5][sX][0] = 60.65,
    Fraktion[5][sY][0] = 2023.11,
    Fraktion[5][sZ][0] = 357.32,
    
    
    Fraktion[5][sX][1] = 340.25,
    Fraktion[5][sY][1] = 968.89,
    Fraktion[5][sZ][1] = 2055.55,


    Zur Erklärung: Der erste Spawnpunkt deiner Fraktion "5" ist bei (60.65, 2023.11, 357,32) und der Zweite bei (340,24, 968.89, 2055.55).
    Dann einfach bei SetSpawnInfo/SetPlayerPos:


    Code
    new randValue = random(5);
    
    
    SetSpawnInfo(playerid, team, skin, Fraktion[DeinSpielerEnum[playerid][DeineSpielerFraktionsValue]][sX], usw...)
    Code
    format(str1, 15, "%s", Charakter1);
     format(str2, 15, "%s", Charakter2);
     format(str3, 15, "%s", Charakter3);
     ShowPlayerDialog(playerid, DIALOG_CHARAKTER, DIALOG_STYLE_LIST, "Charaktere:","",str1,str2,str3, "Einbloggen", "Abbrechen");

    Geht einmal nicht und wie füge ich dann noch einen Zeilenumbruch im Dialog ein?


    Ich glaube, dass du das mit den Zeichenketten noch nicht ganz verstanden hast :P


    Du kannst in einem Dialog nur eine Zeichenkette für die Anzeige des Inhaltes verwenden, das gleiche gilt für den Titel und die Buttons.
    Einen Zeichenumbruch kannst du mit \n erwirken, d.h. deine Zeichenkette sollte erstmal so aussehen:



    Code
    format(string, sizeof(string), "%s\n%s\n%s", Charakter1, Charakter2, Charakter3);
    
    
    ShowPlayerDialog(playerid, DIALOG_CHARAKTER, DIALOG_STYLE_LIST, "Charaktere:",string, "Einloggen", "Abbrechen");


    Im OnDialogResponse nicht vergessen, dass Charakter1 mit 0, Charakter2 mit 1 usw. abgefragt wird :)


    Ich würde nicht OnPlayerExitVehicle verwenden, wenn man bsp. von einer NRG fliegt wird das nicht aufgerufen. Bin da lieber auf der sicheren Seite, ist aber nur eine Kleinigkeit, wäre aber sinnvoll hier zu erwähnen, da ja eine NRG zur Wahl steht.

    Ich habe gerade keine Ahnung wie die genauen Parameter der einzelnen Callbacks sind, von daher kannst du einfach das ganze unter den jeweiligen Callbacks einbauen.
    Farbe kansnt du @ "random(255)" ändern, hier mal ne Farbtabelle https://wiki.sa-mp.com/wiki/Vehicle_Color_IDs.



    Hab das jetzt mal bare hier im Wiki geschrieben, dürfte aber mehr oder weniger stimmen.
    ..langweilige Sonntagabende eben :P


    Es ist ja kein Wunder, dass der Compiler abstürzt.
    Die erste if-Abfrage endet mit einem &&, die Klammersetzung ist wirr und irgendwie.. seltsam.
    Würde dir raten dein System etwas abzuändern, warum den Leaderrank auf die Fraktion beziehen? Sag doch lieber "PlayerInfo[playerid][pLeader] = 1/0".
    Andernfalls kann jemand Leader der Fraktion 1 sein, gleichzeitig aber in Fraktion 2 sein.
    Ebenfalls würde ich die Ranknamen extern, einem Enum oder via Datenbank auslesen, abspeichern, genau wie die Fraktionsnamen, dann könntest du das schnell so schreiben:

    Code
    if(PlayerInfo[playerid][pFaction] == 0) return Fehlermeldung;
    else if(PlayerInfo[playerid][pRank] < 5 || PlayerInfo[playerid][pLeader] == 0) return Fehlermeldung;
    else {
    format(string, sizeof(string), "|____ %s ____|", GetPlayerFactionName(playerid));
    SendClientMessageToAll(farbe, string);
    format(string, sizeof(string), "%s %s: %s", GetPlayerRankName(playerid), sendername, result);
    SendClientMessageToAll(farbe, string);
    }


    Das war jetzt ganz schnell zusammengeschrieben, dürfte aber an der Stelle kein Problem mehr für dich sein den Rest zusammenzubauen.
    Wenn doch würde ich dir raten deine PAWNO-Grundlagen aufzufrischen :)

    Hier mal mein Aduty Befehl, ist in verschiedene Funktionen unterteilt, aber die Namen dürften dir ja schon alles sagen :P





    Code
    stock PlayerColor(playerid) {
    	(ganz viel blabla das ich hier nicht poste :P)
    	if(PlayerInfo[playerid][pADuty]) return SetPlayerColor(playerid, COL_KINGLEY_ORANGE);
    }


    Einfach mal als kleine Leitlinie. Das mit der Frabe würde bei dir alleine nicht funktionieren, da ein Spieler, der in einer Fraktion ist unter daher "Blau" ist wieder auf Weiß zurück gesetzt werden würde.
    Du musst der Priorität nach eine Funktion erstelle (z.B. PlayerColor) die abprüft, welche Farbe der Spieler bekommen soll.
    Hoffe das gibt dir einen kleinen Überblick :D

    Leicht falsch eingerückt, aber egal :P
    Du hast die {} vergessen, so hat er einfach ein leeres if-Statement gehabt, 2x, daher auch das direkt Betreten und Verlassen des Aduty :)
    Übrigens kann man "/aduty" missbrauchen um direkt auf 100% Leben zu kommen. Ich weiß ja nicht, wie sehr deine Teammitglieder am Roleplay geschehen mitwirken sollen, nur als Tipp :P Außerdem bleibt der Aduty-Skin :D

    Gerade kurz schmunzeln müssen :P
    Erst einmal GivePlayerMoney(playerid, money) zu GivePlayerMoney(pID, money).
    Dann muss ich ergänzen, dass GivePlayerMoney das Geld nicht neu setzt, d.h. der Spieler hat " x $ ", du gibst ihm deine Summe " y $ , sodass er " x + y $ " hat, du möchtest aber sicher, dass er eben nur " y $ " hat, also: ResetPlayerMoney(pID); GivePlayerMoney(pID, money);
    Dann empfehle ich dir statt string & string2 zu verwenden einfach string2 zu string zu ändern. Dürfte zwar kein großen Ressourcenunterschied machen, aber theoretisch macht es einen. Strings kannst du 20x umformatieren und niemandem wird es auffallen, außer eben deinem Geldbeutel (wiegesagt, wieder auf's große Ganze ausgedrückt).


    Dann ist "money" ein Integer, d.h. ersetze die %s's in string & string2 mit %i.
    Dann würde ich überprüfen, wie du pduty & plogged abspeicherst, sprich ob du eher mit "true & false" oder mit "1 % 0" arbeitest.

    https://wiki.sa-mp.com/wiki/Strmid


    Ich habe strmid bisher nur sehr rar verwendet, jedoch dürfte es etwa so funktionieren:



    Code
    new string[8], name[MAX_PLAYER_NAME]; 
    GetPlayerName(playerid, name, sizeof(name))
    strmid(string,  name,  1, 2, sizeof(string));

    Wenn es nicht funktioniert kannst du die 1 & 2 mal durch 0, 1, 2 & 3 ersetzen, bin mir da gerade etwas unsicher :)
    Die zufällige Nummer und der Geo Standort hast du ja bereits oben vorgegeben :)

    Code
    public OnPlayerCommandText(playerid, cmdtext[]) {
         if(!strcmp("/enter",cmdtext,true)) {
              if(IsPlayerInRangeOfPoint(playerid, 3.0, 739.0507, -1417.6555, 13.5234)) {
                   SetPlayerPos(playerid, 203.777999,-48.492397,1001.804687);
                   SetPlayerInterior(playerid, 1);
                   return 1;
              }
         }
         return 0;
    }

    So dürfte es funktionieren :)
    Du hast das Gegenteil abgeprüft, würde theoretisch auch gehen, wenn du dahinter irgendwas returnst, aber du willst ja sicher mehrere "Dinge" über enter betretbar machen.


    Kannst du mir erklären wofür du das "Create3DTextLabel("Test",0x33CCFFAA,739.0507,-1417.6555,13.5234,30.0,0,0);" an der Stelle brauchst?
    Würde das eher im OnGameModeInit() festlegen.

    Ich finde den Code allgemein etwas unübersichtlich, du wiederholst dich an einigen Stellen und ich habe das Gefühl, dass du alles in diesem Befehl selbst festlegst.
    Ich würde dir empfehlen die Daten entweder aus einer Datenbank zu laden undoder irgendwo festzulegen, sodass du eigentlich nur sagen müsstest:



    Alternativ kannst du aber auch nur die Fraktion & den Rank ändern, sodass du beim nächsten Spawn abfragst, ob die Fraktion "xyz" ist und er daher einen neu festgelegten Spawn hat (was ich dir raten würde).
    Habe übrigens nicht ganz genau mit deinen Variablen gearbeitet, aber hoffe, dass du trotzdem verstehst worauf ich hinaus möchte.


    Hier das Gedankenkonstrukt:
    "/setleader hans 5 -> hans wird in Fraktion 5 gesetzt -> Hans bekommt DEINLEADERRANK -> beim nächsten Tod wird in einer expliziten Funktion abgefragt, welcher Fraktion er angehört -> SetSpawn bei jedem Spawn individuell"
    Diese Funktion kannst du dann auch am Ende hier anhängen, sodass er neu gespawned wird. Hoffe das war verständlich :x

    Das stimmt, aber wenn du den Spawnskin ändern willst würde ich eher die Skinvariable (sprich PlayerInfo[para1][pSkin(?)]) ändern und dann SetPlayerSkin verwenden.
    Wenn du SetSpawnInfo verwendest setzt du gleichzeitig den Spawn auf x=0.0, y=0.0, z=0.0, angle=0.0.
    Alternativ kannst du auch (falls du das nicht schon tust) die Fraktionsspawns in Variablen abspeichern und dann dort einsetzen :)

    Verändere dort einfach die SpawnInfo, dann wird der Spieler an der gewünschten Stelle gespawned :)

    Ich vermute mal, dass "IsAFightFaction" abfragt, ob es eine Gang ist, daher ein kleiner Fehler. Einfach vor die Abfrage ein "!" für die Negierung hängen.


    Code
    if(!IsAFightFaction(GetPlayerFaction(playerid)))
    {
    SendClientMessage(playerid, COLOR_RED, "Du bist in keine Gang/Mafia!");
    }


    Kleiner Tipp: Das hättest du auch schnell herausfinden können, da dir genau diese Nachricht angezeigt werden müsste :)
    - Mfg. Jan