Beiträge von Manyula

    Keine so einfache Aufgabe, aber möglich.


    Suche dir ein non-collidable Object raus und mache es mittels SetObjectMaterial transparent. Mit SetObjectMaterialText kannst du den Schriftzug darstellen. Nun musst du das Objekt an das Auto heften, mit AttachObjectToVehicle. Die genauen Offsets kannst du mit einem Offset Editor ermitteln, einfach mal googlen. ;)

    if(pInfo[playerid][Bank] >= strval(inputtext))
    {
    GivePlayerMoneyEx(playerid, strval(inputtext));
    pInfo[playerid][Bank] = pInfo[playerid][Bank] - strval(inputtext);
    format(stringDE, sizeof(stringDE), "Bitte gib den Betrag ein, den du auszahlen willst.\nWenn du alles auszahlen möchtest, klicke einfach\nauf OK, ohne einen Betrag anzugeben.\nDerzeitiger Kontostand: "#C_GREEN_E"%d$\n\n"C_GREEN_E"Zahlung erfolgreich!\nDu hast %d$ abgehoben.", pInfo[playerid][Bank], inputtext);
    format(stringEN, sizeof(stringEN), "Please enter the amount of money you want to draw.\nIf you want to draw all you have, just click\non OK, without typing in anything.\nCurrent account balance: "#C_GREEN_E"%d$\n\n"C_GREEN_E"Payment successful!\nYou withdrew %d$.", pInfo[playerid][Bank], inputtext);
    return ShowLanguageDialog(playerid, DIALOG_BANK_WITHDRAW, DIALOG_STYLE_INPUT, "Auszahlen", "Withdraw", stringDE, stringEN, "OK", "OK", "Abbrechen", "Cancel");
    }


    Das ganze spielt sich im Bankwesen beim Auszahlen ab. Wenn ein numerischer Wert eingegeben wird, soll überprüft werden, ob das, was auf der Bank ist größer oder gleich dem ist, was eingegeben wurde (wie im Code oben), damit eine Auszahlung erfolgen kann. In dem formatierten Wert ist der Wert aber nicht korrekt wiedergegeben. Ich habe probeweise 1000$ auszahlen lassen. Ausspucken tut er mir 49$.

    Ich bin mir jetzt noch nicht ganz so im Klaren darüber, wie ich den Timestamp auf der config Datei "lade". Ich habe mir mal die Y_INI Dokumentation durchgelesen und bin mehr als verwirrt... Fällt das Auslesen nun unter "Loading" oder "Reading"?

    Okay, also...


    1. Den Timestamp von 00:00Uhr global abspeichern.
    new NewDay;


    public OnServerTime(hours, minutes)
    {
    hour = hours;
    minute = minutes;


    if(hours == 0 && minutes == 0)
    {
    NewDay = gettime();
    new INI:config = INI_Open("NewDay.cfg");
    INI_WriteInt(config, "Midnight", NewDay);
    INI_Close(config);


    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerOnline(i))
    {
    switch(pInfo[i][BankAccount])
    {
    case BANK_JUNIOR_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_JUNIOR_ACCOUNT;
    case BANK_WORKER_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_WORKER_ACCOUNT;
    case BANK_CHIEF_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_CHIEF_ACCOUNT;
    case BANK_BUSINESS_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_BUSINESS_ACCOUNT;
    }
    }
    }
    }
    return 1;
    }


    Frage dazu: Wie speicher ich den aktuellen Timestamp in einer config Datei ab? Passt das so?

    Dass das eine absolut suboptimale Lösung ist, war mir von Anfang an klar.^^


    Hm, also kann ich das ganze dann per timestamp machen, wenn der Spieler zur Abrechnungszeit 00:00Uhr offline ist? Wenn er dann online ist, ist das ganze ja kein Problem.
    Wie berechne ich die Zeit, die er offline war am besten? Timestamp beim Logout in die Userfile schreiben, und beim Login wieder auslesen und auswerten?

    Hallo,


    ich habe folgendes vor:
    Jeden Tag um 00:00Uhr (Callback dafür existiert bereits, daran hapert es also nicht), soll jedem Spieler ein gewisser Betrag von seinem Bankkonto abgezogen wird, je nachdem, was für einen Accountlevel er/sie hat.


    Beispiel:
    Spieler X ist auf Level 0: 100$ Abzug.
    Spieler Y ist auf Level 2: 300$ Abzug.


    Es müssen also alle Spielerdateien im Ordner "Users" durchloopt werden, alle einzeln geöffnet werden und die eine Variable abgeändert werden.


    Das hier habe ich soweit.
    forward OnServerTime(hours, minutes);
    public OnServerTime(hours, minutes)
    {
    hour = hours;
    minute = minutes;

    if(hours == 0 && minutes == 0)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    switch(pInfo[i][BankAccount])
    {
    case BANK_JUNIOR_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_JUNIOR_ACCOUNT;
    case BANK_WORKER_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_WORKER_ACCOUNT;
    case BANK_CHIEF_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_CHIEF_ACCOUNT;
    case BANK_BUSINESS_ACCOUNT: pInfo[i][Bank] -= DEDUCTION_BUSINESS_ACCOUNT;
    }
    }
    }
    return 1;
    }


    Der Blockiert jegliche Mods (Alle Cleos und alle SAMP Mods)


    Falsch.


    Schau mal bei sixtytigers Forum vorbei, da findest du einige Mods, die sich problemfrei implementieren lassen. Ich hab auch Waffenmods und New Great Effects drinnen.
    Ist meiner Meinung nach auch der beste AC. Wird in der kompetitiven Szene und auch im ESL gerne genutzt. WIRE war der AC, der keine Mods erlaubt hat. ;)

    Hi,


    wenn ich die .xml Datei einer Map öffne, werden mir nicht mehr die einzelnen Objekte angezeigt, sondern das hier:
    <?xml version="1.0"?>
    -<meta>
    <info version="1.0.0" type="map"/>
    <map dimension="0" src="DDD.map"/>
    -<settings>
    <setting value="[ 128 ]" name="#maxplayers"/>
    <setting value="[ false ]" name="#useLODs"/>
    <setting value="[ 1 ]" name="#gamespeed"/>
    <setting value="[ 0 ]" name="#minplayers"/>
    <setting value="[ 0.0080000003799796104 ]" name="#gravity"/>
    <setting value="[ 0 ]" name="#waveheight"/>
    <setting value="[ false ]" name="#locked_time"/>
    <setting value="[ 0 ]" name="#weather"/>
    <setting value="12:0" name="#time"/>
    </settings>
    <script type="server" src="mapEditorScriptingExtension_s.lua"/>
    <script type="client" src="mapEditorScriptingExtension_c.lua" validate="false"/>
    </meta>


    Hat jmd eine Ahnung, wieso?

    COMMAND:setlevel(playerid, params[])
    {
    if(pInfo[playerid][AdminLevel] < 5 && !IsPlayerAdmin(playerid)) SendLanguageMessage(playerid, C_RED, "»ERROR« Du hast einen zu niedrigen Adminlevel, um diese Aktion auszuführen!", "»ERROR« Your admin level is too low to execute this action!");
    else
    {
    new ID,
    Level,
    stringDE[128],
    stringEN[128],
    pName[MAX_PLAYER_NAME],
    AdminName[MAX_PLAYER_NAME];

    if(sscanf(params, "ui", ID, Level)) return SendLanguageMessage(playerid, C_RED, "»ERROR« Gebrauch: /setlevel [ID] [Level]", "»ERROR« Usage: /setlevel [ID] [Level]");
    if(!IsPlayerConnected(ID)) return SendLanguageMessage(playerid, C_RED, "»WARNUNG« Dieser Spieler ist nicht online!", "»WARNING« This player is not online!");
    if(Level < 0 && Level > 5) return SendLanguageMessage(playerid, C_RED, "»ERROR« Ungültiges Level. Verfügbar: 0 bis 5.", "»ERROR« Invalid level. Available: 0 to 5.");
    if(ID == playerid) return SendLanguageMessage(playerid, C_RED, "»WARNUNG« Du kannst deinen eigenen Adminrang nicht bestimmen.", "»WARNING« You can't determine your own admin rank.");

    GetPlayerName(playerid, AdminName, sizeof(AdminName));
    GetPlayerName(ID, pName, sizeof(pName));

    if(pInfo[ID][AdminLevel] < Level)
    {
    format(stringDE, sizeof(stringDE), "»ADMIN« Admin {%06x}%s "#C_TURQUOISE_E"hat {%06x}%s "#C_TURQUOISE_E"auf "#C_GOLD_E"Level %i "#C_GREEN_E"heraufgestuft!", GetPlayerColor(playerid) >>> 8, AdminName, GetPlayerColor(ID) >>> 8, pName, Level);
    format(stringEN, sizeof(stringEN), "»ADMIN« Admin {%06x}%s "#C_GREEN_E"increased {%06x}%s"#C_TURQUOISE_E"s level to "#C_GOLD_E"level %i!", GetPlayerColor(playerid) >>> 8, AdminName, GetPlayerColor(ID) >>> 8, pName, Level);
    SendLanguageMessageToAll(C_TURQUOISE, stringDE, stringEN);
    pInfo[ID][AdminLevel] = Level;
    return 1;
    }
    if(pInfo[ID][AdminLevel] > Level)
    {
    format(stringDE, sizeof(stringDE), "»ADMIN« Admin {%06x}%s "#C_TURQUOISE_E"hat {%06x}%s "#C_TURQUOISE_E"auf "#C_GOLD_E"Level %i "#C_RED_E"herabgestuft!", GetPlayerColor(playerid) >>> 8, AdminName, GetPlayerColor(ID) >>> 8, pName, Level);
    format(stringEN, sizeof(stringEN), "»ADMIN« Admin {%06x}%s "#C_RED_E"decreased {%06x}%s"#C_TURQUOISE_E"s level to "#C_GOLD_E"level %i!", GetPlayerColor(playerid) >>> 8, AdminName, GetPlayerColor(ID) >>> 8, pName, Level);
    SendLanguageMessageToAll(C_TURQUOISE, stringDE, stringEN);
    pInfo[ID][AdminLevel] = Level;
    return 1;
    }
    }
    return 1;
    }


    Ich möchte, dass ein RCON Admin seinen Rang selbst ändern kann. Alle anderen Admins sollen nicht an ihrem eigenen Rang rumschrauben können. Also spielt sich alles in Zeile 16 ab.
    Also, wenn "ID == playerid && IsPlayerAdmin(ID)" gegeben ist, soll der Compiler den Code weiter ausführen. Ist allerdings nur "ID == playerid" erfüllt, soll der Code abgebrochen werden.

    Interaktive Mülltonnen


    Beschreibung
    Dieses kleine Filterscript enthält 89 Mülltonnen-Objekte (ObjektID 1345), die in Los Santos verteilt wurden. Tritt man einer solchen Mülltonne näher, blinkt eine kleine Infobox auf, die Informationen dazu liefert, was zu tun ist. Drückt man nun in der Nähe der Mülltonne die Aktionstaste (ALT L), so wühlt ihr durch den Müll und werdet entweder mit einem kleinen Bonus belohnt oder böse überrascht. Das Durchwühlen kann jederzeit abgebrochen werden (der Vorgang dauert einige Sekunden). Wurde eine Mülltonne geplündert, kann sie erst nach 30min wieder von einem Spieler geplündert werden. Die Zeit in Minuten könnt ihr jederzeit ändern, indem ihr das Define "MINUTE" editiert.


    Was brauche ich?
    Ihr braucht Incognitos Streamer Plugin.


    Pläne
    Ich plane San Fierro und Las Venturas auch noch mit einigen plünderbaren Mülltonnen zu versehen. Das könnte ein bisschen dauern.


    Quellcode
    Trashcan System 1.0


    Info: Die Texte sind auf Englisch. Ihr könnt sie ja an eure Wünsche anpassen.


    Vielen Dank fürs Vorbeischauen!


    Manyula

    Hallo, liebe Brotfische,


    new Float:TrashCans[][] =
    {
    {X, Y, Z, rX, rY, rZ},...
    }


    new TrashCans_ID[MAX_TRASH_CANS] = {-1,...};
    new TrashCans_InteractionField[MAX_TRASH_CANS] = {-1,...};
    Ich weise jedem Objekt eine Variable TrashCan_ID zu, weil jedes Objekt ein eigenes Interaktionsfenster, unabhängig von den anderen, hat.
    Mit jedem erstellten Objekt gibt es ein passendes Interaktionsfeld TrashCans_InteractionField in Form eines DynamicCylinders


    public OnGameModeInit()
    {
    for(new i = 0; i < MAX_TRASH_CANS; i++)
    {
    TrashCans_ID[i] = CreateDynamicObject(1345, TrashCans[i][0], TrashCans[i][1], TrashCans[i][2] , TrashCans[i][3], TrashCans[i][4], TrashCans[i][5], 0, -1);
    TrashCans_InteractionField[i] = CreateDynamicCylinder(TrashCans[i][0], TrashCans[i][1], TrashCans[i][3], TrashCans[i][3]+3.0, 2.0, 0, 0, -1);
    }
    return 1;
    }
    Hier loope ich durch die maximale Anzahl an Objekten und erstelle die Objekte + deren Interaktionsradien (DynamicCylinder) an derselben Stelle, wo die Objekte erstellt werden. Die Daten werden also aus dem Array TrashCans[][] bezogen.


    public OnPlayerEnterDynamicArea(playerid, areaid)
    {
    for(new i = 0; i < MAX_TRASH_CANS; i++)
    {
    if(areaid == TrashCans_InteractionField[i])
    {
    SendClientMessage(playerid, -1, "Press ALT to rummage through the trash.");
    }
    }
    return 1;
    }


    public OnPlayerLeaveDynamicArea(playerid, areaid)
    {
    for(new i = 0; i < MAX_TRASH_CANS; i++)
    {
    if(areaid == TrashCans_InteractionField[i])
    {
    SendClientMessage(playerid, -1, "You're out of range.");
    }
    }
    return 1;
    }
    Dieser Code ist provisorisch um zu sehen, ob das ganze denn auch funktioniert. Aber es wird mir nichts ausgegeben.