Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
[patch/dev] Рандомные Виклики/Дейлики
В общем решил написать патч на поддержку рандомных деликов и викликов.
Чтобы сразу понятно было вот вам скриншоты
Так выглядит на оффе виклик...............................вот к примеру дейлик
А вот как выглядит это все на мангосе
виклик- - -- - -- - - - - -- - - -- -- - - - -- - - - - - -- - -- - - дейлик
Собственно патч
Код:
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 5746f7d..c497bf7 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -6968,6 +6968,84 @@ void ObjectMgr::LoadCreatureInvolvedRelations()
}
}
+void ObjectMgr::LoadCurentWeekly()
+{
+ mCurWeekly.clear();
+
+ QueryResult *result = WorldDatabase.Query("SELECT quest_group,quest FROM quest_curent_weekly");
+
+ uint32 count = 0;
+
+ if( !result )
+ {
+ barGoLink bar( 1 );
+ bar.step();
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u curent weekly", count );
+ return;
+ }
+
+ barGoLink bar((int) result->GetRowCount() );
+
+ Field* fields;
+ do
+ {
+ bar.step();
+ fields = result->Fetch();
+ uint32 group=fields[0].GetUInt32();
+ uint32 quest=fields[1].GetUInt32();
+
+ sObjectMgr.mCurWeekly.insert(std::make_pair(group,quest));
+
+ ++count;
+ } while ( result->NextRow() );
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u curent weekly", count );
+}
+
+void ObjectMgr::LoadCurentDaily()
+{
+ mCurDaily.clear();
+
+ QueryResult *result = WorldDatabase.Query("SELECT quest_group,quest FROM quest_curent_daily");
+
+ uint32 count = 0;
+
+ if( !result )
+ {
+ barGoLink bar( 1 );
+ bar.step();
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u curent daily", count );
+ return;
+ }
+
+ barGoLink bar((int) result->GetRowCount() );
+
+ Field* fields;
+ do
+ {
+ bar.step();
+ fields = result->Fetch();
+ uint32 group=fields[0].GetUInt32();
+ uint32 quest=fields[1].GetUInt32();
+
+ sObjectMgr.mCurDaily.insert(std::make_pair(group,quest));
+
+ ++count;
+ } while ( result->NextRow() );
+
+ delete result;
+
+ sLog.outString();
+ sLog.outString( ">> Loaded %u curent daily", count );
+}
+
void ObjectMgr::LoadReservedPlayersNames()
{
m_ReservedNames.clear(); // need for reload case
diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h
index 9afc138..670c48b 100644
--- a/src/game/ObjectMgr.h
+++ b/src/game/ObjectMgr.h
@@ -209,6 +209,7 @@ typedef UNORDERED_MAP<uint32,PageTextLocale> PageTextLocaleMap;
typedef UNORDERED_MAP<int32,MangosStringLocale> MangosStringLocaleMap;
typedef UNORDERED_MAP<uint32,GossipMenuItemsLocale> GossipMenuItemsLocaleMap;
typedef UNORDERED_MAP<uint32,PointOfInterestLocale> PointOfInterestLocaleMap;
+typedef std::map<uint32,uint32> CurWeeklyOrDaily;
typedef std::multimap<uint32,uint32> QuestRelations;
typedef std::multimap<uint32,ItemRequiredTarget> ItemRequiredTargetMap;
@@ -629,11 +630,16 @@ class ObjectMgr
void LoadGameobjectInvolvedRelations();
void LoadCreatureQuestRelations();
void LoadCreatureInvolvedRelations();
+ void LoadCurentWeekly();
+ void LoadCurentDaily();
QuestRelations mGOQuestRelations;
QuestRelations mGOQuestInvolvedRelations;
QuestRelations mCreatureQuestRelations;
QuestRelations mCreatureQuestInvolvedRelations;
+
+ CurWeeklyOrDaily mCurWeekly;
+ CurWeeklyOrDaily mCurDaily;
void LoadGameObjectScripts();
void LoadQuestEndScripts();
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index e1be3a8..fcd077e 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -13058,6 +13061,9 @@ void Player::PrepareQuestMenu( uint64 guid )
Quest const* pQuest = sObjectMgr.GetQuestTemplate(quest_id);
if(!pQuest) continue;
+ if(!pQuest->IsCurWeeklyOrDaily(pObject->GetEntry()))
+ continue;
QuestStatus status = GetQuestStatus( quest_id );
if (pQuest->IsAutoComplete() && CanTakeQuest(pQuest, false))
diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp
index e2d86ca..a1594f0 100644
--- a/src/game/QuestDef.cpp
+++ b/src/game/QuestDef.cpp
@@ -270,3 +270,24 @@ bool Quest::IsAllowedInRaid() const
return sWorld.getConfig(CONFIG_BOOL_QUEST_IGNORE_RAID);
}
+
+bool Quest::IsCurWeeklyOrDaily(uint32 Entry) const
+{
+ if(!IsDailyOrWeekly() || !ExclusiveGroup) return true;
+ CurWeeklyOrDaily* CurQuest=IsWeekly()?&sObjectMgr.mCurWeekly:&sObjectMgr.mCurDaily;
+ CurWeeklyOrDaily::iterator it=CurQuest->find(ExclusiveGroup);
+ if(it==CurQuest->end())
+ {
+ QuestRelations* pObjectQR = &sObjectMgr.mCreatureQuestRelations;
+ std::vector<int> qList;
+ for(QuestRelations::const_iterator i = pObjectQR->lower_bound(Entry); i != pObjectQR->upper_bound(Entry); ++i)
+ qList.push_back(i->second);
+
+ uint32 randQuest=qList[urand(0,qList.size()-1)];
+ CurQuest->insert(std::make_pair(ExclusiveGroup,randQuest));
+ WorldDatabase.PExecute("INSERT INTO quest_curent_%s (quest_group,quest) VALUES ('%u','%u')",IsWeekly()?"weekly":"daily",ExclusiveGroup,randQuest);
+
+ if(CurQuest->find(ExclusiveGroup)->second==QuestId) return true;
+ } else if(it->second==QuestId) return true;
+ return false;
+}
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index 6e62e37..ec418fa 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -259,7 +259,7 @@ class Quest
bool IsDailyOrWeekly() const { return QuestFlags & (QUEST_FLAGS_DAILY | QUEST_FLAGS_WEEKLY); }
bool IsAutoAccept() const { return QuestFlags & QUEST_FLAGS_AUTO_ACCEPT; }
bool IsAllowedInRaid() const;
-
+ bool IsCurWeeklyOrDaily(uint32 Entry) const;
// multiple values
std::string ObjectiveText[QUEST_OBJECTIVES_COUNT];
uint32 ReqItemId[QUEST_ITEM_OBJECTIVES_COUNT];
diff --git a/src/game/World.cpp b/src/game/World.cpp
index f29bc10..3f5c59f 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1052,6 +1052,12 @@ void World::SetInitialWorldSettings()
sLog.outString( "Loading Quests..." );
sObjectMgr.LoadQuests(); // must be loaded after DBCs, creature_template, item_template, gameobject tables
+ sLog.outString( "Loading Curent Weekly..." );
+ sObjectMgr.LoadCurentWeekly();
+
+ sLog.outString( "Loading Curent Daily..." );
+ sObjectMgr.LoadCurentDaily();
+
sLog.outString( "Loading Quest POI" );
sObjectMgr.LoadQuestPOI();
@@ -1980,11 +1998,13 @@ void World::InitDailyQuestResetTime()
void World::ResetDailyQuests()
{
DETAIL_LOG("Daily quests reset for all characters.");
CharacterDatabase.Execute("DELETE FROM character_queststatus_daily");
+ WorldDatabase.Execute("DELETE FROM quest_curent_daily");
for(SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
if (itr->second->GetPlayer())
itr->second->GetPlayer()->ResetDailyQuestStatus();
-
+ if(!sObjectMgr.mCurDaily.empty())
+ sObjectMgr.mCurDaily.clear();
m_NextDailyQuestReset = time_t(m_NextDailyQuestReset + DAY);
CharacterDatabase.PExecute("UPDATE saved_variables SET NextDailyQuestResetTime = '"UI64FMTD"'", uint64(m_NextDailyQuestReset));
}
@@ -1993,10 +2013,12 @@ void World::ResetWeeklyQuests()
{
DETAIL_LOG("Weekly quests reset for all characters.");
CharacterDatabase.Execute("DELETE FROM character_queststatus_weekly");
+ WorldDatabase.Execute("DELETE FROM quest_curent_weekly");
for(SessionMap::const_iterator itr = m_sessions.begin(); itr != m_sessions.end(); ++itr)
if (itr->second->GetPlayer())
itr->second->GetPlayer()->ResetWeeklyQuestStatus();
-
+ if(!sObjectMgr.mCurWeekly.empty())
+ sObjectMgr.mCurWeekly.clear();
m_NextWeeklyQuestReset = time_t(m_NextWeeklyQuestReset + WEEK);
CharacterDatabase.PExecute("UPDATE saved_variables SET NextWeeklyQuestResetTime = '"UI64FMTD"'", uint64(m_NextWeeklyQuestReset));
}
CREATE TABLE `quest_curent_daily` (
`quest_group` int(10) unsigned NOT NULL default '0',
`quest` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`quest_group`,`quest`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for quest_curent_weekly
-- ----------------------------
CREATE TABLE `quest_curent_weekly` (
`quest_group` int(10) unsigned NOT NULL default '0',
`quest` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`quest_group`,`quest`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Есть небольшой баг. если дейлик/виклик одной группы но разные задания находятся у разных НПЦ то у того НПС которому не повезло с квестом значек над головой остается. Щас этим займусь.
Может придется переписать немного(
В общем сейчас загрузка и сохранение рандомных квестов есть и также их сброс.
Последний раз редактировалось alien; 23.07.2010 в 20:54.
|