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:
@@ -411,6 +411,12 @@ public:
|
|||||||
if (!InstanceScript::SetBossState(type, state))
|
if (!InstanceScript::SetBossState(type, state))
|
||||||
return false;
|
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 (type == DATA_OOK_OOK)
|
||||||
{
|
{
|
||||||
if (state == DONE)
|
if (state == DONE)
|
||||||
@@ -435,26 +441,47 @@ public:
|
|||||||
return true;
|
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;
|
OUT_SAVE_INST_DATA;
|
||||||
|
|
||||||
std::ostringstream saveStream;
|
std::ostringstream saveStream;
|
||||||
|
saveStream << "S S B ";
|
||||||
|
|
||||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||||
saveStream << GetBossState(i) << ' ';
|
saveStream << GetBossState(i) << ' ';
|
||||||
|
|
||||||
saveStream << hozenSlain;
|
saveStream << hozenSlain;
|
||||||
SaveDataBuffer = saveStream.str();
|
|
||||||
|
|
||||||
SaveToDB();
|
|
||||||
OUT_SAVE_INST_DATA_COMPLETE;
|
OUT_SAVE_INST_DATA_COMPLETE;
|
||||||
NeedSave = false;
|
return saveStream.str();
|
||||||
}
|
|
||||||
|
|
||||||
std::string GetSaveData() override
|
|
||||||
{
|
|
||||||
return SaveDataBuffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Load(char const* in) override
|
void Load(char const* in) override
|
||||||
@@ -494,9 +521,6 @@ public:
|
|||||||
OUT_LOAD_INST_DATA_COMPLETE;
|
OUT_LOAD_INST_DATA_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
|
||||||
bool NeedSave;
|
|
||||||
std::string SaveDataBuffer;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
InstanceScript* GetInstanceScript(InstanceMap* map) const override
|
||||||
|
|||||||
Reference in New Issue
Block a user