Hallo,
ich war gerade dabei eine etwas spannendere Hochzeit zu schreiben und dabei sind mir einige Ungereimtheiten und nicht nötige Abfragen von ymir aufgefallen, die ich mit euch teilen wollte.
Bei Fehlern im Tutorial einfach kommentieren.
1. Unnötige Abfrage in "marriage_wedding_is_playing_music" in questlua_marriage.cpp:
ersetzen mit:
Erklärung: Die Funktion IsPlayingMusic gibt bereits einen boolean zurück, pWedding kann in dieser Stelle nicht NULL bzw. ein nullptr sein, da die Funktion hier nur auf der Marriage-Map selbst ausgeführt wird. Gestützt wird das durch die unzähligen anderen Funktion in der questlua_marriage.cpp, die diesen Pointer auch nicht vorher prüfen.
2. Ungenutzte Variable in "ShoutInMap" in marriage.cpp:
suchen und ersetzen mit:
Erklärung: Nun kann die ShoutInMap Funktion auch genutzt werden um ganz normale Chatnachrichten in der Map zu senden, Beispiel gefällig?
3. Nullpointer Fix in "marriage_wedding_client_command" in questlua_marriage.cpp:
In der Funktion suchen:
ersetzen mit
Erklärung: Sollte der Pointer Null sein, kann man nicht auf pWeddingInfo zugreifen. In allen anderen Funktion wird das auch vorher abgefragt, nur hier nicht. Who knows why.
4. Bonus: wedding_is_dark und wedding_is_snow Funktionen, um einfacherere Quests schreiben zu können:
In wedding.cpp irgendwo unter public: einfügen:
In questlua_marriage.cpp folgende Funktionen irgendwo einfügen im namespace marriage:
- ALUA(marriage_wedding_is_dark)
- {
- LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
- marriage::TMarriage *pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID());
- if (!pMarriage)
- {
- sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName());
- return 0;
- }
- if (pMarriage->pWeddingInfo)
- {
- marriage::WeddingMap *pWedding = marriage::WeddingManager::instance().Find(pMarriage->pWeddingInfo->dwMapIndex);
- lua_pushboolean(L, pWedding->IsDark());
- return 1;
- }
- lua_pushboolean(L, false);
- return 1;
- }
- ALUA(marriage_wedding_is_snow)
- {
- LPCHARACTER ch = CQuestManager::instance().GetCurrentCharacterPtr();
- marriage::TMarriage *pMarriage = marriage::CManager::instance().Get(ch->GetPlayerID());
- if (!pMarriage)
- {
- sys_err("pid[%d:%s] is not exist couple", ch->GetPlayerID(), ch->GetName());
- return 0;
- }
- if (pMarriage->pWeddingInfo)
- {
- marriage::WeddingMap *pWedding = marriage::WeddingManager::instance().Find(pMarriage->pWeddingInfo->dwMapIndex);
- lua_pushboolean(L, pWedding->IsSnow());
- return 1;
- }
- lua_pushboolean(L, false);
- return 1;
- }
Unten in der Tabelle folgende zwei Einträge einfügen:
Dies erlaubt nun Togglefunktionalitäten in Quests wie hier als Beispiel aus meiner Hochzeitsquest:
- when WEDDING_MANAGER.click with pc.is_engaged_or_married() and marriage.in_my_wedding() begin
- local sel = select3("Wetter togglen", "Schnee togglen")
- if sel == -1 then return end
- if sel == 1 then
- marriage.wedding_dark(not marriage.wedding_is_dark())
- elseif sel == 2 then
- marriage.wedding_snow(not marriage.wedding_is_snow())
- end
- end