Beiträge von Padarom

    Ich wollte mich jetzt mal nicht ganz durchlesen, aber ich habe schon von einigen gelesen, dass man doch keine Atomkraftwerke über solchen erdbebengefährdeten Gebieten baut. Ich würde folgendes dazu sagen:
    1. Wie sollen sie sonst an ihre Energie kommen? Ich glaube nicht, dass das Kraftwerk erst vor 2 Jahren erbaut wurde, sondern dass es schon etwas älter ist. Damals gab es fast noch keine der heutigen Möglichkeiten mit erneuerbaren Energien an Strom zu kommen, bzw. diese waren nicht so kommerziell. (Sorry wenn ich mich dazu irre)
    2. Glaube ich auch nicht, dass man beim Bau eines Atomkraftwerks davon ausgeht, dass ein Erdbeben mit der Stärke von 8,9/9,0 (!!) das Teil hochjagt. 2-3,0 hätte es wahrscheinlich ausgehalten, aber wer kalkuliert schon ein, dass ein ganzes Land von einem solch starken Erdbeben erschüttert wird?

    edit: Bist du sicher, dass du die aktuelle a_samp.inc hast? Scheint nämlich so, als kennt er die Standardfunktionen die ab Version 0.3 vorhanden sind nicht.

    So, sry dass es erst jetzt gepostet ist, hier ist der Rest des Tutorials (und danke für das positive Feedback :) :


    4. Command zum Tanken
    Nun schreiben wir den Command um zu tanken. Dafür gehen wir wieder in das Callback OnPlayerCommandText und geben folgenden Code ein:
    if(strcmp(cmdtext, "/tanken", true) == 0)
    {
    else if (GetPlayerVehicleSeat(playerid) != 0) return SendClientMessage(playerid,COLOR_RED,"Du bist in keinem Fahrzeug (oder kein Fahrer).");
    new car = GetPlayerVehicleID(playerid);
    else if (TanktGerade[car]) return SendClientMessage(playerid,COLOR_RED,"Du tankst schon!");
    else if (Motor[car] == true) return SendClientMessage(playerid,COLOR_RED,"Du musst vor dem Tanken den Motor ausschalten.");
    new ZuTanken = 100-Tank[car];
    new preis = ZuTanken * BENZINPREIS;
    if (GetPlayerMoney(playerid)-preis < 0) return SendClientMessage(playerid,COLOR_TOMATO,"Du hast nicht genug Geld!");
    GivePlayerMoney(playerid, -preis);
    SendClientMessage(playerid, COLOR_GREEN, "Tanken wird gestartet.");
    SetCameraBehindPlayer(playerid);
    TogglePlayerControllable(playerid,0);
    TanktGerade[car] = true;
    tanktimer[playerid] = SetTimerEx("Auftanken",500,true,"i",playerid);
    return 1;
    }
    Was machen wir hier genau? Als erstes schauen wir ob der Spieler Fahrer eines Fahrzeuges ist. Wenn ja, dann erstellen wir die Variable car mit dem Wert der FahrzeugID des Spielers. Nun überprüfen wir erstmal ob der Spieler gerade am Tanken ist und dann ob der Motor des Fahrzeuges eingeschaltet ist. Wenn alles passt, wird eine Variable namens ZuTanken erstellt, die den maximalen Tankwert - den jetzigen nimmt und somit schaut wieviel Liter zu tanken sind. Danach wird die Variable preis erstellt, die die Anzahl der zu tankenden Liter mal den BENZINPREIS (oben änderbar) errechnet. Wenn der Spieler nun zu wenig Geld zum Tanken hat erhält er erneut eine Nachricht. Jetzt beginnt aber das eigentliche Tanken:
    Der Spieler bekommt den Tankpreis abgezogen, erhält eine Nachricht, wird mit TogglePlayerControllable gefreezt und die Kamera wird hinter ihn gesetzt (da dies schöner aussieht). Dann wird der Bool TanktGerade des Fahrzeuges auf wahr gesetzt und der Tanktimer für den Spieler gestartet, der dem Fahrzeug pro Sekunde 2 Liter Benzin gibt.


    Nun müssen wir noch die beiden Timer erstellen und wir sind mit dem Tanksystem an sich fast fertig.
    public BenzinVerlust()
    {
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    if (Motor[i] == true)
    {
    Tank[i] = Tank[i]-1;
    if (Tank[i]<1)
    {
    Tank[i] = 0;
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    }
    }
    }
    return 1;
    }


    public Auftanken(playerid)
    {
    new car = GetPlayerVehicleID(playerid);
    Tank[car] = Tank[car] +1;
    if(Tank[car] >= 100)
    {
    TanktGerade[car] = false;
    Tank[car] = 100;
    SendClientMessage(playerid, COLOR_GREEN, "Dein Fahrzeug wurde vollgetankt.");
    TogglePlayerControllable(playerid,1);
    KillTimer(tanktimer[playerid]);
    }
    return 1;
    }
    Der erste Timer (BenzinVerlust) zieht dem Auto bei jeder Auslösung Benzin ab. Genau passiert dabei folgendes: Zuerst wird wieder eine Schleife erstellt, die alle Fahrzeuge durchgeht. Diese Schleife schaut zuerst, ob der Motor des Fahrzeuges an ist (Eine Abfrage ob das Auto im Moment getankt wird brauchen wir nicht, da der Motor ja so oder so aus sein muss zum tanken). Wenn ja, subtrahiert sie vom Wert des Tankes 1. Wenn der Wert nun unter 1 ist, geht der Motor des Fahrzeuges automatisch aus. Das erneute setzen des Wertes Tank(i) = 0; wird benötigt, da der Tank ansonsten auf -1, -2, -3, ... springen würde.


    Nun der zweite Timer (Auftanken): Zuerst wird die FahrzeugID des Spielers in der Variable car gespeichert. Nun wird der Tank um 1 erhöht. Ist der Wert nun größer/gleich 100 wird das Tanken gestoppt, die Variable TanktGerade auf falsch gesetzt, der Spieler bekommt eine Nachricht, kann sich wieder bewegen UND der Timer wird nun eliminiert/gestoppt, so dass das Auto nicht weiter tankt.
    Warum in der if-Funktion größer/gleich steht hat folgenden Grund: Wenn der Spieler sein Auto bereits bei einem Tankwert von 100 tankt, dann ist der Tank bei 101. Daher ist ein normales ist gleich nicht nutzvoll, da der Timer sonst immer weiter läuft. Daher wird der Tank auch wieder auf 100 gesetzt (Tank[car] = 100).


    Nun fehlt allerdings noch 1 Sache: Der Motor geht trotzdem an, obwohl der Tank leer ist. Wenn wir dies verhindern wollen müssen wir den Command /m (von oben) um folgendes erweitern:
    if(strcmp(cmdtext, "/m", true) == 0)
    {
    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new car = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(car) == 509 || GetVehicleModel(car) == 481 || GetVehicleModel(car) == 510)
    {
    SendClientMessage(playerid, COLOR_RED, "Du sitzt auf einem Fahrrad. Das hat keinen Motor!");
    }


    else if (Tank[car] < 1)
    {
    SendClientMessage(playerid, COLOR_RED, "Der Tank ist leer. Du musst erst /tanken.");
    }


    else if (Motor[car] == false )
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = true; // Setzt den Bool Motor auf true
    }


    else
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = false; // Setzt den Bool wieder auf falsch zurück.
    }
    }
    return 1;
    }

    5. TextDraw erstellen

    So, nun müssen wir noch eine Variable für das TextDraw erstellen. Das machen wir wie folgt (wo auch die anderen Variablen definiert wurden):
    new Text:Anzeige[MAX_PLAYERS];
    Damit erstellen wir die Text-Variable Anzeige, die durch MAX_PLAYERS wieder für jeden Spieler unterschiedlich sein kann. Als erstes müssen wir das TextDraw formatieren, das tun wir unter OnPlayerConnect:
    Anzeige[playerid] = TextDrawCreate(630.0,410.0," "); // Erstellt das TextDraw an X|Y-Position 630|410 (unten rechts)
    TextDrawSetOutline(Anzeige[playerid], 1); // Setzt dem TextDraw Outlines
    TextDrawAlignment(Anzeige[playerid], 3); // Macht das TextDraw rechtsbündig
    TextDrawSetShadow(Anzeige[playerid], 0); // Schaltet den Schatten des TextDraws aus
    TextDrawShowForPlayer(playerid,Anzeige[playerid]); // Zeigt das TextDraw dem Spieler


    Nun gehen wir in das Callback OnPlayerUpdate (zur Info: OnPlayerUpdate wird jedes Mal aufgerufen, wenn der Spieler Pakete an den Server sendet. Da allerdings mein Tacho etc. auch dort positioniert ist, ist dieser Platz am besten geeignet meiner Meinung nach) und setzen die Eigenschaften für das Textdraw.


    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new vehicleid;
    vehicleid = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(vehicleid) != 509 && GetVehicleModel(vehicleid) != 481 && GetVehicleModel(vehicleid) != 510)
    {
    new string[125];
    if(Tank[vehicleid] < 10) format(string,sizeof string,"~w~Tank: ~r~%i",Tank[vehicleid]);
    else if(Tank[vehicleid] < 30) format(string,sizeof string,"~w~Tank: ~y~%i",Tank[vehicleid]);
    else if(Tank[vehicleid] <= 100) format(string,sizeof string,"~w~Tank: ~g~%i",Tank[vehicleid]);
    TextDrawSetString(Anzeige[playerid],string);
    }
    }
    else
    {
    TextDrawSetString(Anzeige[playerid], " ");
    }
    Okay, nun zur Erklärung: Als erstes wird wieder überprüft, ob der Spieler Fahrer eines Fahrzeuges ist. Wenn nicht, dann wird der Inhalt des Textdraws auf " " gesetzt, also ein Leerzeichen das man nicht sieht. Wenn der Spieler allerdings in einem Fahrzeug sitzt und dieses Fahrzeug kein Fahrrad ist, dann wird der Tankinhalt des Fahrzeuges ausgelesen. Wenn er kleiner als 10 ist, dann wird der Tankinhalt in Rot dargestellt, wenn er kleiner 30 ist, in gelb und kleiner/gleich 100 in grün. Somit kann man auf einen Blick sehen, ob man noch genug Benzin hat. Nach der Überprüfung wird das TextDraw noch geupdatet.


    Ich hoffe ich konnte euch hiermit helfen.


    Mit freundlichen Grüßen
    Padarom

    Fortsetzung folgt Sontag Nachmittag, musste das Tutorial wegen 10.000-Zeichengrenze aufspalten und inzwischen bin ich nicht mehr daheim (gerade mit iPhone on und fahren in paar Stunden nach Österreich snowboarden).


    Mit freundlich. Grüßen
    Padarom

    Du musst darauf achten, dass der Server CaSe SeNsItIvE ist. Also wahrscheinlich heißt dein Script nicht "Gogo", sondern "gogo".
    Andernfalls ist es wichtig dass es beim Compilen keine Errors gab, da sonst keine .amx Datei erstellt wird, die du hosten kannst.

    Hallo,
    ursprünglich habe ich ja ein Tanksystem geschrieben, bei dem allerdings anscheinend ein paar Fehler drin waren. Dann würde ich hiermit ein neues schreiben und es gleich noch um ein Motorensystem erweiten.


    Gliederung:

    • Was erkläre ich?
    • Motorystem (Motor an/aus mit Command)
    • Tank verringern
    • Command zum Tanken
    • TextDraw zur Anzeige erstellen


    1. Was erkläre ich?
    Ich versuche euch hiermit beizubringen, wie ihr ein simples funktionierendes Motor- und Tanksystem schreiben könnt.Das ganze wird wie folgt ablaufen: Alle Fahrzeuge spawnen mit ausgeschaltetem Motor und 100 Liter Tank (abgesehen von Fahrrädern). Man steigt ein und startet ihn mit /m. Solang der Motor läuft (also solang man ihn nicht mit erneuter Eingabe von /m ausgeschaltet hat), verbraucht das Auto alle 10 Sekunden 1 Liter Benzin.Wenn der Tank leer ist, kann man ihn mit /tanken wieder für einen gewissen Betrag auffüllen (Preis änderbar).

    • Jedes Fahrzeug hat genau 100 Liter Benzin (abgesehen von Fahrrädern)
    • Der Tank sinkt bei jedem Fahrzeug gleich schnell
    • /tanken ist überall nutzbar. Wer dies nur an Tankstellen haben will, soll noch mit IsPlayerInRangeOfPoint arbeiten.
    • Das Motorsystem ist ohne das Tanksystem nutzbar, jedoch NICHT andersrum (Tanksystem nicht alleine nutzbar.
    • Für das gesamte Tutorial wird Grundwissen erwartet.


    2. Motorsystem
    Dann fangen wir mal mit dem Tutorial an. Zuerst müssen wir uns einen Boolean erstellen, ob der Motor der Fahrzeuge eingeschaltet ist. Außerdem brauchen wir noch Variablen für die VehicleParams (Motorsystem aus SAMP 0.3c). Also setzen wir an den Anfang des Scripts folgenden Code:
    new engine,lights,alarm,doors,bonnet,boot,objective; // Dies sind die Variablen die für das einschalten des Motors benötigt werden.
    new bool:Motor[MAX_VEHICLES]=false; // Dies ist die Boolean für den Motor. [MAX_VEHICLES] ist angehängt, da sie für jedes Fahrzeug unterschiedlich sein kann.


    Nun muss nach dem Spawn der verschiedenen Fahrzeuge auch noch ihr Motor ausgeschaltet werden. Also erstellen wir im Callback OnGameModeInit eine Schleife:

    ManualVehicleEngineAndLights(); // Dies muss in OnGameModeInit angegeben werden, damit das ganze System überhaupt funktioniert.


    for (new i=0; i< MAX_VEHICLES; i++)
    {
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    }


    public OnVehicleSpawn(vehicleid)
    {
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[vehicleid] = false;
    return 1;
    }
    Dabei wird durch die Schleife die Variable i erstellt, die den Wert 0 trägt und kleiner als die Anzahl aller Fahrzeuge ist (= MAX_VEHICLES) und sich bei jedem Durchlauf der Schleife um 1 erhöht.
    GetVehicleParamsEx speichert die Parameter des Fahrzeuges, das gerade in der Schleife durchlaufen wird.
    SetVehicleParamsEx schaltet dann den Motor aus, und lässt die restlichen Parameter so wie sie vorher waren.
    Die letzte Zeile der Schleife setzt den Boolean Motor (den wir oben definiert haben) für dieses Fahrzeug auf falsch.
    Danach wird noch in dem Callback OnVehicleSpawn der Motor ausgeschaltet, damit Fahrzeuge die zerstört wurden und danach respawnen auch einen ausgeschalteten Motor haben.


    Nun müssen wir allerdings noch den Command zum Starten/Ausschalten des Motors erstellen. Das geht wie folgt im Callback OnPlayerCommandText:
    if(strcmp(cmdtext, "/m", true) == 0)
    {
    if(GetPlayerVehicleSeat(playerid) == 0) // Überprüft zuerst ob der Spieler der Fahrer eines Fahrzeugs ist.
    {
    new car = GetPlayerVehicleID(playerid); // Erstellt die Variable car, die die FahrzeugID des Spielers trägt.
    if(GetVehicleModel(car) == 509 || GetVehicleModel(car) == 481 || GetVehicleModel(car) == 510) // Wenn das Fahrzeug ein Fahrrad ist,
    { // dann sende dem Spieler die Nachricht, sodass er es auch weiß.
    SendClientMessage(playerid, COLOR_RED, "Du sitzt auf einem Fahrrad. Das hat keinen Motor!");
    }


    else if (Motor[car] == false) // Ansonsten, wenn der Motor des Fahrzeugs ausgeschaltet ist (haben wir ja oben mit dem bool Motor definiert)
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective); // Selbe Prozedur wie oben
    SetVehicleParamsEx(car,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // Selbe Prozedur wie oben, nur dass der Motor nun eingeschaltet wird.
    Motor[car] = true; // Setzt den Bool Motor auf true
    }


    else // Ansonsten, wenn der Motor an ist
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = false; // Setzt den Bool wieder auf falsch zurück.
    }
    }
    return 1;
    }


    Damit wäre der Command auch erstellt. Allerdings haben wir jetzt das Problem, dass bei Fahrrädern der Motor zu Anfang auch ausgeschaltet wurde und mit einer Eingabe von /m bei Fahrrädern ja nur die Nachricht kommt, dass diese keinen Motor haben.
    Das können wir aber auch sehr leicht lösen, nämlich unter dem Callback OnPlayerEnterVehicle
    if(GetVehicleModel(vehicleid) == 509 || GetVehicleModel(vehicleid) == 481 || GetVehicleModel(vehicleid) == 510) // Überprüft ob das Fahrzeug ein Fahrrad ist (wie im Command oben)
    {
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // Speichere den derzeitigen Status
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // Behalte alles bei, aber starte den Motor.
    }
    So. Nun wären wir mit dem Motorsystem schon fertig. Wenn ihr wollt, könnt ihr nun aufhören, ansonsten aber auch gerne weitermachen und das Tanksystem auch noch in euer Script einbeziehen.


    3. Tank verringern
    Für das Tanksystem müssen wir auch erstmal einige Dinge am Anfang des Scriptes definieren:
    #define VERLUST 10000 // Die Zeit, die der Motor braucht um 1 Liter zu verbrennen in Millisekunden (Hier 10 Sekunden)
    #define BENZINPREIS 3 // Der Preis, den das Benzin pro Liter kostet (Hier 3$)


    forward BenzinVerlust(); // Wir forwarden unseren Timer für den Benzinverlust
    forward Auftanken(playerid); // Wir forwarden unseren Timer für das Tanken


    new Tank[MAX_VEHICLES], bool:TanktGerade[MAX_VEHICLES]=false, tanktimer[MAX_PLAYERS];
    Die Variable Tank steht hier für die Litermenge im Tank des einzelnen Fahrzeuges. TanktGerade ist wieder ein Boolean, der wieder für jedes Fahrzeug einzeln gilt. tanktimer wird der Timer zum Tanken für die einzelnen Spieler sein.
    Da wir den Tank für jedes Fahrzeug nun erstmal auf 100 Liter setzen wollen, müssen wir in unsere Schleife aus dem Motorensystem gehen. Außerdem benötigen wir noch den Start des Timers zum Reduzieren des Tanks. Dafür muss das Callback OnGameModeInit wie folgt aussehen:
    SetTimer("BenzinVerlust", VERLUST, true);
    for (new i=0; i< MAX_VEHICLES; i++)
    {
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    Tank[i] = 100;
    }
    Als erstes wird der Timer um die Funktion BenzinVerlust aufzurufen gesetzt. VERLUST wurde ja oben definiert und gibt die Zeit an, in der das Fahrzeug 1 Liter verliert. Die Schleife haben wir ja so bereits erstellt, allerdings ist nun noch das Tank(i) = 100;*hinzugekommen, was den Tank für jedes Fahrzeug auf 100 setzt. (* die normalen Klammern durch eckige ersetzen. Das würde allerdings kursiven Text erzeugen, daher mit normalen geschrieben.)


    Weiter geht es HIER

    Unter OnPlayerConnect musst du folgendes setzen:
    SetPlayerColor(playerid,0x000000FF);
    Damit sind die Icons zwar trotzdem da, aber mit der Farbe "Transparent", man sieht sie also nicht.


    Mit freundl. Grüßen
    Padarom

    Das geht schon, allerdings kann man das Nummernschild nicht ändern wenn man gerade im Fahrzeug ist, da dafür das Fahrzeug neu gespawnt werden muss. Nutzt du vll. dini für die Spieler-Accounts?

    Wenn ich es richtig verstanden habe, dann müsste das hier der richtige Code sein, ansonsten bitte genauer erläutern:
    public OnPlayerSpawn(playerid)
    {
    for(new i = 0;i<_cache_haus;i++)
    {
    if(!strcmp(HausDaten[i][Besitzer],spielername(playerid)))
    {
    SetPlayerPos(playerid,HausDaten[i][ax],HausDaten[i][ay],HausDaten[i][az]);
    break;
    }
    else
    {
    SetPlayerPos(playerid,1423.5933,-902.3813,56.7856);
    break;
    }
    }
    return 1;
    }


    Mit freundl. Grüßen
    Padarom

    Hiermit werden alle Bizzes aufgelistet:
    Ungetestet, aber sollte funktionieren.
    for(new i=0; i<MAX_biz; i++)
    {
    new nachricht[128];
    format(nachricht,128,"ID: %i, Besitzer: %s, Art: %s, Preis: %s", i, BizInfo[i][biz_besitzer], BizInfo[i][biz_art], BizInfo[i][biz_preis]);
    SendClientMessage(playerid, COLOR_ORANGE, nachricht);
    }
    //COLOR_ORANGE muss dann auch als die solche definiert sein.


    Mit freundl. Grüßen
    Padarom

    Danke für die Antwort, aber wie meinst du soll ich das machen? Mit dem Scriptbeispiel das ich gepostet habe?
    Ich hab das schon ein bisschen editiert, allerdings ohne weiteren Erfolg. Außer dass der Spieler nun gefreezt wird (TogglePlayerControllable).


    Mit freundl. Grüßen
    Padarom


    **edit**
    Das funktioniert jetzt soweit, der Spieler wird zum Sterbepunkt geportet und ist unbewegbar. Allerdings wird ihm keine Animation zugewiesen und er sieht die Nachricht (path) nun auch. Ich hoffe jemand kann die beiden Probleme noch fixen, danach bin ich hiermit fertig :)
    Außerdem steht nach Timerablauf anstatt dem Namen (der ja eigentlich durch SetTimerEx mitübertragen wird) nur ein D dort. Ich denke dafür muss ich den Timer nicht posten. Vll ist ja das SetTimerEx falsch? Ansonsten pls schreiben.
    if(gestorben[playerid] == true)
    {
    SetPlayerPos(playerid, Spieler[playerid][totx], Spieler[playerid][toty], Spieler[playerid][totz]);
    SetPlayerSkin(playerid, Spieler[playerid][tots]);
    ApplyAnimation(playerid,"CRACK","crckdeth2",4.0,1,1,1,1,1);
    TogglePlayerControllable(playerid, 0);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && i != playerid)
    {
    if(Spieler[i][firma1] == 2 || Spieler[i][firma2] == 2 || Spieler[i][firma3] == 2 || Spieler[i][firma4] == 2)
    {
    timer[playerid] = SetTimerEx("death", 180000, false, "is", playerid, name);
    format(path,sizeof(path),"%s ist schwer verletzt. Sofort zum Versorgen ausrücken.", name);
    SendClientMessage(i, COLOR_RED, path);
    SendClientMessage(playerid, COLOR_GREEN, "Du hattest einen schweren Unfall! Ein Krankenwagen wurde schon gerufen.");
    }

    else if (i == playerid || afk[i] == true)
    {
    SendClientMessage(playerid, COLOR_RED, "Es war kein Notarzt erreichbar, dir wurden 1000$ für die Behandlung abgezogen.");
    gestorben[playerid] = false;
    GivePlayerMoney(playerid,-1000);
    TogglePlayerControllable(playerid, 1);
    ClearAnimations(playerid);
    KillTimer(timer[playerid]);
    }
    }
    }
    }

    Hallo,
    hier mal ein weiteres Problem von mir: Ich bin dabei ein Sterbesystem zu schreiben. Folgendes sollte passieren:
    Medic ist online: Der Spieler stirbt, wird zum Sterbepunkt zurückteleportiert, die Anim Crack wird auf ihn aktiviert, er ist unbeweglich und eine Nachricht an alle Medics wird gesendet. Dabei wird ein Timer gestartet, der nach 3 Minuten abläuft. Wenn er abläuft wird der Spieler zum Krankenhaus teleportiert und ihm werden 1,5k abgezogen. Wenn ihn allerdings ein Medic rechtzeitig mit /defi wiederbeleben kann, verliert er nur 500$.
    Kein Medic ist online/afk: Der Spieler verliert 1000$ und wird zum Krankenhaus teleportiert (teleport ist noch nicht implementiert).
    Hier das Problem: Man stirbt, Medic ist online und es passiert NICHTS.



    public OnPlayerDeath(playerid, killerid, reason)
    {
    GetPlayerPos(playerid,Spieler[playerid][totx],Spieler[playerid][toty],Spieler[playerid][totz]);
    gestorben[playerid] = true;
    return 1;
    }


    // Unter OnPlayerSpawn
    if(gestorben[playerid] == true)
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(medic[i] == true)
    {
    SetPlayerPos(playerid, Spieler[playerid][totx], Spieler[playerid][toty], Spieler[playerid][totz]);
    ApplyAnimation(playerid,"CRACK","crckdeth1",4.1,1,1,1,1,1);
    TogglePlayerControllable(playerid, 0);
    timer[playerid] = SetTimerEx("death", 180000, false, "is", playerid, name);
    if(i != playerid)
    {
    format(path,sizeof(path),"%s ist schwer verletzt. Sofort zum Versorgen ausrücken.", name);
    SendClientMessage(i, COLOR_RED, path);
    SendClientMessage(playerid, COLOR_GREEN, "Du hattest einen schweren Unfall! Ein Krankenwagen wurde schon gerufen.");
    }


    else if (i == playerid || afk[i] == true)
    {
    SendClientMessage(playerid, COLOR_RED, "Es war kein Notarzt erreichbar, dir wurden 1000$ für die Behandlung abgezogen.");
    ClearAnimations(playerid);
    TogglePlayerControllable(playerid, 1);
    gestorben[playerid] = false;
    GivePlayerMoney(playerid,-1000);
    KillTimer(timer[playerid]);
    }
    }
    }
    }
    }


    Ich hoffe ihr könnt mir helfen.


    Mit freundl. Grüßen
    Padarom

    Hallo,
    ich habe mich noch nie richtig mit Split befasst, und als ich es versucht habe bin ich "gescheitert", weil ich nirgends gut erklärte Beschreibungen gefunden habe. Also frage ich für mein Vorhaben lieber hier.
    Ich gebe dafür ein Beispiel wie ich das ganze benötige und erkläre das dann im Einzelnen.
    Ich habe eine Form, in dieser existieren 7 ListBoxen. Diese sollen aber nicht unabhängig voneinander scrollbar sein. Das heißt, dass wenn man in ListBox1 nach unten scrollt, dann sollen die anderen auch nach unten scrollen, da das in etwa wie eine Tabelle ist.
    Folgende ListBoxen habe ich:
    ID - Name - Menge - Einzelpreis - Gesamtpreis - Fabrik - FabrikID
    Nun soll man ein Textdokument laden können, aus dem dann ein Split erstellt wird und auf eine Datenbank (.dll? Habe mich damit noch nicht so beschäftigt) zurückgegriffen wird.


    Folgender Inhalt hat das Textdokument:

    Code
    8 - Hotdog - Kosten: 5 - Anzahl: 5
    19 - Cola - Kosten: 3 - Anzahl: 5
    21 - Fanta - Kosten: 3 - Anzahl: 8


    Nun sollen die ListBoxen (wie oben angeordnet) folgenden Inhalt haben:

    Code
    8 - Hotdog - 5 - 5$ - 25$ - Cows Hell - 28
     19 - Cola - 5 - 3$ - 15$ - Tasty Juice - 20
     21 - Fanta - 8 - 3$ - 24$ - Tasty Juice - 20


    Das heißt, dass jede einzelne Zeile gesplittet werden soll, dann die einzelnen Bereiche zu den einzelnen ListBoxen zugewiesen werden und durch die ID noch die Fabrik herausgefunden wird (eine Auswahl von etwa 30 verschiedenen Fabriken).



    Ich hoffe jemand kann mir dabei mit der Splitfunktion und dem Einlesen der Datei helfen.
    Mit freundlichen Grüßen
    Padarom

    Danke für die Antworten, dann werde ich das Overlay erstmal außer Acht lassen und nach der Fertigstellung evtl. nochmal probieren/ mit C reinschaufeln.
    Dann aber nochmal zurück auf die Frage ob es möglich ist Befehle an SA:MP zu übertragen über eine Art Keybinder dann.

    Hallo,
    ich möchte momentan ein weiteres Programm arbeiten, dass sozusagen in Zusammenarbeit mit meinem letzten läuft.
    In diesem wird eine Datei gespeichert, deren Inhalt von dem neuen ausgelesen und in eine Liste übertragen wird.


    Nun soll man in SA:MP gehen können, wo diese Form weiterhin im Vordergrund ist. Nun soll man an eine bestimmte Position fahren, auf den Listeneintrag klicken und dann soll ingame automatisch ein bestimmter Text in den Chat geschrieben werden.


    z.B. ist der Inhalt der ersten Zeile in der ListBox:
    8 - Computer - 2000$ - 5 - 10000$ - Inlet - 153
    Das würde heißen, dass ID 8 den Namen Computer trägt und für 2000$ pro Stück verkauft wird. Es wurde 5x bestellt, also betragen die Kosten 10000$. Die Firma bei der die Computer abzuholen sind heißt "Inlet" und hat die ID 153.


    Nun sollte man eben zu der Firma fahren und auf den Eintrag drücken (s. O.) und es soll automatisch eine Chatnachricht geschrieben werden:
    "/auf 153 8 5", also Bei der Fabrik 153 die ID8 5x aufladen.


    Das einzige was ich nun wissen muss, ist erstens wie man dieses Overlay erstellt, sodass es ingame sichtbar ist und zweitens wie ich einen bestimmten Befehl an SA:MP übertragen kann. Weder die Forensuche hier, noch bei Google hat mir etwas gebracht.


    Ich hoffe ihr könnt mir helfen.
    Mit freundlichen Grüßen
    Padarom

    Ich habe aber keine TextBox, sondern eine ListBox, und ich möchte nur schauen ob das erste Zeichen ein Leerzeichen ist, und nicht ob das gesamte Feld leer ist.


    **edit**
    Habe das von Purex noch ein bisschen modifiziert und hat jetzt wie folgt geklappt:

    Code
    Dim Getrimmt As String = LTrim(ListBox1.SelectedItem)
    Dim Ungetrimmt As String = ListBox1.SelectedItem
    If (Ungetrimmt = " " + Getrimmt Or Ungetrimmt = "  " + Getrimmt Or Ungetrimmt = "   " + Getrimmt) Then
    
    
    Anzahl.Show()
    Dim Auswahl As String = ListBox1.SelectedItem
    
    
    End If


    Mit freundlichen Grüßen
    Padarom

    Hallo,
    ich habe eine kleine Frage bezüglich VB.net. Und zwar möchte ich derzeit ein Programm schreiben, in dem eine Liste mit etwa 280 Auswahlmöglichkeiten ist. Wenn man auf eine davon drückt, soll sich ein neues Frame öffnen. Nun möchte ich, dass dieses nur geöffnet wird, wenn der erste Buchstabe der Auswahlmöglichkeit ein Leerzeichen ist.
    So habe ich z.B. Dort stehen:

    Code
    Getränke
       1 - Blabla
       2 - Grüne Banane
    
    
    Essen
       3 - Lila
       4 - Pampelmuse


    Nun soll sich das Fenster nur öffnen, wenn ich auf die Auswahlmöglichkeiten drücke (Zeile 2, 3, 6 & 7). Also bei der Leerzeile ist kein Leerzeichen, also dort nicht, genauso wenig wie die Zeilen Essen und Getränke.
    Ich habe schon versucht das mit Split zu lösen, weiß aber bisher noch nicht wie.


    Ich hoffe jemand kann mir helfen.


    Mit freundlichen Grüßen
    Padarom

    Die Koordinaten stimmen, mindestens die Hälfte aller Pickups werden ja auch korrekt angezeigt.
    MAX_HOUSE ist momentan auf 500 definiert, also müsste es groß genug sein.


    **edit**
    Komischerweise gehen inzwischen auch manche der ersten Häuser nicht mehr, also bezieht sich das nicht nur auf etwa das 2. Drittel sondern nun auch auf das erste.