Skip to content

Commit

Permalink
[9331] Implement DB storage of new quest fields RewRepValueIdN
Browse files Browse the repository at this point in the history
Value can be -9 to 9. Value point to actual rewarded value in dbc store.
This id can then fully replace current use of RewRepValueN, as this field will most likely be reserved for custom reputation rewards (override RewRepValueId).
Old system/DB data will still work like normal, but be aware this may change in not too far away future.

Signed-off-by: NoFantasy <nofantasy@nf.no>
  • Loading branch information
NoFantasy committed Feb 8, 2010
1 parent 8ce4609 commit dacabf1
Show file tree
Hide file tree
Showing 10 changed files with 110 additions and 63 deletions.
2 changes: 1 addition & 1 deletion sql/mangos.sql
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CREATE TABLE `db_version` (
`version` varchar(120) default NULL,
`creature_ai_version` varchar(120) default NULL,
`cache_id` int(10) default '0',
`required_9329_01_mangos_spell_chain` bit(1) default NULL
`required_9331_01_mangos_quest_template` bit(1) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes';

--
Expand Down
7 changes: 7 additions & 0 deletions sql/updates/9331_01_mangos_quest_template.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
ALTER TABLE db_version CHANGE COLUMN required_9329_01_mangos_spell_chain required_9331_01_mangos_quest_template bit;

ALTER TABLE quest_template ADD COLUMN RewRepValueId1 tinyint(3) NOT NULL default '0' AFTER RewRepFaction5;
ALTER TABLE quest_template ADD COLUMN RewRepValueId2 tinyint(3) NOT NULL default '0' AFTER RewRepValueId1;
ALTER TABLE quest_template ADD COLUMN RewRepValueId3 tinyint(3) NOT NULL default '0' AFTER RewRepValueId2;
ALTER TABLE quest_template ADD COLUMN RewRepValueId4 tinyint(3) NOT NULL default '0' AFTER RewRepValueId3;
ALTER TABLE quest_template ADD COLUMN RewRepValueId5 tinyint(3) NOT NULL default '0' AFTER RewRepValueId4;
2 changes: 2 additions & 0 deletions sql/updates/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,7 @@ pkgdata_DATA = \
9310_01_mangos_spell_elixir.sql \
9312_01_mangos_quest_template.sql \
9329_01_mangos_spell_chain.sql \
9331_01_mangos_quest_template.sql \
README

## Additional files to include when running 'make dist'
Expand Down Expand Up @@ -508,4 +509,5 @@ EXTRA_DIST = \
9310_01_mangos_spell_elixir.sql \
9312_01_mangos_quest_template.sql \
9329_01_mangos_spell_chain.sql \
9331_01_mangos_quest_template.sql \
README
37 changes: 20 additions & 17 deletions src/game/GossipDef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -537,14 +537,15 @@ void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID
data << uint32(0);
data << uint32(0);

for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
data << uint32(pQuest->RewRepFaction[i]);

for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (if negative, from second row)
data << int32(pQuest->RewRepValueId[i]);

for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override. No bonus is expected given
data << int32(0);
//data << int32(pQuest->RewRepValue[i]); // current field for store of rep value, can be reused to implement "override value"

data << uint32(QUEST_EMOTE_COUNT);

Expand Down Expand Up @@ -660,14 +661,15 @@ void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )
}
}

for(iI = 0; iI < QUEST_REPUTATIONS_COUNT; ++iI) // reward factions ids
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
data << uint32(pQuest->RewRepFaction[i]);

for(iI = 0; iI < QUEST_REPUTATIONS_COUNT; ++iI) // column index in QuestFactionReward.dbc?
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (if negative, from second row)
data << int32(pQuest->RewRepValueId[i]);

for(iI = 0; iI < QUEST_REPUTATIONS_COUNT; ++iI) // reward reputation override?
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override. No bonus is expected given
data << int32(0);
//data << int32(pQuest->RewRepValue[i]); // current field for store of rep value, can be reused to implement "override value"

data << pQuest->GetPointMapId();
data << pQuest->GetPointX();
Expand Down Expand Up @@ -802,13 +804,14 @@ void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID,
data << uint32(0); // unknown

for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward factions ids
data << uint32(0);
data << uint32(pQuest->RewRepFaction[i]);

for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (zero based)?
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // columnid in QuestFactionReward.dbc (if negative, from second row)
data << int32(pQuest->RewRepValueId[i]);

for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override?
data << uint32(0);
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) // reward reputation override. No diplomacy bonus is expected given, reward also does not display in chat window
data << int32(0);
//data << int32(pQuest->RewRepValue[i]);

