예제 #1
0
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;
}
예제 #2
0
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());
}
예제 #3
0
    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();
        }
    }
예제 #4
0
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);
}
예제 #5
0
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();
}
예제 #6
0
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());
}
예제 #7
0
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);
}
예제 #8
0
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());
}
예제 #9
0
     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;
    }