Beiträge von Warren

    Herzlich Willkommen zu diesem Tutorial!


    In diesem Tutorial versuch ich Anfängern zu erklären was ein For-Loop ist und wie er verwendet wird und Funktioniert.
    Dazu ist nicht viel wissen benötigt und man kann gleich Resultate aus diesem Tutorial erziehlen.
    Falls euch das Tutorial gefällt könnt ihr gern ein Feedback hier drunter schreiben und fragen stellen.




    Was ist eine For-Loop (Schleife)?
    Eine Schleife ist eine Kontrollstruktur d.h sie wird z.B verwendet um Code in einer Anwendung wiederholt auszuführen.
    Darunter fällt in SA-MP z.B das Hochzählen und auswerten von Daten, falls der Code in der Schleife vorhanden ist.
    Mehr dazu gibt es im Wikipedia, aber das grobste sollte erklärt sein. (Hier!)




    Was macht sie?
    Eine For-Loop zählt einen Integer bis zu einen vorgegeben Wert positiv hoch oder negativ runter und Stoppt die Schleife falls dieser Wert erreicht wird.
    Wird dieser Wert nicht definiert läuft der For-Loop so lang bis er unterbrochen wird. (Endlosschleife)




    Wozu verwendet man sie?
    Man verwendet ihn um z.B Datenabgleiche zu machen oder um Zeichenketten zu Zählen und oder sie zu Bearbeiten.
    Man kann ihn ebenso verwenden um Daten zu Zählen oder um Werte verschiedenen Datenstrukturen zuzuweisen.
    Auch wird eine Schleife oft benutzt um Datenstrukturen auszulesen und sie zu Verändern. (Was ist eine Datenstruktur?)




    Wie verwendet man sie und wie erstellt man sie?
    Es gibt verschiedene möglichkeiten einen For-Loop zu verwenden und in zu erstellen.



    Die wohl einfachste und bekannteste Form einen For-Loop zu Initialisieren ist diese:
    for(new i = 0; i < MAX_PLAYERS; i++)



    Ebenso gibt andere Formen einen Loop zu erstellen z.b diese:
    new i = 0;
    for(; i < Max; i++)

    MAX_PLAYERS ist in diesem fall eine Konstante die die maximalen Slots des Servers wiedergibt.



    Aber kommen wir zu verwenden.
    Wir haben ein Array in dem wir die Wörter, "Hallo, ich, bin, ein, Loop" gespeichert haben. (Char-Array)
    Nun möchten wir dieses Array auslesen und uns die Wörter zurückgeben lassen.


    new Words[] = {"Hallo", "ich", "bin", "ein", "Loop!"};


    for(new i = 0; i < sizeof(Words); i++)
    {
    printf("Wort %i: %s", i, Words[i]);
    }



    Ebenso können wir abfragen machen ob ein Wort schon existiert.


    new Words[] = {"Hallo", "ich", "bin", "ein", "Loop!"};


    for(new i = 0; i < sizeof(Words); i++)
    {
    if(strfind("Hallo", Words[i]) != -1)
    {
    printf("Das Wort %s existiert im Array!", Words[i]);
    }
    }



    Geschwindigkeiten?
    Natürlich geht es in SA-MP viel um Geschwindigkeit des Scripts, um eventuell Resourcen zu sparen oder einfach eine besser Peformance zu haben.
    Darunter gibt es wichtige Aspekte die man wenn möglich beachten sollte.


    Die schnellste Form eine Schleife zu verwenden ist es, als Bedinung GetMaxPlayers zu verwenden.
    Dazu definieren wir in den Globals einen neuen Wert also einen Integer in diesem fall und geben GetMaxPlayers darin aus.


    new Max_Players;


    OnGameModeInit(...)
    Max_Players = GetMaxPlayers();


    Somit können wir bei 50 Slots Servern z.B erheblich an Leistung sparen.
    Da MAX_PLAYERS seit SAMP 0.3 als 500 definiert ist und der Loop sonst jedesmal bis 500 Zählt.


    Verwendung von unserer neu definierten Variable:
    for(new i = 0; i < Max_Players; i++)


    Man könnte aber auch MAX_PLAYERS neudefinieren:
    #undef MAX_PLAYERS
    #define MAX_PLAYERS (Slots)




    Anweisungen in der Schleife?

    Es gibt verschiedene Anweisungen die man in einer Schleife verwenden kann.
    Darunter zählen "break, continue".


    Break - Unterbricht die Schleife sofort nach dem Aufruf und beendet sie.
    Continue - Falls continue aufgerufen wird fängt die Schleife mit dem nächsten Loop an. (z.B wenn schleife im 4. loop ist springt sie auf den 5.)


    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(example >= 5)
    {
    break;
    }
    }










    Ich hoffe ich konnte euch dem Loop näher bringen und euch hat dieses kleine Tutorial gefallen!


    Edit 1:
    Max zu MAX_PLAYERS geändert.
    Edit 2:
    Max_Players ( GetMaxPlayers ) hinzugefügt
    Edit 3: Edit Edit :P

    Versuch mal die X, Y, Z werte im IsPlayerInRangeOfPoint du hast nur X und Y angeben.
    Weiß gerade nicht ob Z relevant ist.
    Falls du auf einem Berg sein solltest sind das z.b z = 10 und wenn du z nicht zuweist sind es z = 0 + 3 range = zmaxdist = 3.0.




    if(newkeys == KEY_FIRE)
    {
    if(GetPlayerWeapon(playerid) == 9)
    {
    if(BaumKannRunterGehen[playerid] == 1)
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, x, y, z))
    {
    SendClientMessage(playerid, -1, "Baum gefällt!");
    }
    }
    }

    Das wird mit einer Kettensäge nicht funktionieren.


    Dann muss er abgfragen ob der Spieler die Feuertaste gedrückt hat und ob er die Chainsaw in der Hand hat.


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys == KEY_FIRE)
    {
    //Bla Bla GetPlayerWeaponId & IfInRangeOfPoint
    }


    }

    Er hat auch nicht erwähnt das wir die Hausaufgaben machen sollen und er will es auch nicht schnorren. Eben weil er keine Ahnung hat fragt er hier nach. Er wird in der Prüfung das versemmeln wenns ihm keiner erklärt also was erzählst Du eigentlich für einen Schwachsinn?


    Ist ja ok das du die Diskussion nun anfangen möchtest, aber er hat nun seine Lösung.
    Ich wollte dir damit zeigen das ich kein Problem hab ihn die Lösung zu verraten.
    Nur wenn man sich selbst hinsetzt und lernt wie es Funktioniert dann klappt es auch in der Prüfung.


    Und zur Information, ich hab dir in deiner API geholfen und dir Tipps gegeben.
    Das steht nun aber bei der Seite, Thread kann wenn der ersteller keine Fragen hat closed werden. (Stop fighting)



    Fertige Code für C++ den man in C# leicht umwandeln kann. (Fertig so wie du es möchtest)
    #include <Windows.h>
    #include <iostream>


    int personalAmount = 250;
    int allowedBills[] = {500, 200, 100, 50, 20, 10, 5};
    int gottenBills[7];


    int main(void)
    {
    for(int i = 0; i < 7; i++)
    {
    int billCount = personalAmount / allowedBills[i];
    personalAmount %= allowedBills[i];

    if(billCount != 0)
    gottenBills[i] = billCount;
    }

    for(int i = 0; i < 7; i++)
    {
    if(gottenBills[i])
    printf("Du hast %i. %i Euroscheine!\n", allowedBills[i], gottenBills[i]);
    }
    }

    Code
    betrag = betrag - scheine * array[i];


    Kann man auch durch...

    Code
    betrag %= array[i];


    ...ersetzen.


    Kommt aufs selbe bei raus. Wollte es ihn damit besser verdeutlichen. Schau mal im obrigen Beitrag, da hab ich noch von Modulo gesprochen.
    Man kann dann auch wenn man möchte if(Scheine) verwenden.

    @iFlux:
    Das ist PAWN-Code und kein C# ^^



    Das ist C++ und C++ ist ähnlich C# und somit braucht er nur sein Output verändern das er es in der Console ausgegeben bekommt.


    int personalAmount = 250;
    int allowedBills[] = {500, 200, 100, 50, 20, 10, 5};


    int main(void)
    {
    for(int i = 0; i < 7; i++)
    {
    int Scheine = personalAmount / allowedBills[i];
    personalAmount = personalAmount - Scheine * allowedBills[i];

    if(Scheine != 0)
    {
    printf("Du hast (%i) %i Euroscheine bekommen!", Scheine, allowedBills[i]);
    }
    }
    }


    Dann nimmt er antstatt "printf" halt Conole.WriteLine.

    Mach dir ein paar abfragen mit Division nimm den Wert den du an Betrag eingibt als Integer
    dann rechne durch 50, 20 u.s.w und verwende %(Modulo) um den Rest nochmals zu Dividieren.
    Am ende solltest du die Anzahl der einzelnen Scheine haben. (Du musst darauf achten das nur angaben die durch 5 geteilt werden können angeben werden müssen)


    Also z.B


    Wert = 50;
    Wert durch 500 nicht möglich.
    Wert durch 200 nicht möglich.
    Wert durch 100 nicht möglich.
    Wert durch 50 möglich = 1 Fünfziger
    Wenn 1 fünziger geht noch kleiner?
    Wert durch 20 gleich 2 zwanziger rest 10
    Rest durch 10 = 1 zehner, geht noch kleiner?
    Rest 10 durch 5 = 2 fünfer.


    Wert 80;
    Wert durch 500 nicht möglich.
    Wert durch 200 nicht möglich.
    Wert durch 100 nicht möglich.
    Wert durch 50 möglich = 1 Fünfziger rest 30
    Rest durch 20 möglich = 1 rest 10;
    Rest durch 10 möglich = 1 rest 0;
    Falls rest 10 / 5; = 2 fünfer.


    Das ganze kannst du in eine Schleife setzen und dann abfragen.
    Dein Werte lässt du dir in einem Integer-Array ausgeben und fertig. (Multidemensional oder halt Array 0 = 500 Array 1 = 200 usw)




    int personalAmount = 250;
    int allowedBills[] = {500, 200, 100, 50, 20, 10, 5};


    int main(void)
    {
    for(int i = 0; i < 7; i++)
    {
    int Scheine = personalAmount / allowedBills[i];
    personalAmount = personalAmount - Scheine * allowedBills[i];

    if(Scheine != 0)
    {
    printf("Du hast (%i) %i Euroscheine bekommen!", Scheine, allowedBills[i]);
    }
    }
    }



    Ist es was Schulisches? Dann bitte ich dir deine Hausaufgabe persönlich zu lösen.


    Ich brauch meinen Post-Count nicht erhöhen. Wollen ja nicht damit anfangen wie du mir mal hinterher gelaufen bist deine API zu schreiben.
    Was bringt es dir die Hausaufgaben zu Schnorren wenn du in der Prüfung keine Ahnung hast wie es funktioniert? Macht sinn oder?

    Laut meiner Glaskugel ist das CP sowie nur Müll.
    Wenn man ehrlich ist, ist sind Control Panel nicht schwer zu Schreiben.
    Schau dir mal im Internet ein paar PHP Bücher an und versuch dein Glück.
    Es wird dir höchstens 2 Wochen dauern, wenn du erfahrung hast, ein CP zu bauen.


    Ehrlich, es ist nicht böse gemeint.
    Wenn man sich ein "Projekt" anschaut, was man nicht versteht, hilft das auch nicht beim lernen.
    Du musst die Grundkenntnisse besitzen um zu verstehen was ein "Code" tut.


    Beispiel:
    for(new int = 0; i < sizeof(strValue); i++)
    {
    if(strfind("Heroes", strValue[i]) != -1)
    {
    printf("Your magic word %s has been found!", strValue[i]);
    }
    }


    Wenn du nicht weißt was ein For-Loop ist und sie nicht verstehst, wirst du nun schon am Ende sein.
    Du musst verstehen wie ein For-Loop funktioniert und was er tut.
    Ebenso brauchst du wissen was ein "Array" ist oder ein "Multidimensionales-Array".
    Wie wird ein Array ausgelesen? (0, 1, 2, 3, ...) und so weiter.


    Das CP verdient die 3 großen G's.
    Gesehen - Gelacht - Gelöscht.

    Schau mal ob du deine Firewall Black Ops blockt und nicht zu lässt das Daten an den Server gesendet werden.
    Falls dies nicht der Fall ist, versuch in Steam mal nach Fehler zu suchen. (Rechtsklick auf das Spiel -> Eigenschaften -> ...)
    Wenn es dann noch nicht geht, neuinstallation.



    Schade das Black Ops 2 auf dem PC sogut wie Tot ist.




    Herzlich willkommen in diesem Thread!
    In diesem Thread moechte ich euch die Chance bieten in meinem Team als Mapper & Supporter oder Admin taetig zu sein!
    Weitere Informationen gibt es wenn ihr nun weiter lest!



    Informationen zum Projekt
    In unserem Projekt geht es rein um einen RolePlay-Server der viel in Los Santos & San Fierro spielen soll.
    Es werden neue Ideen in den Gamemode gebracht um mit der Konkurenz mitzuhalten.
    Die Ideen & Tipps von Usern werden wir dabei natuerlich beachten.
    Natuerlich wird dabei klein angefangen um mit den Jahren das Script auszubauen.
    Es wird von dem Blank Gamemode auf von uns aufgezogen und ohne Copy & Paste gescriptet.



    Zum Projektleiter
    Ich Dominik (18. Jahre) bin der Projektleiter vom ganzen und werde das Team zusammen halten.
    Durch meine erfahrung an der Programmierung mit C++ faellt es mir leicht in Pawn zu Scripten.
    Dadurch gibt es keine Komplikationen beim einbau von groesseren Ideen in den Gamemode.
    Das Script wird von mir Sauber und Ordentlich per Hand geschrieben.
    Es wird auch darauf geachtet alles so klein wie moeglich zu halten auch wenn es keine OO gibt.



    Was suchen wir nun?
    Wir suchen Mapper, Administratoren sowie Supporter die uns dabei Helfen den Server aufzubauen.
    Jeder der sich bei uns im Team bewirbt sollte sich klar sein das er auch Ar­ran­ge­ment zeigen muss.
    Es sollte dabei aufgepasst werden Respekt und Treue zu zeigen und Ehrlich helfen.
    Aktivitaet steht natuerlich mit an erster Stelle, wer keine Aktivitaet zeigt ist auch nicht fuers Team gemacht.
    Kannst du gut Mappen? Auch schoen und realistisch? Dann suchen wir Dich!
    Hast du Spass dabei deine Maps fuer andere Spieler verfuegbar zu machen, bist du genau richtig!



    Wie kann ich micht Bewerben?
    Ganz einfach, send mir einfach eine Privatnachricht im Forum oder Kontaktier mich in Skype. (Name: grab.uc)
    Nachdem du dich Beworben hast und etwas ueber dich erzaehlt hast Laden wir dich bei uns ins Teamspeak ein.
    Sollten wir uns fuer dich entschieden haben, heissen wir dich herzlich Willkommen im TEAM!



    Kontaktdaten
    Skype: grab.uc
    Teamspeak: clearvision-api.de (iFluX)




    ______
    Unverbindlicher Hinweis: Die Sicherheit einer Transaktion kann am besten durch die Einschaltung eines Mittelsmannes gewaehrleistet werden. Weitere Informationen dazu gibt es hier.

    Ich hab nun angefangen mir das Tool mal etwas genauer anzuschauen.
    An sich ist es eine tolle und nette Sache die ihr da zusammen Geschrieben habt.
    Jedoch überzeugt mich die Auto-Korrektur und die ganzen Funktionsnamen nicht.
    Wenn man viel mit der Tastatur arbeitet und nicht groß die Maus bewegt gibt es einige Defizite.


    Aber für die ganze Arbeit und alles echt SUPER! :)

    Ich mag zwar einen neuen Account auf Breadfish haben und deswegen noch keine Beiträge haben. Das heißt aber nicht, dass ich unprofessionel oder schlecht bin. Besonders dann nicht, wenn ich sogar als Beweis meine RL-Daten via PN mitschicke. Finde es sehr schade, dass man hier dann so abgestempelt wird. Als nicht vertrauenswürdig weil ich "zu wenig" Beiträge habe. Schade schade..




    Ahja. Wayne?

    Danke das du eine so konstruktive Meinung abgegeben hast.
    Nur weil hier jemand Online ist der dir in der SA-MP-Szene nichts bedeutet heißt das noch lang nichts.
    Aber man muss sich im Forum ja behaupten und große reden schwingen.


    Das "Runtime Environments" was du meinst, ist nicht das wofür du es hällst.
    Es ist nicht mehr als ein Interpreter Framework .
    Das bekannteste und kompatibelste ist "Mono".
    Aber warum sollte man überhaupt sich die Mühe machen, das mit Mono laufen zu lassen,
    wenn man effektiver über Crossplattform hinbekommen würde ?


    Wenn ich möchte könnt ich das es über jegliche Plattformen läuft auch z.b Python verwenden. Nils.

    Also ich find die Idee nicht schlecht jeder hat seine eigenen Meinungen und Methoden Sicherheit bzw. Lücken zu schliessen. Wenn du es so machen willst dann mach es auch so. Man kennt ja die Leute hier im forum die sich was auf ihre beitragsanzahl einbilden. Meine Frage wäre gibt es ein Webinterface bereits für dein System oder wird es ein Panel für Administratoren im Client geben ?


    Nein, der Client wird an sich kein Panel haben. Da mir das doch ein bisschen zu Riskant ist den Usern anzubieten.
    Wenn du möchtest kannst du dir das Webpanel mal Live anschauen. :)


    Client:


    Der Launcher ist in C# geschrieben und der Client der alles Managed in C++.
    Das Gamescript hat dann den Code um alles zu Authorisieren.


    Warum C# fragen sich manche?
    Da ich mich nicht groß mit MFC oder anderen GUI Lib's beschäftigt hab ist der Launcher in C# geschrieben ohne das er wichtigen Code beinhaltet.
    Der Client wird dann per C# Launcher gestartet und ließt dann Parameter aus sowie Configs die Namen weiter geben vom Spieler etc.