pSession->SendPacket( &data );
sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u", GUID_LOPART(npcGUID), pQuest->GetQuestId() );
Expand Down
36 changes: 18 additions & 18 deletions src/game/ObjectMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3326,19 +3326,23 @@ void ObjectMgr::LoadQuests()
"RewChoiceItemCount1, RewChoiceItemCount2, RewChoiceItemCount3, RewChoiceItemCount4, RewChoiceItemCount5, RewChoiceItemCount6,"
// 85 86 87 88 89 90 91 92
"RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4,"
// 93 94 95 96 97 98 99 100 101 102
"RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5,"
// 103 104 105 106 107 108
// 93 94 95 96 97
"RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5,"
// 98 99 100 101 102
"RewRepValueId1, RewRepValueId2, RewRepValueId3, RewRepValueId4, RewRepValueId5,"
// 103 104 105 106 107
"RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5,"
// 108 109 110 111 112 113
"RewHonorAddition, RewHonorMultiplier, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast,"
// 109 110 111 112 113 114
// 114 115 116 117 118 119
"RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt,"
// 115 116 117 118 119 120 121 122
// 120 121 122 123 124 125 126 127
"DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4,"
// 123 124 125 126 127 128
// 128 129 130 131 132 133
"IncompleteEmote, CompleteEmote, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4,"
// 129 130 131 132
// 134 135 136 137
"OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4,"
// 133 134
// 138 139
"StartScript, CompleteScript"
" FROM quest_template");
if(result == NULL)
Expand Down Expand Up @@ -3787,23 +3791,19 @@ void ObjectMgr::LoadQuests()

for(int j = 0; j < QUEST_REPUTATIONS_COUNT; ++j)
{
if(qinfo->RewRepFaction[j])
if (qinfo->RewRepFaction[j])
{
if(!qinfo->RewRepValue[j])
{
sLog.outErrorDb("Quest %u has `RewRepFaction%d` = %u but `RewRepValue%d` = 0, quest will not reward this reputation.",
qinfo->GetQuestId(),j+1,qinfo->RewRepValue[j],j+1);
// no changes
}
if (abs(qinfo->RewRepValueId[j]) > 9)
sLog.outErrorDb("Quest %u has RewRepValueId%d = %i but value is not valid.", qinfo->GetQuestId(), j+1, qinfo->RewRepValueId[j]);

if(!sFactionStore.LookupEntry(qinfo->RewRepFaction[j]))
if (!sFactionStore.LookupEntry(qinfo->RewRepFaction[j]))
{
sLog.outErrorDb("Quest %u has `RewRepFaction%d` = %u but raw faction (faction.dbc) %u does not exist, quest will not reward reputation for this faction.",
qinfo->GetQuestId(),j+1,qinfo->RewRepFaction[j] ,qinfo->RewRepFaction[j] );
qinfo->GetQuestId(),j+1,qinfo->RewRepFaction[j] ,qinfo->RewRepFaction[j]);
qinfo->RewRepFaction[j] = 0; // quest will not reward this
}
}
else if(qinfo->RewRepValue[j]!=0)
else if (qinfo->RewRepValue[j] != 0)
{
sLog.outErrorDb("Quest %u has `RewRepFaction%d` = 0 but `RewRepValue%d` = %u.",
qinfo->GetQuestId(),j+1,j+1,qinfo->RewRepValue[j]);
Expand Down
37 changes: 34 additions & 3 deletions src/game/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6047,13 +6047,44 @@ void Player::RewardReputation(Quest const *pQuest)
// quest reputation reward/loss
for(int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
{
if(pQuest->RewRepFaction[i] && pQuest->RewRepValue[i] )
if (!pQuest->RewRepFaction[i])
continue;

// For future, this row should be used as "override". Example quests are 10298 and 10870.
// Typically, no diplomacy mod must apply to the final value (flat). Note the formula must be (finalValue = DBvalue/100)
if (pQuest->RewRepValue[i])
{
int32 rep = CalculateReputationGain(GetQuestLevelForPlayer(pQuest), pQuest->RewRepValue[i], pQuest->RewRepFaction[i], true);
FactionEntry const* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i]);
if(factionEntry)

if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i]))
GetReputationMgr().ModifyReputation(factionEntry, rep);
}
else
{
uint32 row = 1;
int32 field = 0;

if (pQuest->RewRepValueId[i] < 0)
{
++row;
field = abs(pQuest->RewRepValueId[i]);
}
else
field = pQuest->RewRepValueId[i];

if (const QuestFactionRewardEntry *pRow = sQuestFactionRewardStore.LookupEntry(row))
{
int32 repPoints = pRow->rewardValue[field];

if (!repPoints)
continue;

repPoints = CalculateReputationGain(GetQuestLevelForPlayer(pQuest), repPoints, pQuest->RewRepFaction[i], true);

if (const FactionEntry* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i]))
GetReputationMgr().ModifyReputation(factionEntry, repPoints);
}
}
}

