From c2b0bcbd6c8155812857523681cd787059cd9bf9 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 3 Feb 2011 22:20:40 +0100 Subject: Core/Instances: Implemented DungeonEncounter.dbc for creating completed encounters mask to use in packets Core/Dungeon Finder: Implemented new way of giving random dungeon rewards, linked to DungeonEncounter.dbc --- src/server/game/Instances/InstanceScript.cpp | 35 ++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'src/server/game/Instances/InstanceScript.cpp') diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 348ff7a766c..231d6ab6667 100755 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -24,14 +24,19 @@ #include "Creature.h" #include "CreatureAI.h" #include "Log.h" +#include "LFGMgr.h" void InstanceScript::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()); + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPDATE_INSTANCE_DATA); + stmt->setUInt32(0, GetCompletedEncounterMask()); + stmt->setString(1, data); + stmt->setUInt32(2, instance->GetInstanceId()); + CharacterDatabase.Execute(stmt); } void InstanceScript::HandleGameObject(uint64 GUID, bool open, GameObject *go) @@ -427,3 +432,29 @@ void InstanceScript::SendEncounterUnit(uint32 type, Unit* unit /*= NULL*/, uint8 instance->SendToPlayers(&data); } + +void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 creditEntry, Unit* source) +{ + DungeonEncounterList const* encounters = sObjectMgr->GetDungeonEncounterList(instance->GetId(), instance->GetDifficulty()); + if (!encounters) + return; + + for (DungeonEncounterList::const_iterator itr = encounters->begin(); itr != encounters->end(); ++itr) + { + if ((*itr)->creditType == type && (*itr)->creditEntry == creditEntry) + { + completedEncounters |= 1 << (*itr)->dbcEntry->encounterIndex; + sLog->outDebug("Instance %s (instanceId %u) completed encounter %s", instance->GetMapName(), instance->GetInstanceId(), (*itr)->dbcEntry->encounterName[0]); + if (uint32 dungeonId = (*itr)->lastEncounterDungeon) + { + Map::PlayerList const& players = instance->GetPlayers(); + if (!players.isEmpty()) + for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) + if (Player* player = i->getSource()) + if (!source || player->IsAtGroupRewardDistance(source)) + sLFGMgr->RewardDungeonDoneFor(dungeonId, player); + } + return; + } + } +} -- cgit v1.2.3