Merge branch 'azerothcore:master' into Playerbot

This commit is contained in:
ZhengPeiRu21
2022-04-26 08:42:57 -06:00
committed by GitHub
7 changed files with 236 additions and 6 deletions

View File

@@ -704,29 +704,60 @@ void BattlefieldWG::OnGameObjectCreate(GameObject* go)
void BattlefieldWG::HandleKill(Player* killer, Unit* victim)
{
if (killer == victim)
{
return;
}
TeamId killerTeam = killer->GetTeamId();
// xinef: tower cannons also grant rank
if (victim->GetTypeId() == TYPEID_PLAYER || IsKeepNpc(victim->GetEntry()) || victim->GetEntry() == NPC_WINTERGRASP_TOWER_CANNON)
{
for (GuidUnorderedSet::const_iterator itr = m_PlayersInWar[killerTeam].begin(); itr != m_PlayersInWar[killerTeam].end(); ++itr)
if (Player* player = ObjectAccessor::FindPlayer(*itr))
if (victim->GetTypeId() == TYPEID_PLAYER && victim->HasAura(SPELL_LIEUTENANT))
{
// Quest - Wintergrasp - PvP Kill - Horde/Alliance
for (auto& playerGuid : m_PlayersInWar[killerTeam])
{
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
{
if (player->GetDistance2d(killer) < 40)
{
player->KilledMonsterCredit(killerTeam == TEAM_HORDE ? NPC_QUEST_PVP_KILL_ALLIANCE : NPC_QUEST_PVP_KILL_HORDE);
}
}
}
}
for (auto& playerGuid : m_PlayersInWar[killerTeam])
{
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
{
if (player->GetDistance2d(killer) < 40)
{
PromotePlayer(player);
}
}
}
// Xinef: Allow to Skin non-released corpse
if (victim->GetTypeId() == TYPEID_PLAYER)
{
victim->SetUnitFlag(UNIT_FLAG_SKINNABLE);
}
}
else if (victim->IsVehicle() && !killer->IsFriendlyTo(victim))
{
// Quest - Wintergrasp - PvP Kill - Vehicle
for (GuidUnorderedSet::const_iterator itr = m_PlayersInWar[killerTeam].begin(); itr != m_PlayersInWar[killerTeam].end(); ++itr)
if (Player* player = ObjectAccessor::FindPlayer(*itr))
for (auto& playerGuid : m_PlayersInWar[killerTeam])
{
if (Player* player = ObjectAccessor::FindPlayer(playerGuid))
{
if (player->GetDistance2d(killer) < 40)
{
player->KilledMonsterCredit(NPC_QUEST_PVP_KILL_VEHICLE);
}
}
}
}
}

View File

@@ -218,6 +218,8 @@ enum WintergraspNpcs
NPC_QUEST_SOUTHERN_TOWER_KILL = 35074,
NPC_QUEST_VEHICLE_PROTECTED = 31284,
NPC_QUEST_PVP_KILL_VEHICLE = 31093,
NPC_QUEST_PVP_KILL_HORDE = 39019,
NPC_QUEST_PVP_KILL_ALLIANCE = 31086,
};
struct BfWGCoordGY

View File

