VOID FASTCALL CBattle::CopyMagicAndCraftData(PMONSTER_STATUS MSData) { PUSHORT MagicList; ULONG_PTR MaxMagicNumber; PCRAFT_AI_INFO Magic; if (!IsCustomChar(MSData->CharID)) return; MaxMagicNumber = countof(MSData->MagicAiInfo); Magic = MSData->MagicAiInfo; MagicList = GetSaveData()->GetChrMagicList() + MSData->CharID * MaxMagicNumber; for (ULONG_PTR Count = countof(MSData->MagicAiInfo); Count; --Count) { if (Magic->CraftIndex == 0) break; --MaxMagicNumber; ++Magic; } for (; MaxMagicNumber; ++Magic, ++MagicList, --MaxMagicNumber) { Magic->CraftIndex = *MagicList; Magic->AriaActionIndex = 6; Magic->ActionIndex = 7; Magic->Condition = 0; } *(PVOID *)_AddressOfReturnAddress() = (PVOID)0x9A37F4; }
void InstanceData::SaveToDB() { std::string data = GetSaveData(); if (data.empty()) return; CharacterDatabase.escape_string(data); CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%d'", data.c_str(), instance->GetInstanceId()); }
void SetData(uint32 type, uint32 data) { switch(type) { case DATA_SLAD_RAN_EVENT: m_auiEncounter[0] = data; if (data == DONE) { GameObject* pGo = instance->GetGameObject(uiSladRanAltar); if (pGo) pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); } break; case DATA_MOORABI_EVENT: m_auiEncounter[1] = data; if (data == DONE) { GameObject* pGo = instance->GetGameObject(uiMoorabiAltar); if (pGo) pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); if (bHeroicMode) HandleGameObject(uiEckTheFerociousDoor,true); } break; case DATA_DRAKKARI_COLOSSUS_EVENT: m_auiEncounter[2] = data; if (data == DONE) { GameObject* pGo = instance->GetGameObject(uiDrakkariColossusAltar); if (pGo) pGo->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_UNK1); } break; case DATA_GAL_DARAH_EVENT: m_auiEncounter[3] = data; if (data == DONE) { HandleGameObject(uiGalDarahDoor1,true); HandleGameObject(uiGalDarahDoor2,true); } break; case DATA_ECK_THE_FEROCIOUS_EVENT: m_auiEncounter[4] = data; if (bHeroicMode && data == DONE) HandleGameObject(uiEckTheFerociousDoorBehind,true); break; } if (data == DONE) { strInstData = GetSaveData(); SaveToDB(); } }
void InstanceScript::SaveToDB() { std::string data = GetSaveData(); if (data.empty()) return; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_INSTANCE_DATA); stmt->setUInt32(0, GetCompletedEncounterMask()); stmt->setString(1, data); stmt->setUInt32(2, instance->GetInstanceId()); CharacterDatabase.Execute(stmt); }
void InstanceData::SaveToDB() { std::string data = GetSaveData(); if (data.empty()) return; static SqlStatementID updateInstance; SqlStatement stmt = RealmDataDatabase.CreateStatement(updateInstance, "UPDATE instance SET data = ? WHERE id = ?"); stmt.addString(data); stmt.addUInt32(instance->GetInstanceId()); stmt.Execute(); }
void InstanceScript::SaveToDB() { std::string data = GetSaveData(); if (data.empty()) return; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPDATE_INSTANCE_DATA); stmt->setUInt32(0, GetCompletedEncounterMask()); stmt->setString(1, data); stmt->setUInt32(2, instance->GetInstanceId()); CharacterDatabase.Execute(stmt); // Update completed encounters cache when updating instance data sInstanceSaveMgr->SetCompletedEncounters(instance->GetInstanceId(), instance->GetId(), instance->GetDifficulty(), GetCompletedEncounterMask()); }
void InstanceScript::SaveToDB() { std::string data = GetSaveData(); //if (data.empty()) // pussywizard: encounterMask can be updated and theres no reason to not save // return; // pussywizard: InstanceSave* save = sInstanceSaveMgr->GetInstanceSave(instance->GetInstanceId()); if (save) save->SetInstanceData(data); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_INSTANCE_SAVE_DATA); stmt->setString(0, data); stmt->setUInt32(1, instance->GetInstanceId()); CharacterDatabase.Execute(stmt); }
void InstanceData::ResetEncounterInProgress() { // this will only reset encounter state to NOT_STARTED, it won't evade creatures inside of map, better option is to override it in instance script Load(GetSaveData().c_str()); }
void Update(uint32 diff) { // Spawn the support for the bridge if necessary if (spawnSupport) { GameObject* pSladRanStatue = instance->GetGameObject(uiSladRanStatue); if (GameObject* pGOBridge = pSladRanStatue->SummonGameObject(193188,1775.16f, 743.455f, 119.073f, -1.5708f,0,0,0,0,0)) pGOBridge->SetGoState(GO_STATE_READY); spawnSupport = false; } // If there is nothing to activate, then return if (!toActivate) return; if (timer < diff) { timer = 0; if (toActivate == (uint64)-1) { toActivate = 0; GameObject* pSladRanStatue = instance->GetGameObject(uiSladRanStatue); GameObject* pMoorabiStatue = instance->GetGameObject(uiMoorabiStatue); GameObject* pDrakkariColossusStatue = instance->GetGameObject(uiDrakkariColossusStatue); GameObject* pGalDarahStatue = instance->GetGameObject(uiGalDarahStatue); if (pSladRanStatue && pMoorabiStatue && pDrakkariColossusStatue && pGalDarahStatue) { pSladRanStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); pMoorabiStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); pDrakkariColossusStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); pGalDarahStatue->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); // Add the GO that solidifies the bridge so you can walk on it spawnSupport = true; strInstData = GetSaveData(); SaveToDB(); } } else { uint32 spell = 0; GameObject* pAltar = NULL; if (toActivate == uiSladRanStatue) { spell = 57071; pAltar = instance->GetGameObject(uiSladRanAltar); } else if (toActivate == uiMoorabiStatue) { spell = 57068; pAltar = instance->GetGameObject(uiMoorabiAltar); } else if (toActivate == uiDrakkariColossusStatue) { spell = 57072; pAltar = instance->GetGameObject(uiDrakkariColossusAltar); } // This is a workaround to make the beam cast properly. The caster should be ID 30298 but since the spells // all are with scripted target for that same ID, it will hit itself. if (pAltar) if (Creature* trigger = pAltar->SummonCreature(18721, pAltar->GetPositionX(), pAltar->GetPositionY(), pAltar->GetPositionZ() + 3, pAltar->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN, 5000)) { // Set the trigger model to invisible trigger->SetDisplayId(11686); trigger->CastSpell(trigger, spell, false); } if (GameObject* statueGO = instance->GetGameObject(toActivate)) statueGO->SetGoState(GO_STATE_READY); toActivate = 0; if (phase == 3) QueueActivation((uint64)-1, 3000); else { strInstData = GetSaveData(); SaveToDB(); // Don't save in between last statue and bridge turning in case of crash leading to stuck instance } } } else timer -= diff; }