// TODO: implement reputation spillover
Expand Down
47 changes: 25 additions & 22 deletions src/game/QuestDef.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,38 +100,41 @@ Quest::Quest(Field * questRecord)
RewRepFaction[i] = questRecord[93+i].GetUInt32();

for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
RewRepValue[i] = questRecord[98+i].GetInt32();

RewHonorAddition = questRecord[103].GetUInt32();
RewHonorMultiplier = questRecord[104].GetFloat();
RewOrReqMoney = questRecord[105].GetInt32();
RewMoneyMaxLevel = questRecord[106].GetUInt32();
RewSpell = questRecord[107].GetUInt32();
RewSpellCast = questRecord[108].GetUInt32();
RewMailTemplateId = questRecord[109].GetUInt32();
RewMailDelaySecs = questRecord[110].GetUInt32();
PointMapId = questRecord[111].GetUInt32();
PointX = questRecord[112].GetFloat();
PointY = questRecord[113].GetFloat();
PointOpt = questRecord[114].GetUInt32();
RewRepValueId[i] = questRecord[98+i].GetInt32();

for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
RewRepValue[i] = questRecord[103+i].GetInt32();

RewHonorAddition = questRecord[108].GetUInt32();
RewHonorMultiplier = questRecord[109].GetFloat();
RewOrReqMoney = questRecord[110].GetInt32();
RewMoneyMaxLevel = questRecord[111].GetUInt32();
RewSpell = questRecord[112].GetUInt32();
RewSpellCast = questRecord[113].GetUInt32();
RewMailTemplateId = questRecord[114].GetUInt32();
RewMailDelaySecs = questRecord[115].GetUInt32();
PointMapId = questRecord[116].GetUInt32();
PointX = questRecord[117].GetFloat();
PointY = questRecord[118].GetFloat();
PointOpt = questRecord[119].GetUInt32();

for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
DetailsEmote[i] = questRecord[115+i].GetUInt32();
DetailsEmote[i] = questRecord[120+i].GetUInt32();

for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
DetailsEmoteDelay[i] = questRecord[119+i].GetUInt32();
DetailsEmoteDelay[i] = questRecord[124+i].GetUInt32();

IncompleteEmote = questRecord[123].GetUInt32();
CompleteEmote = questRecord[124].GetUInt32();
IncompleteEmote = questRecord[128].GetUInt32();
CompleteEmote = questRecord[129].GetUInt32();

for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
OfferRewardEmote[i] = questRecord[125+i].GetInt32();
OfferRewardEmote[i] = questRecord[130+i].GetInt32();

for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
OfferRewardEmoteDelay[i] = questRecord[129+i].GetInt32();
OfferRewardEmoteDelay[i] = questRecord[134+i].GetInt32();

QuestStartScript = questRecord[133].GetUInt32();
QuestCompleteScript = questRecord[134].GetUInt32();
QuestStartScript = questRecord[138].GetUInt32();
QuestCompleteScript = questRecord[139].GetUInt32();

QuestFlags |= SpecialFlags << 24;

Expand Down
1 change: 1 addition & 0 deletions src/game/QuestDef.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ class Quest
uint32 RewItemId[QUEST_REWARDS_COUNT];
uint32 RewItemCount[QUEST_REWARDS_COUNT];
uint32 RewRepFaction[QUEST_REPUTATIONS_COUNT];
int32 RewRepValueId[QUEST_REPUTATIONS_COUNT];
int32 RewRepValue[QUEST_REPUTATIONS_COUNT];
uint32 DetailsEmote[QUEST_EMOTE_COUNT];
uint32 DetailsEmoteDelay[QUEST_EMOTE_COUNT];
Expand Down
2 changes: 1 addition & 1 deletion src/shared/revision_nr.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "9330"
#define REVISION_NR "9331"
#endif // __REVISION_NR_H__
2 changes: 1 addition & 1 deletion src/shared/revision_sql.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ifndef __REVISION_SQL_H__
#define __REVISION_SQL_H__
#define REVISION_DB_CHARACTERS "required_9250_01_characters_character"
#define REVISION_DB_MANGOS "required_9329_01_mangos_spell_chain"
#define REVISION_DB_MANGOS "required_9331_01_mangos_quest_template"
#define REVISION_DB_REALMD "required_9010_01_realmd_realmlist"
#endif // __REVISION_SQL_H__

0 comments on commit dacabf1

Please sign in to comment.