@@ -2259,8 +2259,12 @@ bool Player::HasQuestForItem(uint32 itemid, uint32 excludeQuestId /* 0 */, bool
// hide quest if player is in raid-group and quest is no raid quest
if (GetGroup() && GetGroup()->isRaidGroup() && !qinfo->IsAllowedInRaid(GetMap()->GetDifficulty()))
if (!InBattleground()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
{
if (!InBattleground() && !GetGroup()->isBFGroup()) //there are two ways.. we can make every bg-quest a raidquest, or add this code here.. i don't know if this can be exploited by other quests, but i think all other quests depend on a specific area.. but keep this in mind, if something strange happens later
{
continue;
}
}
// There should be no mixed ReqItem/ReqSource drop
// This part for ReqItem drop

View File

@@ -403,11 +403,20 @@ public:
bool OnGossipHello(Player* player, Creature* creature) override
{
if (creature->IsQuestGiver())
{
player->PrepareQuestMenu(creature->GetGUID());
}
if (creature->IsVendor())
{
AddGossipItemFor(player, GOSSIP_ICON_VENDOR, GOSSIP_TEXT_BROWSE_GOODS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
}
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
if (!wintergrasp)
{
return true;
}
if (creature->IsQuestGiver())
{
@@ -583,6 +592,8 @@ public:
QuestRelationBounds qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry());
QuestGiverStatus result = DIALOG_STATUS_NONE;
Battlefield* wintergrasp = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG);
for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i)
{
QuestGiverStatus result2 = DIALOG_STATUS_NONE;
@@ -659,6 +670,73 @@ public:
break;
}
if (wintergrasp)
{
// Certain quests are only available when attacking / defending
bool hasCorrectZoneControl = false;
switch (questId)
{
// Horde attacker
case QUEST_BONES_AND_ARROWS_HORDE_ATT:
case QUEST_JINXING_THE_WALLS_HORDE_ATT:
case QUEST_SLAY_THEM_ALL_HORDE_ATT:
case QUEST_FUELING_THE_DEMOLISHERS_HORDE_ATT:
case QUEST_HEALING_WITH_ROSES_HORDE_ATT:
case QUEST_DEFEND_THE_SIEGE_HORDE_ATT:
if (wintergrasp->GetAttackerTeam() == TEAM_HORDE)
{
hasCorrectZoneControl = true;
}
break;
// Horde defender
case QUEST_BONES_AND_ARROWS_HORDE_DEF:
case QUEST_WARDING_THE_WALLS_HORDE_DEF:
case QUEST_SLAY_THEM_ALL_HORDE_DEF:
case QUEST_FUELING_THE_DEMOLISHERS_HORDE_DEF:
case QUEST_HEALING_WITH_ROSES_HORDE_DEF:
case QUEST_TOPPLING_THE_TOWERS_HORDE_DEF:
case QUEST_STOP_THE_SIEGE_HORDE_DEF:
if (wintergrasp->GetDefenderTeam() == TEAM_HORDE)
{
hasCorrectZoneControl = true;
}
break;
// Alliance attacker
case QUEST_BONES_AND_ARROWS_ALLIANCE_ATT:
case QUEST_WARDING_THE_WARRIORS_ALLIANCE_ATT:
case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_ATT:
case QUEST_DEFEND_THE_SIEGE_ALLIANCE_ATT:
case QUEST_A_RARE_HERB_ALLIANCE_ATT:
case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_ATT:
if (wintergrasp->GetAttackerTeam() == TEAM_ALLIANCE)
{
hasCorrectZoneControl = true;
}
break;
// Alliance defender
case QUEST_BONES_AND_ARROWS_ALLIANCE_DEF:
case QUEST_WARDING_THE_WARRIORS_ALLIANCE_DEF:
case QUEST_NO_MERCY_FOR_THE_MERCILESS_ALLIANCE_DEF:
case QUEST_SHOUTHERN_SABOTAGE_ALLIANCE_DEF:
case QUEST_STOP_THE_SIEGE_ALLIANCE_DEF:
case QUEST_A_RARE_HERB_ALLIANCE_DEF:
case QUEST_FUELING_THE_DEMOLISHERS_ALLIANCE_DEF:
if (wintergrasp->GetDefenderTeam() == TEAM_ALLIANCE)
{
hasCorrectZoneControl = true;
}
break;
default:
hasCorrectZoneControl = true;
break;
}
if (!hasCorrectZoneControl)
{
continue;
}
}
QuestStatus status = player->GetQuestStatus(questId);
if (status == QUEST_STATUS_NONE)
{
@@ -689,6 +767,19 @@ public:
return result;
}
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*sender*/, uint32 action) override
{
ClearGossipMenuFor(player);
switch (action)
{
case GOSSIP_ACTION_TRADE:
player->GetSession()->SendListInventory(creature->GetGUID());
break;
}
return true;
}
};
class npc_wg_siege_machine : public CreatureScript