Brasserie : l instance n enregistrait jamais rien

Signale en jeu : « le donjon semble avoir declenche le done total au
1er boss, je n ai plus la liste des autres boss a tuer ».

La chaine de sauvegarde etait construite par une methode Save() qui
n etait APPELEE NULLE PART. Le tampon SaveDataBuffer restait donc vide,
et InstanceScript::SaveToDB abandonne des que la chaine est vide :

    std::string data = GetSaveData();
    if (data.empty())
        return;

Ni l etat des boss ni le masque des rencontres accomplies n atteignaient
la base. Constate directement : completedEncounters = 0 et data = '' sur
l instance 3 apres un boss tue.

Second defaut cumule : Save() n ecrivait pas l en-tete « S S B » que
Load() exige pour accepter la chaine. Meme appelee, la relecture aurait
echoue -- la progression aurait ete perdue a chaque rechargement.

GetSaveData() construit desormais la chaine lui-meme, en-tete compris
(motif habituel de TrinityCore), ce qui supprime le tampon et Save().
SetBossState declenche aussi une sauvegarde : auparavant seule la mort
d un hozen en provoquait une, via SetData.

Verifie au passage, et ecarte : les 7 lignes instance_encounters ajoutees
sont bien chargees (389 -> 396 au demarrage), le drapeau DUNGEON_BOSS est
pose dynamiquement au chargement et IsDungeonBoss le relit correctement,
et DifficultyID 0 est bien etendu a toutes les difficultes de la carte.

A noter : Yan-Zhu the Uncasked (59479) n a aucun spawn sur la carte 961.
Uncle Gao (59074) est present, donc l invocation par evenement reste
plausible -- a verifier quand le donjon sera jouable jusque-la.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
SylvaniaCore deploy
2026-08-27 11:21:31 +02:00
parent b0174ab55f
commit 8238ca0925
@@ -411,6 +411,12 @@ public:
if (!InstanceScript::SetBossState(type, state))
return false;
// SylvaniaCore : sans ceci, seule la mort d'un hozen declenchait
// une sauvegarde (via SetData). Un boss tue ne laissait aucune
// trace, et la progression du donjon etait perdue au moindre
// rechargement.
SaveToDB();
if (type == DATA_OOK_OOK)
{
if (state == DONE)
@@ -435,26 +441,47 @@ public:
return true;
}
void Save()
// ==============================================================
// SylvaniaCore - sauvegarde de l'instance.
//
// SIGNALE EN JEU : « le donjon semble avoir declenche le done
// total au 1er boss, je n'ai plus la liste des autres boss ».
//
// L'instance n'enregistrait RIEN. La chaine etait construite par
// une methode `Save()` qui n'etait appelee nulle part ; le tampon
// `SaveDataBuffer` restait donc vide, et `InstanceScript::SaveToDB`
// abandonne des que la chaine est vide :
//
// std::string data = GetSaveData();
// if (data.empty())
// return;
//
// Ni l'etat des boss ni le masque des rencontres accomplies
// n'atteignaient la base. Constate directement en base :
// `completedEncounters = 0` et `data = ''` apres un boss tue.
//
// Second defaut, cumule : `Save()` n'ecrivait pas l'en-tete
// « S S B » que `Load()` exige pour accepter la chaine. Meme
// appelee, la relecture aurait echoue.
//
// `GetSaveData()` construit desormais la chaine elle-meme, en-tete
// compris. C'est le motif habituel de TrinityCore, et il supprime
// du meme coup le besoin du tampon et de `Save()`.
// ==============================================================
std::string GetSaveData() override
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "S S B ";
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
saveStream << GetBossState(i) << ' ';
saveStream << hozenSlain;
SaveDataBuffer = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
NeedSave = false;
}
std::string GetSaveData() override
{
return SaveDataBuffer;
return saveStream.str();
}
void Load(char const* in) override
@@ -494,9 +521,6 @@ public:
OUT_LOAD_INST_DATA_COMPLETE;
}
protected:
bool NeedSave;
std::string SaveDataBuffer;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override