Oder so ja. Find quest trigger in metin2 aber extrem nützlich und viel zu selten genutzt.
Man kann so viel schönes machen mit einem "when enter begin" oder "when boot begin" oder "when pick_item" begin usw.
Also eigene Trigger schreiben ist glaub nie verkehrt, erhöht nur die Möglichkeiten an schönen Quests!
Danke nochmal, ich brauchs zwar nicht - Aber ist ein schöner Release
Habe die 2. Variante über ein Config File mit eingefügt. Ist getestet und funktioniert.
Da ich dich als Developer sehr schätze würde es mich freuen, falls du noch Feedback zu meinem Code hast.
Alles anzeigen
Zunächst ein Mal: Vielen Dank!
Dann möchte ich grundsätzliche Dinge ansprechen, der Code ist an sich aber recht schlüssig und das Wichtigste: Er erklärt sich selbst, deshalb..
1.) Unnötige Kommentare weglassen
- p.lValue = 0; //The value can be given as a parameter if you dont want to set the value to 0
ist das Selbe wie:
- int costs = ...; // This variable contains the costs for ... in an ... bla bla bla
Offensichtliche Dinge nicht kommentieren, Kommentare nur dann wenn wirklich der Code zu komplex wird und du das Gefühl hast, dass du nach etwa 6 Monaten nicht mehr weißt wie und was da stehen könnte.
2.) using namespace std;
- void ResetDungeonsOnReboot(const string& name)
Durch diesen Funktionsheader schließe ich darauf, dass du irgendwo im Code (wahrscheinlich in der stl.h oder typedef.h / stdafx.h) folgendes stehen hast:
Zu diesem Codeschnipsel gibt es ganz viele Videos die es verteufeln aber ich versuche mal ein simples Beispiel zu machen wo es eben problematisch wird:
- #include <iostream>
- inline int cout()
- {
- return 0;
- }
- int main()
- {
- cout << " I wanted to say hello!!";
- return EXIT_SUCCESS;
- }
Alles anzeigen
Das ist eig. selbsterklärend, dadurch dass die STL so groß ist (Etwa 300.000 Zeilen hat alleine der iostream Header), gibt es sehr viele Funktions und Variablendeklarationen. Benennst du deine Variablen / Funktionen auch so, dann gibt es Kompilierprobleme und so wie du Visual Studio kennst sind diese Fehler nicht lesbar und absolut unübersichtlich. Bei diesen 12 Zeilen ist das vllt. unproblematisch, aber bei einem Projekt mit > 1.000.000 Zeilen Code wirds schwierig mit der Fehlersuche.
Deshalb ist empfohlen überall "using namespace std;" zu löschen und folgendes überall zu tun (explizit statt implizit):
- void ResetDungeonsOnReboot(const std::string& name)
3.) Über C-Style Listen iterieren mit Auto keyword:
Statt
- int dungeonCount = sizeof(dungeons)/sizeof(dungeons[0]);
- for(int i = 0; i < dungeonCount; i++) {
- ResetDungeonsOnReboot(dungeons[i]);
- }
kannst du:
- std::string dungeonFlags[2] = { "BT_group_inside", "d_run_group_inside" }; //replace size of array and elements to your needs
- for (const auto& flag : dungeonFlags)
- {
- // flag ist dein std::string z.B: BT_group_inside, dann d_run_group_inside ...
- }
machen, sieht schöner aus und ist unter umständen auch schneller. Bei 2 Elementen macht das aber keinen Unterschied, du sparst dir aber aufjedenfall die temporäre Variable 'i' im Stack. Kann schon mal StackOverflow's geben, wenn du sone Variable ungehindert inkrementierst in einer Render oder Update Funktion.
4.) ++i statt i++ In For-Loops
Sagen wir du MUSST eine temporäre Variable i nutzen zum Durchitterrieren über custom Datentypen, die nur so funktionieren. Dann immer ++i statt i++, warum erkläre ich dir jetzt. Erst Mal der Fehler:
- for(int i = 0; i < dungeonCount; i++) {...}
Rein von der Logik her, was muss C++ bei i++ machen? Er muss i inkrementieren aber den alten Wert zurückgeben vor der Inkrement-Operation also:
- // Pseudocode, kompiliert so nicht
- HEADER(int& val) {
- int old = val;
- val = val + 1;
- return old;
- }
Jetzt schauen wir uns mal ++i an, hier muss er i inkrementieren und den neuen Wert zurückgeben:
- HEADER(int& val) {
- val = val + 1;
- return val;
- }
Das ist eine Operation weniger und macht höchstwahrscheinlich auch keinen Unterschied weil alle gängigen Compiler extrem schlau sind und dein "i++" als "++i" lesen. Aber besser selbst drauf achten und dem Compiler diese Denkarbeit abnehmen. Jetzt weißt dus ja besser.
5) Schlusswort.
Den Rest möchte ich gar nicht so deep kommentieren, denn das ist mehr Codestil und persönliche Entscheidung. Ich persönlich finde alle Fileoperationen von C einfach nur hässlich und buganfällig und würde für jede davon eine C++ Alternative Library nutzen. Dazu gabs von Marty seine eigenst angefertigte, ansonsten kann ich dir auch die STL von EA Sports Entertainment empfehlen, die haben eine performantere Version davon veröffentlicht. Schaus dir mal an.