Apply style fix

This commit is contained in:
Antz 2020-01-10 23:13:44 +00:00
parent 5531a0087d
commit 35405dd549
155 changed files with 10968 additions and 3660 deletions

View file

@ -73,7 +73,9 @@ class ObjectRegistry
if (iter != i_registeredObjects.end()) if (iter != i_registeredObjects.end())
{ {
if (!replace) if (!replace)
{ return false; } {
return false;
}
delete iter->second; delete iter->second;
i_registeredObjects.erase(iter); i_registeredObjects.erase(iter);
} }
@ -94,7 +96,9 @@ class ObjectRegistry
if (iter != i_registeredObjects.end()) if (iter != i_registeredObjects.end())
{ {
if (delete_object) if (delete_object)
{ delete iter->second; } {
delete iter->second;
}
i_registeredObjects.erase(iter); i_registeredObjects.erase(iter);
} }
} }

View file

@ -131,7 +131,9 @@ class Grid
bool AddGridObject(SPECIFIC_OBJECT* obj) bool AddGridObject(SPECIFIC_OBJECT* obj)
{ {
if (obj->IsActiveObject()) if (obj->IsActiveObject())
{ m_activeGridObjects.insert(obj); } {
m_activeGridObjects.insert(obj);
}
return i_container.template insert<SPECIFIC_OBJECT>(obj); return i_container.template insert<SPECIFIC_OBJECT>(obj);
} }
@ -146,7 +148,9 @@ class Grid
bool RemoveGridObject(SPECIFIC_OBJECT* obj) bool RemoveGridObject(SPECIFIC_OBJECT* obj)
{ {
if (obj->IsActiveObject()) if (obj->IsActiveObject())
{ m_activeGridObjects.erase(obj); } {
m_activeGridObjects.erase(obj);
}
return i_container.template remove<SPECIFIC_OBJECT>(obj); return i_container.template remove<SPECIFIC_OBJECT>(obj);
} }

View file

@ -57,7 +57,9 @@ class GridReference : public Reference<GridRefManager<OBJECT>, OBJECT>
{ {
// called from unlink() // called from unlink()
if (this->isValid()) if (this->isValid())
{ this->getTarget()->decSize(); } {
this->getTarget()->decSize();
}
} }
/** /**

View file

@ -208,7 +208,9 @@ class TypeUnorderedMapContainer
{ {
typename UNORDERED_MAP<KEY_TYPE, SPECIFIC_TYPE*>::iterator i = elements._element.find(hdl); typename UNORDERED_MAP<KEY_TYPE, SPECIFIC_TYPE*>::iterator i = elements._element.find(hdl);
if (i == elements._element.end()) if (i == elements._element.end())
{ return NULL; } {
return NULL;
}
else else
{ return i->second; } { return i->second; }
} }

View file

@ -137,7 +137,9 @@ namespace MaNGOS
void* p = malloc(sizeof(T)); void* p = malloc(sizeof(T));
if (!p) if (!p)
{ return NULL; } {
return NULL;
}
return new(p) T; return new(p) T;
} }

View file

@ -82,19 +82,25 @@ void EventProcessor::KillAllEvents(bool force)
delete i_old->second; delete i_old->second;
if (!force) // need per-element cleanup if (!force) // need per-element cleanup
{ m_events.erase(i_old); } {
m_events.erase(i_old);
}
} }
} }
// fast clear event list (in force case) // fast clear event list (in force case)
if (force) if (force)
{ m_events.clear(); } {
m_events.clear();
}
} }
void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime) void EventProcessor::AddEvent(BasicEvent* Event, uint64 e_time, bool set_addtime)
{ {
if (set_addtime) if (set_addtime)
{ Event->m_addTime = m_time; } {
Event->m_addTime = m_time;
}
Event->m_execTime = e_time; Event->m_execTime = e_time;
m_events.insert(std::pair<uint64, BasicEvent*>(e_time, Event)); m_events.insert(std::pair<uint64, BasicEvent*>(e_time, Event));

View file

@ -88,7 +88,9 @@ class Reference : public LinkedListElement
{ {
assert(fromObj); // fromObj MUST not be NULL assert(fromObj); // fromObj MUST not be NULL
if (isValid()) if (isValid())
{ unlink(); } {
unlink();
}
if (toObj != NULL) if (toObj != NULL)
{ {

View file

@ -144,7 +144,9 @@ class AHB_Seller_Config
uint32 GetMinTime() const uint32 GetMinTime() const
{ {
if (m_minTime < 1) if (m_minTime < 1)
{ return 1; } {
return 1;
}
else if ((m_maxTime) && (m_minTime > m_maxTime)) else if ((m_maxTime) && (m_minTime > m_maxTime))
{ return m_maxTime; } { return m_maxTime; }
else else
@ -161,7 +163,9 @@ class AHB_Seller_Config
void SetMissedItemsPerClass(AuctionQuality quality, ItemClass itemclass, uint32 found) void SetMissedItemsPerClass(AuctionQuality quality, ItemClass itemclass, uint32 found)
{ {
if (m_ItemInfo[quality].ItemClassInfos[itemclass].AmountOfItems > found) if (m_ItemInfo[quality].ItemClassInfos[itemclass].AmountOfItems > found)
{ m_ItemInfo[quality].ItemClassInfos[itemclass].MissItems = m_ItemInfo[quality].ItemClassInfos[itemclass].AmountOfItems - found; } {
m_ItemInfo[quality].ItemClassInfos[itemclass].MissItems = m_ItemInfo[quality].ItemClassInfos[itemclass].AmountOfItems - found;
}
else else
{ m_ItemInfo[quality].ItemClassInfos[itemclass].MissItems = 0; } { m_ItemInfo[quality].ItemClassInfos[itemclass].MissItems = 0; }
} }
@ -421,10 +425,14 @@ bool AuctionBotConfig::Initialize()
return false; return false;
} }
if ((getConfig(CONFIG_UINT32_AHBOT_ALLIANCE_ITEM_AMOUNT_RATIO) == 0) && (getConfig(CONFIG_UINT32_AHBOT_HORDE_ITEM_AMOUNT_RATIO) == 0) && (getConfig(CONFIG_UINT32_AHBOT_NEUTRAL_ITEM_AMOUNT_RATIO) == 0)) if ((getConfig(CONFIG_UINT32_AHBOT_ALLIANCE_ITEM_AMOUNT_RATIO) == 0) && (getConfig(CONFIG_UINT32_AHBOT_HORDE_ITEM_AMOUNT_RATIO) == 0) && (getConfig(CONFIG_UINT32_AHBOT_NEUTRAL_ITEM_AMOUNT_RATIO) == 0))
{ sLog.outString("AuctionHouseBot SELLER is disabled! (If you want to use it please set config in 'ahbot.conf')"); } {
sLog.outString("AuctionHouseBot SELLER is disabled! (If you want to use it please set config in 'ahbot.conf')");
}
if (!getConfig(CONFIG_BOOL_AHBOT_BUYER_ALLIANCE_ENABLED) && !getConfig(CONFIG_BOOL_AHBOT_BUYER_HORDE_ENABLED) && !getConfig(CONFIG_BOOL_AHBOT_BUYER_NEUTRAL_ENABLED)) if (!getConfig(CONFIG_BOOL_AHBOT_BUYER_ALLIANCE_ENABLED) && !getConfig(CONFIG_BOOL_AHBOT_BUYER_HORDE_ENABLED) && !getConfig(CONFIG_BOOL_AHBOT_BUYER_NEUTRAL_ENABLED))
{ sLog.outString("AuctionHouseBot BUYER is disabled! (If you want to use it please set config in 'ahbot.conf')"); } {
sLog.outString("AuctionHouseBot BUYER is disabled! (If you want to use it please set config in 'ahbot.conf')");
}
m_ItemsPerCycleBoost = getConfig(CONFIG_UINT32_AHBOT_ITEMS_PER_CYCLE_BOOST); m_ItemsPerCycleBoost = getConfig(CONFIG_UINT32_AHBOT_ITEMS_PER_CYCLE_BOOST);
m_ItemsPerCycleNormal = getConfig(CONFIG_UINT32_AHBOT_ITEMS_PER_CYCLE_NORMAL); m_ItemsPerCycleNormal = getConfig(CONFIG_UINT32_AHBOT_ITEMS_PER_CYCLE_NORMAL);
@ -439,7 +447,9 @@ void AuctionBotConfig::SetAHBotId(const std::string& BotCharName)
{ {
m_BotId = sObjectMgr.GetPlayerGuidByName(BotCharName.c_str()).GetCounter(); m_BotId = sObjectMgr.GetPlayerGuidByName(BotCharName.c_str()).GetCounter();
if (!m_BotId) if (!m_BotId)
{ sLog.outError("AHBot uses an invalid character name `%s`", BotCharName.c_str()); } {
sLog.outError("AHBot uses an invalid character name `%s`", BotCharName.c_str());
}
} }
} }
@ -488,7 +498,9 @@ void AuctionBotConfig::GetConfigFromFile()
{ {
// Check config file version // Check config file version
if (m_AhBotCfg.GetIntDefault("ConfVersion", 0) != AUCTIONHOUSEBOT_CONF_VERSION) if (m_AhBotCfg.GetIntDefault("ConfVersion", 0) != AUCTIONHOUSEBOT_CONF_VERSION)
{ sLog.outError("AHBot: Configuration file version doesn't match expected version. Some config variables may be wrong or missing."); } {
sLog.outError("AHBot: Configuration file version doesn't match expected version. Some config variables may be wrong or missing.");
}
setConfigMax(CONFIG_UINT32_AHBOT_ALLIANCE_ITEM_AMOUNT_RATIO , "AuctionHouseBot.Alliance.Items.Amount.Ratio" , 100, 10000); setConfigMax(CONFIG_UINT32_AHBOT_ALLIANCE_ITEM_AMOUNT_RATIO , "AuctionHouseBot.Alliance.Items.Amount.Ratio" , 100, 10000);
setConfigMax(CONFIG_UINT32_AHBOT_HORDE_ITEM_AMOUNT_RATIO , "AuctionHouseBot.Horde.Items.Amount.Ratio" , 100, 10000); setConfigMax(CONFIG_UINT32_AHBOT_HORDE_ITEM_AMOUNT_RATIO , "AuctionHouseBot.Horde.Items.Amount.Ratio" , 100, 10000);
@ -664,7 +676,9 @@ bool AuctionBotBuyer::Initialize()
} }
} }
if (!active_house) if (!active_house)
{ return false; } {
return false;
}
// load Check interval // load Check interval
m_CheckInterval = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_BUYER_RECHECK_INTERVAL) * MINUTE; m_CheckInterval = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_BUYER_RECHECK_INTERVAL) * MINUTE;
@ -700,7 +714,9 @@ void AuctionBotBuyer::LoadConfig()
{ {
m_HouseConfig[i].BuyerEnabled = sAuctionBotConfig.getConfigBuyerEnabled(AuctionHouseType(i)); m_HouseConfig[i].BuyerEnabled = sAuctionBotConfig.getConfigBuyerEnabled(AuctionHouseType(i));
if (m_HouseConfig[i].BuyerEnabled) if (m_HouseConfig[i].BuyerEnabled)
{ LoadBuyerValues(m_HouseConfig[i]); } {
LoadBuyerValues(m_HouseConfig[i]);
}
} }
} }
@ -727,12 +743,16 @@ uint32 AuctionBotBuyer::GetBuyableEntry(AHB_Buyer_Config& config)
if (Aentry->buyout != 0) if (Aentry->buyout != 0)
{ {
if (Aentry->buyout / item->GetCount() < buyerItem.MinBuyPrice) if (Aentry->buyout / item->GetCount() < buyerItem.MinBuyPrice)
{ buyerItem.MinBuyPrice = Aentry->buyout / item->GetCount(); } {
buyerItem.MinBuyPrice = Aentry->buyout / item->GetCount();
}
else if (buyerItem.MinBuyPrice == 0) else if (buyerItem.MinBuyPrice == 0)
{ buyerItem.MinBuyPrice = Aentry->buyout / item->GetCount(); } { buyerItem.MinBuyPrice = Aentry->buyout / item->GetCount(); }
} }
if (Aentry->startbid / item->GetCount() < buyerItem.MinBidPrice) if (Aentry->startbid / item->GetCount() < buyerItem.MinBidPrice)
{ buyerItem.MinBidPrice = Aentry->startbid / item->GetCount(); } {
buyerItem.MinBidPrice = Aentry->startbid / item->GetCount();
}
else if (buyerItem.MinBidPrice == 0) else if (buyerItem.MinBidPrice == 0)
{ buyerItem.MinBidPrice = Aentry->startbid / item->GetCount(); } { buyerItem.MinBidPrice = Aentry->startbid / item->GetCount(); }
@ -779,7 +799,9 @@ void AuctionBotBuyer::PrepareListOfEntry(AHB_Buyer_Config& config)
for (CheckEntryMap::iterator itr = config.CheckedEntry.begin(); itr != config.CheckedEntry.end();) for (CheckEntryMap::iterator itr = config.CheckedEntry.begin(); itr != config.CheckedEntry.end();)
{ {
if (itr->second.LastExist < (Now - 5)) if (itr->second.LastExist < (Now - 5))
{ config.CheckedEntry.erase(itr++); } {
config.CheckedEntry.erase(itr++);
}
else else
{ ++itr; } { ++itr; }
} }
@ -794,14 +816,18 @@ bool AuctionBotBuyer::IsBuyableEntry(uint64 buyoutPrice, double InGame_BuyPrice,
if (buyoutPrice <= MinBuyPrice) if (buyoutPrice <= MinBuyPrice)
{ {
if (buyoutPrice <= MaxBuyablePrice) if (buyoutPrice <= MaxBuyablePrice)
{ Chance = MaxChance; } {
Chance = MaxChance;
}
else else
{ {
if ((buyoutPrice > 0) && (MaxBuyablePrice > 0)) if ((buyoutPrice > 0) && (MaxBuyablePrice > 0))
{ {
double ratio = buyoutPrice / MaxBuyablePrice; double ratio = buyoutPrice / MaxBuyablePrice;
if (ratio < 10) if (ratio < 10)
{ Chance = MaxChance - (ratio * (MaxChance / 10)); } {
Chance = MaxChance - (ratio * (MaxChance / 10));
}
else { Chance = 1; } else { Chance = 1; }
} }
} }
@ -809,14 +835,18 @@ bool AuctionBotBuyer::IsBuyableEntry(uint64 buyoutPrice, double InGame_BuyPrice,
else if (buyoutPrice <= InGame_BuyPrice) else if (buyoutPrice <= InGame_BuyPrice)
{ {
if (buyoutPrice <= MaxBuyablePrice) if (buyoutPrice <= MaxBuyablePrice)
{ Chance = MaxChance / 5; } {
Chance = MaxChance / 5;
}
else else
{ {
if ((buyoutPrice > 0) && (MaxBuyablePrice > 0)) if ((buyoutPrice > 0) && (MaxBuyablePrice > 0))
{ {
double ratio = buyoutPrice / MaxBuyablePrice; double ratio = buyoutPrice / MaxBuyablePrice;
if (ratio < 10) if (ratio < 10)
{ Chance = (MaxChance / 5) - (ratio * (MaxChance / 50)); } {
Chance = (MaxChance / 5) - (ratio * (MaxChance / 50));
}
else { Chance = 1; } else { Chance = 1; }
} }
} }
@ -829,7 +859,9 @@ bool AuctionBotBuyer::IsBuyableEntry(uint64 buyoutPrice, double InGame_BuyPrice,
{ {
double ratio = buyoutPrice / MaxBuyablePrice; double ratio = buyoutPrice / MaxBuyablePrice;
if (ratio < 10) if (ratio < 10)
{ Chance = (MaxChance / 5) - (ratio * (MaxChance / 50)); } {
Chance = (MaxChance / 5) - (ratio * (MaxChance / 50));
}
else { Chance = 0; } else { Chance = 0; }
} }
else { Chance = 0; } else { Chance = 0; }
@ -852,14 +884,18 @@ bool AuctionBotBuyer::IsBidableEntry(uint64 bidPrice, double InGame_BuyPrice, do
if (bidPrice <= MinBidPrice) if (bidPrice <= MinBidPrice)
{ {
if ((InGame_BuyPrice != 0) && (bidPrice < (InGame_BuyPrice - (InGame_BuyPrice / 30)))) if ((InGame_BuyPrice != 0) && (bidPrice < (InGame_BuyPrice - (InGame_BuyPrice / 30))))
{ Chance = MaxChance; } {
Chance = MaxChance;
}
else else
{ {
if (bidPrice < MaxBidablePrice) if (bidPrice < MaxBidablePrice)
{ {
double ratio = MaxBidablePrice / bidPrice; double ratio = MaxBidablePrice / bidPrice;
if (ratio < 3) if (ratio < 3)
{ Chance = ((MaxChance / 500) * ratio); } {
Chance = ((MaxChance / 500) * ratio);
}
else else
{ Chance = (MaxChance / 500); } { Chance = (MaxChance / 500); }
} }
@ -873,7 +909,9 @@ bool AuctionBotBuyer::IsBidableEntry(uint64 bidPrice, double InGame_BuyPrice, do
{ {
double ratio = MaxBidablePrice / bidPrice; double ratio = MaxBidablePrice / bidPrice;
if (ratio < 4) if (ratio < 4)
{ Chance = ((MaxChance / 1000) * ratio); } {
Chance = ((MaxChance / 1000) * ratio);
}
else else
{ Chance = (MaxChance / 1000); } { Chance = (MaxChance / 1000); }
} }
@ -940,7 +978,9 @@ void AuctionBotBuyer::addNewAuctionBuyerBotBid(AHB_Buyer_Config& config)
} }
if (BuyCycles == 0) if (BuyCycles == 0)
{ break; } {
break;
}
uint32 MaxChance = 5000; uint32 MaxChance = 5000;
@ -1024,12 +1064,16 @@ void AuctionBotBuyer::addNewAuctionBuyerBotBid(AHB_Buyer_Config& config)
else else
{ {
if (IsBidableEntry(bidPriceByItem, InGame_BuyPrice, MaxBidablePrice, minBidPrice, MaxChance / 2, config.FactionChance)) if (IsBidableEntry(bidPriceByItem, InGame_BuyPrice, MaxBidablePrice, minBidPrice, MaxChance / 2, config.FactionChance))
{ PlaceBidToEntry(auction, bidPrice); } {
PlaceBidToEntry(auction, bidPrice);
}
} }
} }
else // buyout = 0 mean only bid are possible else // buyout = 0 mean only bid are possible
if (IsBidableEntry(bidPriceByItem, InGame_BuyPrice, MaxBidablePrice, minBidPrice, MaxChance, config.FactionChance)) if (IsBidableEntry(bidPriceByItem, InGame_BuyPrice, MaxBidablePrice, minBidPrice, MaxChance, config.FactionChance))
{ PlaceBidToEntry(auction, bidPrice); } {
PlaceBidToEntry(auction, bidPrice);
}
auctionEval.LastChecked = Now; auctionEval.LastChecked = Now;
--BuyCycles; --BuyCycles;
@ -1044,7 +1088,9 @@ bool AuctionBotBuyer::Update(AuctionHouseType houseType)
{ {
DEBUG_FILTER_LOG(LOG_FILTER_AHBOT_BUYER, "AHBot: %s buying ...", AuctionBotConfig::GetHouseTypeName(houseType)); DEBUG_FILTER_LOG(LOG_FILTER_AHBOT_BUYER, "AHBot: %s buying ...", AuctionBotConfig::GetHouseTypeName(houseType));
if (GetBuyableEntry(m_HouseConfig[houseType]) > 0) if (GetBuyableEntry(m_HouseConfig[houseType]) > 0)
{ addNewAuctionBuyerBotBid(m_HouseConfig[houseType]); } {
addNewAuctionBuyerBotBid(m_HouseConfig[houseType]);
}
return true; return true;
} }
else { return false; } else { return false; }
@ -1132,7 +1178,9 @@ bool AuctionBotSeller::Initialize()
uint32 entry = fields[0].GetUInt32(); uint32 entry = fields[0].GetUInt32();
if (!entry) if (!entry)
{ continue; } {
continue;
}
lootItems.push_back(fields[0].GetUInt32()); lootItems.push_back(fields[0].GetUInt32());
} }
@ -1159,25 +1207,35 @@ bool AuctionBotSeller::Initialize()
bar.step(); bar.step();
if (!prototype) if (!prototype)
{ continue; } {
continue;
}
// skip items with too high quality (code can't propertly work with its) // skip items with too high quality (code can't propertly work with its)
if (prototype->Quality >= MAX_AUCTION_QUALITY) if (prototype->Quality >= MAX_AUCTION_QUALITY)
{ continue; } {
continue;
}
// forced exclude filter // forced exclude filter
bool isExcludeItem = false; bool isExcludeItem = false;
for (size_t i = 0; (i < excludeItems.size() && (!isExcludeItem)); ++i) for (size_t i = 0; (i < excludeItems.size() && (!isExcludeItem)); ++i)
if (itemID == excludeItems[i]) if (itemID == excludeItems[i])
{ isExcludeItem = true; } {
isExcludeItem = true;
}
if (isExcludeItem) if (isExcludeItem)
{ continue; } {
continue;
}
// forced include filter // forced include filter
bool isForcedIncludeItem = false; bool isForcedIncludeItem = false;
for (size_t i = 0; (i < includeItems.size() && (!isForcedIncludeItem)); ++i) for (size_t i = 0; (i < includeItems.size() && (!isForcedIncludeItem)); ++i)
if (itemID == includeItems[i]) if (itemID == includeItems[i])
{ isForcedIncludeItem = true; } {
isForcedIncludeItem = true;
}
if (isForcedIncludeItem) if (isForcedIncludeItem)
{ {
@ -1191,23 +1249,33 @@ bool AuctionBotSeller::Initialize()
{ {
case NO_BIND: case NO_BIND:
if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_NO)) if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_NO))
{ continue; } {
continue;
}
break; break;
case BIND_WHEN_PICKED_UP: case BIND_WHEN_PICKED_UP:
if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_PICKUP)) if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_PICKUP))
{ continue; } {
continue;
}
break; break;
case BIND_WHEN_EQUIPPED: case BIND_WHEN_EQUIPPED:
if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_EQUIP)) if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_EQUIP))
{ continue; } {
continue;
}
break; break;
case BIND_WHEN_USE: case BIND_WHEN_USE:
if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_USE)) if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_USE))
{ continue; } {
continue;
}
break; break;
case BIND_QUEST_ITEM: case BIND_QUEST_ITEM:
if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_QUEST)) if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BIND_QUEST))
{ continue; } {
continue;
}
break; break;
default: default:
continue; continue;
@ -1217,12 +1285,16 @@ bool AuctionBotSeller::Initialize()
if (sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BUYPRICE_SELLER)) if (sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BUYPRICE_SELLER))
{ {
if (prototype->BuyPrice == 0) if (prototype->BuyPrice == 0)
{ continue; } {
continue;
}
} }
else else
{ {
if (prototype->SellPrice == 0) if (prototype->SellPrice == 0)
{ continue; } {
continue;
}
} }
// vendor filter // vendor filter
@ -1231,10 +1303,14 @@ bool AuctionBotSeller::Initialize()
bool IsVendorItem = false; bool IsVendorItem = false;
for (size_t i = 0; (i < npcItems.size()) && (!IsVendorItem); ++i) for (size_t i = 0; (i < npcItems.size()) && (!IsVendorItem); ++i)
if (itemID == npcItems[i]) if (itemID == npcItems[i])
{ IsVendorItem = true; } {
IsVendorItem = true;
}
if (IsVendorItem) if (IsVendorItem)
{ continue; } {
continue;
}
} }
// loot filter // loot filter
@ -1243,9 +1319,13 @@ bool AuctionBotSeller::Initialize()
bool isLootItem = false; bool isLootItem = false;
for (size_t i = 0; (i < lootItems.size()) && (!isLootItem); ++i) for (size_t i = 0; (i < lootItems.size()) && (!isLootItem); ++i)
if (itemID == lootItems[i]) if (itemID == lootItems[i])
{ isLootItem = true; } {
isLootItem = true;
}
if (isLootItem) if (isLootItem)
{ continue; } {
continue;
}
} }
// not vendor/loot filter // not vendor/loot filter
@ -1256,14 +1336,20 @@ bool AuctionBotSeller::Initialize()
for (size_t i = 0; (i < npcItems.size()) && (!IsVendorItem); ++i) for (size_t i = 0; (i < npcItems.size()) && (!IsVendorItem); ++i)
if (itemID == npcItems[i]) if (itemID == npcItems[i])
{ IsVendorItem = true; } {
IsVendorItem = true;
}
for (size_t i = 0; (i < lootItems.size()) && (!isLootItem); ++i) for (size_t i = 0; (i < lootItems.size()) && (!isLootItem); ++i)
if (itemID == lootItems[i]) if (itemID == lootItems[i])
{ isLootItem = true; } {
isLootItem = true;
}
if ((!isLootItem) && (!IsVendorItem)) if ((!isLootItem) && (!IsVendorItem))
{ continue; } {
continue;
}
} }
// item class/subclass specific filters // item class/subclass specific filters
@ -1275,32 +1361,44 @@ bool AuctionBotSeller::Initialize()
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_ITEM_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_ITEM_LEVEL))
{ {
if (prototype->ItemLevel < value) if (prototype->ItemLevel < value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_ITEM_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_ITEM_LEVEL))
{ {
if (prototype->ItemLevel > value) if (prototype->ItemLevel > value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_REQ_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_REQ_LEVEL))
{ {
if (prototype->RequiredLevel < value) if (prototype->RequiredLevel < value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_REQ_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_REQ_LEVEL))
{ {
if (prototype->RequiredLevel > value) if (prototype->RequiredLevel > value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_SKILL_RANK)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_SKILL_RANK))
{ {
if (prototype->RequiredSkillRank < value) if (prototype->RequiredSkillRank < value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_SKILL_RANK)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_SKILL_RANK))
{ {
if (prototype->RequiredSkillRank > value) if (prototype->RequiredSkillRank > value)
{ continue; } {
continue;
}
} }
break; break;
} }
@ -1311,22 +1409,30 @@ bool AuctionBotSeller::Initialize()
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_REQ_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_REQ_LEVEL))
{ {
if (prototype->RequiredLevel < value) if (prototype->RequiredLevel < value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_REQ_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_REQ_LEVEL))
{ {
if (prototype->RequiredLevel > value) if (prototype->RequiredLevel > value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_SKILL_RANK)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MIN_SKILL_RANK))
{ {
if (prototype->RequiredSkillRank < value) if (prototype->RequiredSkillRank < value)
{ continue; } {
continue;
}
} }
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_SKILL_RANK)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_ITEM_MAX_SKILL_RANK))
{ {
if (prototype->RequiredSkillRank > value) if (prototype->RequiredSkillRank > value)
{ continue; } {
continue;
}
} }
break; break;
} }
@ -1351,10 +1457,14 @@ bool AuctionBotSeller::Initialize()
{ {
// skip any not locked lootable items (mostly quest specific or reward cases) // skip any not locked lootable items (mostly quest specific or reward cases)
if (!prototype->LockID) if (!prototype->LockID)
{ continue; } {
continue;
}
if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_LOCKBOX_ENABLED)) if (!sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_LOCKBOX_ENABLED))
{ continue; } {
continue;
}
} }
break; break;
@ -1378,10 +1488,14 @@ bool AuctionBotSeller::Initialize()
{ {
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_TRADEGOOD_MIN_ITEM_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_TRADEGOOD_MIN_ITEM_LEVEL))
if (prototype->ItemLevel < value) if (prototype->ItemLevel < value)
{ continue; } {
continue;
}
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_TRADEGOOD_MAX_ITEM_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_TRADEGOOD_MAX_ITEM_LEVEL))
if (prototype->ItemLevel > value) if (prototype->ItemLevel > value)
{ continue; } {
continue;
}
break; break;
} }
case ITEM_CLASS_CONTAINER: case ITEM_CLASS_CONTAINER:
@ -1389,10 +1503,14 @@ bool AuctionBotSeller::Initialize()
{ {
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_CONTAINER_MIN_ITEM_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_CONTAINER_MIN_ITEM_LEVEL))
if (prototype->ItemLevel < value) if (prototype->ItemLevel < value)
{ continue; } {
continue;
}
if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_CONTAINER_MAX_ITEM_LEVEL)) if (uint32 value = sAuctionBotConfig.getConfig(CONFIG_UINT32_AHBOT_CLASS_CONTAINER_MAX_ITEM_LEVEL))
if (prototype->ItemLevel > value) if (prototype->ItemLevel > value)
{ continue; } {
continue;
}
break; break;
} }
@ -1436,7 +1554,9 @@ void AuctionBotSeller::LoadConfig()
{ {
for (int i = 0; i < MAX_AUCTION_HOUSE_TYPE; ++i) for (int i = 0; i < MAX_AUCTION_HOUSE_TYPE; ++i)
if (sAuctionBotConfig.getConfigItemAmountRatio(AuctionHouseType(i))) if (sAuctionBotConfig.getConfigItemAmountRatio(AuctionHouseType(i)))
{ LoadSellerValues(m_HouseConfig[i]); } {
LoadSellerValues(m_HouseConfig[i]);
}
} }
void AuctionBotSeller::LoadItemsQuantity(AHB_Seller_Config& config) void AuctionBotSeller::LoadItemsQuantity(AHB_Seller_Config& config)
@ -1721,7 +1841,9 @@ void AuctionBotSeller::SetItemsRatio(uint32 al, uint32 ho, uint32 ne)
void AuctionBotSeller::SetItemsRatioForHouse(AuctionHouseType house, uint32 val) void AuctionBotSeller::SetItemsRatioForHouse(AuctionHouseType house, uint32 val)
{ {
if (val > 10000) // apply same upper limit as used for config load if (val > 10000) // apply same upper limit as used for config load
{ val = 10000; } {
val = 10000;
}
switch (house) switch (house)
{ {
@ -1831,7 +1953,9 @@ void AuctionBotSeller::addNewAuctions(AHB_Seller_Config& config)
uint64 bidPrice = 0; uint64 bidPrice = 0;
// Not sure if i will keep the next test // Not sure if i will keep the next test
if (sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BUYPRICE_SELLER)) if (sAuctionBotConfig.getConfig(CONFIG_BOOL_AHBOT_BUYPRICE_SELLER))
{ buyoutPrice = prototype->BuyPrice * item->GetCount(); } {
buyoutPrice = prototype->BuyPrice * item->GetCount();
}
else else
{ buyoutPrice = prototype->SellPrice * item->GetCount(); } { buyoutPrice = prototype->SellPrice * item->GetCount(); }
// Price of items are set here // Price of items are set here
@ -1847,7 +1971,9 @@ bool AuctionBotSeller::Update(AuctionHouseType houseType)
{ {
DEBUG_FILTER_LOG(LOG_FILTER_AHBOT_SELLER, "AHBot: %s selling ...", AuctionBotConfig::GetHouseTypeName(houseType)); DEBUG_FILTER_LOG(LOG_FILTER_AHBOT_SELLER, "AHBot: %s selling ...", AuctionBotConfig::GetHouseTypeName(houseType));
if (SetStat(m_HouseConfig[houseType])) if (SetStat(m_HouseConfig[houseType]))
{ addNewAuctions(m_HouseConfig[houseType]); } {
addNewAuctions(m_HouseConfig[houseType]);
}
return true; return true;
} }
else else
@ -1901,25 +2027,33 @@ void AuctionHouseBot::Initialize()
void AuctionHouseBot::SetItemsRatio(uint32 al, uint32 ho, uint32 ne) void AuctionHouseBot::SetItemsRatio(uint32 al, uint32 ho, uint32 ne)
{ {
if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller)) if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller))
{ seller->SetItemsRatio(al, ho, ne); } {
seller->SetItemsRatio(al, ho, ne);
}
} }
void AuctionHouseBot::SetItemsRatioForHouse(AuctionHouseType house, uint32 val) void AuctionHouseBot::SetItemsRatioForHouse(AuctionHouseType house, uint32 val)
{ {
if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller)) if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller))
{ seller->SetItemsRatioForHouse(house, val); } {
seller->SetItemsRatioForHouse(house, val);
}
} }
void AuctionHouseBot::SetItemsAmount(uint32(&vals) [MAX_AUCTION_QUALITY]) void AuctionHouseBot::SetItemsAmount(uint32(&vals) [MAX_AUCTION_QUALITY])
{ {
if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller)) if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller))
{ seller->SetItemsAmount(vals); } {
seller->SetItemsAmount(vals);
}
} }
void AuctionHouseBot::SetItemsAmountForQuality(AuctionQuality quality, uint32 val) void AuctionHouseBot::SetItemsAmountForQuality(AuctionQuality quality, uint32 val)
{ {
if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller)) if (AuctionBotSeller* seller = dynamic_cast<AuctionBotSeller*>(m_Seller))
{ seller->SetItemsAmountForQuality(quality, val); } {
seller->SetItemsAmountForQuality(quality, val);
}
} }
bool AuctionHouseBot::ReloadAllConfig() bool AuctionHouseBot::ReloadAllConfig()
@ -1953,7 +2087,9 @@ void AuctionHouseBot::PrepareStatusInfos(AuctionHouseBotStatusInfo& statusInfo)
if (Aentry->owner == sAuctionBotConfig.GetAHBotId()) // Add only ahbot items if (Aentry->owner == sAuctionBotConfig.GetAHBotId()) // Add only ahbot items
{ {
if (prototype->Quality < MAX_AUCTION_QUALITY) if (prototype->Quality < MAX_AUCTION_QUALITY)
{ ++statusInfo[i].QualityInfo[prototype->Quality]; } {
++statusInfo[i].QualityInfo[prototype->Quality];
}
++statusInfo[i].ItemsCount; ++statusInfo[i].ItemsCount;
} }
@ -1982,7 +2118,9 @@ void AuctionHouseBot::Update()
{ {
// nothing do... // nothing do...
if (!m_Buyer && !m_Seller) if (!m_Buyer && !m_Seller)
{ return; } {
return;
}
// scan all possible update cases until first success // scan all possible update cases until first success
for (uint32 count = 0; count < 2 * MAX_AUCTION_HOUSE_TYPE; ++count) for (uint32 count = 0; count < 2 * MAX_AUCTION_HOUSE_TYPE; ++count)
@ -1992,21 +2130,29 @@ void AuctionHouseBot::Update()
if (m_OperationSelector < MAX_AUCTION_HOUSE_TYPE) if (m_OperationSelector < MAX_AUCTION_HOUSE_TYPE)
{ {
if (m_Seller) if (m_Seller)
{ successStep = m_Seller->Update(AuctionHouseType(m_OperationSelector)); } {
successStep = m_Seller->Update(AuctionHouseType(m_OperationSelector));
}
} }
else else
{ {
if (m_Buyer) if (m_Buyer)
{ successStep = m_Buyer->Update(AuctionHouseType(m_OperationSelector - MAX_AUCTION_HOUSE_TYPE)); } {
successStep = m_Buyer->Update(AuctionHouseType(m_OperationSelector - MAX_AUCTION_HOUSE_TYPE));
}
} }
++m_OperationSelector; ++m_OperationSelector;
if (m_OperationSelector >= 2 * MAX_AUCTION_HOUSE_TYPE) if (m_OperationSelector >= 2 * MAX_AUCTION_HOUSE_TYPE)
{ m_OperationSelector = 0; } {
m_OperationSelector = 0;
}
// one success update per call // one success update per call
if (successStep) if (successStep)
{ break; } {
break;
}
} }
} }
/** @} */ /** @} */

View file

@ -211,7 +211,9 @@ void BattleGround::BroadcastWorker(Do& _do)
{ {
for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
if (Player* plr = ObjectAccessor::FindPlayer(itr->first)) if (Player* plr = ObjectAccessor::FindPlayer(itr->first))
{ _do(plr); } {
_do(plr);
}
} }
BattleGround::BattleGround(): m_BuffChange(false), m_ArenaBuffSpawned(false), m_StartDelayTime(0), m_startMaxDist(0) BattleGround::BattleGround(): m_BuffChange(false), m_ArenaBuffSpawned(false), m_StartDelayTime(0), m_startMaxDist(0)
@ -300,12 +302,16 @@ BattleGround::~BattleGround()
// skip template bgs as they were never added to visible bg list // skip template bgs as they were never added to visible bg list
BattleGroundBracketId bracketId = GetBracketId(); BattleGroundBracketId bracketId = GetBracketId();
if (bracketId != BG_BRACKET_ID_TEMPLATE) if (bracketId != BG_BRACKET_ID_TEMPLATE)
{ sBattleGroundMgr.DeleteClientVisibleInstanceId(GetTypeID(), bracketId, GetClientInstanceID()); } {
sBattleGroundMgr.DeleteClientVisibleInstanceId(GetTypeID(), bracketId, GetClientInstanceID());
}
// unload map // unload map
// map can be null at bg destruction // map can be null at bg destruction
if (m_Map) if (m_Map)
{ m_Map->SetUnload(); } {
m_Map->SetUnload();
}
// remove from bg free slot queue // remove from bg free slot queue
this->RemoveFromBGFreeSlotQueue(); this->RemoveFromBGFreeSlotQueue();
@ -333,7 +339,9 @@ void BattleGround::Update(uint32 diff)
// ]] // ]]
// BattleGround Template instance can not be updated, because it would be deleted // BattleGround Template instance can not be updated, because it would be deleted
if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE)) if (!GetInvitedCount(HORDE) && !GetInvitedCount(ALLIANCE))
{ delete this; } {
delete this;
}
return; return;
} }
@ -377,13 +385,17 @@ void BattleGround::Update(uint32 diff)
if (newtime > (MINUTE * IN_MILLISECONDS)) if (newtime > (MINUTE * IN_MILLISECONDS))
{ {
if (newtime / (MINUTE * IN_MILLISECONDS) != m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS)) if (newtime / (MINUTE * IN_MILLISECONDS) != m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS))
{ PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS))); } {
PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / (MINUTE * IN_MILLISECONDS)));
}
} }
else else
{ {
// announce every 15 seconds // announce every 15 seconds
if (newtime / (15 * IN_MILLISECONDS) != m_PrematureCountDownTimer / (15 * IN_MILLISECONDS)) if (newtime / (15 * IN_MILLISECONDS) != m_PrematureCountDownTimer / (15 * IN_MILLISECONDS))
{ PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / IN_MILLISECONDS)); } {
PSendMessageToAll(LANG_BATTLEGROUND_PREMATURE_FINISH_WARNING_SECS, CHAT_MSG_SYSTEM, NULL, (uint32)(m_PrematureCountDownTimer / IN_MILLISECONDS));
}
} }
m_PrematureCountDownTimer = newtime; m_PrematureCountDownTimer = newtime;
} }
@ -438,7 +450,9 @@ void BattleGround::Update(uint32 diff)
SetStartDelayTime(m_StartDelayTimes[BG_STARTING_EVENT_FIRST]); SetStartDelayTime(m_StartDelayTimes[BG_STARTING_EVENT_FIRST]);
// first start warning - 2 or 1 minute, only if defined // first start warning - 2 or 1 minute, only if defined
if (m_StartMessageIds[BG_STARTING_EVENT_FIRST]) if (m_StartMessageIds[BG_STARTING_EVENT_FIRST])
{ SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL); } {
SendMessageToAll(m_StartMessageIds[BG_STARTING_EVENT_FIRST], CHAT_MSG_BG_SYSTEM_NEUTRAL);
}
} }
// After 1 minute or 30 seconds, warning is signalled // After 1 minute or 30 seconds, warning is signalled
else if (GetStartDelayTime() <= m_StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2)) else if (GetStartDelayTime() <= m_StartDelayTimes[BG_STARTING_EVENT_SECOND] && !(m_Events & BG_STARTING_EVENT_2))
@ -551,10 +565,14 @@ void BattleGround::SendPacketToAll(WorldPacket* packet)
for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{ {
if (itr->second.OfflineRemoveTime) if (itr->second.OfflineRemoveTime)
{ continue; } {
continue;
}
if (Player* plr = sObjectMgr.GetPlayer(itr->first)) if (Player* plr = sObjectMgr.GetPlayer(itr->first))
{ plr->GetSession()->SendPacket(packet); } {
plr->GetSession()->SendPacket(packet);
}
else else
{ sLog.outError("BattleGround:SendPacketToAll: %s not found!", itr->first.GetString().c_str()); } { sLog.outError("BattleGround:SendPacketToAll: %s not found!", itr->first.GetString().c_str()); }
} }
@ -572,7 +590,9 @@ void BattleGround::SendPacketToTeam(Team teamId, WorldPacket* packet, Player* se
for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{ {
if (itr->second.OfflineRemoveTime) if (itr->second.OfflineRemoveTime)
{ continue; } {
continue;
}
Player* plr = sObjectMgr.GetPlayer(itr->first); Player* plr = sObjectMgr.GetPlayer(itr->first);
if (!plr) if (!plr)
@ -582,13 +602,17 @@ void BattleGround::SendPacketToTeam(Team teamId, WorldPacket* packet, Player* se
} }
if (!self && sender == plr) if (!self && sender == plr)
{ continue; } {
continue;
}
Team team = itr->second.PlayerTeam; Team team = itr->second.PlayerTeam;
if (!team) { team = plr->GetTeam(); } if (!team) { team = plr->GetTeam(); }
if (team == teamId) if (team == teamId)
{ plr->GetSession()->SendPacket(packet); } {
plr->GetSession()->SendPacket(packet);
}
} }
} }
@ -615,7 +639,9 @@ void BattleGround::PlaySoundToTeam(uint32 SoundID, Team teamId)
for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{ {
if (itr->second.OfflineRemoveTime) if (itr->second.OfflineRemoveTime)
{ continue; } {
continue;
}
Player* plr = sObjectMgr.GetPlayer(itr->first); Player* plr = sObjectMgr.GetPlayer(itr->first);
if (!plr) if (!plr)
@ -645,7 +671,9 @@ void BattleGround::CastSpellOnTeam(uint32 SpellID, Team teamId)
for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{ {
if (itr->second.OfflineRemoveTime) if (itr->second.OfflineRemoveTime)
{ continue; } {
continue;
}
Player* plr = sObjectMgr.GetPlayer(itr->first); Player* plr = sObjectMgr.GetPlayer(itr->first);
@ -659,7 +687,9 @@ void BattleGround::CastSpellOnTeam(uint32 SpellID, Team teamId)
if (!team) { team = plr->GetTeam(); } if (!team) { team = plr->GetTeam(); }
if (team == teamId) if (team == teamId)
{ plr->CastSpell(plr, SpellID, true); } {
plr->CastSpell(plr, SpellID, true);
}
} }
} }
@ -673,7 +703,9 @@ void BattleGround::RewardHonorToTeam(uint32 Honor, Team teamId)
for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{ {
if (itr->second.OfflineRemoveTime) if (itr->second.OfflineRemoveTime)
{ continue; } {
continue;
}
Player* plr = sObjectMgr.GetPlayer(itr->first); Player* plr = sObjectMgr.GetPlayer(itr->first);
@ -687,7 +719,9 @@ void BattleGround::RewardHonorToTeam(uint32 Honor, Team teamId)
if (!team) { team = plr->GetTeam(); } if (!team) { team = plr->GetTeam(); }
if (team == teamId) if (team == teamId)
{ UpdatePlayerScore(plr, SCORE_BONUS_HONOR, Honor); } {
UpdatePlayerScore(plr, SCORE_BONUS_HONOR, Honor);
}
} }
} }
@ -702,12 +736,16 @@ void BattleGround::RewardReputationToTeam(uint32 faction_id, uint32 Reputation,
FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id); FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id);
if (!factionEntry) if (!factionEntry)
{ return; } {
return;
}
for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for (BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
{ {
if (itr->second.OfflineRemoveTime) if (itr->second.OfflineRemoveTime)
{ continue; } {
continue;
}
Player* plr = sObjectMgr.GetPlayer(itr->first); Player* plr = sObjectMgr.GetPlayer(itr->first);
@ -721,7 +759,9 @@ void BattleGround::RewardReputationToTeam(uint32 faction_id, uint32 Reputation,
if (!team) { team = plr->GetTeam(); } if (!team) { team = plr->GetTeam(); }
if (team == teamId) if (team == teamId)
{ plr->GetReputationMgr().ModifyReputation(factionEntry, Reputation); } {
plr->GetReputationMgr().ModifyReputation(factionEntry, Reputation);
}
} }
} }
@ -873,7 +913,9 @@ void BattleGround::EndBattleGround(Team winner)
// should remove spirit of redemption // should remove spirit of redemption
if (plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) if (plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION))
{ plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); } {
plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT);
}
if (!plr->IsAlive()) if (!plr->IsAlive())
{ {
@ -976,7 +1018,9 @@ void BattleGround::EndBattleGround(Team winner)
} }
if (winmsg_id) if (winmsg_id)
{ SendMessageToAll(winmsg_id, CHAT_MSG_BG_SYSTEM_NEUTRAL); } {
SendMessageToAll(winmsg_id, CHAT_MSG_BG_SYSTEM_NEUTRAL);
}
} }
/// <summary> /// <summary>
@ -1018,19 +1062,25 @@ void BattleGround::RewardMark(Player* plr, uint32 count)
{ {
case BATTLEGROUND_AV: case BATTLEGROUND_AV:
if (count == ITEM_WINNER_COUNT) if (count == ITEM_WINNER_COUNT)
{ RewardSpellCast(plr, SPELL_AV_MARK_WINNER); } {
RewardSpellCast(plr, SPELL_AV_MARK_WINNER);
}
else else
{ RewardSpellCast(plr, SPELL_AV_MARK_LOSER); } { RewardSpellCast(plr, SPELL_AV_MARK_LOSER); }
break; break;
case BATTLEGROUND_WS: case BATTLEGROUND_WS:
if (count == ITEM_WINNER_COUNT) if (count == ITEM_WINNER_COUNT)
{ RewardSpellCast(plr, SPELL_WS_MARK_WINNER); } {
RewardSpellCast(plr, SPELL_WS_MARK_WINNER);
}
else else
{ RewardSpellCast(plr, SPELL_WS_MARK_LOSER); } { RewardSpellCast(plr, SPELL_WS_MARK_LOSER); }
break; break;
case BATTLEGROUND_AB: case BATTLEGROUND_AB:
if (count == ITEM_WINNER_COUNT) if (count == ITEM_WINNER_COUNT)
{ RewardSpellCast(plr, SPELL_AB_MARK_WINNER); } {
RewardSpellCast(plr, SPELL_AB_MARK_WINNER);
}
else else
{ RewardSpellCast(plr, SPELL_AB_MARK_LOSER); } { RewardSpellCast(plr, SPELL_AB_MARK_LOSER); }
break; break;
@ -1084,14 +1134,20 @@ void BattleGround::RewardItem(Player* plr, uint32 item_id, uint32 count)
} }
if (msg != EQUIP_ERR_OK) // convert to possible store amount if (msg != EQUIP_ERR_OK) // convert to possible store amount
{ count -= no_space_count; } {
count -= no_space_count;
}
if (count != 0 && !dest.empty()) // can add some if (count != 0 && !dest.empty()) // can add some
if (Item* item = plr->StoreNewItem(dest, item_id, true, 0)) if (Item* item = plr->StoreNewItem(dest, item_id, true, 0))
{ plr->SendNewItem(item, count, true, false); } {
plr->SendNewItem(item, count, true, false);
}
if (no_space_count > 0) if (no_space_count > 0)
{ SendRewardMarkByMail(plr, item_id, no_space_count); } {
SendRewardMarkByMail(plr, item_id, no_space_count);
}
} }
/// <summary> /// <summary>
@ -1104,11 +1160,15 @@ void BattleGround::SendRewardMarkByMail(Player* plr, uint32 mark, uint32 count)
{ {
uint32 bmEntry = GetBattlemasterEntry(); uint32 bmEntry = GetBattlemasterEntry();
if (!bmEntry) if (!bmEntry)
{ return; } {
return;
}
ItemPrototype const* markProto = ObjectMgr::GetItemPrototype(mark); ItemPrototype const* markProto = ObjectMgr::GetItemPrototype(mark);
if (!markProto) if (!markProto)
{ return; } {
return;
}
if (Item* markItem = Item::CreateItem(mark, count, plr)) if (Item* markItem = Item::CreateItem(mark, count, plr))
{ {
@ -1202,7 +1262,9 @@ void BattleGround::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
{ {
// should remove spirit of redemption // should remove spirit of redemption
if (plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) if (plr->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION))
{ plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); } {
plr->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT);
}
plr->RemoveAurasDueToSpell(isArena() ? SPELL_ARENA_DAMPENING : SPELL_BATTLEGROUND_DAMPENING); plr->RemoveAurasDueToSpell(isArena() ? SPELL_ARENA_DAMPENING : SPELL_BATTLEGROUND_DAMPENING);
plr->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED); plr->RemoveSpellsCausingAura(SPELL_AURA_MOUNTED);
@ -1300,7 +1362,9 @@ void BattleGround::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
plr->SetBGTeam(TEAM_NONE); plr->SetBGTeam(TEAM_NONE);
if (Transport) if (Transport)
{ plr->TeleportToBGEntryPoint(); } {
plr->TeleportToBGEntryPoint();
}
DETAIL_LOG("BATTLEGROUND: Removed player %s from BattleGround.", plr->GetName()); DETAIL_LOG("BATTLEGROUND: Removed player %s from BattleGround.", plr->GetName());
} }
@ -1331,7 +1395,9 @@ void BattleGround::Reset()
} }
if (m_InvitedAlliance > 0 || m_InvitedHorde > 0) if (m_InvitedAlliance > 0 || m_InvitedHorde > 0)
{ sLog.outError("BattleGround system: bad counter, m_InvitedAlliance: %d, m_InvitedHorde: %d", m_InvitedAlliance, m_InvitedHorde); } {
sLog.outError("BattleGround system: bad counter, m_InvitedAlliance: %d, m_InvitedHorde: %d", m_InvitedAlliance, m_InvitedHorde);
}
m_InvitedAlliance = 0; m_InvitedAlliance = 0;
m_InvitedHorde = 0; m_InvitedHorde = 0;
@ -1375,7 +1441,9 @@ void BattleGround::AddPlayer(Player* plr)
{ {
// remove afk from player // remove afk from player
if (plr->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK)) if (plr->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_AFK))
{ plr->ToggleAFK(); } {
plr->ToggleAFK();
}
// score struct must be created in inherited class // score struct must be created in inherited class
@ -1473,7 +1541,9 @@ void BattleGround::AddOrSetPlayerToCorrectBgGroup(Player* plr, ObjectGuid plr_gu
group->AddMember(plr_guid, plr->GetName()); group->AddMember(plr_guid, plr->GetName());
if (Group* originalGroup = plr->GetOriginalGroup()) if (Group* originalGroup = plr->GetOriginalGroup())
if (originalGroup->IsLeader(plr_guid)) if (originalGroup->IsLeader(plr_guid))
{ group->ChangeLeader(plr_guid); } {
group->ChangeLeader(plr_guid);
}
} }
} }
else // first player joined else // first player joined
@ -1568,7 +1638,9 @@ uint32 BattleGround::GetFreeSlotsForTeam(Team team) const
{ {
// return free slot count to MaxPlayerPerTeam // return free slot count to MaxPlayerPerTeam
if (GetStatus() == STATUS_WAIT_JOIN || GetStatus() == STATUS_IN_PROGRESS) if (GetStatus() == STATUS_WAIT_JOIN || GetStatus() == STATUS_IN_PROGRESS)
{ return (GetInvitedCount(team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(team) : 0; } {
return (GetInvitedCount(team) < GetMaxPlayersPerTeam()) ? GetMaxPlayersPerTeam() - GetInvitedCount(team) : 0;
}
return 0; return 0;
} }
@ -1594,7 +1666,9 @@ void BattleGround::UpdatePlayerScore(Player* Source, uint32 type, uint32 value)
BattleGroundScoreMap::const_iterator itr = m_PlayerScores.find(Source->GetObjectGuid()); BattleGroundScoreMap::const_iterator itr = m_PlayerScores.find(Source->GetObjectGuid());
if (itr == m_PlayerScores.end()) // player not found... if (itr == m_PlayerScores.end()) // player not found...
{ return; } {
return;
}
switch (type) switch (type)
{ {
@ -1685,10 +1759,14 @@ void BattleGround::OnObjectDBLoad(Creature* creature)
{ {
const BattleGroundEventIdx eventId = sBattleGroundMgr.GetCreatureEventIndex(creature->GetGUIDLow()); const BattleGroundEventIdx eventId = sBattleGroundMgr.GetCreatureEventIndex(creature->GetGUIDLow());
if (eventId.event1 == BG_EVENT_NONE) if (eventId.event1 == BG_EVENT_NONE)
{ return; } {
return;
}
m_EventObjects[MAKE_PAIR32(eventId.event1, eventId.event2)].creatures.push_back(creature->GetObjectGuid()); m_EventObjects[MAKE_PAIR32(eventId.event1, eventId.event2)].creatures.push_back(creature->GetObjectGuid());
if (!IsActiveEvent(eventId.event1, eventId.event2)) if (!IsActiveEvent(eventId.event1, eventId.event2))
{ SpawnBGCreature(creature->GetObjectGuid(), RESPAWN_ONE_DAY); } {
SpawnBGCreature(creature->GetObjectGuid(), RESPAWN_ONE_DAY);
}
} }
/// <summary> /// <summary>
@ -1701,7 +1779,9 @@ ObjectGuid BattleGround::GetSingleCreatureGuid(uint8 event1, uint8 event2)
{ {
GuidVector::const_iterator itr = m_EventObjects[MAKE_PAIR32(event1, event2)].creatures.begin(); GuidVector::const_iterator itr = m_EventObjects[MAKE_PAIR32(event1, event2)].creatures.begin();
if (itr != m_EventObjects[MAKE_PAIR32(event1, event2)].creatures.end()) if (itr != m_EventObjects[MAKE_PAIR32(event1, event2)].creatures.end())
{ return *itr; } {
return *itr;
}
return ObjectGuid(); return ObjectGuid();
} }
@ -1713,7 +1793,9 @@ void BattleGround::OnObjectDBLoad(GameObject* obj)
{ {
const BattleGroundEventIdx eventId = sBattleGroundMgr.GetGameObjectEventIndex(obj->GetGUIDLow()); const BattleGroundEventIdx eventId = sBattleGroundMgr.GetGameObjectEventIndex(obj->GetGUIDLow());
if (eventId.event1 == BG_EVENT_NONE) if (eventId.event1 == BG_EVENT_NONE)
{ return; } {
return;
}
m_EventObjects[MAKE_PAIR32(eventId.event1, eventId.event2)].gameobjects.push_back(obj->GetObjectGuid()); m_EventObjects[MAKE_PAIR32(eventId.event1, eventId.event2)].gameobjects.push_back(obj->GetObjectGuid());
if (!IsActiveEvent(eventId.event1, eventId.event2)) if (!IsActiveEvent(eventId.event1, eventId.event2))
{ {
@ -1723,7 +1805,9 @@ void BattleGround::OnObjectDBLoad(GameObject* obj)
{ {
// it's possible, that doors aren't spawned anymore (wsg) // it's possible, that doors aren't spawned anymore (wsg)
if (GetStatus() >= STATUS_IN_PROGRESS && IsDoor(eventId.event1, eventId.event2)) if (GetStatus() >= STATUS_IN_PROGRESS && IsDoor(eventId.event1, eventId.event2))
{ DoorOpen(obj->GetObjectGuid()); } {
DoorOpen(obj->GetObjectGuid());
}
} }
} }
@ -1811,12 +1895,16 @@ void BattleGround::SpawnBGObject(ObjectGuid guid, uint32 respawntime)
GameObject* obj = map->GetGameObject(guid); GameObject* obj = map->GetGameObject(guid);
if (!obj) if (!obj)
{ return; } {
return;
}
if (respawntime == 0) if (respawntime == 0)
{ {
// we need to change state from GO_JUST_DEACTIVATED to GO_READY in case battleground is starting again // we need to change state from GO_JUST_DEACTIVATED to GO_READY in case battleground is starting again
if (obj->getLootState() == GO_JUST_DEACTIVATED) if (obj->getLootState() == GO_JUST_DEACTIVATED)
{ obj->SetLootState(GO_READY); } {
obj->SetLootState(GO_READY);
}
obj->SetRespawnTime(0); obj->SetRespawnTime(0);
map->Add(obj); map->Add(obj);
} }
@ -1839,7 +1927,9 @@ void BattleGround::SpawnBGCreature(ObjectGuid guid, uint32 respawntime)
Creature* obj = map->GetCreature(guid); Creature* obj = map->GetCreature(guid);
if (!obj) if (!obj)
{ return; } {
return;
}
if (respawntime == 0) if (respawntime == 0)
{ {
obj->Respawn(); obj->Respawn();
@ -1877,7 +1967,9 @@ void BattleGround::SendYellToAll(int32 entry, uint32 language, ObjectGuid guid)
{ {
Creature* source = GetBgMap()->GetCreature(guid); Creature* source = GetBgMap()->GetCreature(guid);
if (!source) if (!source)
{ return; } {
return;
}
MaNGOS::BattleGroundYellBuilder bg_builder(Language(language), entry, source); MaNGOS::BattleGroundYellBuilder bg_builder(Language(language), entry, source);
MaNGOS::LocalizedPacketDo<MaNGOS::BattleGroundYellBuilder> bg_do(bg_builder); MaNGOS::LocalizedPacketDo<MaNGOS::BattleGroundYellBuilder> bg_do(bg_builder);
BroadcastWorker(bg_do); BroadcastWorker(bg_do);
@ -1929,7 +2021,9 @@ void BattleGround::SendYell2ToAll(int32 entry, uint32 language, ObjectGuid guid,
{ {
Creature* source = GetBgMap()->GetCreature(guid); Creature* source = GetBgMap()->GetCreature(guid);
if (!source) if (!source)
{ return; } {
return;
}
MaNGOS::BattleGround2YellBuilder bg_builder(language, entry, source, arg1, arg2); MaNGOS::BattleGround2YellBuilder bg_builder(language, entry, source, arg1, arg2);
MaNGOS::LocalizedPacketDo<MaNGOS::BattleGround2YellBuilder> bg_do(bg_builder); MaNGOS::LocalizedPacketDo<MaNGOS::BattleGround2YellBuilder> bg_do(bg_builder);
BroadcastWorker(bg_do); BroadcastWorker(bg_do);
@ -1957,7 +2051,9 @@ void BattleGround::HandleTriggerBuff(ObjectGuid go_guid)
{ {
GameObject* obj = GetBgMap()->GetGameObject(go_guid); GameObject* obj = GetBgMap()->GetGameObject(go_guid);
if (!obj || obj->GetGoType() != GAMEOBJECT_TYPE_TRAP || !obj->isSpawned()) if (!obj || obj->GetGoType() != GAMEOBJECT_TYPE_TRAP || !obj->isSpawned())
{ return; } {
return;
}
obj->SetLootState(GO_JUST_DEACTIVATED); // can be despawned or destroyed obj->SetLootState(GO_JUST_DEACTIVATED); // can be despawned or destroyed
return; return;
@ -1984,10 +2080,14 @@ void BattleGround::HandleKillPlayer(Player* player, Player* killer)
Player* plr = sObjectMgr.GetPlayer(itr->first); Player* plr = sObjectMgr.GetPlayer(itr->first);
if (!plr || plr == killer) if (!plr || plr == killer)
{ continue; } {
continue;
}
if (plr->GetTeam() == killer->GetTeam() && plr->IsAtGroupRewardDistance(player)) if (plr->GetTeam() == killer->GetTeam() && plr->IsAtGroupRewardDistance(player))
{ UpdatePlayerScore(plr, SCORE_HONORABLE_KILLS, 1); } {
UpdatePlayerScore(plr, SCORE_HONORABLE_KILLS, 1);
}
} }
} }
@ -2006,7 +2106,9 @@ Team BattleGround::GetPlayerTeam(ObjectGuid guid)
{ {
BattleGroundPlayerMap::const_iterator itr = m_Players.find(guid); BattleGroundPlayerMap::const_iterator itr = m_Players.find(guid);
if (itr != m_Players.end()) if (itr != m_Players.end())
{ return itr->second.PlayerTeam; } {
return itr->second.PlayerTeam;
}
return TEAM_NONE; return TEAM_NONE;
} }
@ -2019,7 +2121,9 @@ bool BattleGround::IsPlayerInBattleGround(ObjectGuid guid)
{ {
BattleGroundPlayerMap::const_iterator itr = m_Players.find(guid); BattleGroundPlayerMap::const_iterator itr = m_Players.find(guid);
if (itr != m_Players.end()) if (itr != m_Players.end())
{ return true; } {
return true;
}
return false; return false;
} }
@ -2030,7 +2134,9 @@ bool BattleGround::IsPlayerInBattleGround(ObjectGuid guid)
void BattleGround::PlayerAddedToBGCheckIfBGIsRunning(Player* plr) void BattleGround::PlayerAddedToBGCheckIfBGIsRunning(Player* plr)
{ {
if (GetStatus() != STATUS_WAIT_LEAVE) if (GetStatus() != STATUS_WAIT_LEAVE)
{ return; } {
return;
}
WorldPacket data; WorldPacket data;
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
@ -2058,7 +2164,9 @@ uint32 BattleGround::GetAlivePlayersCountByTeam(Team team) const
{ {
Player* pl = sObjectMgr.GetPlayer(itr->first); Player* pl = sObjectMgr.GetPlayer(itr->first);
if (pl && pl->IsAlive()) if (pl && pl->IsAlive())
{ ++count; } {
++count;
}
} }
} }
return count; return count;
@ -2082,10 +2190,14 @@ void BattleGround::SetBgRaid(Team team, Group* bg_raid)
Group*& old_raid = m_BgRaids[GetTeamIndexByTeamId(team)]; Group*& old_raid = m_BgRaids[GetTeamIndexByTeamId(team)];
if (old_raid) if (old_raid)
{ old_raid->SetBattlegroundGroup(NULL); } {
old_raid->SetBattlegroundGroup(NULL);
}
if (bg_raid) if (bg_raid)
{ bg_raid->SetBattlegroundGroup(this); } {
bg_raid->SetBattlegroundGroup(this);
}
old_raid = bg_raid; old_raid = bg_raid;
} }

View file

@ -664,7 +664,9 @@ class BattleGround
uint32 GetInvitedCount(Team team) const uint32 GetInvitedCount(Team team) const
{ {
if (team == ALLIANCE) if (team == ALLIANCE)
{ return m_InvitedAlliance; } {
return m_InvitedAlliance;
}
else else
{ return m_InvitedHorde; } { return m_InvitedHorde; }
} }
@ -1030,7 +1032,9 @@ class BattleGround
void UpdatePlayersCountByTeam(Team team, bool remove) void UpdatePlayersCountByTeam(Team team, bool remove)
{ {
if (remove) if (remove)
{ --m_PlayersCount[GetTeamIndexByTeamId(team)]; } {
--m_PlayersCount[GetTeamIndexByTeamId(team)];
}
else else
{ ++m_PlayersCount[GetTeamIndexByTeamId(team)]; } { ++m_PlayersCount[GetTeamIndexByTeamId(team)]; }
} }
@ -1193,7 +1197,9 @@ class BattleGround
bool IsActiveEvent(uint8 event1, uint8 event2) bool IsActiveEvent(uint8 event1, uint8 event2)
{ {
if (m_ActiveEvents.find(event1) == m_ActiveEvents.end()) if (m_ActiveEvents.find(event1) == m_ActiveEvents.end())
{ return false; } {
return false;
}
return m_ActiveEvents[event1] == event2; return m_ActiveEvents[event1] == event2;
} }
/** /**

View file

@ -68,7 +68,9 @@ void BattleGroundAB::Update(uint32 diff)
if (m_BannerTimers[node].timer) if (m_BannerTimers[node].timer)
{ {
if (m_BannerTimers[node].timer > diff) if (m_BannerTimers[node].timer > diff)
{ m_BannerTimers[node].timer -= diff; } {
m_BannerTimers[node].timer -= diff;
}
else else
{ {
m_BannerTimers[node].timer = 0; m_BannerTimers[node].timer = 0;
@ -80,7 +82,9 @@ void BattleGroundAB::Update(uint32 diff)
if (m_NodeTimers[node]) if (m_NodeTimers[node])
{ {
if (m_NodeTimers[node] > diff) if (m_NodeTimers[node] > diff)
{ m_NodeTimers[node] -= diff; } {
m_NodeTimers[node] -= diff;
}
else else
{ {
m_NodeTimers[node] = 0; m_NodeTimers[node] = 0;
@ -109,7 +113,9 @@ void BattleGroundAB::Update(uint32 diff)
for (uint8 team = 0; team < PVP_TEAM_COUNT; ++team) for (uint8 team = 0; team < PVP_TEAM_COUNT; ++team)
if (m_Nodes[node] == team + BG_AB_NODE_TYPE_OCCUPIED) if (m_Nodes[node] == team + BG_AB_NODE_TYPE_OCCUPIED)
{ ++team_points[team]; } {
++team_points[team];
}
} }
// Accumulate points // Accumulate points
@ -117,7 +123,9 @@ void BattleGroundAB::Update(uint32 diff)
{ {
int points = team_points[team]; int points = team_points[team];
if (!points) if (!points)
{ continue; } {
continue;
}
m_lastTick[team] += diff; m_lastTick[team] += diff;
if (m_lastTick[team] > BG_AB_TickIntervals[points]) if (m_lastTick[team] > BG_AB_TickIntervals[points])
{ {
@ -138,7 +146,9 @@ void BattleGroundAB::Update(uint32 diff)
if (!m_IsInformedNearVictory && m_TeamScores[team] > BG_AB_WARNING_NEAR_VICTORY_SCORE) if (!m_IsInformedNearVictory && m_TeamScores[team] > BG_AB_WARNING_NEAR_VICTORY_SCORE)
{ {
if (team == TEAM_INDEX_ALLIANCE) if (team == TEAM_INDEX_ALLIANCE)
{ SendMessageToAll(LANG_BG_AB_A_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); } {
SendMessageToAll(LANG_BG_AB_A_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL);
}
else else
{ SendMessageToAll(LANG_BG_AB_H_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); } { SendMessageToAll(LANG_BG_AB_H_NEAR_VICTORY, CHAT_MSG_BG_SYSTEM_NEUTRAL); }
PlaySoundToAll(BG_AB_SOUND_NEAR_VICTORY); PlaySoundToAll(BG_AB_SOUND_NEAR_VICTORY);
@ -146,11 +156,17 @@ void BattleGroundAB::Update(uint32 diff)
} }
if (m_TeamScores[team] > BG_AB_MAX_TEAM_SCORE) if (m_TeamScores[team] > BG_AB_MAX_TEAM_SCORE)
{ m_TeamScores[team] = BG_AB_MAX_TEAM_SCORE; } {
m_TeamScores[team] = BG_AB_MAX_TEAM_SCORE;
}
if (team == TEAM_INDEX_ALLIANCE) if (team == TEAM_INDEX_ALLIANCE)
{ UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]); } {
UpdateWorldState(BG_AB_OP_RESOURCES_ALLY, m_TeamScores[team]);
}
if (team == TEAM_INDEX_HORDE) if (team == TEAM_INDEX_HORDE)
{ UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]); } {
UpdateWorldState(BG_AB_OP_RESOURCES_HORDE, m_TeamScores[team]);
}
// update achievement flags // update achievement flags
// we increased m_TeamScores[team] so we just need to check if it is 500 more than other teams resources // we increased m_TeamScores[team] so we just need to check if it is 500 more than other teams resources
@ -163,9 +179,13 @@ void BattleGroundAB::Update(uint32 diff)
// Test win condition // Test win condition
if (m_TeamScores[TEAM_INDEX_ALLIANCE] >= BG_AB_MAX_TEAM_SCORE) if (m_TeamScores[TEAM_INDEX_ALLIANCE] >= BG_AB_MAX_TEAM_SCORE)
{ EndBattleGround(ALLIANCE); } {
EndBattleGround(ALLIANCE);
}
if (m_TeamScores[TEAM_INDEX_HORDE] >= BG_AB_MAX_TEAM_SCORE) if (m_TeamScores[TEAM_INDEX_HORDE] >= BG_AB_MAX_TEAM_SCORE)
{ EndBattleGround(HORDE); } {
EndBattleGround(HORDE);
}
} }
} }
@ -213,13 +233,17 @@ bool BattleGroundAB::HandleAreaTrigger(Player* source, uint32 trigger)
{ {
case 3948: // Arathi Basin Alliance Exit. case 3948: // Arathi Basin Alliance Exit.
if (source->GetTeam() != ALLIANCE) if (source->GetTeam() != ALLIANCE)
{ source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_ALLIANCE_USE); } {
source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_ALLIANCE_USE);
}
else else
{ source->LeaveBattleground(); } { source->LeaveBattleground(); }
break; break;
case 3949: // Arathi Basin Horde Exit. case 3949: // Arathi Basin Horde Exit.
if (source->GetTeam() != HORDE) if (source->GetTeam() != HORDE)
{ source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_HORDE_USE); } {
source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_HORDE_USE);
}
else else
{ source->LeaveBattleground(); } { source->LeaveBattleground(); }
break; break;
@ -250,7 +274,9 @@ void BattleGroundAB::_CreateBanner(uint8 node, uint8 type, uint8 teamIndex, bool
// cause the node-type is in the generic form // cause the node-type is in the generic form
// please see in the headerfile for the ids // please see in the headerfile for the ids
if (type != BG_AB_NODE_TYPE_NEUTRAL) if (type != BG_AB_NODE_TYPE_NEUTRAL)
{ type += teamIndex; } {
type += teamIndex;
}
SpawnEvent(node, type, true); // will automaticly despawn other events SpawnEvent(node, type, true); // will automaticly despawn other events
} }
@ -297,7 +323,9 @@ void BattleGroundAB::FillInitialWorldStates(WorldPacket& data, uint32& count)
uint8 ally = 0, horde = 0; uint8 ally = 0, horde = 0;
for (uint8 node = 0; node < BG_AB_NODES_MAX; ++node) for (uint8 node = 0; node < BG_AB_NODES_MAX; ++node)
if (m_Nodes[node] == BG_AB_NODE_STATUS_ALLY_OCCUPIED) if (m_Nodes[node] == BG_AB_NODE_STATUS_ALLY_OCCUPIED)
{ ++ally; } {
++ally;
}
else if (m_Nodes[node] == BG_AB_NODE_STATUS_HORDE_OCCUPIED) else if (m_Nodes[node] == BG_AB_NODE_STATUS_HORDE_OCCUPIED)
{ ++horde; } { ++horde; }
@ -324,7 +352,9 @@ void BattleGroundAB::_SendNodeUpdate(uint8 node)
const uint8 plusArray[] = {0, 2, 3, 0, 1}; const uint8 plusArray[] = {0, 2, 3, 0, 1};
if (m_prevNodes[node]) if (m_prevNodes[node])
{ UpdateWorldState(BG_AB_OP_NODESTATES[node] + plusArray[m_prevNodes[node]], WORLD_STATE_REMOVE); } {
UpdateWorldState(BG_AB_OP_NODESTATES[node] + plusArray[m_prevNodes[node]], WORLD_STATE_REMOVE);
}
else else
{ UpdateWorldState(BG_AB_OP_NODEICONS[node], WORLD_STATE_REMOVE); } { UpdateWorldState(BG_AB_OP_NODEICONS[node], WORLD_STATE_REMOVE); }
@ -334,7 +364,9 @@ void BattleGroundAB::_SendNodeUpdate(uint8 node)
uint8 ally = 0, horde = 0; uint8 ally = 0, horde = 0;
for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i) for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i)
if (m_Nodes[i] == BG_AB_NODE_STATUS_ALLY_OCCUPIED) if (m_Nodes[i] == BG_AB_NODE_STATUS_ALLY_OCCUPIED)
{ ++ally; } {
++ally;
}
else if (m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED) else if (m_Nodes[i] == BG_AB_NODE_STATUS_HORDE_OCCUPIED)
{ ++horde; } { ++horde; }
@ -353,12 +385,18 @@ void BattleGroundAB::_NodeOccupied(uint8 node, Team team)
for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i) for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i)
{ {
if (m_Nodes[node] == GetTeamIndexByTeamId(team) + BG_AB_NODE_TYPE_OCCUPIED && !m_NodeTimers[i]) if (m_Nodes[node] == GetTeamIndexByTeamId(team) + BG_AB_NODE_TYPE_OCCUPIED && !m_NodeTimers[i])
{ ++capturedNodes; } {
++capturedNodes;
}
} }
if (capturedNodes >= 5) if (capturedNodes >= 5)
{ CastSpellOnTeam(SPELL_AB_QUEST_REWARD_5_BASES, team); } {
CastSpellOnTeam(SPELL_AB_QUEST_REWARD_5_BASES, team);
}
if (capturedNodes >= 4) if (capturedNodes >= 4)
{ CastSpellOnTeam(SPELL_AB_QUEST_REWARD_4_BASES, team); } {
CastSpellOnTeam(SPELL_AB_QUEST_REWARD_4_BASES, team);
}
} }
/* Invoked if a player used a banner as a gameobject */ /* Invoked if a player used a banner as a gameobject */
@ -370,18 +408,24 @@ void BattleGroundAB::_NodeOccupied(uint8 node, Team team)
void BattleGroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj) void BattleGroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
uint8 event = (sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetGUIDLow())).event1; uint8 event = (sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetGUIDLow())).event1;
if (event >= BG_AB_NODES_MAX) // not a node if (event >= BG_AB_NODES_MAX) // not a node
{ return; } {
return;
}
BG_AB_Nodes node = BG_AB_Nodes(event); BG_AB_Nodes node = BG_AB_Nodes(event);
PvpTeamIndex teamIndex = GetTeamIndexByTeamId(source->GetTeam()); PvpTeamIndex teamIndex = GetTeamIndexByTeamId(source->GetTeam());
// Check if player really could use this banner, not cheated // Check if player really could use this banner, not cheated
if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node] % 2)) if (!(m_Nodes[node] == 0 || teamIndex == m_Nodes[node] % 2))
{ return; } {
return;
}
source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
uint32 sound; uint32 sound;
@ -400,7 +444,9 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* target
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME; m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
if (teamIndex == 0) if (teamIndex == 0)
{ SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node), LANG_BG_ALLY); } {
SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node), LANG_BG_ALLY);
}
else else
{ SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node), LANG_BG_HORDE); } { SendMessage2ToAll(LANG_BG_AB_NODE_CLAIMED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node), LANG_BG_HORDE); }
@ -421,7 +467,9 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* target
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME; m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
if (teamIndex == TEAM_INDEX_ALLIANCE) if (teamIndex == TEAM_INDEX_ALLIANCE)
{ SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node)); } {
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
}
else else
{ SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node)); } { SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node)); }
} }
@ -438,7 +486,9 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* target
_NodeOccupied(node, (teamIndex == TEAM_INDEX_ALLIANCE) ? ALLIANCE : HORDE); _NodeOccupied(node, (teamIndex == TEAM_INDEX_ALLIANCE) ? ALLIANCE : HORDE);
if (teamIndex == TEAM_INDEX_ALLIANCE) if (teamIndex == TEAM_INDEX_ALLIANCE)
{ SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node)); } {
SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
}
else else
{ SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node)); } { SendMessage2ToAll(LANG_BG_AB_NODE_DEFENDED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node)); }
} }
@ -456,7 +506,9 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* target
m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME; m_NodeTimers[node] = BG_AB_FLAG_CAPTURING_TIME;
if (teamIndex == TEAM_INDEX_ALLIANCE) if (teamIndex == TEAM_INDEX_ALLIANCE)
{ SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node)); } {
SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_ALLIANCE, source, _GetNodeNameId(node));
}
else else
{ SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node)); } { SendMessage2ToAll(LANG_BG_AB_NODE_ASSAULTED, CHAT_MSG_BG_SYSTEM_HORDE, source, _GetNodeNameId(node)); }
@ -467,7 +519,9 @@ void BattleGroundAB::EventPlayerClickedOnFlag(Player* source, GameObject* target
if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED) if (m_Nodes[node] >= BG_AB_NODE_TYPE_OCCUPIED)
{ {
if (teamIndex == TEAM_INDEX_ALLIANCE) if (teamIndex == TEAM_INDEX_ALLIANCE)
{ SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_ALLY, _GetNodeNameId(node)); } {
SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_ALLIANCE, NULL, LANG_BG_ALLY, _GetNodeNameId(node));
}
else else
{ SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_HORDE, _GetNodeNameId(node)); } { SendMessage2ToAll(LANG_BG_AB_NODE_TAKEN, CHAT_MSG_BG_SYSTEM_HORDE, NULL, LANG_BG_HORDE, _GetNodeNameId(node)); }
} }
@ -539,7 +593,9 @@ WorldSafeLocsEntry const* BattleGroundAB::GetClosestGraveYard(Player* player)
std::vector<uint8> nodes; std::vector<uint8> nodes;
for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i) for (uint8 i = 0; i < BG_AB_NODES_MAX; ++i)
if (m_Nodes[i] == teamIndex + 3) if (m_Nodes[i] == teamIndex + 3)
{ nodes.push_back(i); } {
nodes.push_back(i);
}
WorldSafeLocsEntry const* good_entry = NULL; WorldSafeLocsEntry const* good_entry = NULL;
// If so, select the closest node to place ghost on // If so, select the closest node to place ghost on
@ -553,7 +609,9 @@ WorldSafeLocsEntry const* BattleGroundAB::GetClosestGraveYard(Player* player)
{ {
WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[nodes[i]]); WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[nodes[i]]);
if (!entry) if (!entry)
{ continue; } {
continue;
}
float dist = (entry->x - plr_x) * (entry->x - plr_x) + (entry->y - plr_y) * (entry->y - plr_y); float dist = (entry->x - plr_x) * (entry->x - plr_x) + (entry->y - plr_y) * (entry->y - plr_y);
if (mindist > dist) if (mindist > dist)
{ {
@ -565,7 +623,9 @@ WorldSafeLocsEntry const* BattleGroundAB::GetClosestGraveYard(Player* player)
} }
// If not, place ghost on starting location // If not, place ghost on starting location
if (!good_entry) if (!good_entry)
{ good_entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[teamIndex + 5]); } {
good_entry = sWorldSafeLocsStore.LookupEntry(BG_AB_GraveyardIds[teamIndex + 5]);
}
return good_entry; return good_entry;
} }
@ -580,7 +640,9 @@ void BattleGroundAB::UpdatePlayerScore(Player* source, uint32 type, uint32 value
{ {
BattleGroundScoreMap::iterator itr = m_PlayerScores.find(source->GetObjectGuid()); BattleGroundScoreMap::iterator itr = m_PlayerScores.find(source->GetObjectGuid());
if (itr == m_PlayerScores.end()) // player not found... if (itr == m_PlayerScores.end()) // player not found...
{ return; } {
return;
}
switch (type) switch (type)
{ {
@ -615,10 +677,14 @@ Team BattleGroundAB::GetPrematureWinner()
int32 allianceScore = m_TeamScores[TEAM_INDEX_ALLIANCE]; int32 allianceScore = m_TeamScores[TEAM_INDEX_ALLIANCE];
if (hordeScore > allianceScore) if (hordeScore > allianceScore)
{ return HORDE; } {
return HORDE;
}
if (allianceScore > hordeScore) if (allianceScore > hordeScore)
{ return ALLIANCE; } {
return ALLIANCE;
}
// If the values are equal, fall back to number of players on each team // If the values are equal, fall back to number of players on each team
return BattleGround::GetPrematureWinner(); return BattleGround::GetPrematureWinner();

View file

@ -43,7 +43,9 @@ BattleGroundAV::BattleGroundAV(): m_HonorMapComplete(0), m_RepTowerDestruction(0
void BattleGroundAV::HandleKillPlayer(Player* player, Player* killer) void BattleGroundAV::HandleKillPlayer(Player* player, Player* killer)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
BattleGround::HandleKillPlayer(player, killer); BattleGround::HandleKillPlayer(player, killer);
UpdateScore(GetTeamIndexByTeamId(player->GetTeam()), -1); UpdateScore(GetTeamIndexByTeamId(player->GetTeam()), -1);
@ -53,10 +55,14 @@ void BattleGroundAV::HandleKillUnit(Creature* creature, Player* killer)
{ {
DEBUG_LOG("BattleGroundAV: HandleKillUnit %i", creature->GetEntry()); DEBUG_LOG("BattleGroundAV: HandleKillUnit %i", creature->GetEntry());
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
uint8 event1 = (sBattleGroundMgr.GetCreatureEventIndex(creature->GetGUIDLow())).event1; uint8 event1 = (sBattleGroundMgr.GetCreatureEventIndex(creature->GetGUIDLow())).event1;
if (event1 == BG_EVENT_NONE) if (event1 == BG_EVENT_NONE)
{ return; } {
return;
}
switch (event1) switch (event1)
{ {
case BG_AV_BOSS_A: case BG_AV_BOSS_A:
@ -75,7 +81,9 @@ void BattleGroundAV::HandleKillUnit(Creature* creature, Player* killer)
break; break;
case BG_AV_CAPTAIN_A: case BG_AV_CAPTAIN_A:
if (IsActiveEvent(BG_AV_NodeEventCaptainDead_A, 0)) if (IsActiveEvent(BG_AV_NodeEventCaptainDead_A, 0))
{ return; } {
return;
}
RewardReputationToTeam(BG_AV_FACTION_H, m_RepCaptain, HORDE); RewardReputationToTeam(BG_AV_FACTION_H, m_RepCaptain, HORDE);
RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), HORDE); RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), HORDE);
UpdateScore(TEAM_INDEX_ALLIANCE, (-1) * BG_AV_RES_CAPTAIN); UpdateScore(TEAM_INDEX_ALLIANCE, (-1) * BG_AV_RES_CAPTAIN);
@ -84,7 +92,9 @@ void BattleGroundAV::HandleKillUnit(Creature* creature, Player* killer)
break; break;
case BG_AV_CAPTAIN_H: case BG_AV_CAPTAIN_H:
if (IsActiveEvent(BG_AV_NodeEventCaptainDead_H, 0)) if (IsActiveEvent(BG_AV_NodeEventCaptainDead_H, 0))
{ return; } {
return;
}
RewardReputationToTeam(BG_AV_FACTION_A, m_RepCaptain, ALLIANCE); RewardReputationToTeam(BG_AV_FACTION_A, m_RepCaptain, ALLIANCE);
RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), ALLIANCE); RewardHonorToTeam(GetBonusHonorFromKill(BG_AV_KILL_CAPTAIN), ALLIANCE);
UpdateScore(TEAM_INDEX_HORDE, (-1) * BG_AV_RES_CAPTAIN); UpdateScore(TEAM_INDEX_HORDE, (-1) * BG_AV_RES_CAPTAIN);
@ -103,7 +113,9 @@ void BattleGroundAV::HandleKillUnit(Creature* creature, Player* killer)
void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player) void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
BattleGroundAVTeamIndex teamIdx = GetAVTeamIndexByTeamId(player->GetTeam()); BattleGroundAVTeamIndex teamIdx = GetAVTeamIndexByTeamId(player->GetTeam());
MANGOS_ASSERT(teamIdx != BG_AV_TEAM_NEUTRAL); MANGOS_ASSERT(teamIdx != BG_AV_TEAM_NEUTRAL);
@ -123,7 +135,9 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
DEBUG_LOG("BattleGroundAV: Quest %i completed starting with unit upgrading..", questid); DEBUG_LOG("BattleGroundAV: Quest %i completed starting with unit upgrading..", questid);
for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
if (m_Nodes[i].Owner == teamIdx && m_Nodes[i].State == POINT_CONTROLLED) if (m_Nodes[i].Owner == teamIdx && m_Nodes[i].State == POINT_CONTROLLED)
{ PopulateNode(i); } {
PopulateNode(i);
}
} }
break; break;
case BG_AV_QUEST_A_COMMANDER1: case BG_AV_QUEST_A_COMMANDER1:
@ -131,21 +145,27 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
m_Team_QuestStatus[teamIdx][1]++; m_Team_QuestStatus[teamIdx][1]++;
reputation = 1; reputation = 1;
if (m_Team_QuestStatus[teamIdx][1] == 120) if (m_Team_QuestStatus[teamIdx][1] == 120)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
}
break; break;
case BG_AV_QUEST_A_COMMANDER2: case BG_AV_QUEST_A_COMMANDER2:
case BG_AV_QUEST_H_COMMANDER2: case BG_AV_QUEST_H_COMMANDER2:
m_Team_QuestStatus[teamIdx][2]++; m_Team_QuestStatus[teamIdx][2]++;
reputation = 2; reputation = 2;
if (m_Team_QuestStatus[teamIdx][2] == 60) if (m_Team_QuestStatus[teamIdx][2] == 60)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
}
break; break;
case BG_AV_QUEST_A_COMMANDER3: case BG_AV_QUEST_A_COMMANDER3:
case BG_AV_QUEST_H_COMMANDER3: case BG_AV_QUEST_H_COMMANDER3:
m_Team_QuestStatus[teamIdx][3]++; m_Team_QuestStatus[teamIdx][3]++;
reputation = 5; reputation = 5;
if (m_Team_QuestStatus[teamIdx][1] == 30) if (m_Team_QuestStatus[teamIdx][1] == 30)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
}
break; break;
case BG_AV_QUEST_A_BOSS1: case BG_AV_QUEST_A_BOSS1:
case BG_AV_QUEST_H_BOSS1: case BG_AV_QUEST_H_BOSS1:
@ -156,7 +176,9 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
m_Team_QuestStatus[teamIdx][4]++; m_Team_QuestStatus[teamIdx][4]++;
reputation += 1; reputation += 1;
if (m_Team_QuestStatus[teamIdx][4] >= 200) if (m_Team_QuestStatus[teamIdx][4] >= 200)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
}
break; break;
case BG_AV_QUEST_A_NEAR_MINE: case BG_AV_QUEST_A_NEAR_MINE:
case BG_AV_QUEST_H_NEAR_MINE: case BG_AV_QUEST_H_NEAR_MINE:
@ -166,7 +188,9 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
{ {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIdx][6] == 7) if (m_Team_QuestStatus[teamIdx][6] == 7)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - ground assault ready", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - ground assault ready", questid);
}
} }
break; break;
case BG_AV_QUEST_A_OTHER_MINE: case BG_AV_QUEST_A_OTHER_MINE:
@ -177,7 +201,9 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
{ {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIdx][5] == 20) if (m_Team_QuestStatus[teamIdx][5] == 20)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - ground assault ready", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - ground assault ready", questid);
}
} }
break; break;
case BG_AV_QUEST_A_RIDER_HIDE: case BG_AV_QUEST_A_RIDER_HIDE:
@ -188,7 +214,9 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
{ {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIdx][8] == 25) if (m_Team_QuestStatus[teamIdx][8] == 25)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - rider assault ready", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - rider assault ready", questid);
}
} }
break; break;
case BG_AV_QUEST_A_RIDER_TAME: case BG_AV_QUEST_A_RIDER_TAME:
@ -199,7 +227,9 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
{ {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid); DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here", questid);
if (m_Team_QuestStatus[teamIdx][7] == 25) if (m_Team_QuestStatus[teamIdx][7] == 25)
{ DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - rider assault ready", questid); } {
DEBUG_LOG("BattleGroundAV: Quest %i completed (need to implement some events here - rider assault ready", questid);
}
} }
break; break;
default: default:
@ -208,7 +238,9 @@ void BattleGroundAV::HandleQuestComplete(uint32 questid, Player* player)
break; break;
} }
if (reputation) if (reputation)
{ RewardReputationToTeam((player->GetTeam() == ALLIANCE) ? BG_AV_FACTION_A : BG_AV_FACTION_H, reputation, player->GetTeam()); } {
RewardReputationToTeam((player->GetTeam() == ALLIANCE) ? BG_AV_FACTION_A : BG_AV_FACTION_H, reputation, player->GetTeam());
}
} }
void BattleGroundAV::UpdateScore(PvpTeamIndex teamIdx, int32 points) void BattleGroundAV::UpdateScore(PvpTeamIndex teamIdx, int32 points)
@ -241,7 +273,9 @@ void BattleGroundAV::Update(uint32 diff)
BattleGround::Update(diff); BattleGround::Update(diff);
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
// add points from mine owning, and look if the neutral team can reclaim the mine // add points from mine owning, and look if the neutral team can reclaim the mine
for (uint8 mine = 0; mine < BG_AV_MAX_MINES; ++mine) for (uint8 mine = 0; mine < BG_AV_MAX_MINES; ++mine)
@ -256,7 +290,9 @@ void BattleGroundAV::Update(uint32 diff)
} }
if (m_Mine_Reclaim_Timer[mine] > diff) if (m_Mine_Reclaim_Timer[mine] > diff)
{ m_Mine_Reclaim_Timer[mine] -= diff; } {
m_Mine_Reclaim_Timer[mine] -= diff;
}
else else
{ ChangeMineOwner(mine, BG_AV_TEAM_NEUTRAL); } { ChangeMineOwner(mine, BG_AV_TEAM_NEUTRAL); }
} }
@ -268,7 +304,9 @@ void BattleGroundAV::Update(uint32 diff)
if (m_Nodes[i].State == POINT_ASSAULTED) if (m_Nodes[i].State == POINT_ASSAULTED)
{ {
if (m_Nodes[i].Timer > diff) if (m_Nodes[i].Timer > diff)
{ m_Nodes[i].Timer -= diff; } {
m_Nodes[i].Timer -= diff;
}
else else
{ EventPlayerDestroyedPoint(i); } { EventPlayerDestroyedPoint(i); }
} }
@ -303,20 +341,28 @@ void BattleGroundAV::EndBattleGround(Team winner)
for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i) for (BG_AV_Nodes i = BG_AV_NODES_DUNBALDAR_SOUTH; i <= BG_AV_NODES_STONEHEART_BUNKER; ++i)
if (m_Nodes[i].State == POINT_CONTROLLED) if (m_Nodes[i].State == POINT_CONTROLLED)
if (m_Nodes[i].TotalOwner == BG_AV_TEAM_ALLIANCE) if (m_Nodes[i].TotalOwner == BG_AV_TEAM_ALLIANCE)
{ ++tower_survived[TEAM_INDEX_ALLIANCE]; } {
++tower_survived[TEAM_INDEX_ALLIANCE];
}
for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i) for (BG_AV_Nodes i = BG_AV_NODES_ICEBLOOD_TOWER; i <= BG_AV_NODES_FROSTWOLF_WTOWER; ++i)
if (m_Nodes[i].State == POINT_CONTROLLED) if (m_Nodes[i].State == POINT_CONTROLLED)
if (m_Nodes[i].TotalOwner == BG_AV_TEAM_HORDE) if (m_Nodes[i].TotalOwner == BG_AV_TEAM_HORDE)
{ ++tower_survived[TEAM_INDEX_HORDE]; } {
++tower_survived[TEAM_INDEX_HORDE];
}
// graves all controlled // graves all controlled
for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i) for (BG_AV_Nodes i = BG_AV_NODES_FIRSTAID_STATION; i < BG_AV_NODES_MAX; ++i)
if (m_Nodes[i].State == POINT_CONTROLLED && m_Nodes[i].Owner != BG_AV_TEAM_NEUTRAL) if (m_Nodes[i].State == POINT_CONTROLLED && m_Nodes[i].Owner != BG_AV_TEAM_NEUTRAL)
{ ++graves_owned[m_Nodes[i].Owner]; } {
++graves_owned[m_Nodes[i].Owner];
}
for (uint8 i = 0; i < BG_AV_MAX_MINES; ++i) for (uint8 i = 0; i < BG_AV_MAX_MINES; ++i)
if (m_Mine_Owner[i] != BG_AV_TEAM_NEUTRAL) if (m_Mine_Owner[i] != BG_AV_TEAM_NEUTRAL)
{ ++mines_owned[m_Mine_Owner[i]]; } {
++mines_owned[m_Mine_Owner[i]];
}
// now we have the values give the honor/reputation to the teams: // now we have the values give the honor/reputation to the teams:
Team team[PVP_TEAM_COUNT] = { ALLIANCE, HORDE }; Team team[PVP_TEAM_COUNT] = { ALLIANCE, HORDE };
@ -330,9 +376,13 @@ void BattleGroundAV::EndBattleGround(Team winner)
} }
DEBUG_LOG("BattleGroundAV: EndbattleGround: bgteam: %u towers:%u honor:%u rep:%u", i, tower_survived[i], GetBonusHonorFromKill(tower_survived[i] * BG_AV_KILL_SURVIVING_TOWER), tower_survived[i] * BG_AV_REP_SURVIVING_TOWER); DEBUG_LOG("BattleGroundAV: EndbattleGround: bgteam: %u towers:%u honor:%u rep:%u", i, tower_survived[i], GetBonusHonorFromKill(tower_survived[i] * BG_AV_KILL_SURVIVING_TOWER), tower_survived[i] * BG_AV_REP_SURVIVING_TOWER);
if (graves_owned[i]) if (graves_owned[i])
{ RewardReputationToTeam(faction[i], graves_owned[i] * m_RepOwnedGrave, team[i]); } {
RewardReputationToTeam(faction[i], graves_owned[i] * m_RepOwnedGrave, team[i]);
}
if (mines_owned[i]) if (mines_owned[i])
{ RewardReputationToTeam(faction[i], mines_owned[i] * m_RepOwnedMine, team[i]); } {
RewardReputationToTeam(faction[i], mines_owned[i] * m_RepOwnedMine, team[i]);
}
// captain survived?: // captain survived?:
if (!IsActiveEvent(BG_AV_NodeEventCaptainDead_A + GetTeamIndexByTeamId(team[i]), 0)) if (!IsActiveEvent(BG_AV_NodeEventCaptainDead_A + GetTeamIndexByTeamId(team[i]), 0))
{ {
@ -358,13 +408,17 @@ bool BattleGroundAV::HandleAreaTrigger(Player* source, uint32 trigger)
case 95: case 95:
case 2608: case 2608:
if (source->GetTeam() != ALLIANCE) if (source->GetTeam() != ALLIANCE)
{ source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_ALLIANCE_USE); } {
source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_ALLIANCE_USE);
}
else else
{ source->LeaveBattleground(); } { source->LeaveBattleground(); }
break; break;
case 2606: case 2606:
if (source->GetTeam() != HORDE) if (source->GetTeam() != HORDE)
{ source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_HORDE_USE); } {
source->GetSession()->SendNotification(LANG_BATTLEGROUND_ONLY_HORDE_USE);
}
else else
{ source->LeaveBattleground(); } { source->LeaveBattleground(); }
break; break;
@ -378,7 +432,9 @@ void BattleGroundAV::UpdatePlayerScore(Player* source, uint32 type, uint32 value
{ {
BattleGroundScoreMap::iterator itr = m_PlayerScores.find(source->GetObjectGuid()); BattleGroundScoreMap::iterator itr = m_PlayerScores.find(source->GetObjectGuid());
if (itr == m_PlayerScores.end()) // player not found... if (itr == m_PlayerScores.end()) // player not found...
{ return; } {
return;
}
switch (type) switch (type)
{ {
@ -441,7 +497,9 @@ void BattleGroundAV::ChangeMineOwner(uint8 mine, BattleGroundAVTeamIndex teamIdx
// TODO changing the owner should result in setting respawntime to infinite for current creatures (they should fight the new ones), spawning new mine owners creatures and changing the chest - objects so that the current owning team can use them // TODO changing the owner should result in setting respawntime to infinite for current creatures (they should fight the new ones), spawning new mine owners creatures and changing the chest - objects so that the current owning team can use them
MANGOS_ASSERT(mine == BG_AV_NORTH_MINE || mine == BG_AV_SOUTH_MINE); MANGOS_ASSERT(mine == BG_AV_NORTH_MINE || mine == BG_AV_SOUTH_MINE);
if (m_Mine_Owner[mine] == teamIdx) if (m_Mine_Owner[mine] == teamIdx)
{ return; } {
return;
}
m_Mine_PrevOwner[mine] = m_Mine_Owner[mine]; m_Mine_PrevOwner[mine] = m_Mine_Owner[mine];
m_Mine_Owner[mine] = teamIdx; m_Mine_Owner[mine] = teamIdx;
@ -464,9 +522,13 @@ void BattleGroundAV::ChangeMineOwner(uint8 mine, BattleGroundAVTeamIndex teamIdx
bool BattleGroundAV::PlayerCanDoMineQuest(int32 GOId, Team team) bool BattleGroundAV::PlayerCanDoMineQuest(int32 GOId, Team team)
{ {
if (GOId == BG_AV_OBJECTID_MINE_N) if (GOId == BG_AV_OBJECTID_MINE_N)
{ return (m_Mine_Owner[BG_AV_NORTH_MINE] == GetAVTeamIndexByTeamId(team)); } {
return (m_Mine_Owner[BG_AV_NORTH_MINE] == GetAVTeamIndexByTeamId(team));
}
if (GOId == BG_AV_OBJECTID_MINE_S) if (GOId == BG_AV_OBJECTID_MINE_S)
{ return (m_Mine_Owner[BG_AV_SOUTH_MINE] == GetAVTeamIndexByTeamId(team)); } {
return (m_Mine_Owner[BG_AV_SOUTH_MINE] == GetAVTeamIndexByTeamId(team));
}
return true; // cause it's no mine'object it is ok if this is true return true; // cause it's no mine'object it is ok if this is true
} }
@ -479,7 +541,9 @@ void BattleGroundAV::PopulateNode(BG_AV_Nodes node)
{ {
uint32 graveDefenderType; uint32 graveDefenderType;
if (m_Team_QuestStatus[teamIdx][0] < 500) if (m_Team_QuestStatus[teamIdx][0] < 500)
{ graveDefenderType = 0; } {
graveDefenderType = 0;
}
else if (m_Team_QuestStatus[teamIdx][0] < 1000) else if (m_Team_QuestStatus[teamIdx][0] < 1000)
{ graveDefenderType = 1; } { graveDefenderType = 1; }
else if (m_Team_QuestStatus[teamIdx][0] < 1500) else if (m_Team_QuestStatus[teamIdx][0] < 1500)
@ -488,7 +552,9 @@ void BattleGroundAV::PopulateNode(BG_AV_Nodes node)
{ graveDefenderType = 3; } { graveDefenderType = 3; }
if (m_Nodes[node].State == POINT_CONTROLLED) // we can spawn the current owner event if (m_Nodes[node].State == POINT_CONTROLLED) // we can spawn the current owner event
{ SpawnEvent(BG_AV_NODES_MAX + node, teamIdx * BG_AV_MAX_GRAVETYPES + graveDefenderType, true); } {
SpawnEvent(BG_AV_NODES_MAX + node, teamIdx * BG_AV_MAX_GRAVETYPES + graveDefenderType, true);
}
else // we despawn the event from the prevowner else // we despawn the event from the prevowner
{ SpawnEvent(BG_AV_NODES_MAX + node, m_Nodes[node].PrevOwner * BG_AV_MAX_GRAVETYPES + graveDefenderType, false); } { SpawnEvent(BG_AV_NODES_MAX + node, m_Nodes[node].PrevOwner * BG_AV_MAX_GRAVETYPES + graveDefenderType, false); }
} }
@ -499,11 +565,15 @@ void BattleGroundAV::PopulateNode(BG_AV_Nodes node)
void BattleGroundAV::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj) void BattleGroundAV::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
DEBUG_LOG("BattleGroundAV: using gameobject %i", target_obj->GetEntry()); DEBUG_LOG("BattleGroundAV: using gameobject %i", target_obj->GetEntry());
uint8 event = (sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetGUIDLow())).event1; uint8 event = (sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetGUIDLow())).event1;
if (event >= BG_AV_NODES_MAX) // not a node if (event >= BG_AV_NODES_MAX) // not a node
{ return; } {
return;
}
BG_AV_Nodes node = BG_AV_Nodes(event); BG_AV_Nodes node = BG_AV_Nodes(event);
switch ((sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetGUIDLow())).event2 % BG_AV_MAX_STATES) switch ((sBattleGroundMgr.GetGameObjectEventIndex(target_obj->GetGUIDLow())).event2 % BG_AV_MAX_STATES)
{ {
@ -525,7 +595,9 @@ void BattleGroundAV::EventPlayerDefendsPoint(Player* player, BG_AV_Nodes node)
PvpTeamIndex teamIdx = GetTeamIndexByTeamId(player->GetTeam()); PvpTeamIndex teamIdx = GetTeamIndexByTeamId(player->GetTeam());
if (m_Nodes[node].Owner == BattleGroundAVTeamIndex(teamIdx) || m_Nodes[node].State != POINT_ASSAULTED) if (m_Nodes[node].Owner == BattleGroundAVTeamIndex(teamIdx) || m_Nodes[node].State != POINT_ASSAULTED)
{ return; } {
return;
}
if (m_Nodes[node].TotalOwner == BG_AV_TEAM_NEUTRAL) // initial snowfall capture if (m_Nodes[node].TotalOwner == BG_AV_TEAM_NEUTRAL) // initial snowfall capture
{ {
// until snowfall doesn't belong to anyone it is better handled in assault - code (best would be to have a special function // until snowfall doesn't belong to anyone it is better handled in assault - code (best would be to have a special function
@ -571,7 +643,9 @@ void BattleGroundAV::EventPlayerAssaultsPoint(Player* player, BG_AV_Nodes node)
PvpTeamIndex teamIdx = GetTeamIndexByTeamId(player->GetTeam()); PvpTeamIndex teamIdx = GetTeamIndexByTeamId(player->GetTeam());
DEBUG_LOG("BattleGroundAV: player assaults node %i", node); DEBUG_LOG("BattleGroundAV: player assaults node %i", node);
if (m_Nodes[node].Owner == BattleGroundAVTeamIndex(teamIdx) || BattleGroundAVTeamIndex(teamIdx) == m_Nodes[node].TotalOwner) if (m_Nodes[node].Owner == BattleGroundAVTeamIndex(teamIdx) || BattleGroundAVTeamIndex(teamIdx) == m_Nodes[node].TotalOwner)
{ return; } {
return;
}
AssaultNode(node, teamIdx); // update nodeinfo variables AssaultNode(node, teamIdx); // update nodeinfo variables
UpdateNodeWorldState(node); // send mapicon UpdateNodeWorldState(node); // send mapicon
@ -612,7 +686,9 @@ void BattleGroundAV::FillInitialWorldStates(WorldPacket& data, uint32& count)
} }
if (m_Nodes[BG_AV_NODES_SNOWFALL_GRAVE].Owner == BG_AV_TEAM_NEUTRAL) // cause neutral teams aren't handled generic if (m_Nodes[BG_AV_NODES_SNOWFALL_GRAVE].Owner == BG_AV_TEAM_NEUTRAL) // cause neutral teams aren't handled generic
{ FillInitialWorldState(data, count, AV_SNOWFALL_N, WORLD_STATE_ADD); } {
FillInitialWorldState(data, count, AV_SNOWFALL_N, WORLD_STATE_ADD);
}
FillInitialWorldState(data, count, BG_AV_Alliance_Score, m_TeamScores[TEAM_INDEX_ALLIANCE]); FillInitialWorldState(data, count, BG_AV_Alliance_Score, m_TeamScores[TEAM_INDEX_ALLIANCE]);
FillInitialWorldState(data, count, BG_AV_Horde_Score, m_TeamScores[TEAM_INDEX_HORDE]); FillInitialWorldState(data, count, BG_AV_Horde_Score, m_TeamScores[TEAM_INDEX_HORDE]);
@ -629,18 +705,24 @@ void BattleGroundAV::FillInitialWorldStates(WorldPacket& data, uint32& count)
FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_NORTH_MINE][m_Mine_Owner[BG_AV_NORTH_MINE]], WORLD_STATE_ADD); FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_NORTH_MINE][m_Mine_Owner[BG_AV_NORTH_MINE]], WORLD_STATE_ADD);
if (m_Mine_Owner[BG_AV_NORTH_MINE] != m_Mine_PrevOwner[BG_AV_NORTH_MINE]) if (m_Mine_Owner[BG_AV_NORTH_MINE] != m_Mine_PrevOwner[BG_AV_NORTH_MINE])
{ FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_NORTH_MINE][m_Mine_PrevOwner[BG_AV_NORTH_MINE]], WORLD_STATE_REMOVE); } {
FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_NORTH_MINE][m_Mine_PrevOwner[BG_AV_NORTH_MINE]], WORLD_STATE_REMOVE);
}
FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_SOUTH_MINE][m_Mine_Owner[BG_AV_SOUTH_MINE]], WORLD_STATE_ADD); FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_SOUTH_MINE][m_Mine_Owner[BG_AV_SOUTH_MINE]], WORLD_STATE_ADD);
if (m_Mine_Owner[BG_AV_SOUTH_MINE] != m_Mine_PrevOwner[BG_AV_SOUTH_MINE]) if (m_Mine_Owner[BG_AV_SOUTH_MINE] != m_Mine_PrevOwner[BG_AV_SOUTH_MINE])
{ FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_SOUTH_MINE][m_Mine_PrevOwner[BG_AV_SOUTH_MINE]], WORLD_STATE_REMOVE); } {
FillInitialWorldState(data, count, BG_AV_MineWorldStates[BG_AV_SOUTH_MINE][m_Mine_PrevOwner[BG_AV_SOUTH_MINE]], WORLD_STATE_REMOVE);
}
} }
void BattleGroundAV::UpdateNodeWorldState(BG_AV_Nodes node) void BattleGroundAV::UpdateNodeWorldState(BG_AV_Nodes node)
{ {
UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].State, m_Nodes[node].Owner)], WORLD_STATE_ADD); UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].State, m_Nodes[node].Owner)], WORLD_STATE_ADD);
if (m_Nodes[node].PrevOwner == BG_AV_TEAM_NEUTRAL) // currently only snowfall is supported as neutral node if (m_Nodes[node].PrevOwner == BG_AV_TEAM_NEUTRAL) // currently only snowfall is supported as neutral node
{ UpdateWorldState(AV_SNOWFALL_N, WORLD_STATE_REMOVE); } {
UpdateWorldState(AV_SNOWFALL_N, WORLD_STATE_REMOVE);
}
else else
{ UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].PrevState, m_Nodes[node].PrevOwner)], WORLD_STATE_REMOVE); } { UpdateWorldState(BG_AV_NodeWorldStates[node][GetWorldStateType(m_Nodes[node].PrevState, m_Nodes[node].PrevOwner)], WORLD_STATE_REMOVE); }
} }
@ -651,7 +733,9 @@ void BattleGroundAV::SendMineWorldStates(uint32 mine)
UpdateWorldState(BG_AV_MineWorldStates[mine][m_Mine_Owner[mine]], WORLD_STATE_ADD); UpdateWorldState(BG_AV_MineWorldStates[mine][m_Mine_Owner[mine]], WORLD_STATE_ADD);
if (m_Mine_Owner[mine] != m_Mine_PrevOwner[mine]) if (m_Mine_Owner[mine] != m_Mine_PrevOwner[mine])
{ UpdateWorldState(BG_AV_MineWorldStates[mine][m_Mine_PrevOwner[mine]], WORLD_STATE_REMOVE); } {
UpdateWorldState(BG_AV_MineWorldStates[mine][m_Mine_PrevOwner[mine]], WORLD_STATE_REMOVE);
}
} }
WorldSafeLocsEntry const* BattleGroundAV::GetClosestGraveYard(Player* plr) WorldSafeLocsEntry const* BattleGroundAV::GetClosestGraveYard(Player* plr)
@ -667,10 +751,14 @@ WorldSafeLocsEntry const* BattleGroundAV::GetClosestGraveYard(Player* plr)
for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i) for (uint8 i = BG_AV_NODES_FIRSTAID_STATION; i <= BG_AV_NODES_FROSTWOLF_HUT; ++i)
{ {
if (m_Nodes[i].Owner != teamIdx || m_Nodes[i].State != POINT_CONTROLLED) if (m_Nodes[i].Owner != teamIdx || m_Nodes[i].State != POINT_CONTROLLED)
{ continue; } {
continue;
}
WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[i]); WorldSafeLocsEntry const* entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[i]);
if (!entry) if (!entry)
{ continue; } {
continue;
}
float dist = (entry->x - x) * (entry->x - x) + (entry->y - y) * (entry->y - y); float dist = (entry->x - x) * (entry->x - x) + (entry->y - y) * (entry->y - y);
if (mindist > dist) if (mindist > dist)
{ {
@ -681,7 +769,9 @@ WorldSafeLocsEntry const* BattleGroundAV::GetClosestGraveYard(Player* plr)
} }
// If not, place ghost in the starting-cave // If not, place ghost in the starting-cave
if (!good_entry) if (!good_entry)
{ good_entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[teamIdx + 7]); } {
good_entry = sWorldSafeLocsStore.LookupEntry(BG_AV_GraveyardIds[teamIdx + 7]);
}
return good_entry; return good_entry;
} }
@ -746,7 +836,9 @@ void BattleGroundAV::InitNode(BG_AV_Nodes node, BattleGroundAVTeamIndex teamIdx,
m_Nodes[node].Tower = tower; m_Nodes[node].Tower = tower;
m_ActiveEvents[node] = teamIdx * BG_AV_MAX_STATES + m_Nodes[node].State; m_ActiveEvents[node] = teamIdx * BG_AV_MAX_STATES + m_Nodes[node].State;
if (IsGrave(node)) // grave-creatures are special cause of a quest if (IsGrave(node)) // grave-creatures are special cause of a quest
{ m_ActiveEvents[node + BG_AV_NODES_MAX] = teamIdx * BG_AV_MAX_GRAVETYPES; } {
m_ActiveEvents[node + BG_AV_NODES_MAX] = teamIdx * BG_AV_MAX_GRAVETYPES;
}
} }
void BattleGroundAV::DefendNode(BG_AV_Nodes node, PvpTeamIndex teamIdx) void BattleGroundAV::DefendNode(BG_AV_Nodes node, PvpTeamIndex teamIdx)
@ -821,9 +913,13 @@ Team BattleGroundAV::GetPrematureWinner()
int32 allianceScore = m_TeamScores[TEAM_INDEX_ALLIANCE]; int32 allianceScore = m_TeamScores[TEAM_INDEX_ALLIANCE];
if (hordeScore > allianceScore) if (hordeScore > allianceScore)
{ return HORDE; } {
return HORDE;
}
if (allianceScore > hordeScore) if (allianceScore > hordeScore)
{ return ALLIANCE; } {
return ALLIANCE;
}
// If the values are equal, fall back to number of players on each team // If the values are equal, fall back to number of players on each team
return BattleGround::GetPrematureWinner(); return BattleGround::GetPrematureWinner();

View file

@ -51,10 +51,14 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recv_data)
Creature* pCreature = GetPlayer()->GetMap()->GetCreature(guid); Creature* pCreature = GetPlayer()->GetMap()->GetCreature(guid);
if (!pCreature) if (!pCreature)
{ return; } {
return;
}
if (!pCreature->IsBattleMaster()) // it's not battlemaster if (!pCreature->IsBattleMaster()) // it's not battlemaster
{ return; } {
return;
}
// Stop the npc if moving // Stop the npc if moving
pCreature->StopMoving(); pCreature->StopMoving();
@ -62,7 +66,9 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recv_data)
BattleGroundTypeId bgTypeId = sBattleGroundMgr.GetBattleMasterBG(pCreature->GetEntry()); BattleGroundTypeId bgTypeId = sBattleGroundMgr.GetBattleMasterBG(pCreature->GetEntry());
if (bgTypeId == BATTLEGROUND_TYPE_NONE) if (bgTypeId == BATTLEGROUND_TYPE_NONE)
{ return; } {
return;
}
if (!_player->GetBGAccessByLevel(bgTypeId)) if (!_player->GetBGAccessByLevel(bgTypeId))
{ {
@ -121,12 +127,16 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
// ignore if player is already in BG // ignore if player is already in BG
if (_player->InBattleGround()) if (_player->InBattleGround())
{ return; } {
return;
}
// get bg instance or bg template if instance not found // get bg instance or bg template if instance not found
BattleGround* bg = NULL; BattleGround* bg = NULL;
if (instanceId) if (instanceId)
{ bg = sBattleGroundMgr.GetBattleGroundThroughClientInstance(instanceId, bgTypeId); } {
bg = sBattleGroundMgr.GetBattleGroundThroughClientInstance(instanceId, bgTypeId);
}
if (!bg && !(bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId))) if (!bg && !(bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId)))
{ {
@ -158,16 +168,22 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recv_data)
{ return; } { return; }
// check if has free queue slots // check if has free queue slots
if (!_player->HasFreeBattleGroundQueueId()) if (!_player->HasFreeBattleGroundQueueId())
{ return; } {
return;
}
} }
else else
{ {
grp = _player->GetGroup(); grp = _player->GetGroup();
// no group found, error // no group found, error
if (!grp) if (!grp)
{ return; } {
return;
}
if (grp->GetLeaderGuid() != _player->GetObjectGuid()) if (grp->GetLeaderGuid() != _player->GetObjectGuid())
{ return; } {
return;
}
err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0); err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0);
isPremade = sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH) && isPremade = sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_PREMADE_GROUP_WAIT_FOR_MATCH) &&
(grp->GetMembersCount() >= bg->GetMinPlayersPerTeam()); (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam());
@ -230,7 +246,9 @@ void WorldSession::HandleBattleGroundPlayerPositionsOpcode(WorldPacket & /*recv_
BattleGround* bg = _player->GetBattleGround(); BattleGround* bg = _player->GetBattleGround();
if (!bg) // can't be received if player not in battleground if (!bg) // can't be received if player not in battleground
{ return; } {
return;
}
Player* flagCarrierA = NULL; Player* flagCarrierA = NULL;
Player* flagCarrierH = NULL; Player* flagCarrierH = NULL;
@ -295,7 +313,9 @@ void WorldSession::HandlePVPLogDataOpcode(WorldPacket & /*recv_data*/)
BattleGround* bg = _player->GetBattleGround(); BattleGround* bg = _player->GetBattleGround();
if (!bg) if (!bg)
{ return; } {
return;
}
// arena finish version will send in BattleGround::EndBattleGround directly // arena finish version will send in BattleGround::EndBattleGround directly
if (bg->isArena()) if (bg->isArena())
@ -388,7 +408,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
// bg template might and must be used in case of leaving queue, when instance is not created yet // bg template might and must be used in case of leaving queue, when instance is not created yet
if (!bg && action == 0) if (!bg && action == 0)
{ bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId); } {
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
}
if (!bg) if (!bg)
{ {
sLog.outError("BattlegroundHandler: bg_template not found for instance id %u type id %u.", ginfo.IsInvitedToBGInstanceGUID, bgTypeId); sLog.outError("BattlegroundHandler: bg_template not found for instance id %u type id %u.", ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
@ -454,7 +476,9 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recv_data)
// this is still needed here if battleground "jumping" shouldn't add deserter debuff // this is still needed here if battleground "jumping" shouldn't add deserter debuff
// also this is required to prevent stuck at old battleground after SetBattleGroundId set to new // also this is required to prevent stuck at old battleground after SetBattleGroundId set to new
if (BattleGround* currentBg = _player->GetBattleGround()) if (BattleGround* currentBg = _player->GetBattleGround())
{ currentBg->RemovePlayerAtLeave(_player->GetObjectGuid(), false, true); } {
currentBg->RemovePlayerAtLeave(_player->GetObjectGuid(), false, true);
}
// set the destination instance id // set the destination instance id
_player->SetBattleGroundId(bg->GetInstanceID(), bgTypeId); _player->SetBattleGroundId(bg->GetInstanceID(), bgTypeId);
@ -501,7 +525,9 @@ void WorldSession::HandleLeaveBattlefieldOpcode(WorldPacket& recv_data)
if (_player->IsInCombat()) if (_player->IsInCombat())
if (BattleGround* bg = _player->GetBattleGround()) if (BattleGround* bg = _player->GetBattleGround())
if (bg->GetStatus() != STATUS_WAIT_LEAVE) if (bg->GetStatus() != STATUS_WAIT_LEAVE)
{ return; } {
return;
}
_player->LeaveBattleground(); _player->LeaveBattleground();
} }
@ -518,7 +544,9 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recv_data*/)
{ {
BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i); BattleGroundQueueTypeId bgQueueTypeId = _player->GetBattleGroundQueueTypeId(i);
if (!bgQueueTypeId) if (!bgQueueTypeId)
{ continue; } {
continue;
}
BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId); BattleGroundTypeId bgTypeId = BattleGroundMgr::BGTemplateId(bgQueueTypeId);
ArenaType arenaType = BattleGroundMgr::BGArenaType(bgQueueTypeId); ArenaType arenaType = BattleGroundMgr::BGArenaType(bgQueueTypeId);
@ -541,12 +569,16 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recv_data*/)
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId]; BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
GroupQueueInfo ginfo; GroupQueueInfo ginfo;
if (!bgQueue.GetPlayerGroupInfoData(_player->GetObjectGuid(), &ginfo)) if (!bgQueue.GetPlayerGroupInfoData(_player->GetObjectGuid(), &ginfo))
{ continue; } {
continue;
}
if (ginfo.IsInvitedToBGInstanceGUID) if (ginfo.IsInvitedToBGInstanceGUID)
{ {
bg = sBattleGroundMgr.GetBattleGround(ginfo.IsInvitedToBGInstanceGUID, bgTypeId); bg = sBattleGroundMgr.GetBattleGround(ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
if (!bg) if (!bg)
{ continue; } {
continue;
}
uint32 remainingTime = WorldTimer::getMSTimeDiff(WorldTimer::getMSTime(), ginfo.RemoveInviteTime); uint32 remainingTime = WorldTimer::getMSTimeDiff(WorldTimer::getMSTime(), ginfo.RemoveInviteTime);
// send status invited to BattleGround // send status invited to BattleGround
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType); sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, _player, i, STATUS_WAIT_JOIN, remainingTime, 0, arenaType);
@ -556,7 +588,9 @@ void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recv_data*/)
{ {
bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId); bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
if (!bg) if (!bg)
{ continue; } {
continue;
}
// expected bracket entry // expected bracket entry
PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); PvPDifficultyEntry const* bracketEntry = GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel());
@ -577,17 +611,23 @@ void WorldSession::HandleAreaSpiritHealerQueryOpcode(WorldPacket& recv_data)
BattleGround* bg = _player->GetBattleGround(); BattleGround* bg = _player->GetBattleGround();
if (!bg) if (!bg)
{ return; } {
return;
}
ObjectGuid guid; ObjectGuid guid;
recv_data >> guid; recv_data >> guid;
Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); Creature* unit = GetPlayer()->GetMap()->GetCreature(guid);
if (!unit) if (!unit)
{ return; } {
return;
}
if (!unit->IsSpiritService()) // it's not spirit service if (!unit->IsSpiritService()) // it's not spirit service
{ return; } {
return;
}
unit->SendAreaSpiritHealerQueryOpcode(GetPlayer()); unit->SendAreaSpiritHealerQueryOpcode(GetPlayer());
} }
@ -598,17 +638,23 @@ void WorldSession::HandleAreaSpiritHealerQueueOpcode(WorldPacket& recv_data)
BattleGround* bg = _player->GetBattleGround(); BattleGround* bg = _player->GetBattleGround();
if (!bg) if (!bg)
{ return; } {
return;
}
ObjectGuid guid; ObjectGuid guid;
recv_data >> guid; recv_data >> guid;
Creature* unit = GetPlayer()->GetMap()->GetCreature(guid); Creature* unit = GetPlayer()->GetMap()->GetCreature(guid);
if (!unit) if (!unit)
{ return; } {
return;
}
if (!unit->IsSpiritService()) // it's not spirit service if (!unit->IsSpiritService()) // it's not spirit service
{ return; } {
return;
}
sScriptMgr.OnGossipHello(GetPlayer(), unit); sScriptMgr.OnGossipHello(GetPlayer(), unit);
} }

View file

@ -128,7 +128,9 @@ bool BattleGroundQueue::SelectionPool::KickGroup(uint32 size)
PlayerCount -= ginfo->Players.size(); PlayerCount -= ginfo->Players.size();
// return false if we kicked smaller group or there are enough players in selection pool // return false if we kicked smaller group or there are enough players in selection pool
if (ginfo->Players.size() <= size + 1) if (ginfo->Players.size() <= size + 1)
{ return false; } {
return false;
}
} }
return true; return true;
} }
@ -148,7 +150,9 @@ bool BattleGroundQueue::SelectionPool::AddGroup(GroupQueueInfo* ginfo, uint32 de
return true; return true;
} }
if (PlayerCount < desiredCount) if (PlayerCount < desiredCount)
{ return true; } {
return true;
}
return false; return false;
} }
@ -236,10 +240,14 @@ GroupQueueInfo* BattleGroundQueue::AddGroup(Player* leader, Group* grp, BattleGr
GroupsQueueType::const_iterator itr; GroupsQueueType::const_iterator itr;
for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr) for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_ALLIANCE].end(); ++itr)
if (!(*itr)->IsInvitedToBGInstanceGUID) if (!(*itr)->IsInvitedToBGInstanceGUID)
{ qAlliance += (*itr)->Players.size(); } {
qAlliance += (*itr)->Players.size();
}
for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].end(); ++itr) for (itr = m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].begin(); itr != m_QueuedGroups[bracketId][BG_QUEUE_NORMAL_HORDE].end(); ++itr)
if (!(*itr)->IsInvitedToBGInstanceGUID) if (!(*itr)->IsInvitedToBGInstanceGUID)
{ qHorde += (*itr)->Players.size(); } {
qHorde += (*itr)->Players.size();
}
// Show queue status to player only (when joining queue) // Show queue status to player only (when joining queue)
if (sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_QUEUE_ANNOUNCER_JOIN) == 1) if (sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_QUEUE_ANNOUNCER_JOIN) == 1)
@ -304,7 +312,9 @@ uint32 BattleGroundQueue::GetAverageQueueWaitTime(GroupQueueInfo* ginfo, BattleG
} }
// check if there is enought values(we always add values > 0) // check if there is enought values(we always add values > 0)
if (m_WaitTimes[team_index][bracket_id][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME - 1]) if (m_WaitTimes[team_index][bracket_id][COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME - 1])
{ return (m_SumOfWaitTimes[team_index][bracket_id] / COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME); } {
return (m_SumOfWaitTimes[team_index][bracket_id] / COUNT_OF_PLAYERS_TO_AVERAGE_WAIT_TIME);
}
else else
// if there aren't enough values return 0 - not available // if there aren't enough values return 0 - not available
{ return 0; } { return 0; }
@ -369,14 +379,18 @@ void BattleGroundQueue::RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount)
// remove player queue info from group queue info // remove player queue info from group queue info
GroupQueueInfoPlayers::iterator pitr = group->Players.find(guid); GroupQueueInfoPlayers::iterator pitr = group->Players.find(guid);
if (pitr != group->Players.end()) if (pitr != group->Players.end())
{ group->Players.erase(pitr); } {
group->Players.erase(pitr);
}
// if invited to bg, and should decrease invited count, then do it // if invited to bg, and should decrease invited count, then do it
if (decreaseInvitedCount && group->IsInvitedToBGInstanceGUID) if (decreaseInvitedCount && group->IsInvitedToBGInstanceGUID)
{ {
BattleGround* bg = sBattleGroundMgr.GetBattleGround(group->IsInvitedToBGInstanceGUID, group->BgTypeId); BattleGround* bg = sBattleGroundMgr.GetBattleGround(group->IsInvitedToBGInstanceGUID, group->BgTypeId);
if (bg) if (bg)
{ bg->DecreaseInvitedCount(group->GroupTeam); } {
bg->DecreaseInvitedCount(group->GroupTeam);
}
} }
// remove player queue info // remove player queue info
@ -446,7 +460,9 @@ bool BattleGroundQueue::GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo*
// ACE_Guard<ACE_Recursive_Thread_Mutex> g(m_Lock); // ACE_Guard<ACE_Recursive_Thread_Mutex> g(m_Lock);
QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(guid); QueuedPlayersMap::const_iterator qItr = m_QueuedPlayers.find(guid);
if (qItr == m_QueuedPlayers.end()) if (qItr == m_QueuedPlayers.end())
{ return false; } {
return false;
}
*ginfo = *(qItr->second.GroupInfo); *ginfo = *(qItr->second.GroupInfo);
return true; return true;
} }
@ -455,7 +471,9 @@ bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, BattleGround* bg,
{ {
// set side if needed // set side if needed
if (side) if (side)
{ ginfo->GroupTeam = side; } {
ginfo->GroupTeam = side;
}
if (!ginfo->IsInvitedToBGInstanceGUID) if (!ginfo->IsInvitedToBGInstanceGUID)
{ {
@ -479,7 +497,9 @@ bool BattleGroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, BattleGround* bg,
Player* plr = sObjectMgr.GetPlayer(itr->first); Player* plr = sObjectMgr.GetPlayer(itr->first);
// if offline, skip him, this should not happen - player is removed from queue when he logs out // if offline, skip him, this should not happen - player is removed from queue when he logs out
if (!plr) if (!plr)
{ continue; } {
continue;
}
// invite the player // invite the player
PlayerInvitedToBGUpdateAverageWaitTime(ginfo, bracket_id); PlayerInvitedToBGUpdateAverageWaitTime(ginfo, bracket_id);
@ -541,7 +561,9 @@ void BattleGroundQueue::FillPlayersToBG(BattleGround* bg, BattleGroundBracketId
// if ofc like BG queue invitation is set in config, then we are happy // if ofc like BG queue invitation is set in config, then we are happy
if (sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_INVITATION_TYPE) == 0) if (sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_INVITATION_TYPE) == 0)
{ return; } {
return;
}
/* /*
if we reached this code, then we have to solve NP - complete problem called Subset sum problem if we reached this code, then we have to solve NP - complete problem called Subset sum problem
@ -569,7 +591,9 @@ void BattleGroundQueue::FillPlayersToBG(BattleGround* bg, BattleGroundBracketId
if (!m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount()) if (!m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount())
{ {
if (aliFree <= diffHorde + 1) if (aliFree <= diffHorde + 1)
{ break; } {
break;
}
m_SelectionPools[TEAM_INDEX_HORDE].KickGroup(diffHorde - diffAli); m_SelectionPools[TEAM_INDEX_HORDE].KickGroup(diffHorde - diffAli);
} }
} }
@ -584,7 +608,9 @@ void BattleGroundQueue::FillPlayersToBG(BattleGround* bg, BattleGroundBracketId
if (!m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount()) if (!m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount())
{ {
if (hordeFree <= diffAli + 1) if (hordeFree <= diffAli + 1)
{ break; } {
break;
}
m_SelectionPools[TEAM_INDEX_ALLIANCE].KickGroup(diffAli - diffHorde); m_SelectionPools[TEAM_INDEX_ALLIANCE].KickGroup(diffAli - diffHorde);
} }
} }
@ -607,10 +633,14 @@ bool BattleGroundQueue::CheckPremadeMatch(BattleGroundBracketId bracket_id, uint
GroupsQueueType::const_iterator ali_group, horde_group; GroupsQueueType::const_iterator ali_group, horde_group;
for (ali_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].begin(); ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end(); ++ali_group) for (ali_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].begin(); ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end(); ++ali_group)
if (!(*ali_group)->IsInvitedToBGInstanceGUID) if (!(*ali_group)->IsInvitedToBGInstanceGUID)
{ break; } {
break;
}
for (horde_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].begin(); horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end(); ++horde_group) for (horde_group = m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].begin(); horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end(); ++horde_group)
if (!(*horde_group)->IsInvitedToBGInstanceGUID) if (!(*horde_group)->IsInvitedToBGInstanceGUID)
{ break; } {
break;
}
if (ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end() && horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end()) if (ali_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_ALLIANCE].end() && horde_group != m_QueuedGroups[bracket_id][BG_QUEUE_PREMADE_HORDE].end())
{ {
@ -625,7 +655,9 @@ bool BattleGroundQueue::CheckPremadeMatch(BattleGroundBracketId bracket_id, uint
{ {
// if itr can join BG and player count is less that maxPlayers, then add group to selectionpool // if itr can join BG and player count is less that maxPlayers, then add group to selectionpool
if (!(*itr)->IsInvitedToBGInstanceGUID && !m_SelectionPools[i].AddGroup((*itr), maxPlayers)) if (!(*itr)->IsInvitedToBGInstanceGUID && !m_SelectionPools[i].AddGroup((*itr), maxPlayers))
{ break; } {
break;
}
} }
} }
// premade selection pools are set // premade selection pools are set
@ -667,14 +699,18 @@ bool BattleGroundQueue::CheckNormalMatch(BattleGround* bg_template, BattleGround
{ {
m_SelectionPools[i].AddGroup(*(itr_team[i]), maxPlayers); m_SelectionPools[i].AddGroup(*(itr_team[i]), maxPlayers);
if (m_SelectionPools[i].GetPlayerCount() >= minPlayers) if (m_SelectionPools[i].GetPlayerCount() >= minPlayers)
{ break; } {
break;
}
} }
} }
} }
// try to invite same number of players - this cycle may cause longer wait time even if there are enough players in queue, but we want ballanced bg // try to invite same number of players - this cycle may cause longer wait time even if there are enough players in queue, but we want ballanced bg
uint32 j = TEAM_INDEX_ALLIANCE; uint32 j = TEAM_INDEX_ALLIANCE;
if (m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() < m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount()) if (m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() < m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount())
{ j = TEAM_INDEX_HORDE; } {
j = TEAM_INDEX_HORDE;
}
if (sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_INVITATION_TYPE) != 0 if (sWorld.getConfig(CONFIG_UINT32_BATTLEGROUND_INVITATION_TYPE) != 0
&& m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() >= minPlayers && m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount() >= minPlayers) && m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() >= minPlayers && m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount() >= minPlayers)
{ {
@ -684,15 +720,21 @@ bool BattleGroundQueue::CheckNormalMatch(BattleGround* bg_template, BattleGround
{ {
if (!(*(itr_team[j]))->IsInvitedToBGInstanceGUID) if (!(*(itr_team[j]))->IsInvitedToBGInstanceGUID)
if (!m_SelectionPools[j].AddGroup(*(itr_team[j]), m_SelectionPools[(j + 1) % PVP_TEAM_COUNT].GetPlayerCount())) if (!m_SelectionPools[j].AddGroup(*(itr_team[j]), m_SelectionPools[(j + 1) % PVP_TEAM_COUNT].GetPlayerCount()))
{ break; } {
break;
}
} }
// do not allow to start bg with more than 2 players more on 1 faction // do not allow to start bg with more than 2 players more on 1 faction
if (abs((int32)(m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() - m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount())) > 2) if (abs((int32)(m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() - m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount())) > 2)
{ return false; } {
return false;
}
} }
// allow 1v0 if debug bg // allow 1v0 if debug bg
if (sBattleGroundMgr.isTesting() && bg_template->isBattleGround() && (m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount())) if (sBattleGroundMgr.isTesting() && bg_template->isBattleGround() && (m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount() || m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount()))
{ return true; } {
return true;
}
// return true if there are enough players in selection pools - enable to work .debug bg command correctly // return true if there are enough players in selection pools - enable to work .debug bg command correctly
return m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount() >= minPlayers && m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() >= minPlayers; return m_SelectionPools[TEAM_INDEX_ALLIANCE].GetPlayerCount() >= minPlayers && m_SelectionPools[TEAM_INDEX_HORDE].GetPlayerCount() >= minPlayers;
} }
@ -826,7 +868,9 @@ void BattleGroundQueue::Update(BattleGroundTypeId bgTypeId, BattleGroundBracketI
uint32 MinPlayersPerTeam = bg_template->GetMinPlayersPerTeam(); uint32 MinPlayersPerTeam = bg_template->GetMinPlayersPerTeam();
uint32 MaxPlayersPerTeam = bg_template->GetMaxPlayersPerTeam(); uint32 MaxPlayersPerTeam = bg_template->GetMaxPlayersPerTeam();
if (sBattleGroundMgr.isTesting()) if (sBattleGroundMgr.isTesting())
{ MinPlayersPerTeam = 1; } {
MinPlayersPerTeam = 1;
}
if (bg_template->isArena()) if (bg_template->isArena())
{ {
if (sBattleGroundMgr.isArenaTesting()) if (sBattleGroundMgr.isArenaTesting())
@ -1052,12 +1096,16 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
Player* plr = sObjectMgr.GetPlayer(m_PlayerGuid); Player* plr = sObjectMgr.GetPlayer(m_PlayerGuid);
// player logged off (we should do nothing, he is correctly removed from queue in another procedure) // player logged off (we should do nothing, he is correctly removed from queue in another procedure)
if (!plr) if (!plr)
{ return true; } {
return true;
}
BattleGround* bg = sBattleGroundMgr.GetBattleGround(m_BgInstanceGUID, m_BgTypeId); BattleGround* bg = sBattleGroundMgr.GetBattleGround(m_BgInstanceGUID, m_BgTypeId);
// if battleground ended and its instance deleted - do nothing // if battleground ended and its instance deleted - do nothing
if (!bg) if (!bg)
{ return true; } {
return true;
}
BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType()); BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BGQueueTypeId(bg->GetTypeID(), bg->GetArenaType());
uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId); uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId);
@ -1671,7 +1719,9 @@ BattleGround* BattleGroundMgr::GetBattleGroundThroughClientInstance(uint32 insta
// SMSG_BATTLEFIELD_LIST we need to find the battleground with this clientinstance-id // SMSG_BATTLEFIELD_LIST we need to find the battleground with this clientinstance-id
BattleGround* bg = GetBattleGroundTemplate(bgTypeId); BattleGround* bg = GetBattleGroundTemplate(bgTypeId);
if (!bg) if (!bg)
{ return NULL; } {
return NULL;
}
if (bg->isArena()) if (bg->isArena())
return GetBattleGround(instanceId, bgTypeId); return GetBattleGround(instanceId, bgTypeId);
@ -1679,7 +1729,9 @@ BattleGround* BattleGroundMgr::GetBattleGroundThroughClientInstance(uint32 insta
for (BattleGroundSet::iterator itr = m_BattleGrounds[bgTypeId].begin(); itr != m_BattleGrounds[bgTypeId].end(); ++itr) for (BattleGroundSet::iterator itr = m_BattleGrounds[bgTypeId].begin(); itr != m_BattleGrounds[bgTypeId].end(); ++itr)
{ {
if (itr->second->GetClientInstanceID() == instanceId) if (itr->second->GetClientInstanceID() == instanceId)
{ return itr->second; } {
return itr->second;
}
} }
return NULL; return NULL;
} }
@ -1694,7 +1746,9 @@ BattleGround* BattleGroundMgr::GetBattleGround(uint32 InstanceID, BattleGroundTy
{ {
itr = m_BattleGrounds[i].find(InstanceID); itr = m_BattleGrounds[i].find(InstanceID);
if (itr != m_BattleGrounds[i].end()) if (itr != m_BattleGrounds[i].end())
{ return itr->second; } {
return itr->second;
}
} }
return NULL; return NULL;
} }
@ -1724,7 +1778,9 @@ uint32 BattleGroundMgr::CreateClientVisibleInstanceId(BattleGroundTypeId bgTypeI
for (ClientBattleGroundIdSet::const_iterator itr = ids.begin(); itr != ids.end();) for (ClientBattleGroundIdSet::const_iterator itr = ids.begin(); itr != ids.end();)
{ {
if ((++lastId) != *itr) // if there is a gap between the ids, we will break.. if ((++lastId) != *itr) // if there is a gap between the ids, we will break..
{ break; } {
break;
}
lastId = *itr; lastId = *itr;
} }
ids.insert(lastId + 1); ids.insert(lastId + 1);
@ -1975,7 +2031,9 @@ void BattleGroundMgr::CreateInitialBattleGrounds()
// sLog.outDetail("Creating battleground %s, %u-%u", bl->name[sWorld.GetDBClang()], MinLvl, MaxLvl); // sLog.outDetail("Creating battleground %s, %u-%u", bl->name[sWorld.GetDBClang()], MinLvl, MaxLvl);
if (!CreateBattleGround(bgTypeID, IsArena, MinPlayersPerTeam, MaxPlayersPerTeam, bl->minLevel, bl->maxLevel, bl->name[sWorld.GetDefaultDbcLocale()], bl->mapid[0], AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3])) if (!CreateBattleGround(bgTypeID, IsArena, MinPlayersPerTeam, MaxPlayersPerTeam, bl->minLevel, bl->maxLevel, bl->name[sWorld.GetDefaultDbcLocale()], bl->mapid[0], AStartLoc[0], AStartLoc[1], AStartLoc[2], AStartLoc[3], HStartLoc[0], HStartLoc[1], HStartLoc[2], HStartLoc[3]))
{ continue; } {
continue;
}
++count; ++count;
} }
@ -2064,7 +2122,9 @@ void BattleGroundMgr::DistributeArenaPoints()
void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket* data, ObjectGuid guid, Player* plr, BattleGroundTypeId bgTypeId) void BattleGroundMgr::BuildBattleGroundListPacket(WorldPacket* data, ObjectGuid guid, Player* plr, BattleGroundTypeId bgTypeId)
{ {
if (!plr) if (!plr)
{ return; } {
return;
}
BattleGround* bgTemplate = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId); BattleGround* bgTemplate = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
@ -2121,7 +2181,9 @@ void BattleGroundMgr::SendToBattleGround(Player* pl, uint32 instanceId, BattleGr
float x, y, z, O; float x, y, z, O;
Team team = pl->GetBGTeam(); Team team = pl->GetBGTeam();
if (team == 0) if (team == 0)
{ team = pl->GetTeam(); } {
team = pl->GetTeam();
}
bg->GetTeamStartLoc(team, x, y, z, O); bg->GetTeamStartLoc(team, x, y, z, O);
DETAIL_LOG("BATTLEGROUND: Sending %s to map %u, X %f, Y %f, Z %f, O %f", pl->GetName(), mapid, x, y, z, O); DETAIL_LOG("BATTLEGROUND: Sending %s to map %u, X %f, Y %f, Z %f, O %f", pl->GetName(), mapid, x, y, z, O);
@ -2241,7 +2303,9 @@ void BattleGroundMgr::ToggleTesting()
{ {
m_Testing = !m_Testing; m_Testing = !m_Testing;
if (m_Testing) if (m_Testing)
{ sWorld.SendWorldText(LANG_DEBUG_BG_ON); } {
sWorld.SendWorldText(LANG_DEBUG_BG_ON);
}
else else
{ sWorld.SendWorldText(LANG_DEBUG_BG_OFF); } { sWorld.SendWorldText(LANG_DEBUG_BG_OFF); }
} }
@ -2270,7 +2334,9 @@ void BattleGroundMgr::ScheduleQueueUpdate(uint32 arenaRating, ArenaType arenaTyp
} }
} }
if (!found) if (!found)
{ m_QueueUpdateScheduler.push_back(schedule_id); } {
m_QueueUpdateScheduler.push_back(schedule_id);
}
} }
uint32 BattleGroundMgr::GetMaxRatingDifference() const uint32 BattleGroundMgr::GetMaxRatingDifference() const
@ -2473,7 +2539,9 @@ void BattleGroundMgr::LoadBattleEventIndexes()
} }
if (gameobject) if (gameobject)
{ m_GameObjectBattleEventIndexMap[dbTableGuidLow] = events; } {
m_GameObjectBattleEventIndexMap[dbTableGuidLow] = events;
}
else else
{ m_CreatureBattleEventIndexMap[dbTableGuidLow] = events; } { m_CreatureBattleEventIndexMap[dbTableGuidLow] = events; }

View file

@ -572,7 +572,9 @@ class BattleGroundMgr
{ {
BattleMastersMap::const_iterator itr = mBattleMastersMap.find(entry); BattleMastersMap::const_iterator itr = mBattleMastersMap.find(entry);
if (itr != mBattleMastersMap.end()) if (itr != mBattleMastersMap.end())
{ return itr->second; } {
return itr->second;
}
return BATTLEGROUND_TYPE_NONE; return BATTLEGROUND_TYPE_NONE;
} }
@ -591,7 +593,9 @@ class BattleGroundMgr
{ {
CreatureBattleEventIndexesMap::const_iterator itr = m_CreatureBattleEventIndexMap.find(dbTableGuidLow); CreatureBattleEventIndexesMap::const_iterator itr = m_CreatureBattleEventIndexMap.find(dbTableGuidLow);
if (itr != m_CreatureBattleEventIndexMap.end()) if (itr != m_CreatureBattleEventIndexMap.end())
{ return itr->second; } {
return itr->second;
}
return m_CreatureBattleEventIndexMap.find(-1)->second; return m_CreatureBattleEventIndexMap.find(-1)->second;
} }
/** /**
@ -604,7 +608,9 @@ class BattleGroundMgr
{ {
GameObjectBattleEventIndexesMap::const_iterator itr = m_GameObjectBattleEventIndexMap.find(dbTableGuidLow); GameObjectBattleEventIndexesMap::const_iterator itr = m_GameObjectBattleEventIndexMap.find(dbTableGuidLow);
if (itr != m_GameObjectBattleEventIndexMap.end()) if (itr != m_GameObjectBattleEventIndexMap.end())
{ return itr->second; } {
return itr->second;
}
return m_GameObjectBattleEventIndexMap.find(-1)->second; return m_GameObjectBattleEventIndexMap.find(-1)->second;
} }

View file

@ -162,11 +162,15 @@ void BattleGroundWS::RespawnFlag(Team team, bool captured)
void BattleGroundWS::RespawnDroppedFlag(Team team) void BattleGroundWS::RespawnDroppedFlag(Team team)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
RespawnFlag(team, false); RespawnFlag(team, false);
if (team == ALLIANCE) if (team == ALLIANCE)
{ SendMessageToAll(LANG_BG_WS_ALLIANCE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL); } {
SendMessageToAll(LANG_BG_WS_ALLIANCE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL);
}
else else
{ SendMessageToAll(LANG_BG_WS_HORDE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL); } { SendMessageToAll(LANG_BG_WS_HORDE_FLAG_RESPAWNED, CHAT_MSG_BG_SYSTEM_NEUTRAL); }
@ -174,7 +178,9 @@ void BattleGroundWS::RespawnDroppedFlag(Team team)
GameObject* obj = GetBgMap()->GetGameObject(GetDroppedFlagGuid(team)); GameObject* obj = GetBgMap()->GetGameObject(GetDroppedFlagGuid(team));
if (obj) if (obj)
{ obj->Delete(); } {
obj->Delete();
}
else else
{ sLog.outError("Unknown dropped flag bg: %s", GetDroppedFlagGuid(team).GetString().c_str()); } { sLog.outError("Unknown dropped flag bg: %s", GetDroppedFlagGuid(team).GetString().c_str()); }
@ -184,7 +190,9 @@ void BattleGroundWS::RespawnDroppedFlag(Team team)
void BattleGroundWS::EventPlayerCapturedFlag(Player* source) void BattleGroundWS::EventPlayerCapturedFlag(Player* source)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
m_LastCapturedFlagTeam = source->GetTeam(); m_LastCapturedFlagTeam = source->GetTeam();
@ -192,28 +200,36 @@ void BattleGroundWS::EventPlayerCapturedFlag(Player* source)
if (source->GetTeam() == ALLIANCE) if (source->GetTeam() == ALLIANCE)
{ {
if (!IsHordeFlagPickedUp()) if (!IsHordeFlagPickedUp())
{ return; } {
return;
}
ClearHordeFlagCarrier(); // must be before aura remove to prevent 2 events (drop+capture) at the same time ClearHordeFlagCarrier(); // must be before aura remove to prevent 2 events (drop+capture) at the same time
// horde flag in base (but not respawned yet) // horde flag in base (but not respawned yet)
m_FlagState[TEAM_INDEX_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; m_FlagState[TEAM_INDEX_HORDE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;
// Drop Horde Flag from Player // Drop Horde Flag from Player
source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG); source->RemoveAurasDueToSpell(BG_WS_SPELL_WARSONG_FLAG);
if (m_TeamScores[TEAM_INDEX_ALLIANCE] < BG_WS_MAX_TEAM_SCORE) if (m_TeamScores[TEAM_INDEX_ALLIANCE] < BG_WS_MAX_TEAM_SCORE)
{ m_TeamScores[TEAM_INDEX_ALLIANCE] += 1; } {
m_TeamScores[TEAM_INDEX_ALLIANCE] += 1;
}
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE); PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_ALLIANCE);
RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE); RewardReputationToTeam(890, m_ReputationCapture, ALLIANCE);
} }
else else
{ {
if (!IsAllianceFlagPickedUp()) if (!IsAllianceFlagPickedUp())
{ return; } {
return;
}
ClearAllianceFlagCarrier(); // must be before aura remove to prevent 2 events (drop+capture) at the same time ClearAllianceFlagCarrier(); // must be before aura remove to prevent 2 events (drop+capture) at the same time
// alliance flag in base (but not respawned yet) // alliance flag in base (but not respawned yet)
m_FlagState[TEAM_INDEX_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN; m_FlagState[TEAM_INDEX_ALLIANCE] = BG_WS_FLAG_STATE_WAIT_RESPAWN;
// Drop Alliance Flag from Player // Drop Alliance Flag from Player
source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG); source->RemoveAurasDueToSpell(BG_WS_SPELL_SILVERWING_FLAG);
if (m_TeamScores[TEAM_INDEX_HORDE] < BG_WS_MAX_TEAM_SCORE) if (m_TeamScores[TEAM_INDEX_HORDE] < BG_WS_MAX_TEAM_SCORE)
{ m_TeamScores[TEAM_INDEX_HORDE] += 1; } {
m_TeamScores[TEAM_INDEX_HORDE] += 1;
}
PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE); PlaySoundToAll(BG_WS_SOUND_FLAG_CAPTURED_HORDE);
RewardReputationToTeam(889, m_ReputationCapture, HORDE); RewardReputationToTeam(889, m_ReputationCapture, HORDE);
} }
@ -225,7 +241,9 @@ void BattleGroundWS::EventPlayerCapturedFlag(Player* source)
SpawnEvent(WS_EVENT_FLAG_H, 0, false); SpawnEvent(WS_EVENT_FLAG_H, 0, false);
if (source->GetTeam() == ALLIANCE) if (source->GetTeam() == ALLIANCE)
{ SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, source); } {
SendMessageToAll(LANG_BG_WS_CAPTURED_HF, CHAT_MSG_BG_SYSTEM_ALLIANCE, source);
}
else else
{ SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, source); } { SendMessageToAll(LANG_BG_WS_CAPTURED_AF, CHAT_MSG_BG_SYSTEM_HORDE, source); }
@ -236,7 +254,9 @@ void BattleGroundWS::EventPlayerCapturedFlag(Player* source)
Team winner = TEAM_NONE; Team winner = TEAM_NONE;
if (m_TeamScores[TEAM_INDEX_ALLIANCE] == BG_WS_MAX_TEAM_SCORE) if (m_TeamScores[TEAM_INDEX_ALLIANCE] == BG_WS_MAX_TEAM_SCORE)
{ winner = ALLIANCE; } {
winner = ALLIANCE;
}
else if (m_TeamScores[TEAM_INDEX_HORDE] == BG_WS_MAX_TEAM_SCORE) else if (m_TeamScores[TEAM_INDEX_HORDE] == BG_WS_MAX_TEAM_SCORE)
{ winner = HORDE; } { winner = HORDE; }
@ -264,7 +284,9 @@ void BattleGroundWS::EventPlayerDroppedFlag(Player* source)
if (source->GetTeam() == ALLIANCE) if (source->GetTeam() == ALLIANCE)
{ {
if (!IsHordeFlagPickedUp()) if (!IsHordeFlagPickedUp())
{ return; } {
return;
}
if (GetHordeFlagCarrierGuid() == source->GetObjectGuid()) if (GetHordeFlagCarrierGuid() == source->GetObjectGuid())
{ {
ClearHordeFlagCarrier(); ClearHordeFlagCarrier();
@ -274,7 +296,9 @@ void BattleGroundWS::EventPlayerDroppedFlag(Player* source)
else else
{ {
if (!IsAllianceFlagPickedUp()) if (!IsAllianceFlagPickedUp())
{ return; } {
return;
}
if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid()) if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid())
{ {
ClearAllianceFlagCarrier(); ClearAllianceFlagCarrier();
@ -289,7 +313,9 @@ void BattleGroundWS::EventPlayerDroppedFlag(Player* source)
if (source->GetTeam() == ALLIANCE) if (source->GetTeam() == ALLIANCE)
{ {
if (!IsHordeFlagPickedUp()) if (!IsHordeFlagPickedUp())
{ return; } {
return;
}
if (GetHordeFlagCarrierGuid() == source->GetObjectGuid()) if (GetHordeFlagCarrierGuid() == source->GetObjectGuid())
{ {
ClearHordeFlagCarrier(); ClearHordeFlagCarrier();
@ -302,7 +328,9 @@ void BattleGroundWS::EventPlayerDroppedFlag(Player* source)
else else
{ {
if (!IsAllianceFlagPickedUp()) if (!IsAllianceFlagPickedUp())
{ return; } {
return;
}
if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid()) if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid())
{ {
ClearAllianceFlagCarrier(); ClearAllianceFlagCarrier();
@ -336,7 +364,9 @@ void BattleGroundWS::EventPlayerDroppedFlag(Player* source)
void BattleGroundWS::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj) void BattleGroundWS::EventPlayerClickedOnFlag(Player* source, GameObject* target_obj)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
int32 message_id = 0; int32 message_id = 0;
ChatMsg type; ChatMsg type;
@ -432,7 +462,9 @@ void BattleGroundWS::EventPlayerClickedOnFlag(Player* source, GameObject* target
} }
if (!message_id) if (!message_id)
{ return; } {
return;
}
SendMessageToAll(message_id, type, source); SendMessageToAll(message_id, type, source);
source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); source->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT);
@ -468,7 +500,9 @@ void BattleGroundWS::RemovePlayer(Player* plr, ObjectGuid guid)
void BattleGroundWS::UpdateFlagState(Team team, uint32 value) void BattleGroundWS::UpdateFlagState(Team team, uint32 value)
{ {
if (team == ALLIANCE) if (team == ALLIANCE)
{ UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, value); } {
UpdateWorldState(BG_WS_FLAG_STATE_ALLIANCE, value);
}
else else
{ UpdateWorldState(BG_WS_FLAG_STATE_HORDE, value); } { UpdateWorldState(BG_WS_FLAG_STATE_HORDE, value); }
} }
@ -485,19 +519,25 @@ bool BattleGroundWS::HandleAreaTrigger(Player* source, uint32 trigger)
{ {
// this is wrong way to implement these things. On official it done by gameobject spell cast. // this is wrong way to implement these things. On official it done by gameobject spell cast.
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return false; } {
return false;
}
switch (trigger) switch (trigger)
{ {
case 3646: // Alliance Flag spawn case 3646: // Alliance Flag spawn
if (m_FlagState[TEAM_INDEX_HORDE] && !m_FlagState[TEAM_INDEX_ALLIANCE]) if (m_FlagState[TEAM_INDEX_HORDE] && !m_FlagState[TEAM_INDEX_ALLIANCE])
if (GetHordeFlagCarrierGuid() == source->GetObjectGuid()) if (GetHordeFlagCarrierGuid() == source->GetObjectGuid())
{ EventPlayerCapturedFlag(source); } {
EventPlayerCapturedFlag(source);
}
break; break;
case 3647: // Horde Flag spawn case 3647: // Horde Flag spawn
if (m_FlagState[TEAM_INDEX_ALLIANCE] && !m_FlagState[TEAM_INDEX_HORDE]) if (m_FlagState[TEAM_INDEX_ALLIANCE] && !m_FlagState[TEAM_INDEX_HORDE])
if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid()) if (GetAllianceFlagCarrierGuid() == source->GetObjectGuid())
{ EventPlayerCapturedFlag(source); } {
EventPlayerCapturedFlag(source);
}
break; break;
default: default:
return false; return false;
@ -551,7 +591,9 @@ void BattleGroundWS::EndBattleGround(Team winner)
void BattleGroundWS::HandleKillPlayer(Player* player, Player* killer) void BattleGroundWS::HandleKillPlayer(Player* player, Player* killer)
{ {
if (GetStatus() != STATUS_IN_PROGRESS) if (GetStatus() != STATUS_IN_PROGRESS)
{ return; } {
return;
}
EventPlayerDroppedFlag(player); EventPlayerDroppedFlag(player);
@ -562,7 +604,9 @@ void BattleGroundWS::UpdatePlayerScore(Player* source, uint32 type, uint32 value
{ {
BattleGroundScoreMap::iterator itr = m_PlayerScores.find(source->GetObjectGuid()); BattleGroundScoreMap::iterator itr = m_PlayerScores.find(source->GetObjectGuid());
if (itr == m_PlayerScores.end()) // player not found if (itr == m_PlayerScores.end()) // player not found
{ return; } {
return;
}
switch (type) switch (type)
{ {
@ -588,14 +632,18 @@ WorldSafeLocsEntry const* BattleGroundWS::GetClosestGraveYard(Player* player)
if (player->GetTeam() == ALLIANCE) if (player->GetTeam() == ALLIANCE)
{ {
if (GetStatus() == STATUS_IN_PROGRESS) if (GetStatus() == STATUS_IN_PROGRESS)
{ return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE); } {
return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_ALLIANCE);
}
else else
{ return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_ALLIANCE); } { return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_ALLIANCE); }
} }
else else
{ {
if (GetStatus() == STATUS_IN_PROGRESS) if (GetStatus() == STATUS_IN_PROGRESS)
{ return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE); } {
return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_MAIN_HORDE);
}
else else
{ return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_HORDE); } { return sWorldSafeLocsStore.LookupEntry(WS_GRAVEYARD_FLAGROOM_HORDE); }
} }
@ -607,14 +655,18 @@ void BattleGroundWS::FillInitialWorldStates(WorldPacket& data, uint32& count)
FillInitialWorldState(data, count, BG_WS_FLAG_CAPTURES_HORDE, m_TeamScores[TEAM_INDEX_HORDE]); FillInitialWorldState(data, count, BG_WS_FLAG_CAPTURES_HORDE, m_TeamScores[TEAM_INDEX_HORDE]);
if (m_FlagState[TEAM_INDEX_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND) if (m_FlagState[TEAM_INDEX_ALLIANCE] == BG_WS_FLAG_STATE_ON_GROUND)
{ FillInitialWorldState(data, count, BG_WS_FLAG_UNK_ALLIANCE, -1); } {
FillInitialWorldState(data, count, BG_WS_FLAG_UNK_ALLIANCE, -1);
}
else if (m_FlagState[TEAM_INDEX_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER) else if (m_FlagState[TEAM_INDEX_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER)
{ FillInitialWorldState(data, count, BG_WS_FLAG_UNK_ALLIANCE, 1); } { FillInitialWorldState(data, count, BG_WS_FLAG_UNK_ALLIANCE, 1); }
else else
{ FillInitialWorldState(data, count, BG_WS_FLAG_UNK_ALLIANCE, 0); } { FillInitialWorldState(data, count, BG_WS_FLAG_UNK_ALLIANCE, 0); }
if (m_FlagState[TEAM_INDEX_HORDE] == BG_WS_FLAG_STATE_ON_GROUND) if (m_FlagState[TEAM_INDEX_HORDE] == BG_WS_FLAG_STATE_ON_GROUND)
{ FillInitialWorldState(data, count, BG_WS_FLAG_UNK_HORDE, -1); } {
FillInitialWorldState(data, count, BG_WS_FLAG_UNK_HORDE, -1);
}
else if (m_FlagState[TEAM_INDEX_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER) else if (m_FlagState[TEAM_INDEX_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER)
{ FillInitialWorldState(data, count, BG_WS_FLAG_UNK_HORDE, 1); } { FillInitialWorldState(data, count, BG_WS_FLAG_UNK_HORDE, 1); }
else else
@ -623,12 +675,16 @@ void BattleGroundWS::FillInitialWorldStates(WorldPacket& data, uint32& count)
FillInitialWorldState(data, count, BG_WS_FLAG_CAPTURES_MAX, BG_WS_MAX_TEAM_SCORE); FillInitialWorldState(data, count, BG_WS_FLAG_CAPTURES_MAX, BG_WS_MAX_TEAM_SCORE);
if (m_FlagState[TEAM_INDEX_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER) if (m_FlagState[TEAM_INDEX_HORDE] == BG_WS_FLAG_STATE_ON_PLAYER)
{ FillInitialWorldState(data, count, BG_WS_FLAG_STATE_HORDE, 2); } {
FillInitialWorldState(data, count, BG_WS_FLAG_STATE_HORDE, 2);
}
else else
{ FillInitialWorldState(data, count, BG_WS_FLAG_STATE_HORDE, 1); } { FillInitialWorldState(data, count, BG_WS_FLAG_STATE_HORDE, 1); }
if (m_FlagState[TEAM_INDEX_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER) if (m_FlagState[TEAM_INDEX_ALLIANCE] == BG_WS_FLAG_STATE_ON_PLAYER)
{ FillInitialWorldState(data, count, BG_WS_FLAG_STATE_ALLIANCE, 2); } {
FillInitialWorldState(data, count, BG_WS_FLAG_STATE_ALLIANCE, 2);
}
else else
{ FillInitialWorldState(data, count, BG_WS_FLAG_STATE_ALLIANCE, 1); } { FillInitialWorldState(data, count, BG_WS_FLAG_STATE_ALLIANCE, 1); }
@ -642,9 +698,13 @@ Team BattleGroundWS::GetPrematureWinner()
int32 allianceScore = m_TeamScores[TEAM_INDEX_ALLIANCE]; int32 allianceScore = m_TeamScores[TEAM_INDEX_ALLIANCE];
if (hordeScore > allianceScore) if (hordeScore > allianceScore)
{ return HORDE; } {
return HORDE;
}
if (allianceScore > hordeScore) if (allianceScore > hordeScore)
{ return ALLIANCE; } {
return ALLIANCE;
}
// If the values are equal, fall back to number of players on each team // If the values are equal, fall back to number of players on each team
return BattleGround::GetPrematureWinner(); return BattleGround::GetPrematureWinner();

View file

@ -46,7 +46,9 @@ bool ChatHandler::HandleHelpCommand(char* args)
else else
{ {
if (!ShowHelpForCommand(getCommandTable(), args)) if (!ShowHelpForCommand(getCommandTable(), args))
{ SendSysMessage(LANG_NO_CMD); } {
SendSysMessage(LANG_NO_CMD);
}
} }
return true; return true;
@ -62,7 +64,9 @@ bool ChatHandler::HandleAccountCommand(char* args)
{ {
// let show subcommands at unexpected data in args // let show subcommands at unexpected data in args
if (*args) if (*args)
{ return false; } {
return false;
}
AccountTypes gmlevel = GetAccessLevel(); AccountTypes gmlevel = GetAccessLevel();
PSendSysMessage(LANG_ACCOUNT_LEVEL, uint32(gmlevel)); PSendSysMessage(LANG_ACCOUNT_LEVEL, uint32(gmlevel));
@ -108,7 +112,9 @@ bool ChatHandler::HandleServerInfoCommand(char* /*args*/)
{ {
char const* ver = sScriptMgr.GetScriptLibraryVersion(); char const* ver = sScriptMgr.GetScriptLibraryVersion();
if (ver && *ver) if (ver && *ver)
{ PSendSysMessage(LANG_USING_SCRIPT_LIB, ver); } {
PSendSysMessage(LANG_USING_SCRIPT_LIB, ver);
}
else else
{ SendSysMessage(LANG_USING_SCRIPT_LIB_UNKNOWN); } { SendSysMessage(LANG_USING_SCRIPT_LIB_UNKNOWN); }
} }
@ -161,7 +167,9 @@ bool ChatHandler::HandleSaveCommand(char* /*args*/)
// save or plan save after 20 sec (logout delay) if current next save time more this value and _not_ output any messages to prevent cheat planning // save or plan save after 20 sec (logout delay) if current next save time more this value and _not_ output any messages to prevent cheat planning
uint32 save_interval = sWorld.getConfig(CONFIG_UINT32_INTERVAL_SAVE); uint32 save_interval = sWorld.getConfig(CONFIG_UINT32_INTERVAL_SAVE);
if (save_interval == 0 || (save_interval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= save_interval - 20 * IN_MILLISECONDS)) if (save_interval == 0 || (save_interval > 20 * IN_MILLISECONDS && player->GetSaveTimer() <= save_interval - 20 * IN_MILLISECONDS))
{ player->SaveToDB(); } {
player->SaveToDB();
}
return true; return true;
} }
@ -214,7 +222,9 @@ bool ChatHandler::HandleAccountPasswordCommand(char* args)
char* new_pass_c = ExtractQuotedOrLiteralArg(&args); char* new_pass_c = ExtractQuotedOrLiteralArg(&args);
if (!old_pass || !new_pass || !new_pass_c) if (!old_pass || !new_pass || !new_pass_c)
{ return false; } {
return false;
}
std::string password_old = old_pass; std::string password_old = old_pass;
std::string password_new = new_pass; std::string password_new = new_pass;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -44,18 +44,24 @@
bool ChatHandler::HandleAccountDeleteCommand(char* args) bool ChatHandler::HandleAccountDeleteCommand(char* args)
{ {
if (!*args) if (!*args)
{ return false; } {
return false;
}
std::string account_name; std::string account_name;
uint32 account_id = ExtractAccountId(&args, &account_name); uint32 account_id = ExtractAccountId(&args, &account_name);
if (!account_id) if (!account_id)
{ return false; } {
return false;
}
/// Commands not recommended call from chat, but support anyway /// Commands not recommended call from chat, but support anyway
/// can delete only for account with less security /// can delete only for account with less security
/// This is also reject self apply in fact /// This is also reject self apply in fact
if (HasLowerSecurityAccount(NULL, account_id, true)) if (HasLowerSecurityAccount(NULL, account_id, true))
{ return false; } {
return false;
}
AccountOpResult result = sAccountMgr.DeleteAccount(account_id); AccountOpResult result = sAccountMgr.DeleteAccount(account_id);
switch (result) switch (result)
@ -94,12 +100,16 @@ bool ChatHandler::GetDeletedCharacterInfoList(DeletedInfoList& foundList, std::s
{ {
// search by GUID // search by GUID
if (isNumeric(searchString)) if (isNumeric(searchString))
{ resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = %u", uint32(atoi(searchString.c_str()))); } {
resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = %u", uint32(atoi(searchString.c_str())));
}
// search by name // search by name
else else
{ {
if (!normalizePlayerName(searchString)) if (!normalizePlayerName(searchString))
{ return false; } {
return false;
}
resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name " _LIKE_ " " _CONCAT3_("'%%'", "'%s'", "'%%'"), searchString.c_str()); resultChar = CharacterDatabase.PQuery("SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name " _LIKE_ " " _CONCAT3_("'%%'", "'%s'", "'%%'"), searchString.c_str());
} }
@ -157,7 +167,9 @@ std::string ChatHandler::GenerateDeletedCharacterGUIDsWhereStr(DeletedInfoList::
DeletedInfoList::const_iterator itr2 = itr; DeletedInfoList::const_iterator itr2 = itr;
if (++itr2 != itr_end) if (++itr2 != itr_end)
{ wherestr << "','"; } {
wherestr << "','";
}
} }
wherestr << "')"; wherestr << "')";
return wherestr.str(); return wherestr.str();
@ -197,7 +209,9 @@ void ChatHandler::HandleCharacterDeletedListHelper(DeletedInfoList const& foundL
} }
if (!m_session) if (!m_session)
{ SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR); } {
SendSysMessage(LANG_CHARACTER_DELETED_LIST_BAR);
}
} }
/** /**
@ -214,7 +228,9 @@ bool ChatHandler::HandleCharacterDeletedListCommand(char* args)
{ {
DeletedInfoList foundList; DeletedInfoList foundList;
if (!GetDeletedCharacterInfoList(foundList, args)) if (!GetDeletedCharacterInfoList(foundList, args))
{ return false; } {
return false;
}
// if no characters have been found, output a warning // if no characters have been found, output a warning
if (foundList.empty()) if (foundList.empty())
@ -278,7 +294,9 @@ bool ChatHandler::HandleCharacterDeletedRestoreCommand(char* args)
{ {
// It is required to submit at least one argument // It is required to submit at least one argument
if (!*args) if (!*args)
{ return false; } {
return false;
}
std::string searchString; std::string searchString;
std::string newCharName; std::string newCharName;
@ -290,7 +308,9 @@ bool ChatHandler::HandleCharacterDeletedRestoreCommand(char* args)
DeletedInfoList foundList; DeletedInfoList foundList;
if (!GetDeletedCharacterInfoList(foundList, searchString)) if (!GetDeletedCharacterInfoList(foundList, searchString))
{ return false; } {
return false;
}
if (foundList.empty()) if (foundList.empty())
{ {
@ -343,11 +363,15 @@ bool ChatHandler::HandleCharacterDeletedDeleteCommand(char* args)
{ {
// It is required to submit at least one argument // It is required to submit at least one argument
if (!*args) if (!*args)
{ return false; } {
return false;
}
DeletedInfoList foundList; DeletedInfoList foundList;
if (!GetDeletedCharacterInfoList(foundList, args)) if (!GetDeletedCharacterInfoList(foundList, args))
{ return false; } {
return false;
}
if (foundList.empty()) if (foundList.empty())
{ {
@ -381,10 +405,14 @@ bool ChatHandler::HandleCharacterDeletedOldCommand(char* args)
int32 keepDays = sWorld.getConfig(CONFIG_UINT32_CHARDELETE_KEEP_DAYS); int32 keepDays = sWorld.getConfig(CONFIG_UINT32_CHARDELETE_KEEP_DAYS);
if (!ExtractOptInt32(&args, keepDays, sWorld.getConfig(CONFIG_UINT32_CHARDELETE_KEEP_DAYS))) if (!ExtractOptInt32(&args, keepDays, sWorld.getConfig(CONFIG_UINT32_CHARDELETE_KEEP_DAYS)))
{ return false; } {
return false;
}
if (keepDays < 0) if (keepDays < 0)
{ return false; } {
return false;
}
Player::DeleteOldCharacters((uint32)keepDays); Player::DeleteOldCharacters((uint32)keepDays);
return true; return true;
@ -394,13 +422,17 @@ bool ChatHandler::HandleCharacterEraseCommand(char* args)
{ {
char* nameStr = ExtractLiteralArg(&args); char* nameStr = ExtractLiteralArg(&args);
if (!nameStr) if (!nameStr)
{ return false; } {
return false;
}
Player* target; Player* target;
ObjectGuid target_guid; ObjectGuid target_guid;
std::string target_name; std::string target_name;
if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name)) if (!ExtractPlayerTarget(&nameStr, &target, &target_guid, &target_name))
{ return false; } {
return false;
}
uint32 account_id; uint32 account_id;
@ -441,7 +473,9 @@ bool ChatHandler::HandleAccountOnlineListCommand(char* args)
{ {
uint32 limit; uint32 limit;
if (!ExtractOptUInt32(&args, limit, 100)) if (!ExtractOptUInt32(&args, limit, 100))
{ return false; } {
return false;
}
///- Get the list of accounts ID logged to the realm ///- Get the list of accounts ID logged to the realm
// 0 1 2 3 4 // 0 1 2 3 4
@ -457,7 +491,9 @@ bool ChatHandler::HandleAccountCreateCommand(char* args)
char* szAcc = ExtractQuotedOrLiteralArg(&args); char* szAcc = ExtractQuotedOrLiteralArg(&args);
char* szPassword = ExtractQuotedOrLiteralArg(&args); char* szPassword = ExtractQuotedOrLiteralArg(&args);
if (!szAcc || !szPassword) if (!szAcc || !szPassword)
{ return false; } {
return false;
}
// normalized in accmgr.CreateAccount // normalized in accmgr.CreateAccount
std::string account_name = szAcc; std::string account_name = szAcc;
@ -503,13 +539,17 @@ bool ChatHandler::HandleServerLogFilterCommand(char* args)
SendSysMessage(LANG_LOG_FILTERS_STATE_HEADER); SendSysMessage(LANG_LOG_FILTERS_STATE_HEADER);
for (int i = 0; i < LOG_FILTER_COUNT; ++i) for (int i = 0; i < LOG_FILTER_COUNT; ++i)
if (*logFilterData[i].name) if (*logFilterData[i].name)
{ PSendSysMessage(" %-20s = %s", logFilterData[i].name, GetOnOffStr(sLog.HasLogFilter(1 << i))); } {
PSendSysMessage(" %-20s = %s", logFilterData[i].name, GetOnOffStr(sLog.HasLogFilter(1 << i)));
}
return true; return true;
} }
char* filtername = ExtractLiteralArg(&args); char* filtername = ExtractLiteralArg(&args);
if (!filtername) if (!filtername)
{ return false; } {
return false;
}
bool value; bool value;
if (!ExtractOnOff(&args, value)) if (!ExtractOnOff(&args, value))
@ -529,7 +569,9 @@ bool ChatHandler::HandleServerLogFilterCommand(char* args)
for (int i = 0; i < LOG_FILTER_COUNT; ++i) for (int i = 0; i < LOG_FILTER_COUNT; ++i)
{ {
if (!*logFilterData[i].name) if (!*logFilterData[i].name)
{ continue; } {
continue;
}
if (!strncmp(filtername, logFilterData[i].name, strlen(filtername))) if (!strncmp(filtername, logFilterData[i].name, strlen(filtername)))
{ {

View file

@ -41,28 +41,40 @@
bool ChatHandler::HandleDebugSendSpellFailCommand(char* args) bool ChatHandler::HandleDebugSendSpellFailCommand(char* args)
{ {
if (!*args) if (!*args)
{ return false; } {
return false;
}
uint32 failnum; uint32 failnum;
if (!ExtractUInt32(&args, failnum) || failnum > 255) if (!ExtractUInt32(&args, failnum) || failnum > 255)
{ return false; } {
return false;
}
uint32 failarg1; uint32 failarg1;
if (!ExtractOptUInt32(&args, failarg1, 0)) if (!ExtractOptUInt32(&args, failarg1, 0))
{ return false; } {
return false;
}
uint32 failarg2; uint32 failarg2;
if (!ExtractOptUInt32(&args, failarg2, 0)) if (!ExtractOptUInt32(&args, failarg2, 0))
{ return false; } {
return false;
}
WorldPacket data(SMSG_CAST_FAILED, 5); WorldPacket data(SMSG_CAST_FAILED, 5);
data << uint8(0); data << uint8(0);
data << uint32(133); data << uint32(133);
data << uint8(failnum); data << uint8(failnum);
if (failarg1 || failarg2) if (failarg1 || failarg2)
{ data << uint32(failarg1); } {
data << uint32(failarg1);
}
if (failarg2) if (failarg2)
{ data << uint32(failarg2); } {
data << uint32(failarg2);
}
m_session->SendPacket(&data); m_session->SendPacket(&data);
@ -81,11 +93,15 @@ bool ChatHandler::HandleDebugSendPoiCommand(char* args)
uint32 icon; uint32 icon;
if (!ExtractUInt32(&args, icon)) if (!ExtractUInt32(&args, icon))
{ return false; } {
return false;
}
uint32 flags; uint32 flags;
if (!ExtractUInt32(&args, flags)) if (!ExtractUInt32(&args, flags))
{ return false; } {
return false;
}
DETAIL_LOG("Command : POI, NPC = %u, icon = %u flags = %u", target->GetGUIDLow(), icon, flags); DETAIL_LOG("Command : POI, NPC = %u, icon = %u flags = %u", target->GetGUIDLow(), icon, flags);
pPlayer->PlayerTalkClass->SendPointOfInterest(target->GetPositionX(), target->GetPositionY(), Poi_Icon(icon), flags, 30, "Test POI"); pPlayer->PlayerTalkClass->SendPointOfInterest(target->GetPositionX(), target->GetPositionY(), Poi_Icon(icon), flags, 30, "Test POI");
@ -95,7 +111,9 @@ bool ChatHandler::HandleDebugSendPoiCommand(char* args)
bool ChatHandler::HandleDebugSendEquipErrorCommand(char* args) bool ChatHandler::HandleDebugSendEquipErrorCommand(char* args)
{ {
if (!*args) if (!*args)
{ return false; } {
return false;
}
uint8 msg = atoi(args); uint8 msg = atoi(args);
m_session->GetPlayer()->SendEquipError(InventoryResult(msg), NULL, NULL); m_session->GetPlayer()->SendEquipError(InventoryResult(msg), NULL, NULL);
@ -105,7 +123,9 @@ bool ChatHandler::HandleDebugSendEquipErrorCommand(char* args)
bool ChatHandler::HandleDebugSendSellErrorCommand(char* args) bool ChatHandler::HandleDebugSendSellErrorCommand(char* args)
{ {
if (!*args) if (!*args)
{ return false; } {
return false;
}
uint8 msg = atoi(args); uint8 msg = atoi(args);
m_session->GetPlayer()->SendSellError(SellResult(msg), 0, ObjectGuid(), 0); m_session->GetPlayer()->SendSellError(SellResult(msg), 0, ObjectGuid(), 0);
@ -115,7 +135,9 @@ bool ChatHandler::HandleDebugSendSellErrorCommand(char* args)
bool ChatHandler::HandleDebugSendBuyErrorCommand(char* args) bool ChatHandler::HandleDebugSendBuyErrorCommand(char* args)
{ {
if (!*args) if (!*args)
{ return false; } {
return false;
}
uint8 msg = atoi(args); uint8 msg = atoi(args);
m_session->GetPlayer()->SendBuyError(BuyResult(msg), 0, 0, 0); m_session->GetPlayer()->SendBuyError(BuyResult(msg), 0, 0, 0);
@ -126,11 +148,15 @@ bool ChatHandler::HandleDebugSendOpcodeCommand(char* /*args*/)
{ {
Unit* unit = getSelectedUnit(); Unit* unit = getSelectedUnit();
if (!unit || (unit->GetTypeId() != TYPEID_PLAYER)) if (!unit || (unit->GetTypeId() != TYPEID_PLAYER))
{ unit = m_session->GetPlayer(); } {
unit = m_session->GetPlayer();
}
std::ifstream stream("opcode.txt"); std::ifstream stream("opcode.txt");
if (!stream.is_open()) if (!stream.is_open())
{ return false; } {
return false;
}
uint32 opcode = 0; uint32 opcode = 0;
if (!(stream >> opcode)) if (!(stream >> opcode))
@ -145,7 +171,9 @@ bool ChatHandler::HandleDebugSendOpcodeCommand(char* /*args*/)
while (stream >> type) while (stream >> type)
{ {
if (type.empty()) if (type.empty())
{ break; } {
break;
}
if (type == "uint8") if (type == "uint8")
{ {
@ -209,11 +237,15 @@ bool ChatHandler::HandleDebugUpdateWorldStateCommand(char* args)
{ {
uint32 world; uint32 world;
if (!ExtractUInt32(&args, world)) if (!ExtractUInt32(&args, world))
{ return false; } {
return false;
}
uint32 state; uint32 state;
if (!ExtractUInt32(&args, state)) if (!ExtractUInt32(&args, state))
{ return false; } {
return false;
}
m_session->GetPlayer()->SendUpdateWorldState(world, state); m_session->GetPlayer()->SendUpdateWorldState(world, state);
return true; return true;
@ -225,7 +257,9 @@ bool ChatHandler::HandleDebugPlayCinematicCommand(char* args)
// #cinematicid - ID decimal number from CinemaicSequences.dbc (1st column) // #cinematicid - ID decimal number from CinemaicSequences.dbc (1st column)
uint32 dwId; uint32 dwId;
if (!ExtractUInt32(&args, dwId)) if (!ExtractUInt32(&args, dwId))
{ return false; } {
return false;
}
if (!sCinematicSequencesStore.LookupEntry(dwId)) if (!sCinematicSequencesStore.LookupEntry(dwId))
{ {
@ -264,7 +298,9 @@ bool ChatHandler::HandleDebugPlaySoundCommand(char* args)
// #soundid - ID decimal number from SoundEntries.dbc (1st column) // #soundid - ID decimal number from SoundEntries.dbc (1st column)
uint32 dwSoundId; uint32 dwSoundId;
if (!ExtractUInt32(&args, dwSoundId)) if (!ExtractUInt32(&args, dwSoundId))
{ return false; } {
return false;
}
if (!sSoundEntriesStore.LookupEntry(dwSoundId)) if (!sSoundEntriesStore.LookupEntry(dwSoundId))
{ {
@ -282,7 +318,9 @@ bool ChatHandler::HandleDebugPlaySoundCommand(char* args)
} }
if (m_session->GetPlayer()->GetSelectionGuid()) if (m_session->GetPlayer()->GetSelectionGuid())
{ unit->PlayDistanceSound(dwSoundId, m_session->GetPlayer()); } {
unit->PlayDistanceSound(dwSoundId, m_session->GetPlayer());
}
else else
{ unit->PlayDirectSound(dwSoundId, m_session->GetPlayer()); } { unit->PlayDirectSound(dwSoundId, m_session->GetPlayer()); }
@ -297,7 +335,9 @@ bool ChatHandler::HandleDebugSendChannelNotifyCommand(char* args)
uint32 code; uint32 code;
if (!ExtractUInt32(&args, code) || code > 255) if (!ExtractUInt32(&args, code) || code > 255)
{ return false; } {
return false;
}
WorldPacket data(SMSG_CHANNEL_NOTIFY, (1 + 10)); WorldPacket data(SMSG_CHANNEL_NOTIFY, (1 + 10));
data << uint8(code); // notify type data << uint8(code); // notify type
@ -315,7 +355,9 @@ bool ChatHandler::HandleDebugSendChatMsgCommand(char* args)
uint32 type; uint32 type;
if (!ExtractUInt32(&args, type) || type > 255) if (!ExtractUInt32(&args, type) || type > 255)
{ return false; } {
return false;
}
WorldPacket data; WorldPacket data;
ChatHandler::BuildChatPacket(data, ChatMsg(type), msg, LANG_UNIVERSAL, CHAT_TAG_NONE, m_session->GetPlayer()->GetObjectGuid(), m_session->GetPlayerName()); ChatHandler::BuildChatPacket(data, ChatMsg(type), msg, LANG_UNIVERSAL, CHAT_TAG_NONE, m_session->GetPlayer()->GetObjectGuid(), m_session->GetPlayerName());
@ -327,7 +369,9 @@ bool ChatHandler::HandleDebugSendQuestPartyMsgCommand(char* args)
{ {
uint32 msg; uint32 msg;
if (!ExtractUInt32(&args, msg)) if (!ExtractUInt32(&args, msg))
{ return false; } {
return false;
}
m_session->GetPlayer()->SendPushToPartyResponse(m_session->GetPlayer(), msg); m_session->GetPlayer()->SendPushToPartyResponse(m_session->GetPlayer(), msg);
return true; return true;
@ -337,10 +381,14 @@ bool ChatHandler::HandleDebugGetLootRecipientCommand(char* /*args*/)
{ {
Creature* target = getSelectedCreature(); Creature* target = getSelectedCreature();
if (!target) if (!target)
{ return false; } {
return false;
}
if (!target->HasLootRecipient()) if (!target->HasLootRecipient())
{ SendSysMessage("loot recipient: no loot recipient"); } {
SendSysMessage("loot recipient: no loot recipient");
}
else if (Player* recipient = target->GetLootRecipient()) else if (Player* recipient = target->GetLootRecipient())
PSendSysMessage("loot recipient: %s with raw data %s from group %u", PSendSysMessage("loot recipient: %s with raw data %s from group %u",
recipient->GetGuidStr().c_str(), recipient->GetGuidStr().c_str(),
@ -362,7 +410,9 @@ bool ChatHandler::HandleDebugSendQuestInvalidMsgCommand(char* args)
bool ChatHandler::HandleDebugGetItemStateCommand(char* args) bool ChatHandler::HandleDebugGetItemStateCommand(char* args)
{ {
if (!*args) if (!*args)
{ return false; } {
return false;
}
ItemUpdateState state = ITEM_UNCHANGED; ItemUpdateState state = ITEM_UNCHANGED;
bool list_queue = false, check_all = false; bool list_queue = false, check_all = false;
@ -406,7 +456,9 @@ bool ChatHandler::HandleDebugGetItemStateCommand(char* args)
for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i) for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
{ {
if (i >= BUYBACK_SLOT_START && i < BUYBACK_SLOT_END) if (i >= BUYBACK_SLOT_START && i < BUYBACK_SLOT_END)
{ continue; } {
continue;
}
Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
if (!item) { continue; } if (!item) { continue; }
@ -455,7 +507,9 @@ bool ChatHandler::HandleDebugGetItemStateCommand(char* args)
item->GetGuidStr().c_str(), bag_slot, item->GetSlot(), st.c_str()); item->GetGuidStr().c_str(), bag_slot, item->GetSlot(), st.c_str());
} }
if (updateQueue.empty()) if (updateQueue.empty())
{ PSendSysMessage("updatequeue empty"); } {
PSendSysMessage("updatequeue empty");
}
} }
if (check_all) if (check_all)
@ -465,7 +519,9 @@ bool ChatHandler::HandleDebugGetItemStateCommand(char* args)
for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i) for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
{ {
if (i >= BUYBACK_SLOT_START && i < BUYBACK_SLOT_END) if (i >= BUYBACK_SLOT_START && i < BUYBACK_SLOT_END)
{ continue; } {
continue;
}
Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
if (!item) { continue; } if (!item) { continue; }
@ -638,7 +694,9 @@ bool ChatHandler::HandleDebugGetItemStateCommand(char* args)
} }
} }
if (!error) if (!error)
{ SendSysMessage("All OK!"); } {
SendSysMessage("All OK!");
}
} }
return true; return true;
@ -691,7 +749,9 @@ bool ChatHandler::HandleDebugPhaseCommand(char* args)
{ {
uint32 emote_id; uint32 emote_id;
if (!ExtractUInt32(&args, emote_id)) if (!ExtractUInt32(&args, emote_id))
{ return false; } {
return false;
}
m_session->GetPlayer()->HandleEmoteCommand(emote_id); m_session->GetPlayer()->HandleEmoteCommand(emote_id);
return true; return true;
@ -702,7 +762,9 @@ bool ChatHandler::HandleDebugAnimCommand(char* args)
{ {
uint32 emote_id; uint32 emote_id;
if (!ExtractUInt32(&args, emote_id)) if (!ExtractUInt32(&args, emote_id))
{ return false; } {
return false;
}
m_session->GetPlayer()->HandleEmoteCommand(emote_id); m_session->GetPlayer()->HandleEmoteCommand(emote_id);
return true; return true;
@ -712,7 +774,9 @@ bool ChatHandler::HandleDebugSetAuraStateCommand(char* args)
{ {
int32 state; int32 state;
if (!ExtractInt32(&args, state)) if (!ExtractInt32(&args, state))
{ return false; } {
return false;
}
Unit* unit = getSelectedUnit(); Unit* unit = getSelectedUnit();
if (!unit) if (!unit)
@ -747,7 +811,9 @@ bool ChatHandler::HandleSetValueHelper(Object* target, uint32 field, char* typeS
uint32 base; // 0 -> float uint32 base; // 0 -> float
if (!typeStr) if (!typeStr)
{ base = 10; } {
base = 10;
}
else if (strncmp(typeStr, "int", strlen(typeStr)) == 0) else if (strncmp(typeStr, "int", strlen(typeStr)) == 0)
{ base = 10; } { base = 10; }
else if (strncmp(typeStr, "hex", strlen(typeStr)) == 0) else if (strncmp(typeStr, "hex", strlen(typeStr)) == 0)
@ -763,7 +829,9 @@ bool ChatHandler::HandleSetValueHelper(Object* target, uint32 field, char* typeS
{ {
uint32 iValue; uint32 iValue;
if (!ExtractUInt32Base(&valStr, iValue, base)) if (!ExtractUInt32Base(&valStr, iValue, base))
{ return false; } {
return false;
}
DEBUG_LOG(GetMangosString(LANG_SET_UINT), guid.GetString().c_str(), field, iValue); DEBUG_LOG(GetMangosString(LANG_SET_UINT), guid.GetString().c_str(), field, iValue);
target->SetUInt32Value(field , iValue); target->SetUInt32Value(field , iValue);
@ -773,7 +841,9 @@ bool ChatHandler::HandleSetValueHelper(Object* target, uint32 field, char* typeS
{ {
float fValue; float fValue;
if (!ExtractFloat(&valStr, fValue)) if (!ExtractFloat(&valStr, fValue))
{ return false; } {
return false;
}
DEBUG_LOG(GetMangosString(LANG_SET_FLOAT), guid.GetString().c_str(), field, fValue); DEBUG_LOG(GetMangosString(LANG_SET_FLOAT), guid.GetString().c_str(), field, fValue);
target->SetFloatValue(field , fValue); target->SetFloatValue(field , fValue);
@ -787,23 +857,33 @@ bool ChatHandler::HandleDebugSetItemValueCommand(char* args)
{ {
uint32 guid; uint32 guid;
if (!ExtractUInt32(&args, guid)) if (!ExtractUInt32(&args, guid))
{ return false; } {
return false;
}
uint32 field; uint32 field;
if (!ExtractUInt32(&args, field)) if (!ExtractUInt32(&args, field))
{ return false; } {
return false;
}
char* typeStr = ExtractOptNotLastArg(&args); char* typeStr = ExtractOptNotLastArg(&args);
if (!typeStr) if (!typeStr)
{ return false; } {
return false;
}
char* valStr = ExtractLiteralArg(&args); char* valStr = ExtractLiteralArg(&args);
if (!valStr) if (!valStr)
{ return false; } {
return false;
}
Item* item = m_session->GetPlayer()->GetItemByGuid(ObjectGuid(HIGHGUID_ITEM, guid)); Item* item = m_session->GetPlayer()->GetItemByGuid(ObjectGuid(HIGHGUID_ITEM, guid));
if (!item) if (!item)
{ return false; } {
return false;
}
return HandleSetValueHelper(item, field, typeStr, valStr); return HandleSetValueHelper(item, field, typeStr, valStr);
} }
@ -820,15 +900,21 @@ bool ChatHandler::HandleDebugSetValueCommand(char* args)
uint32 field; uint32 field;
if (!ExtractUInt32(&args, field)) if (!ExtractUInt32(&args, field))
{ return false; } {
return false;
}
char* typeStr = ExtractOptNotLastArg(&args); char* typeStr = ExtractOptNotLastArg(&args);
if (!typeStr) if (!typeStr)
{ return false; } {
return false;
}
char* valStr = ExtractLiteralArg(&args); char* valStr = ExtractLiteralArg(&args);
if (!valStr) if (!valStr)
{ return false; } {
return false;
}
return HandleSetValueHelper(target, field, typeStr, valStr); return HandleSetValueHelper(target, field, typeStr, valStr);
} }
@ -845,7 +931,9 @@ bool ChatHandler::HandleGetValueHelper(Object* target, uint32 field, char* typeS
uint32 base; // 0 -> float uint32 base; // 0 -> float
if (!typeStr) if (!typeStr)
{ base = 10; } {
base = 10;
}
else if (strncmp(typeStr, "int", strlen(typeStr)) == 0) else if (strncmp(typeStr, "int", strlen(typeStr)) == 0)
{ base = 10; } { base = 10; }
else if (strncmp(typeStr, "hex", strlen(typeStr)) == 0) else if (strncmp(typeStr, "hex", strlen(typeStr)) == 0)
@ -899,19 +987,27 @@ bool ChatHandler::HandleDebugGetItemValueCommand(char* args)
{ {
uint32 guid; uint32 guid;
if (!ExtractUInt32(&args, guid)) if (!ExtractUInt32(&args, guid))
{ return false; } {
return false;
}
uint32 field; uint32 field;
if (!ExtractUInt32(&args, field)) if (!ExtractUInt32(&args, field))
{ return false; } {
return false;
}
char* typeStr = ExtractLiteralArg(&args); char* typeStr = ExtractLiteralArg(&args);
if (!typeStr && *args) // optional arg but check format fail case if (!typeStr && *args) // optional arg but check format fail case
{ return false; } {
return false;
}
Item* item = m_session->GetPlayer()->GetItemByGuid(ObjectGuid(HIGHGUID_ITEM, guid)); Item* item = m_session->GetPlayer()->GetItemByGuid(ObjectGuid(HIGHGUID_ITEM, guid));
if (!item) if (!item)
{ return false; } {
return false;
}
return HandleGetValueHelper(item, field, typeStr); return HandleGetValueHelper(item, field, typeStr);
} }
@ -928,11 +1024,15 @@ bool ChatHandler::HandleDebugGetValueCommand(char* args)
uint32 field; uint32 field;
if (!ExtractUInt32(&args, field)) if (!ExtractUInt32(&args, field))
{ return false; } {
return false;
}
char* typeStr = ExtractLiteralArg(&args); char* typeStr = ExtractLiteralArg(&args);
if (!typeStr && *args) // optional arg but check format fail case if (!typeStr && *args) // optional arg but check format fail case
{ return false; } {
return false;
}
return HandleGetValueHelper(target, field, typeStr); return HandleGetValueHelper(target, field, typeStr);
} }
@ -950,7 +1050,9 @@ bool ChatHandler::HandlerDebugModValueHelper(Object* target, uint32 field, char*
uint32 type; // 0 -> float 1 -> int add 2-> bit or 3 -> bit and 4 -> bit and not uint32 type; // 0 -> float 1 -> int add 2-> bit or 3 -> bit and 4 -> bit and not
if (strncmp(typeStr, "int", strlen(typeStr)) == 0) if (strncmp(typeStr, "int", strlen(typeStr)) == 0)
{ type = 1; } {
type = 1;
}
else if (strncmp(typeStr, "float", strlen(typeStr)) == 0) else if (strncmp(typeStr, "float", strlen(typeStr)) == 0)
{ type = 0; } { type = 0; }
else if (strncmp(typeStr, "|=", strlen("|=") + 1) == 0) // exactly copy else if (strncmp(typeStr, "|=", strlen("|=") + 1) == 0) // exactly copy
@ -966,7 +1068,9 @@ bool ChatHandler::HandlerDebugModValueHelper(Object* target, uint32 field, char*
{ {
uint32 iValue; uint32 iValue;
if (!ExtractUInt32Base(&valStr, iValue, type == 1 ? 10 : 16)) if (!ExtractUInt32Base(&valStr, iValue, type == 1 ? 10 : 16))
{ return false; } {
return false;
}
uint32 value = target->GetUInt32Value(field); uint32 value = target->GetUInt32Value(field);
const char* guidString = guid.GetString().c_str(); const char* guidString = guid.GetString().c_str();
@ -1002,7 +1106,9 @@ bool ChatHandler::HandlerDebugModValueHelper(Object* target, uint32 field, char*
{ {
float fValue; float fValue;
if (!ExtractFloat(&valStr, fValue)) if (!ExtractFloat(&valStr, fValue))
{ return false; } {
return false;
}
float value = target->GetFloatValue(field); float value = target->GetFloatValue(field);
@ -1021,23 +1127,33 @@ bool ChatHandler::HandleDebugModItemValueCommand(char* args)
{ {
uint32 guid; uint32 guid;
if (!ExtractUInt32(&args, guid)) if (!ExtractUInt32(&args, guid))
{ return false; } {
return false;
}
uint32 field; uint32 field;
if (!ExtractUInt32(&args, field)) if (!ExtractUInt32(&args, field))
{ return false; } {
return false;
}
char* typeStr = ExtractLiteralArg(&args); char* typeStr = ExtractLiteralArg(&args);
if (!typeStr) if (!typeStr)
{ return false; } {
return false;
}
char* valStr = ExtractLiteralArg(&args); char* valStr = ExtractLiteralArg(&args);
if (!valStr) if (!valStr)
{ return false; } {
return false;
}
Item* item = m_session->GetPlayer()->GetItemByGuid(ObjectGuid(HIGHGUID_ITEM, guid)); Item* item = m_session->GetPlayer()->GetItemByGuid(ObjectGuid(HIGHGUID_ITEM, guid));
if (!item) if (!item)
{ return false; } {
return false;
}
return HandlerDebugModValueHelper(item, field, typeStr, valStr); return HandlerDebugModValueHelper(item, field, typeStr, valStr);
} }
@ -1054,15 +1170,21 @@ bool ChatHandler::HandleDebugModValueCommand(char* args)
uint32 field; uint32 field;
if (!ExtractUInt32(&args, field)) if (!ExtractUInt32(&args, field))
{ return false; } {
return false;
}
char* typeStr = ExtractLiteralArg(&args); char* typeStr = ExtractLiteralArg(&args);
if (!typeStr && *args) // optional arg but check format fail case if (!typeStr && *args) // optional arg but check format fail case
{ return false; } {
return false;
}
char* valStr = ExtractLiteralArg(&args); char* valStr = ExtractLiteralArg(&args);
if (!valStr) if (!valStr)
{ return false; } {
return false;
}
return HandlerDebugModValueHelper(target, field, typeStr, valStr); return HandlerDebugModValueHelper(target, field, typeStr, valStr);
} }
@ -1071,11 +1193,15 @@ bool ChatHandler::HandleDebugSpellCoefsCommand(char* args)
{ {
uint32 spellid = ExtractSpellIdFromLink(&args); uint32 spellid = ExtractSpellIdFromLink(&args);
if (!spellid) if (!spellid)
{ return false; } {
return false;
}
SpellEntry const* spellEntry = sSpellStore.LookupEntry(spellid); SpellEntry const* spellEntry = sSpellStore.LookupEntry(spellid);
if (!spellEntry) if (!spellEntry)
{ return false; } {
return false;
}
SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellid); SpellBonusEntry const* bonus = sSpellMgr.GetSpellBonusData(spellid);
@ -1128,11 +1254,15 @@ bool ChatHandler::HandleDebugSpellModsCommand(char* args)
{ {
char* typeStr = ExtractLiteralArg(&args); char* typeStr = ExtractLiteralArg(&args);
if (!typeStr) if (!typeStr)
{ return false; } {
return false;
}
Opcodes opcode; Opcodes opcode;
if (strncmp(typeStr, "flat", strlen(typeStr)) == 0) if (strncmp(typeStr, "flat", strlen(typeStr)) == 0)
{ opcode = SMSG_SET_FLAT_SPELL_MODIFIER; } {
opcode = SMSG_SET_FLAT_SPELL_MODIFIER;
}
else if (strncmp(typeStr, "pct", strlen(typeStr)) == 0) else if (strncmp(typeStr, "pct", strlen(typeStr)) == 0)
{ opcode = SMSG_SET_PCT_SPELL_MODIFIER; } { opcode = SMSG_SET_PCT_SPELL_MODIFIER; }
else else
@ -1140,15 +1270,21 @@ bool ChatHandler::HandleDebugSpellModsCommand(char* args)
uint32 effidx; uint32 effidx;
if (!ExtractUInt32(&args, effidx) || effidx >= 64 + 32) if (!ExtractUInt32(&args, effidx) || effidx >= 64 + 32)
{ return false; } {
return false;
}
uint32 spellmodop; uint32 spellmodop;
if (!ExtractUInt32(&args, spellmodop) || spellmodop >= MAX_SPELLMOD) if (!ExtractUInt32(&args, spellmodop) || spellmodop >= MAX_SPELLMOD)
{ return false; } {
return false;
}
int32 value; int32 value;
if (!ExtractInt32(&args, value)) if (!ExtractInt32(&args, value))
{ return false; } {
return false;
}
Player* chr = getSelectedPlayer(); Player* chr = getSelectedPlayer();
if (chr == NULL) if (chr == NULL)
@ -1160,7 +1296,9 @@ bool ChatHandler::HandleDebugSpellModsCommand(char* args)
// check online security // check online security
if (HasLowerSecurity(chr)) if (HasLowerSecurity(chr))
{ return false; } {
return false;
}
PSendSysMessage(LANG_YOU_CHANGE_SPELLMODS, opcode == SMSG_SET_FLAT_SPELL_MODIFIER ? "flat" : "pct", PSendSysMessage(LANG_YOU_CHANGE_SPELLMODS, opcode == SMSG_SET_FLAT_SPELL_MODIFIER ? "flat" : "pct",
spellmodop, value, effidx, GetNameLink(chr).c_str()); spellmodop, value, effidx, GetNameLink(chr).c_str());

View file

@ -37,7 +37,9 @@ void ConfusedMovementGenerator<T>::Initialize(T& unit)
unit.GetPosition(i_x, i_y, i_z); unit.GetPosition(i_x, i_y, i_z);
if (!unit.IsAlive() || unit.hasUnitState(UNIT_STAT_NOT_MOVE)) if (!unit.IsAlive() || unit.hasUnitState(UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
unit.StopMoving(); unit.StopMoving();
unit.addUnitState(UNIT_STAT_CONFUSED_MOVE); unit.addUnitState(UNIT_STAT_CONFUSED_MOVE);
@ -57,7 +59,9 @@ void ConfusedMovementGenerator<T>::Reset(T& unit)
i_nextMoveTime.Reset(0); i_nextMoveTime.Reset(0);
if (!unit.IsAlive() || unit.hasUnitState(UNIT_STAT_NOT_MOVE)) if (!unit.IsAlive() || unit.hasUnitState(UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
unit.StopMoving(); unit.StopMoving();
unit.addUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_CONFUSED_MOVE); unit.addUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_CONFUSED_MOVE);
@ -68,7 +72,9 @@ bool ConfusedMovementGenerator<T>::Update(T& unit, const uint32& diff)
{ {
// ignore in case other no reaction state // ignore in case other no reaction state
if (unit.hasUnitState(UNIT_STAT_CAN_NOT_REACT & ~UNIT_STAT_CONFUSED)) if (unit.hasUnitState(UNIT_STAT_CAN_NOT_REACT & ~UNIT_STAT_CONFUSED))
{ return true; } {
return true;
}
if (i_nextMoveTime.Passed()) if (i_nextMoveTime.Passed())
{ {
@ -76,7 +82,9 @@ bool ConfusedMovementGenerator<T>::Update(T& unit, const uint32& diff)
unit.addUnitState(UNIT_STAT_CONFUSED_MOVE); unit.addUnitState(UNIT_STAT_CONFUSED_MOVE);
if (unit.movespline->Finalized()) if (unit.movespline->Finalized())
{ i_nextMoveTime.Reset(urand(800, 1500)); } {
i_nextMoveTime.Reset(urand(800, 1500));
}
} }
else else
{ {

View file

@ -39,7 +39,9 @@ void FleeingMovementGenerator<T>::_setTargetLocation(T& owner)
{ {
// ignore in case other no reaction state // ignore in case other no reaction state
if (owner.hasUnitState((UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE) & ~UNIT_STAT_FLEEING)) if (owner.hasUnitState((UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE) & ~UNIT_STAT_FLEEING))
{ return; } {
return;
}
float x, y, z; float x, y, z;
if (!_getPoint(owner, x, y, z)) if (!_getPoint(owner, x, y, z))
@ -76,7 +78,9 @@ bool FleeingMovementGenerator<T>::_getPoint(T& owner, float& x, float& y, float&
{ {
dist_from_caster = fright->GetDistance(&owner); dist_from_caster = fright->GetDistance(&owner);
if (dist_from_caster > 0.2f) if (dist_from_caster > 0.2f)
{ angle_to_caster = fright->GetAngle(&owner); } {
angle_to_caster = fright->GetAngle(&owner);
}
else else
{ angle_to_caster = frand(0, 2 * M_PI_F); } { angle_to_caster = frand(0, 2 * M_PI_F); }
} }
@ -172,7 +176,9 @@ template<class T>
bool FleeingMovementGenerator<T>::Update(T& owner, const uint32& time_diff) bool FleeingMovementGenerator<T>::Update(T& owner, const uint32& time_diff)
{ {
if (!owner.IsAlive()) if (!owner.IsAlive())
{ return false; } {
return false;
}
// ignore in case other no reaction state // ignore in case other no reaction state
if (owner.hasUnitState((UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE) & ~UNIT_STAT_FLEEING)) if (owner.hasUnitState((UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE) & ~UNIT_STAT_FLEEING))
@ -183,7 +189,9 @@ bool FleeingMovementGenerator<T>::Update(T& owner, const uint32& time_diff)
i_nextCheckTime.Update(time_diff); i_nextCheckTime.Update(time_diff);
if (i_nextCheckTime.Passed() && owner.movespline->Finalized()) if (i_nextCheckTime.Passed() && owner.movespline->Finalized())
{ _setTargetLocation(owner); } {
_setTargetLocation(owner);
}
return true; return true;
} }
@ -217,7 +225,9 @@ void TimedFleeingMovementGenerator::Finalize(Unit& owner)
bool TimedFleeingMovementGenerator::Update(Unit& owner, const uint32& time_diff) bool TimedFleeingMovementGenerator::Update(Unit& owner, const uint32& time_diff)
{ {
if (!owner.IsAlive()) if (!owner.IsAlive())
{ return false; } {
return false;
}
// ignore in case other no reaction state // ignore in case other no reaction state
if (owner.hasUnitState((UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE) & ~UNIT_STAT_FLEEING)) if (owner.hasUnitState((UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE) & ~UNIT_STAT_FLEEING))
@ -228,7 +238,9 @@ bool TimedFleeingMovementGenerator::Update(Unit& owner, const uint32& time_diff)
i_totalFleeTime.Update(time_diff); i_totalFleeTime.Update(time_diff);
if (i_totalFleeTime.Passed()) if (i_totalFleeTime.Passed())
{ return false; } {
return false;
}
// This calls grant-parent Update method hiden by FleeingMovementGenerator::Update(Creature &, const uint32 &) version // This calls grant-parent Update method hiden by FleeingMovementGenerator::Update(Creature &, const uint32 &) version
// This is done instead of casting Unit& to Creature& and call parent method, then we can use Unit directly // This is done instead of casting Unit& to Creature& and call parent method, then we can use Unit directly

View file

@ -42,7 +42,9 @@ void HomeMovementGenerator<Creature>::Reset(Creature&)
void HomeMovementGenerator<Creature>::_setTargetLocation(Creature& owner) void HomeMovementGenerator<Creature>::_setTargetLocation(Creature& owner)
{ {
if (owner.hasUnitState(UNIT_STAT_NOT_MOVE)) if (owner.hasUnitState(UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
Movement::MoveSplineInit init(owner); Movement::MoveSplineInit init(owner);
float x, y, z, o; float x, y, z, o;
@ -71,7 +73,9 @@ void HomeMovementGenerator<Creature>::Finalize(Creature& owner)
if (arrived) if (arrived)
{ {
if (owner.GetTemporaryFactionFlags() & TEMPFACTION_RESTORE_REACH_HOME) if (owner.GetTemporaryFactionFlags() & TEMPFACTION_RESTORE_REACH_HOME)
{ owner.ClearTemporaryFaction(); } {
owner.ClearTemporaryFaction();
}
owner.SetWalk(!owner.hasUnitState(UNIT_STAT_RUNNING_STATE) && !owner.IsLevitating(), false); owner.SetWalk(!owner.hasUnitState(UNIT_STAT_RUNNING_STATE) && !owner.IsLevitating(), false);
owner.LoadCreatureAddon(true); owner.LoadCreatureAddon(true);

View file

@ -60,7 +60,9 @@ bool
DistractMovementGenerator::Update(Unit& /*owner*/, const uint32& time_diff) DistractMovementGenerator::Update(Unit& /*owner*/, const uint32& time_diff)
{ {
if (time_diff > m_timer) if (time_diff > m_timer)
{ return false; } {
return false;
}
m_timer -= time_diff; m_timer -= time_diff;
return true; return true;

View file

@ -76,14 +76,18 @@ MotionMaster::~MotionMaster()
MovementGenerator* m = top(); MovementGenerator* m = top();
pop(); pop();
if (!isStatic(m)) if (!isStatic(m))
{ delete m; } {
delete m;
}
} }
} }
void MotionMaster::UpdateMotion(uint32 diff) void MotionMaster::UpdateMotion(uint32 diff)
{ {
if (m_owner->hasUnitState(UNIT_STAT_CAN_NOT_MOVE)) if (m_owner->hasUnitState(UNIT_STAT_CAN_NOT_MOVE))
{ return; } {
return;
}
MANGOS_ASSERT(!empty()); MANGOS_ASSERT(!empty());
m_cleanFlag |= MMCF_UPDATE; m_cleanFlag |= MMCF_UPDATE;
@ -102,14 +106,18 @@ void MotionMaster::UpdateMotion(uint32 diff)
{ {
MovementGenerator* mg = (*m_expList)[i]; MovementGenerator* mg = (*m_expList)[i];
if (!isStatic(mg)) if (!isStatic(mg))
{ delete mg; } {
delete mg;
}
} }
delete m_expList; delete m_expList;
m_expList = NULL; m_expList = NULL;
if (empty()) if (empty())
{ Initialize(); } {
Initialize();
}
if (m_cleanFlag & MMCF_RESET) if (m_cleanFlag & MMCF_RESET)
{ {
@ -128,7 +136,9 @@ void MotionMaster::DirectClean(bool reset, bool all)
curr->Finalize(*m_owner); curr->Finalize(*m_owner);
if (!isStatic(curr)) if (!isStatic(curr))
{ delete curr; } {
delete curr;
}
} }
if (!all && reset) if (!all && reset)
@ -141,15 +151,21 @@ void MotionMaster::DirectClean(bool reset, bool all)
void MotionMaster::DelayedClean(bool reset, bool all) void MotionMaster::DelayedClean(bool reset, bool all)
{ {
if (reset) if (reset)
{ m_cleanFlag |= MMCF_RESET; } {
m_cleanFlag |= MMCF_RESET;
}
else else
{ m_cleanFlag &= ~MMCF_RESET; } { m_cleanFlag &= ~MMCF_RESET; }
if (empty() || (!all && size() == 1)) if (empty() || (!all && size() == 1))
{ return; } {
return;
}
if (!m_expList) if (!m_expList)
{ m_expList = new ExpireList(); } {
m_expList = new ExpireList();
}
while (all ? !empty() : size() > 1) while (all ? !empty() : size() > 1)
{ {
@ -158,14 +174,18 @@ void MotionMaster::DelayedClean(bool reset, bool all)
curr->Finalize(*m_owner); curr->Finalize(*m_owner);
if (!isStatic(curr)) if (!isStatic(curr))
{ m_expList->push_back(curr); } {
m_expList->push_back(curr);
}
} }
} }
void MotionMaster::DirectExpire(bool reset) void MotionMaster::DirectExpire(bool reset)
{ {
if (empty() || size() == 1) if (empty() || size() == 1)
{ return; } {
return;
}
MovementGenerator* curr = top(); MovementGenerator* curr = top();
pop(); pop();
@ -185,31 +205,43 @@ void MotionMaster::DirectExpire(bool reset)
curr->Finalize(*m_owner); curr->Finalize(*m_owner);
if (!isStatic(curr)) if (!isStatic(curr))
{ delete curr; } {
delete curr;
}
if (empty()) if (empty())
{ Initialize(); } {
Initialize();
}
// Prevent reseting possible new pushed MMGen // Prevent reseting possible new pushed MMGen
if (reset && top() == nowTop) if (reset && top() == nowTop)
{ top()->Reset(*m_owner); } {
top()->Reset(*m_owner);
}
} }
void MotionMaster::DelayedExpire(bool reset) void MotionMaster::DelayedExpire(bool reset)
{ {
if (reset) if (reset)
{ m_cleanFlag |= MMCF_RESET; } {
m_cleanFlag |= MMCF_RESET;
}
else else
{ m_cleanFlag &= ~MMCF_RESET; } { m_cleanFlag &= ~MMCF_RESET; }
if (empty() || size() == 1) if (empty() || size() == 1)
{ return; } {
return;
}
MovementGenerator* curr = top(); MovementGenerator* curr = top();
pop(); pop();
if (!m_expList) if (!m_expList)
{ m_expList = new ExpireList(); } {
m_expList = new ExpireList();
}
// also drop stored under top() targeted motions // also drop stored under top() targeted motions
while (!empty() && (top()->GetMovementGeneratorType() == CHASE_MOTION_TYPE || top()->GetMovementGeneratorType() == FOLLOW_MOTION_TYPE)) while (!empty() && (top()->GetMovementGeneratorType() == CHASE_MOTION_TYPE || top()->GetMovementGeneratorType() == FOLLOW_MOTION_TYPE))
@ -223,13 +255,17 @@ void MotionMaster::DelayedExpire(bool reset)
curr->Finalize(*m_owner); curr->Finalize(*m_owner);
if (!isStatic(curr)) if (!isStatic(curr))
{ m_expList->push_back(curr); } {
m_expList->push_back(curr);
}
} }
void MotionMaster::MoveIdle() void MotionMaster::MoveIdle()
{ {
if (empty() || !isStatic(top())) if (empty() || !isStatic(top()))
{ push(&si_idleMovement); } {
push(&si_idleMovement);
}
} }
void MotionMaster::MoveRandomAroundPoint(float x, float y, float z, float radius, float verticalZ) void MotionMaster::MoveRandomAroundPoint(float x, float y, float z, float radius, float verticalZ)
@ -248,7 +284,9 @@ void MotionMaster::MoveRandomAroundPoint(float x, float y, float z, float radius
void MotionMaster::MoveTargetedHome() void MotionMaster::MoveTargetedHome()
{ {
if (m_owner->hasUnitState(UNIT_STAT_LOST_CONTROL)) if (m_owner->hasUnitState(UNIT_STAT_LOST_CONTROL))
{ return; } {
return;
}
Clear(false); Clear(false);
@ -256,7 +294,9 @@ void MotionMaster::MoveTargetedHome()
{ {
// Manual exception for linked mobs // Manual exception for linked mobs
if (m_owner->IsLinkingEventTrigger() && m_owner->GetMap()->GetCreatureLinkingHolder()->TryFollowMaster((Creature*)m_owner)) if (m_owner->IsLinkingEventTrigger() && m_owner->GetMap()->GetCreatureLinkingHolder()->TryFollowMaster((Creature*)m_owner))
{ DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s refollowed linked master", m_owner->GetGuidStr().c_str()); } {
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s refollowed linked master", m_owner->GetGuidStr().c_str());
}
else else
{ {
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s targeted home", m_owner->GetGuidStr().c_str()); DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s targeted home", m_owner->GetGuidStr().c_str());
@ -284,7 +324,9 @@ void MotionMaster::MoveConfused()
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s move confused", m_owner->GetGuidStr().c_str()); DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s move confused", m_owner->GetGuidStr().c_str());
if (m_owner->GetTypeId() == TYPEID_PLAYER) if (m_owner->GetTypeId() == TYPEID_PLAYER)
{ Mutate(new ConfusedMovementGenerator<Player>()); } {
Mutate(new ConfusedMovementGenerator<Player>());
}
else else
{ Mutate(new ConfusedMovementGenerator<Creature>()); } { Mutate(new ConfusedMovementGenerator<Creature>()); }
} }
@ -293,12 +335,16 @@ void MotionMaster::MoveChase(Unit* target, float dist, float angle)
{ {
// ignore movement request if target not exist // ignore movement request if target not exist
if (!target) if (!target)
{ return; } {
return;
}
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s chase to %s", m_owner->GetGuidStr().c_str(), target->GetGuidStr().c_str()); DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s chase to %s", m_owner->GetGuidStr().c_str(), target->GetGuidStr().c_str());
if (m_owner->GetTypeId() == TYPEID_PLAYER) if (m_owner->GetTypeId() == TYPEID_PLAYER)
{ Mutate(new ChaseMovementGenerator<Player>(*target, dist, angle)); } {
Mutate(new ChaseMovementGenerator<Player>(*target, dist, angle));
}
else else
{ Mutate(new ChaseMovementGenerator<Creature>(*target, dist, angle)); } { Mutate(new ChaseMovementGenerator<Creature>(*target, dist, angle)); }
} }
@ -306,18 +352,24 @@ void MotionMaster::MoveChase(Unit* target, float dist, float angle)
void MotionMaster::MoveFollow(Unit* target, float dist, float angle) void MotionMaster::MoveFollow(Unit* target, float dist, float angle)
{ {
if (m_owner->hasUnitState(UNIT_STAT_LOST_CONTROL)) if (m_owner->hasUnitState(UNIT_STAT_LOST_CONTROL))
{ return; } {
return;
}
Clear(); Clear();
// ignore movement request if target not exist // ignore movement request if target not exist
if (!target) if (!target)
{ return; } {
return;
}
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s follow to %s", m_owner->GetGuidStr().c_str(), target->GetGuidStr().c_str()); DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s follow to %s", m_owner->GetGuidStr().c_str(), target->GetGuidStr().c_str());
if (m_owner->GetTypeId() == TYPEID_PLAYER) if (m_owner->GetTypeId() == TYPEID_PLAYER)
{ Mutate(new FollowMovementGenerator<Player>(*target, dist, angle)); } {
Mutate(new FollowMovementGenerator<Player>(*target, dist, angle));
}
else else
{ Mutate(new FollowMovementGenerator<Creature>(*target, dist, angle)); } { Mutate(new FollowMovementGenerator<Creature>(*target, dist, angle)); }
} }
@ -327,7 +379,9 @@ void MotionMaster::MovePoint(uint32 id, float x, float y, float z, bool generate
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s targeted point (Id: %u X: %f Y: %f Z: %f)", m_owner->GetGuidStr().c_str(), id, x, y, z); DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s targeted point (Id: %u X: %f Y: %f Z: %f)", m_owner->GetGuidStr().c_str(), id, x, y, z);
if (m_owner->GetTypeId() == TYPEID_PLAYER) if (m_owner->GetTypeId() == TYPEID_PLAYER)
{ Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath)); } {
Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath));
}
else else
{ Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath)); } { Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath)); }
} }
@ -363,16 +417,22 @@ void MotionMaster::MoveSeekAssistanceDistract(uint32 time)
void MotionMaster::MoveFleeing(Unit* enemy, uint32 time) void MotionMaster::MoveFleeing(Unit* enemy, uint32 time)
{ {
if (!enemy) if (!enemy)
{ return; } {
return;
}
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s flee from %s", m_owner->GetGuidStr().c_str(), enemy->GetGuidStr().c_str()); DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s flee from %s", m_owner->GetGuidStr().c_str(), enemy->GetGuidStr().c_str());
if (m_owner->GetTypeId() == TYPEID_PLAYER) if (m_owner->GetTypeId() == TYPEID_PLAYER)
{ Mutate(new FleeingMovementGenerator<Player>(enemy->GetObjectGuid())); } {
Mutate(new FleeingMovementGenerator<Player>(enemy->GetObjectGuid()));
}
else else
{ {
if (time) if (time)
{ Mutate(new TimedFleeingMovementGenerator(enemy->GetObjectGuid(), time)); } {
Mutate(new TimedFleeingMovementGenerator(enemy->GetObjectGuid(), time));
}
else else
{ Mutate(new FleeingMovementGenerator<Creature>(enemy->GetObjectGuid())); } { Mutate(new FleeingMovementGenerator<Creature>(enemy->GetObjectGuid())); }
} }
@ -434,7 +494,9 @@ void MotionMaster::MoveDistract(uint32 timer)
void MotionMaster::MoveFlyOrLand(uint32 id, float x, float y, float z, bool liftOff) void MotionMaster::MoveFlyOrLand(uint32 id, float x, float y, float z, bool liftOff)
{ {
if (m_owner->GetTypeId() != TYPEID_UNIT) if (m_owner->GetTypeId() != TYPEID_UNIT)
{ return; } {
return;
}
DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s targeted point for %s (Id: %u X: %f Y: %f Z: %f)", m_owner->GetGuidStr().c_str(), liftOff ? "liftoff" : "landing", id, x, y, z); DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s targeted point for %s (Id: %u X: %f Y: %f Z: %f)", m_owner->GetGuidStr().c_str(), liftOff ? "liftoff" : "landing", id, x, y, z);
Mutate(new FlyOrLandMovementGenerator(id, x, y, z, liftOff)); Mutate(new FlyOrLandMovementGenerator(id, x, y, z, liftOff));
@ -457,7 +519,9 @@ void MotionMaster::Mutate(MovementGenerator* m)
} }
if (!empty()) if (!empty())
{ top()->Interrupt(*m_owner); } {
top()->Interrupt(*m_owner);
}
} }
m->Initialize(*m_owner); m->Initialize(*m_owner);
@ -488,7 +552,9 @@ uint32 MotionMaster::getLastReachedWaypoint() const
for (Impl::container_type::const_reverse_iterator rItr = Impl::c.rbegin(); rItr != Impl::c.rend(); ++rItr) for (Impl::container_type::const_reverse_iterator rItr = Impl::c.rbegin(); rItr != Impl::c.rend(); ++rItr)
{ {
if ((*rItr)->GetMovementGeneratorType() == WAYPOINT_MOTION_TYPE) if ((*rItr)->GetMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
{ return (static_cast<WaypointMovementGenerator<Creature>*>(*rItr))->getLastReachedWaypoint(); } {
return (static_cast<WaypointMovementGenerator<Creature>*>(*rItr))->getLastReachedWaypoint();
}
} }
return 0; return 0;
} }
@ -496,7 +562,9 @@ uint32 MotionMaster::getLastReachedWaypoint() const
MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType() const MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType() const
{ {
if (empty()) if (empty())
{ return IDLE_MOTION_TYPE; } {
return IDLE_MOTION_TYPE;
}
return top()->GetMovementGeneratorType(); return top()->GetMovementGeneratorType();
} }
@ -516,7 +584,9 @@ void MotionMaster::GetWaypointPathInformation(std::ostringstream& oss) const
bool MotionMaster::GetDestination(float& x, float& y, float& z) bool MotionMaster::GetDestination(float& x, float& y, float& z)
{ {
if (m_owner->movespline->Finalized()) if (m_owner->movespline->Finalized())
{ return false; } {
return false;
}
const G3D::Vector3& dest = m_owner->movespline->FinalDestination(); const G3D::Vector3& dest = m_owner->movespline->FinalDestination();
x = dest.x; x = dest.x;
@ -558,7 +628,9 @@ void MotionMaster::MoveFall()
// Abort too if the ground is very near // Abort too if the ground is very near
if (fabs(m_owner->GetPositionZ() - tz) < 0.1f) if (fabs(m_owner->GetPositionZ() - tz) < 0.1f)
{ return; } {
return;
}
Movement::MoveSplineInit init(*m_owner); Movement::MoveSplineInit init(*m_owner);
init.MoveTo(m_owner->GetPositionX(), m_owner->GetPositionY(), tz); init.MoveTo(m_owner->GetPositionX(), m_owner->GetPositionY(), tz);

View file

@ -95,14 +95,18 @@ class MotionMaster : private std::stack<MovementGenerator*>
void Clear(bool reset = true, bool all = false) void Clear(bool reset = true, bool all = false)
{ {
if (m_cleanFlag & MMCF_UPDATE) if (m_cleanFlag & MMCF_UPDATE)
{ DelayedClean(reset, all); } {
DelayedClean(reset, all);
}
else else
{ DirectClean(reset, all); } { DirectClean(reset, all); }
} }
void MovementExpired(bool reset = true) void MovementExpired(bool reset = true)
{ {
if (m_cleanFlag & MMCF_UPDATE) if (m_cleanFlag & MMCF_UPDATE)
{ DelayedExpire(reset); } {
DelayedExpire(reset);
}
else else
{ DirectExpire(reset); } { DirectExpire(reset); }
} }

View file

@ -88,7 +88,9 @@ bool PathFinder::calculate(float destX, float destY, float destZ, bool forceDest
dtPolyRef PathFinder::getPathPolyByPosition(const dtPolyRef* polyPath, uint32 polyPathSize, const float* point, float* distance) const dtPolyRef PathFinder::getPathPolyByPosition(const dtPolyRef* polyPath, uint32 polyPathSize, const float* point, float* distance) const
{ {
if (!polyPath || !polyPathSize) if (!polyPath || !polyPathSize)
{ return INVALID_POLYREF; } {
return INVALID_POLYREF;
}
dtPolyRef nearestPoly = INVALID_POLYREF; dtPolyRef nearestPoly = INVALID_POLYREF;
float minDist2d = FLT_MAX; float minDist2d = FLT_MAX;
@ -110,11 +112,15 @@ dtPolyRef PathFinder::getPathPolyByPosition(const dtPolyRef* polyPath, uint32 po
} }
if (minDist2d < 1.0f) // shortcut out - close enough for us if (minDist2d < 1.0f) // shortcut out - close enough for us
{ break; } {
break;
}
} }
if (distance) if (distance)
{ *distance = dtSqrt(minDist3d); } {
*distance = dtSqrt(minDist3d);
}
return (minDist2d < 3.0f) ? nearestPoly : INVALID_POLYREF; return (minDist2d < 3.0f) ? nearestPoly : INVALID_POLYREF;
} }
@ -126,7 +132,9 @@ dtPolyRef PathFinder::getPolyByLocation(const float* point, float* distance) con
// we need to use the expensive navMesh.findNearestPoly // we need to use the expensive navMesh.findNearestPoly
dtPolyRef polyRef = getPathPolyByPosition(m_pathPolyRefs, m_polyLength, point, distance); dtPolyRef polyRef = getPathPolyByPosition(m_pathPolyRefs, m_polyLength, point, distance);
if (polyRef != INVALID_POLYREF) if (polyRef != INVALID_POLYREF)
{ return polyRef; } {
return polyRef;
}
// we don't have it in our old path // we don't have it in our old path
// try to get it by findNearestPoly() // try to get it by findNearestPoly()
@ -205,13 +213,17 @@ void PathFinder::BuildPolyPath(const Vector3& startPos, const Vector3& endPos)
{ {
DEBUG_FILTER_LOG(LOG_FILTER_PATHFINDING, "++ BuildPolyPath :: underWater case\n"); DEBUG_FILTER_LOG(LOG_FILTER_PATHFINDING, "++ BuildPolyPath :: underWater case\n");
if (owner->CanSwim()) if (owner->CanSwim())
{ buildShotrcut = true; } {
buildShotrcut = true;
}
} }
else else
{ {
DEBUG_FILTER_LOG(LOG_FILTER_PATHFINDING, "++ BuildPolyPath :: flying case\n"); DEBUG_FILTER_LOG(LOG_FILTER_PATHFINDING, "++ BuildPolyPath :: flying case\n");
if (owner->CanFly()) if (owner->CanFly())
{ buildShotrcut = true; } {
buildShotrcut = true;
}
} }
} }
@ -391,7 +403,9 @@ void PathFinder::BuildPolyPath(const Vector3& startPos, const Vector3& endPos)
// by now we know what type of path we can get // by now we know what type of path we can get
if (m_pathPolyRefs[m_polyLength - 1] == endPoly && !(m_type & PATHFIND_INCOMPLETE)) if (m_pathPolyRefs[m_polyLength - 1] == endPoly && !(m_type & PATHFIND_INCOMPLETE))
{ m_type = PATHFIND_NORMAL; } {
m_type = PATHFIND_NORMAL;
}
else else
{ m_type = PATHFIND_INCOMPLETE; } { m_type = PATHFIND_INCOMPLETE; }
@ -576,12 +590,16 @@ uint32 PathFinder::fixupCorridor(dtPolyRef* path, uint32 npath, uint32 maxPath,
} }
} }
if (found) if (found)
{ break; } {
break;
}
} }
// If no intersection found just return current path. // If no intersection found just return current path.
if (furthestPath == -1 || furthestVisited == -1) if (furthestPath == -1 || furthestVisited == -1)
{ return npath; } {
return npath;
}
// Concatenate paths. // Concatenate paths.
@ -590,10 +608,14 @@ uint32 PathFinder::fixupCorridor(dtPolyRef* path, uint32 npath, uint32 maxPath,
uint32 orig = uint32(furthestPath + 1) < npath ? furthestPath + 1 : npath; uint32 orig = uint32(furthestPath + 1) < npath ? furthestPath + 1 : npath;
uint32 size = npath > orig ? npath - orig : 0; uint32 size = npath > orig ? npath - orig : 0;
if (req + size > maxPath) if (req + size > maxPath)
{ size = maxPath - req; } {
size = maxPath - req;
}
if (size) if (size)
{ memmove(path + req, path + orig, size * sizeof(dtPolyRef)); } {
memmove(path + req, path + orig, size * sizeof(dtPolyRef));
}
// Store visited // Store visited
for (uint32 i = 0; i < req; ++i) for (uint32 i = 0; i < req; ++i)
@ -615,7 +637,9 @@ bool PathFinder::getSteerTarget(const float* startPos, const float* endPos,
dtStatus dtResult = m_navMeshQuery->findStraightPath(startPos, endPos, path, pathSize, dtStatus dtResult = m_navMeshQuery->findStraightPath(startPos, endPos, path, pathSize,
steerPath, steerPathFlags, steerPathPolys, (int*)&nsteerPath, MAX_STEER_POINTS); steerPath, steerPathFlags, steerPathPolys, (int*)&nsteerPath, MAX_STEER_POINTS);
if (!nsteerPath || dtStatusFailed(dtResult)) if (!nsteerPath || dtStatusFailed(dtResult))
{ return false; } {
return false;
}
// Find vertex far enough to steer to. // Find vertex far enough to steer to.
uint32 ns = 0; uint32 ns = 0;
@ -629,7 +653,9 @@ bool PathFinder::getSteerTarget(const float* startPos, const float* endPos,
} }
// Failed to find good point to steer to. // Failed to find good point to steer to.
if (ns >= nsteerPath) if (ns >= nsteerPath)
{ return false; } {
return false;
}
dtVcopy(steerPos, &steerPath[ns * VERTEX_SIZE]); dtVcopy(steerPos, &steerPath[ns * VERTEX_SIZE]);
steerPos[1] = startPos[1]; // keep Z value steerPos[1] = startPos[1]; // keep Z value
@ -653,11 +679,15 @@ dtStatus PathFinder::findSmoothPath(const float* startPos, const float* endPos,
float iterPos[VERTEX_SIZE], targetPos[VERTEX_SIZE]; float iterPos[VERTEX_SIZE], targetPos[VERTEX_SIZE];
dtStatus dtResult = m_navMeshQuery->closestPointOnPolyBoundary(polys[0], startPos, iterPos); dtStatus dtResult = m_navMeshQuery->closestPointOnPolyBoundary(polys[0], startPos, iterPos);
if (dtStatusFailed(dtResult)) if (dtStatusFailed(dtResult))
{ return DT_FAILURE; } {
return DT_FAILURE;
}
dtResult = m_navMeshQuery->closestPointOnPolyBoundary(polys[npolys - 1], endPos, targetPos); dtResult = m_navMeshQuery->closestPointOnPolyBoundary(polys[npolys - 1], endPos, targetPos);
if (dtStatusFailed(dtResult)) if (dtStatusFailed(dtResult))
{ return DT_FAILURE; } {
return DT_FAILURE;
}
dtVcopy(&smoothPath[nsmoothPath * VERTEX_SIZE], iterPos); dtVcopy(&smoothPath[nsmoothPath * VERTEX_SIZE], iterPos);
++nsmoothPath; ++nsmoothPath;
@ -672,7 +702,9 @@ dtStatus PathFinder::findSmoothPath(const float* startPos, const float* endPos,
dtPolyRef steerPosRef = INVALID_POLYREF; dtPolyRef steerPosRef = INVALID_POLYREF;
if (!getSteerTarget(iterPos, targetPos, SMOOTH_PATH_SLOP, polys, npolys, steerPos, steerPosFlag, steerPosRef)) if (!getSteerTarget(iterPos, targetPos, SMOOTH_PATH_SLOP, polys, npolys, steerPos, steerPosFlag, steerPosRef))
{ break; } {
break;
}
bool endOfPath = (steerPosFlag & DT_STRAIGHTPATH_END); bool endOfPath = (steerPosFlag & DT_STRAIGHTPATH_END);
bool offMeshConnection = (steerPosFlag & DT_STRAIGHTPATH_OFFMESH_CONNECTION); bool offMeshConnection = (steerPosFlag & DT_STRAIGHTPATH_OFFMESH_CONNECTION);
@ -683,7 +715,9 @@ dtStatus PathFinder::findSmoothPath(const float* startPos, const float* endPos,
float len = dtSqrt(dtVdot(delta, delta)); float len = dtSqrt(dtVdot(delta, delta));
// If the steer target is end of path or off-mesh link, do not move past the location. // If the steer target is end of path or off-mesh link, do not move past the location.
if ((endOfPath || offMeshConnection) && len < SMOOTH_PATH_STEP_SIZE) if ((endOfPath || offMeshConnection) && len < SMOOTH_PATH_STEP_SIZE)
{ len = 1.0f; } {
len = 1.0f;
}
else else
{ len = SMOOTH_PATH_STEP_SIZE / len; } { len = SMOOTH_PATH_STEP_SIZE / len; }

View file

@ -36,7 +36,9 @@ template<class T>
void PointMovementGenerator<T>::Initialize(T& unit) void PointMovementGenerator<T>::Initialize(T& unit)
{ {
if (unit.hasUnitState(UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE)) if (unit.hasUnitState(UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
unit.StopMoving(); unit.StopMoving();
@ -52,7 +54,9 @@ void PointMovementGenerator<T>::Finalize(T& unit)
unit.clearUnitState(UNIT_STAT_ROAMING | UNIT_STAT_ROAMING_MOVE); unit.clearUnitState(UNIT_STAT_ROAMING | UNIT_STAT_ROAMING_MOVE);
if (unit.movespline->Finalized()) if (unit.movespline->Finalized())
{ MovementInform(unit); } {
MovementInform(unit);
}
} }
template<class T> template<class T>
@ -79,7 +83,9 @@ bool PointMovementGenerator<T>::Update(T& unit, const uint32& diff)
} }
if (!unit.hasUnitState(UNIT_STAT_ROAMING_MOVE) && unit.movespline->Finalized()) if (!unit.hasUnitState(UNIT_STAT_ROAMING_MOVE) && unit.movespline->Finalized())
{ Initialize(unit); } {
Initialize(unit);
}
return !unit.movespline->Finalized(); return !unit.movespline->Finalized();
} }
@ -93,7 +99,9 @@ template <>
void PointMovementGenerator<Creature>::MovementInform(Creature& unit) void PointMovementGenerator<Creature>::MovementInform(Creature& unit)
{ {
if (unit.AI()) if (unit.AI())
{ unit.AI()->MovementInform(POINT_MOTION_TYPE, id); } {
unit.AI()->MovementInform(POINT_MOTION_TYPE, id);
}
if (unit.IsTemporarySummon()) if (unit.IsTemporarySummon())
{ {
@ -101,7 +109,9 @@ void PointMovementGenerator<Creature>::MovementInform(Creature& unit)
if (pSummon->GetSummonerGuid().IsCreatureOrVehicle()) if (pSummon->GetSummonerGuid().IsCreatureOrVehicle())
if (Creature* pSummoner = unit.GetMap()->GetCreature(pSummon->GetSummonerGuid())) if (Creature* pSummoner = unit.GetMap()->GetCreature(pSummon->GetSummonerGuid()))
if (pSummoner->AI()) if (pSummoner->AI())
{ pSummoner->AI()->SummonedMovementInform(&unit, POINT_MOTION_TYPE, id); } {
pSummoner->AI()->SummonedMovementInform(&unit, POINT_MOTION_TYPE, id);
}
} }
} }
@ -123,7 +133,9 @@ void AssistanceMovementGenerator::Finalize(Unit& unit)
((Creature*)&unit)->SetNoCallAssistance(false); ((Creature*)&unit)->SetNoCallAssistance(false);
((Creature*)&unit)->CallAssistance(); ((Creature*)&unit)->CallAssistance();
if (unit.IsAlive()) if (unit.IsAlive())
{ unit.GetMotionMaster()->MoveSeekAssistanceDistract(sWorld.getConfig(CONFIG_UINT32_CREATURE_FAMILY_ASSISTANCE_DELAY)); } {
unit.GetMotionMaster()->MoveSeekAssistanceDistract(sWorld.getConfig(CONFIG_UINT32_CREATURE_FAMILY_ASSISTANCE_DELAY));
}
} }
bool EffectMovementGenerator::Update(Unit& unit, const uint32&) bool EffectMovementGenerator::Update(Unit& unit, const uint32&)
@ -134,15 +146,21 @@ bool EffectMovementGenerator::Update(Unit& unit, const uint32&)
void EffectMovementGenerator::Finalize(Unit& unit) void EffectMovementGenerator::Finalize(Unit& unit)
{ {
if (unit.GetTypeId() != TYPEID_UNIT) if (unit.GetTypeId() != TYPEID_UNIT)
{ return; } {
return;
}
if (((Creature&)unit).AI() && unit.movespline->Finalized()) if (((Creature&)unit).AI() && unit.movespline->Finalized())
{ ((Creature&)unit).AI()->MovementInform(EFFECT_MOTION_TYPE, m_Id); } {
((Creature&)unit).AI()->MovementInform(EFFECT_MOTION_TYPE, m_Id);
}
// Need restore previous movement since we have no proper states system // Need restore previous movement since we have no proper states system
if (unit.IsAlive() && !unit.hasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_FLEEING | UNIT_STAT_NO_COMBAT_MOVEMENT)) if (unit.IsAlive() && !unit.hasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_FLEEING | UNIT_STAT_NO_COMBAT_MOVEMENT))
{ {
if (Unit* victim = unit.getVictim()) if (Unit* victim = unit.getVictim())
{ unit.GetMotionMaster()->MoveChase(victim); } {
unit.GetMotionMaster()->MoveChase(victim);
}
else else
{ unit.GetMotionMaster()->Initialize(); } { unit.GetMotionMaster()->Initialize(); }
} }
@ -151,7 +169,9 @@ void EffectMovementGenerator::Finalize(Unit& unit)
void FlyOrLandMovementGenerator::Initialize(Unit& unit) void FlyOrLandMovementGenerator::Initialize(Unit& unit)
{ {
if (unit.hasUnitState(UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE)) if (unit.hasUnitState(UNIT_STAT_CAN_NOT_REACT | UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
unit.StopMoving(); unit.StopMoving();

View file

@ -76,7 +76,9 @@ void RandomMovementGenerator<Creature>::Initialize(Creature& creature)
creature.addUnitState(UNIT_STAT_ROAMING); // _MOVE set in _setRandomLocation creature.addUnitState(UNIT_STAT_ROAMING); // _MOVE set in _setRandomLocation
if (!creature.IsAlive() || creature.hasUnitState(UNIT_STAT_NOT_MOVE)) if (!creature.IsAlive() || creature.hasUnitState(UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
_setRandomLocation(creature); _setRandomLocation(creature);
} }
@ -116,7 +118,9 @@ bool RandomMovementGenerator<Creature>::Update(Creature& creature, const uint32&
{ {
i_nextMoveTime.Update(diff); i_nextMoveTime.Update(diff);
if (i_nextMoveTime.Passed()) if (i_nextMoveTime.Passed())
{ _setRandomLocation(creature); } {
_setRandomLocation(creature);
}
} }
return true; return true;
} }

View file

@ -38,10 +38,14 @@ template<class T, typename D>
void TargetedMovementGeneratorMedium<T, D>::_setTargetLocation(T& owner, bool updateDestination) void TargetedMovementGeneratorMedium<T, D>::_setTargetLocation(T& owner, bool updateDestination)
{ {
if (!i_target.isValid() || !i_target->IsInWorld()) if (!i_target.isValid() || !i_target->IsInWorld())
{ return; } {
return;
}
if (owner.hasUnitState(UNIT_STAT_NOT_MOVE)) if (owner.hasUnitState(UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
float x, y, z; float x, y, z;
@ -55,7 +59,9 @@ void TargetedMovementGeneratorMedium<T, D>::_setTargetLocation(T& owner, bool up
if (!RequiresNewPosition(owner, x, y, z)) if (!RequiresNewPosition(owner, x, y, z))
{ {
if (!owner.movespline->Finalized()) if (!owner.movespline->Finalized())
{ return; } {
return;
}
} }
// Chase Movement and angle == 0 case: Chase to current angle // Chase Movement and angle == 0 case: Chase to current angle
else if (this->GetMovementGeneratorType() == CHASE_MOTION_TYPE && i_angle == 0.0f) else if (this->GetMovementGeneratorType() == CHASE_MOTION_TYPE && i_angle == 0.0f)
@ -78,14 +84,18 @@ void TargetedMovementGeneratorMedium<T, D>::_setTargetLocation(T& owner, bool up
} }
if (!i_path) if (!i_path)
{ i_path = new PathFinder(&owner); } {
i_path = new PathFinder(&owner);
}
// allow pets following their master to cheat while generating paths // allow pets following their master to cheat while generating paths
bool forceDest = (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->IsPet() bool forceDest = (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->IsPet()
&& owner.hasUnitState(UNIT_STAT_FOLLOW)); && owner.hasUnitState(UNIT_STAT_FOLLOW));
i_path->calculate(x, y, z, forceDest); i_path->calculate(x, y, z, forceDest);
if (i_path->getPathType() & PATHFIND_NOPATH) if (i_path->getPathType() & PATHFIND_NOPATH)
{ return; } {
return;
}
D::_addUnitStateMove(owner); D::_addUnitStateMove(owner);
i_targetReached = false; i_targetReached = false;
@ -101,10 +111,14 @@ template<class T, typename D>
bool TargetedMovementGeneratorMedium<T, D>::Update(T& owner, const uint32& time_diff) bool TargetedMovementGeneratorMedium<T, D>::Update(T& owner, const uint32& time_diff)
{ {
if (!i_target.isValid() || !i_target->IsInWorld()) if (!i_target.isValid() || !i_target->IsInWorld())
{ return false; } {
return false;
}
if (!owner.IsAlive()) if (!owner.IsAlive())
{ return true; } {
return true;
}
if (owner.hasUnitState(UNIT_STAT_NOT_MOVE)) if (owner.hasUnitState(UNIT_STAT_NOT_MOVE))
{ {
@ -122,7 +136,9 @@ bool TargetedMovementGeneratorMedium<T, D>::Update(T& owner, const uint32& time_
if (owner.IsNonMeleeSpellCasted(false, false, true)) if (owner.IsNonMeleeSpellCasted(false, false, true))
{ {
if (!owner.IsStopped()) if (!owner.IsStopped())
{ owner.StopMoving(); } {
owner.StopMoving();
}
return true; return true;
} }
@ -143,12 +159,16 @@ bool TargetedMovementGeneratorMedium<T, D>::Update(T& owner, const uint32& time_
} }
if (m_speedChanged || targetMoved) if (m_speedChanged || targetMoved)
{ _setTargetLocation(owner, targetMoved); } {
_setTargetLocation(owner, targetMoved);
}
if (owner.movespline->Finalized()) if (owner.movespline->Finalized())
{ {
if (i_angle == 0.f && !owner.HasInArc(0.01f, i_target.getTarget())) if (i_angle == 0.f && !owner.HasInArc(0.01f, i_target.getTarget()))
{ owner.SetInFront(i_target.getTarget()); } {
owner.SetInFront(i_target.getTarget());
}
if (!i_targetReached) if (!i_targetReached)
{ {
@ -170,7 +190,9 @@ bool TargetedMovementGeneratorMedium<T, D>::RequiresNewPosition(T& owner, float
{ {
// More distance let have better performance, less distance let have more sensitive reaction at target move. // More distance let have better performance, less distance let have more sensitive reaction at target move.
if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->CanFly()) if (owner.GetTypeId() == TYPEID_UNIT && ((Creature*)&owner)->CanFly())
{ return !i_target->IsWithinDist3d(x, y, z, this->GetDynamicTargetDistance(owner, true)); } {
return !i_target->IsWithinDist3d(x, y, z, this->GetDynamicTargetDistance(owner, true));
}
else else
{ return !i_target->IsWithinDist2d(x, y, this->GetDynamicTargetDistance(owner, true)); } { return !i_target->IsWithinDist2d(x, y, this->GetDynamicTargetDistance(owner, true)); }
} }
@ -191,7 +213,9 @@ template<class T>
void ChaseMovementGenerator<T>::_reachTarget(T& owner) void ChaseMovementGenerator<T>::_reachTarget(T& owner)
{ {
if (owner.CanReachWithMeleeAttack(this->i_target.getTarget())) if (owner.CanReachWithMeleeAttack(this->i_target.getTarget()))
{ owner.Attack(this->i_target.getTarget(), true); } {
owner.Attack(this->i_target.getTarget(), true);
}
} }
template<> template<>
@ -236,7 +260,9 @@ template<class T>
float ChaseMovementGenerator<T>::GetDynamicTargetDistance(T& owner, bool forRangeCheck) const float ChaseMovementGenerator<T>::GetDynamicTargetDistance(T& owner, bool forRangeCheck) const
{ {
if (!forRangeCheck) if (!forRangeCheck)
{ return this->i_offset + CHASE_DEFAULT_RANGE_FACTOR * this->i_target->GetCombatReach(&owner); } {
return this->i_offset + CHASE_DEFAULT_RANGE_FACTOR * this->i_target->GetCombatReach(&owner);
}
return CHASE_RECHASE_RANGE_FACTOR * this->i_target->GetCombatReach(&owner) - this->i_target->GetObjectBoundingRadius(); return CHASE_RECHASE_RANGE_FACTOR * this->i_target->GetCombatReach(&owner) - this->i_target->GetObjectBoundingRadius();
} }
@ -270,7 +296,9 @@ void FollowMovementGenerator<Creature>::_updateSpeed(Creature& u)
{ {
// pet only sync speed with owner // pet only sync speed with owner
if (!((Creature&)u).IsPet() || !i_target.isValid() || i_target->GetObjectGuid() != u.GetOwnerGuid()) if (!((Creature&)u).IsPet() || !i_target.isValid() || i_target->GetObjectGuid() != u.GetOwnerGuid())
{ return; } {
return;
}
u.UpdateSpeed(MOVE_RUN, true); u.UpdateSpeed(MOVE_RUN, true);
u.UpdateSpeed(MOVE_WALK, true); u.UpdateSpeed(MOVE_WALK, true);
@ -326,12 +354,16 @@ template<class T>
float FollowMovementGenerator<T>::GetDynamicTargetDistance(T& owner, bool forRangeCheck) const float FollowMovementGenerator<T>::GetDynamicTargetDistance(T& owner, bool forRangeCheck) const
{ {
if (!forRangeCheck) if (!forRangeCheck)
{ return this->i_offset + owner.GetObjectBoundingRadius() + this->i_target->GetObjectBoundingRadius(); } {
return this->i_offset + owner.GetObjectBoundingRadius() + this->i_target->GetObjectBoundingRadius();
}
float allowed_dist = sWorld.getConfig(CONFIG_FLOAT_RATE_TARGET_POS_RECALCULATION_RANGE) - this->i_target->GetObjectBoundingRadius(); float allowed_dist = sWorld.getConfig(CONFIG_FLOAT_RATE_TARGET_POS_RECALCULATION_RANGE) - this->i_target->GetObjectBoundingRadius();
allowed_dist += FOLLOW_RECALCULATE_FACTOR * (owner.GetObjectBoundingRadius() + this->i_target->GetObjectBoundingRadius()); allowed_dist += FOLLOW_RECALCULATE_FACTOR * (owner.GetObjectBoundingRadius() + this->i_target->GetObjectBoundingRadius());
if (this->i_offset > FOLLOW_DIST_GAP_FOR_DIST_FACTOR) if (this->i_offset > FOLLOW_DIST_GAP_FOR_DIST_FACTOR)
{ allowed_dist += FOLLOW_DIST_RECALCULATE_FACTOR * this->i_offset; } {
allowed_dist += FOLLOW_DIST_RECALCULATE_FACTOR * this->i_offset;
}
return allowed_dist; return allowed_dist;
} }

View file

@ -65,7 +65,9 @@ void WaypointMovementGenerator<Creature>::LoadPath(Creature& creature, int32 pat
} }
if (i_path->empty()) if (i_path->empty())
{ return; } {
return;
}
// Initialize the i_currentNode to point to the first node // Initialize the i_currentNode to point to the first node
i_currentNode = i_path->begin()->first; i_currentNode = i_path->begin()->first;
m_lastReachedWaypoint = 0; m_lastReachedWaypoint = 0;
@ -107,12 +109,16 @@ void WaypointMovementGenerator<Creature>::Reset(Creature& creature)
void WaypointMovementGenerator<Creature>::OnArrived(Creature& creature) void WaypointMovementGenerator<Creature>::OnArrived(Creature& creature)
{ {
if (!i_path || i_path->empty()) if (!i_path || i_path->empty())
{ return; } {
return;
}
m_lastReachedWaypoint = i_currentNode; m_lastReachedWaypoint = i_currentNode;
if (m_isArrivalDone) if (m_isArrivalDone)
{ return; } {
return;
}
creature.clearUnitState(UNIT_STAT_ROAMING_MOVE); creature.clearUnitState(UNIT_STAT_ROAMING_MOVE);
m_isArrivalDone = true; m_isArrivalDone = true;
@ -131,13 +137,19 @@ void WaypointMovementGenerator<Creature>::OnArrived(Creature& creature)
if (WaypointBehavior* behavior = node.behavior) if (WaypointBehavior* behavior = node.behavior)
{ {
if (behavior->emote != 0) if (behavior->emote != 0)
{ creature.HandleEmote(behavior->emote); } {
creature.HandleEmote(behavior->emote);
}
if (behavior->spell != 0) if (behavior->spell != 0)
{ creature.CastSpell(&creature, behavior->spell, false); } {
creature.CastSpell(&creature, behavior->spell, false);
}
if (behavior->model1 != 0) if (behavior->model1 != 0)
{ creature.SetDisplayId(behavior->model1); } {
creature.SetDisplayId(behavior->model1);
}
if (behavior->textid[0]) if (behavior->textid[0])
{ {
@ -150,14 +162,18 @@ void WaypointMovementGenerator<Creature>::OnArrived(Creature& creature)
for (; i < MAX_WAYPOINT_TEXT; ++i) for (; i < MAX_WAYPOINT_TEXT; ++i)
{ {
if (!behavior->textid[i]) if (!behavior->textid[i])
{ break; } {
break;
}
} }
textId = behavior->textid[urand(0, i - 1)]; textId = behavior->textid[urand(0, i - 1)];
} }
if (MangosStringLocale const* textData = sObjectMgr.GetMangosStringLocale(textId)) if (MangosStringLocale const* textData = sObjectMgr.GetMangosStringLocale(textId))
{ creature.MonsterText(textData, NULL); } {
creature.MonsterText(textData, NULL);
}
else else
{ sLog.outErrorDb("%s reached waypoint %u, attempted to do text %i, but required text-data could not be found", creature.GetGuidStr().c_str(), i_currentNode, textId); } { sLog.outErrorDb("%s reached waypoint %u, attempted to do text %i, but required text-data could not be found", creature.GetGuidStr().c_str(), i_currentNode, textId); }
} }
@ -179,13 +195,19 @@ void WaypointMovementGenerator<Creature>::OnArrived(Creature& creature)
void WaypointMovementGenerator<Creature>::StartMove(Creature& creature) void WaypointMovementGenerator<Creature>::StartMove(Creature& creature)
{ {
if (!i_path || i_path->empty()) if (!i_path || i_path->empty())
{ return; } {
return;
}
if (Stopped(creature)) if (Stopped(creature))
{ return; } {
return;
}
if (!creature.IsAlive() || creature.hasUnitState(UNIT_STAT_NOT_MOVE)) if (!creature.IsAlive() || creature.hasUnitState(UNIT_STAT_NOT_MOVE))
{ return; } {
return;
}
WaypointPath::const_iterator currPoint = i_path->find(i_currentNode); WaypointPath::const_iterator currPoint = i_path->find(i_currentNode);
MANGOS_ASSERT(currPoint != i_path->end()); MANGOS_ASSERT(currPoint != i_path->end());
@ -193,7 +215,9 @@ void WaypointMovementGenerator<Creature>::StartMove(Creature& creature)
if (WaypointBehavior* behavior = currPoint->second.behavior) if (WaypointBehavior* behavior = currPoint->second.behavior)
{ {
if (behavior->model2 != 0) if (behavior->model2 != 0)
{ creature.SetDisplayId(behavior->model2); } {
creature.SetDisplayId(behavior->model2);
}
creature.SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); creature.SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
} }
@ -231,7 +255,9 @@ void WaypointMovementGenerator<Creature>::StartMove(Creature& creature)
init.MoveTo(nextNode.x, nextNode.y, nextNode.z, true); init.MoveTo(nextNode.x, nextNode.y, nextNode.z, true);
if (nextNode.orientation != 100 && nextNode.delay != 0) if (nextNode.orientation != 100 && nextNode.delay != 0)
{ init.SetFacing(nextNode.orientation); } {
init.SetFacing(nextNode.orientation);
}
creature.SetWalk(!creature.hasUnitState(UNIT_STAT_RUNNING_STATE) && !creature.IsLevitating(), false); creature.SetWalk(!creature.hasUnitState(UNIT_STAT_RUNNING_STATE) && !creature.IsLevitating(), false);
init.Launch(); init.Launch();
} }
@ -256,12 +282,16 @@ bool WaypointMovementGenerator<Creature>::Update(Creature& creature, const uint3
if (Stopped(creature)) if (Stopped(creature))
{ {
if (CanMove(diff, creature)) if (CanMove(diff, creature))
{ StartMove(creature); } {
StartMove(creature);
}
} }
else else
{ {
if (creature.IsStopped()) if (creature.IsStopped())
{ Stop(STOP_TIME_FOR_PLAYER); } {
Stop(STOP_TIME_FOR_PLAYER);
}
else if (creature.movespline->Finalized()) else if (creature.movespline->Finalized())
{ {
OnArrived(creature); OnArrived(creature);
@ -291,12 +321,16 @@ bool WaypointMovementGenerator<Creature>::GetResetPosition(Creature&, float& x,
{ {
// prevent a crash at empty waypoint path. // prevent a crash at empty waypoint path.
if (!i_path || i_path->empty()) if (!i_path || i_path->empty())
{ return false; } {
return false;
}
WaypointPath::const_iterator lastPoint = i_path->find(m_lastReachedWaypoint); WaypointPath::const_iterator lastPoint = i_path->find(m_lastReachedWaypoint);
// Special case: Before the first waypoint is reached, m_lastReachedWaypoint is set to 0 (which may not be contained in i_path) // Special case: Before the first waypoint is reached, m_lastReachedWaypoint is set to 0 (which may not be contained in i_path)
if (!m_lastReachedWaypoint && lastPoint == i_path->end()) if (!m_lastReachedWaypoint && lastPoint == i_path->end())
{ return false; } {
return false;
}
MANGOS_ASSERT(lastPoint != i_path->end()); MANGOS_ASSERT(lastPoint != i_path->end());
@ -369,14 +403,18 @@ bool WaypointMovementGenerator<Creature>::SetNextWaypoint(uint32 pointId)
uint32 FlightPathMovementGenerator::GetPathAtMapEnd() const uint32 FlightPathMovementGenerator::GetPathAtMapEnd() const
{ {
if (i_currentNode >= i_path->size()) if (i_currentNode >= i_path->size())
{ return i_path->size(); } {
return i_path->size();
}
uint32 curMapId = (*i_path)[i_currentNode].mapid; uint32 curMapId = (*i_path)[i_currentNode].mapid;
for (uint32 i = i_currentNode; i < i_path->size(); ++i) for (uint32 i = i_currentNode; i < i_path->size(); ++i)
{ {
if ((*i_path)[i].mapid != curMapId) if ((*i_path)[i].mapid != curMapId)
{ return i; } {
return i;
}
} }
return i_path->size(); return i_path->size();
@ -400,7 +438,9 @@ void FlightPathMovementGenerator::Finalize(Player& player)
{ {
player.GetHostileRefManager().setOnlineOfflineState(true); player.GetHostileRefManager().setOnlineOfflineState(true);
if (player.pvpInfo.inHostileArea) if (player.pvpInfo.inHostileArea)
{ player.CastSpell(&player, 2479, true); } {
player.CastSpell(&player, 2479, true);
}
// update z position to ground and orientation for landing point // update z position to ground and orientation for landing point
// this prevent cheating with landing point at lags // this prevent cheating with landing point at lags
@ -448,7 +488,9 @@ bool FlightPathMovementGenerator::Update(Player& player, const uint32& diff)
{ {
DoEventIfAny(player, (*i_path)[i_currentNode], departureEvent); DoEventIfAny(player, (*i_path)[i_currentNode], departureEvent);
if (pointId == i_currentNode) if (pointId == i_currentNode)
{ break; } {
break;
}
i_currentNode += (uint32)departureEvent; i_currentNode += (uint32)departureEvent;
departureEvent = !departureEvent; departureEvent = !departureEvent;
} }
@ -461,7 +503,9 @@ bool FlightPathMovementGenerator::Update(Player& player, const uint32& diff)
void FlightPathMovementGenerator::SetCurrentNodeAfterTeleport() void FlightPathMovementGenerator::SetCurrentNodeAfterTeleport()
{ {
if (i_path->empty()) if (i_path->empty())
{ return; } {
return;
}
uint32 map0 = (*i_path)[0].mapid; uint32 map0 = (*i_path)[0].mapid;

View file

@ -34,7 +34,9 @@ int AggressorAI::Permissible(const Creature* creature)
{ {
// have some hostile factions, it will be selected by IsHostileTo check at MoveInLineOfSight // have some hostile factions, it will be selected by IsHostileTo check at MoveInLineOfSight
if (!creature->IsCivilian() && !creature->IsNeutralToAll()) if (!creature->IsCivilian() && !creature->IsNeutralToAll())
{ return PERMIT_BASE_PROACTIVE; } {
return PERMIT_BASE_PROACTIVE;
}
return PERMIT_BASE_NO; return PERMIT_BASE_NO;
} }
@ -47,7 +49,9 @@ void AggressorAI::MoveInLineOfSight(Unit* u)
{ {
// Ignore Z for flying creatures // Ignore Z for flying creatures
if (!m_creature->CanFly() && m_creature->GetDistanceZ(u) > CREATURE_Z_ATTACK_RANGE) if (!m_creature->CanFly() && m_creature->GetDistanceZ(u) > CREATURE_Z_ATTACK_RANGE)
{ return; } {
return;
}
if (m_creature->CanInitiateAttack() && u->IsTargetableForAttack() && if (m_creature->CanInitiateAttack() && u->IsTargetableForAttack() &&
m_creature->IsHostileTo(u) && u->isInAccessablePlaceFor(m_creature)) m_creature->IsHostileTo(u) && u->isInAccessablePlaceFor(m_creature))
@ -111,7 +115,9 @@ void AggressorAI::EnterEvadeMode()
// Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
{ m_creature->GetMotionMaster()->MoveTargetedHome(); } {
m_creature->GetMotionMaster()->MoveTargetedHome();
}
} }
m_creature->DeleteThreatList(); m_creature->DeleteThreatList();
@ -124,7 +130,9 @@ void AggressorAI::UpdateAI(const uint32 /*diff*/)
{ {
// update i_victimGuid if m_creature->getVictim() !=0 and changed // update i_victimGuid if m_creature->getVictim() !=0 and changed
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
{ return; } {
return;
}
i_victimGuid = m_creature->getVictim()->GetObjectGuid(); i_victimGuid = m_creature->getVictim()->GetObjectGuid();
@ -140,7 +148,9 @@ bool AggressorAI::IsVisible(Unit* pl) const
void AggressorAI::AttackStart(Unit* u) void AggressorAI::AttackStart(Unit* u)
{ {
if (!u || !m_creature->CanAttackByItself()) if (!u || !m_creature->CanAttackByItself())
{ return; } {
return;
}
if (m_creature->Attack(u, true)) if (m_creature->Attack(u, true))
{ {

View file

@ -62,7 +62,9 @@ AuctionHouseMgr::~AuctionHouseMgr()
AuctionHouseObject* AuctionHouseMgr::GetAuctionsMap(AuctionHouseEntry const* house) AuctionHouseObject* AuctionHouseMgr::GetAuctionsMap(AuctionHouseEntry const* house)
{ {
if (sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_AUCTION)) if (sWorld.getConfig(CONFIG_BOOL_ALLOW_TWO_SIDE_INTERACTION_AUCTION))
{ return &mAuctions[AUCTION_HOUSE_NEUTRAL]; } {
return &mAuctions[AUCTION_HOUSE_NEUTRAL];
}
// team have linked auction houses // team have linked auction houses
switch (GetAuctionHouseTeam(house)) switch (GetAuctionHouseTeam(house))
@ -84,7 +86,9 @@ uint64 AuctionHouseMgr::GetAuctionDeposit(AuctionHouseEntry const* entry, uint32
float min_deposit = float(sWorld.getConfig(CONFIG_UINT32_AUCTION_DEPOSIT_MIN)); float min_deposit = float(sWorld.getConfig(CONFIG_UINT32_AUCTION_DEPOSIT_MIN));
if (deposit < min_deposit) if (deposit < min_deposit)
{ deposit = min_deposit; } {
deposit = min_deposit;
}
return uint64(deposit * sWorld.getConfig(CONFIG_FLOAT_RATE_AUCTION_DEPOSIT)); return uint64(deposit * sWorld.getConfig(CONFIG_FLOAT_RATE_AUCTION_DEPOSIT));
} }
@ -94,7 +98,9 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction)
{ {
Item* pItem = GetAItem(auction->itemGuidLow); Item* pItem = GetAItem(auction->itemGuidLow);
if (!pItem) if (!pItem)
{ return; } {
return;
}
ObjectGuid bidder_guid = ObjectGuid(HIGHGUID_PLAYER, auction->bidder); ObjectGuid bidder_guid = ObjectGuid(HIGHGUID_PLAYER, auction->bidder);
Player* bidder = sObjectMgr.GetPlayer(bidder_guid); Player* bidder = sObjectMgr.GetPlayer(bidder_guid);
@ -123,7 +129,9 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction)
if (bidder_security > SEC_PLAYER) // not do redundant DB requests if (bidder_security > SEC_PLAYER) // not do redundant DB requests
{ {
if (!sObjectMgr.GetPlayerNameByGUID(bidder_guid, bidder_name)) if (!sObjectMgr.GetPlayerNameByGUID(bidder_guid, bidder_name))
{ bidder_name = sObjectMgr.GetMangosStringForDBCLocale(LANG_UNKNOWN); } {
bidder_name = sObjectMgr.GetMangosStringForDBCLocale(LANG_UNKNOWN);
}
} }
} }
@ -196,7 +204,9 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction)
uint32 owner_accId = 0; uint32 owner_accId = 0;
if (!owner) if (!owner)
{ owner_accId = sObjectMgr.GetPlayerAccountIdByGUID(owner_guid); } {
owner_accId = sObjectMgr.GetPlayerAccountIdByGUID(owner_guid);
}
// owner exist // owner exist
if (owner || owner_accId) if (owner || owner_accId)
@ -245,7 +255,9 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction)
uint32 owner_accId = 0; uint32 owner_accId = 0;
if (!owner) if (!owner)
{ owner_accId = sObjectMgr.GetPlayerAccountIdByGUID(owner_guid); } {
owner_accId = sObjectMgr.GetPlayerAccountIdByGUID(owner_guid);
}
// owner exist // owner exist
if (owner || owner_accId) if (owner || owner_accId)
@ -561,7 +573,9 @@ AuctionHouseEntry const* AuctionHouseMgr::GetAuctionHouseEntry(Unit* unit)
{ {
Player* player = (Player*)unit; Player* player = (Player*)unit;
if (player->GetAuctionAccessMode() > 0) if (player->GetAuctionAccessMode() > 0)
{ houseid = 7; } {
houseid = 7;
}
else else
{ {
switch (((Player*)unit)->GetTeam()) switch (((Player*)unit)->GetTeam())
@ -630,7 +644,9 @@ void AuctionHouseObject::BuildListBidderItems(WorldPacket& data, Player* player,
if (Aentry->bidder == player->GetGUIDLow()) if (Aentry->bidder == player->GetGUIDLow())
{ {
if (itr->second->BuildAuctionInfo(data)) if (itr->second->BuildAuctionInfo(data))
{ ++count; } {
++count;
}
++totalcount; ++totalcount;
} }
} }
@ -646,7 +662,9 @@ void AuctionHouseObject::BuildListOwnerItems(WorldPacket& data, Player* player,
if (Aentry->owner == player->GetGUIDLow()) if (Aentry->owner == player->GetGUIDLow())
{ {
if (Aentry->BuildAuctionInfo(data)) if (Aentry->BuildAuctionInfo(data))
{ ++count; } {
++count;
}
++totalcount; ++totalcount;
} }
} }
@ -818,7 +836,9 @@ void WorldSession::BuildListAuctionItems(std::vector<AuctionEntry*> const& aucti
continue; continue;
Item* item = sAuctionMgr.GetAItem(Aentry->itemGuidLow); Item* item = sAuctionMgr.GetAItem(Aentry->itemGuidLow);
if (!item) if (!item)
{ continue; } {
continue;
}
if (isFull) if (isFull)
{ {
@ -830,19 +850,29 @@ void WorldSession::BuildListAuctionItems(std::vector<AuctionEntry*> const& aucti
ItemPrototype const* proto = item->GetProto(); ItemPrototype const* proto = item->GetProto();
if (itemClass != 0xffffffff && proto->Class != itemClass) if (itemClass != 0xffffffff && proto->Class != itemClass)
{ continue; } {
continue;
}
if (itemSubClass != 0xffffffff && proto->SubClass != itemSubClass) if (itemSubClass != 0xffffffff && proto->SubClass != itemSubClass)
{ continue; } {
continue;
}
if (inventoryType != 0xffffffff && proto->InventoryType != inventoryType) if (inventoryType != 0xffffffff && proto->InventoryType != inventoryType)
{ continue; } {
continue;
}
if (quality != 0xffffffff && proto->Quality < quality) if (quality != 0xffffffff && proto->Quality < quality)
{ continue; } {
continue;
}
if (levelmin != 0x00 && (proto->RequiredLevel < levelmin || (levelmax != 0x00 && proto->RequiredLevel > levelmax))) if (levelmin != 0x00 && (proto->RequiredLevel < levelmin || (levelmax != 0x00 && proto->RequiredLevel > levelmax)))
{ continue; } {
continue;
}
if (usable != 0x00) if (usable != 0x00)
{ {
@ -867,7 +897,9 @@ void WorldSession::BuildListAuctionItems(std::vector<AuctionEntry*> const& aucti
sObjectMgr.GetItemLocaleStrings(proto->ItemId, loc_idx, &name); sObjectMgr.GetItemLocaleStrings(proto->ItemId, loc_idx, &name);
if (!wsearchedname.empty() && !Utf8FitTo(name, wsearchedname)) if (!wsearchedname.empty() && !Utf8FitTo(name, wsearchedname))
{ continue; } {
continue;
}
if (count < 50 && totalcount >= listfrom) if (count < 50 && totalcount >= listfrom)
{ {
@ -942,7 +974,9 @@ AuctionEntry* AuctionHouseObject::AddAuction(AuctionHouseEntry const* auctionHou
AH->SaveToDB(); AH->SaveToDB();
if (pl) if (pl)
{ pl->SaveInventoryAndGoldToDB(); } {
pl->SaveInventoryAndGoldToDB();
}
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
@ -993,7 +1027,9 @@ uint64 AuctionEntry::GetAuctionOutBid() const
{ {
uint64 outbid = (bid / 100) * 5; uint64 outbid = (bid / 100) * 5;
if (!outbid) if (!outbid)
{ outbid = 1; } {
outbid = 1;
}
return outbid; return outbid;
} }
@ -1018,7 +1054,9 @@ void AuctionEntry::AuctionBidWinning(Player* newbidder)
CharacterDatabase.BeginTransaction(); CharacterDatabase.BeginTransaction();
CharacterDatabase.PExecute("UPDATE auction SET itemguid = 0, moneyTime = '" UI64FMTD "', buyguid = '%u', lastbid = '" UI64FMTD "' WHERE id = '%u'", (uint64)moneyDeliveryTime, bidder, bid, Id); CharacterDatabase.PExecute("UPDATE auction SET itemguid = 0, moneyTime = '" UI64FMTD "', buyguid = '%u', lastbid = '" UI64FMTD "' WHERE id = '%u'", (uint64)moneyDeliveryTime, bidder, bid, Id);
if (newbidder) if (newbidder)
{ newbidder->SaveInventoryAndGoldToDB(); } {
newbidder->SaveInventoryAndGoldToDB();
}
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
sAuctionMgr.SendAuctionWonMail(this); sAuctionMgr.SendAuctionWonMail(this);
@ -1030,7 +1068,9 @@ bool AuctionEntry::UpdateBid(uint64 newbid, Player* newbidder /*=NULL*/)
// bid can't be greater buyout // bid can't be greater buyout
if (buyout && newbid > buyout) if (buyout && newbid > buyout)
{ newbid = buyout; } {
newbid = buyout;
}
if (newbidder && newbidder->GetGUIDLow() == bidder) if (newbidder && newbidder->GetGUIDLow() == bidder)
{ {
@ -1042,7 +1082,9 @@ bool AuctionEntry::UpdateBid(uint64 newbid, Player* newbidder /*=NULL*/)
newbidder->ModifyMoney(-int64(newbid)); newbidder->ModifyMoney(-int64(newbid));
if (bidder) // return money to old bidder if present if (bidder) // return money to old bidder if present
{ WorldSession::SendAuctionOutbiddedMail(this); } {
WorldSession::SendAuctionOutbiddedMail(this);
}
} }
bidder = newbidder ? newbidder->GetGUIDLow() : 0; bidder = newbidder ? newbidder->GetGUIDLow() : 0;
@ -1057,7 +1099,9 @@ bool AuctionEntry::UpdateBid(uint64 newbid, Player* newbidder /*=NULL*/)
CharacterDatabase.BeginTransaction(); CharacterDatabase.BeginTransaction();
CharacterDatabase.PExecute("UPDATE auction SET buyguid = '%u', lastbid = '" UI64FMTD "' WHERE id = '%u'", bidder, bid, Id); CharacterDatabase.PExecute("UPDATE auction SET buyguid = '%u', lastbid = '" UI64FMTD "' WHERE id = '%u'", bidder, bid, Id);
if (newbidder) if (newbidder)
{ newbidder->SaveInventoryAndGoldToDB(); } {
newbidder->SaveInventoryAndGoldToDB();
}
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
return true; return true;
} }

View file

@ -49,14 +49,18 @@ void Bag::AddToWorld()
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (m_bagslot[i]) if (m_bagslot[i])
{ m_bagslot[i]->AddToWorld(); } {
m_bagslot[i]->AddToWorld();
}
} }
void Bag::RemoveFromWorld() void Bag::RemoveFromWorld()
{ {
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (m_bagslot[i]) if (m_bagslot[i])
{ m_bagslot[i]->RemoveFromWorld(); } {
m_bagslot[i]->RemoveFromWorld();
}
Item::RemoveFromWorld(); Item::RemoveFromWorld();
} }
@ -66,7 +70,9 @@ bool Bag::Create(uint32 guidlow, uint32 itemid, Player const* owner)
ItemPrototype const* itemProto = ObjectMgr::GetItemPrototype(itemid); ItemPrototype const* itemProto = ObjectMgr::GetItemPrototype(itemid);
if (!itemProto || itemProto->ContainerSlots > MAX_BAG_SIZE) if (!itemProto || itemProto->ContainerSlots > MAX_BAG_SIZE)
{ return false; } {
return false;
}
Object::_Create(guidlow, 0, HIGHGUID_CONTAINER); Object::_Create(guidlow, 0, HIGHGUID_CONTAINER);
@ -101,7 +107,9 @@ void Bag::SaveToDB()
bool Bag::LoadFromDB(uint32 guidLow, Field* fields, ObjectGuid ownerGuid) bool Bag::LoadFromDB(uint32 guidLow, Field* fields, ObjectGuid ownerGuid)
{ {
if (!Item::LoadFromDB(guidLow, fields, ownerGuid)) if (!Item::LoadFromDB(guidLow, fields, ownerGuid))
{ return false; } {
return false;
}
// cleanup bag content related item value fields (its will be filled correctly from `character_inventory`) // cleanup bag content related item value fields (its will be filled correctly from `character_inventory`)
for (int i = 0; i < MAX_BAG_SIZE; ++i) for (int i = 0; i < MAX_BAG_SIZE; ++i)
@ -119,7 +127,9 @@ void Bag::DeleteFromDB()
{ {
for (int i = 0; i < MAX_BAG_SIZE; ++i) for (int i = 0; i < MAX_BAG_SIZE; ++i)
if (m_bagslot[i]) if (m_bagslot[i])
{ m_bagslot[i]->DeleteFromDB(); } {
m_bagslot[i]->DeleteFromDB();
}
Item::DeleteFromDB(); Item::DeleteFromDB();
} }
@ -129,7 +139,9 @@ uint32 Bag::GetFreeSlots() const
uint32 slots = 0; uint32 slots = 0;
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (!m_bagslot[i]) if (!m_bagslot[i])
{ ++slots; } {
++slots;
}
return slots; return slots;
} }
@ -139,7 +151,9 @@ void Bag::RemoveItem(uint8 slot, bool /*update*/)
MANGOS_ASSERT(slot < MAX_BAG_SIZE); MANGOS_ASSERT(slot < MAX_BAG_SIZE);
if (m_bagslot[slot]) if (m_bagslot[slot])
{ m_bagslot[slot]->SetContainer(NULL); } {
m_bagslot[slot]->SetContainer(NULL);
}
m_bagslot[slot] = NULL; m_bagslot[slot] = NULL;
SetGuidValue(CONTAINER_FIELD_SLOT_1 + (slot * 2), ObjectGuid()); SetGuidValue(CONTAINER_FIELD_SLOT_1 + (slot * 2), ObjectGuid());
@ -166,7 +180,9 @@ void Bag::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) cons
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (m_bagslot[i]) if (m_bagslot[i])
{ m_bagslot[i]->BuildCreateUpdateBlockForPlayer(data, target); } {
m_bagslot[i]->BuildCreateUpdateBlockForPlayer(data, target);
}
} }
// If the bag is empty returns true // If the bag is empty returns true
@ -174,7 +190,9 @@ bool Bag::IsEmpty() const
{ {
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (m_bagslot[i]) if (m_bagslot[i])
{ return false; } {
return false;
}
return true; return true;
} }
@ -183,7 +201,9 @@ Item* Bag::GetItemByEntry(uint32 item) const
{ {
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (m_bagslot[i] && m_bagslot[i]->GetEntry() == item) if (m_bagslot[i] && m_bagslot[i]->GetEntry() == item)
{ return m_bagslot[i]; } {
return m_bagslot[i];
}
return NULL; return NULL;
} }
@ -204,7 +224,9 @@ uint32 Bag::GetItemCount(uint32 item, Item* eItem) const
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (m_bagslot[i]) if (m_bagslot[i])
if (m_bagslot[i] != eItem && m_bagslot[i]->GetEntry() == item) if (m_bagslot[i] != eItem && m_bagslot[i]->GetEntry() == item)
{ count += m_bagslot[i]->GetCount(); } {
count += m_bagslot[i]->GetCount();
}
if (eItem && eItem->GetProto()->GemProperties) if (eItem && eItem->GetProto()->GemProperties)
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
@ -232,7 +254,9 @@ uint8 Bag::GetSlotByItemGUID(ObjectGuid guid) const
for (uint32 i = 0; i < GetBagSize(); ++i) for (uint32 i = 0; i < GetBagSize(); ++i)
if (m_bagslot[i] != 0) if (m_bagslot[i] != 0)
if (m_bagslot[i]->GetObjectGuid() == guid) if (m_bagslot[i]->GetObjectGuid() == guid)
{ return i; } {
return i;
}
return NULL_SLOT; return NULL_SLOT;
} }
@ -240,7 +264,9 @@ uint8 Bag::GetSlotByItemGUID(ObjectGuid guid) const
Item* Bag::GetItemByPos(uint8 slot) const Item* Bag::GetItemByPos(uint8 slot) const
{ {
if (slot < GetBagSize()) if (slot < GetBagSize())
{ return m_bagslot[slot]; } {
return m_bagslot[slot];
}
return NULL; return NULL;
} }

View file

@ -78,7 +78,9 @@ class Bag : public Item
inline Item* NewItemOrBag(ItemPrototype const* proto) inline Item* NewItemOrBag(ItemPrototype const* proto)
{ {
if (proto->InventoryType == INVTYPE_BAG) if (proto->InventoryType == INVTYPE_BAG)
{ return new Bag; } {
return new Bag;
}
return new Item; return new Item;
} }

View file

@ -53,7 +53,9 @@ void Camera::UpdateForCurrentViewPoint()
m_gridRef.unlink(); m_gridRef.unlink();
if (GridType* grid = m_source->GetViewPoint().m_grid) if (GridType* grid = m_source->GetViewPoint().m_grid)
{ grid->AddWorldObject(this); } {
grid->AddWorldObject(this);
}
UpdateVisibilityForOwner(); UpdateVisibilityForOwner();
} }
@ -63,7 +65,9 @@ void Camera::SetView(WorldObject* obj, bool update_far_sight_field /*= true*/)
MANGOS_ASSERT(obj); MANGOS_ASSERT(obj);
if (m_source == obj) if (m_source == obj)
{ return; } {
return;
}
if (!m_owner.IsInMap(obj)) if (!m_owner.IsInMap(obj))
{ {
@ -80,17 +84,23 @@ void Camera::SetView(WorldObject* obj, bool update_far_sight_field /*= true*/)
// detach and deregister from active objects if there are no more reasons to be active // detach and deregister from active objects if there are no more reasons to be active
m_source->GetViewPoint().Detach(this); m_source->GetViewPoint().Detach(this);
if (!m_source->IsActiveObject()) if (!m_source->IsActiveObject())
{ m_source->GetMap()->RemoveFromActive(m_source); } {
m_source->GetMap()->RemoveFromActive(m_source);
}
m_source = obj; m_source = obj;
if (!m_source->IsActiveObject()) if (!m_source->IsActiveObject())
{ m_source->GetMap()->AddToActive(m_source); } {
m_source->GetMap()->AddToActive(m_source);
}
m_source->GetViewPoint().Attach(this); m_source->GetViewPoint().Attach(this);
if (update_far_sight_field) if (update_far_sight_field)
{ m_owner.SetGuidValue(PLAYER_FARSIGHT, (m_source == &m_owner ? ObjectGuid() : m_source->GetObjectGuid())); } {
m_owner.SetGuidValue(PLAYER_FARSIGHT, (m_source == &m_owner ? ObjectGuid() : m_source->GetObjectGuid()));
}
UpdateForCurrentViewPoint(); UpdateForCurrentViewPoint();
} }
@ -98,7 +108,9 @@ void Camera::SetView(WorldObject* obj, bool update_far_sight_field /*= true*/)
void Camera::Event_ViewPointVisibilityChanged() void Camera::Event_ViewPointVisibilityChanged()
{ {
if (!m_owner.HaveAtClient(m_source)) if (!m_owner.HaveAtClient(m_source))
{ ResetView(); } {
ResetView();
}
} }
void Camera::ResetView(bool update_far_sight_field /*= true*/) void Camera::ResetView(bool update_far_sight_field /*= true*/)

View file

@ -55,7 +55,9 @@ void Corpse::AddToWorld()
{ {
///- Register the corpse for guid lookup ///- Register the corpse for guid lookup
if (!IsInWorld()) if (!IsInWorld())
{ sObjectAccessor.AddObject(this); } {
sObjectAccessor.AddObject(this);
}
Object::AddToWorld(); Object::AddToWorld();
} }
@ -64,7 +66,9 @@ void Corpse::RemoveFromWorld()
{ {
///- Remove the corpse from the accessor ///- Remove the corpse from the accessor
if (IsInWorld()) if (IsInWorld())
{ sObjectAccessor.RemoveObject(this); } {
sObjectAccessor.RemoveObject(this);
}
Object::RemoveFromWorld(); Object::RemoveFromWorld();
} }
@ -232,9 +236,13 @@ bool Corpse::LoadFromDB(uint32 lowguid, Field* fields)
uint32 flags = CORPSE_FLAG_UNK2; uint32 flags = CORPSE_FLAG_UNK2;
if (playerFlags & PLAYER_FLAGS_HIDE_HELM) if (playerFlags & PLAYER_FLAGS_HIDE_HELM)
{ flags |= CORPSE_FLAG_HIDE_HELM; } {
flags |= CORPSE_FLAG_HIDE_HELM;
}
if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK) if (playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
{ flags |= CORPSE_FLAG_HIDE_CLOAK; } {
flags |= CORPSE_FLAG_HIDE_CLOAK;
}
SetUInt32Value(CORPSE_FIELD_FLAGS, flags); SetUInt32Value(CORPSE_FIELD_FLAGS, flags);
// no need to mark corpse as lootable, because corpses are not saved in battle grounds // no need to mark corpse as lootable, because corpses are not saved in battle grounds
@ -265,7 +273,9 @@ bool Corpse::isVisibleForInState(Player const* u, WorldObject const* viewPoint,
bool Corpse::IsHostileTo(Unit const* unit) const bool Corpse::IsHostileTo(Unit const* unit) const
{ {
if (Player* owner = sObjectMgr.GetPlayer(GetOwnerGuid())) if (Player* owner = sObjectMgr.GetPlayer(GetOwnerGuid()))
{ return owner->IsHostileTo(unit); } {
return owner->IsHostileTo(unit);
}
else else
{ return false; } { return false; }
} }
@ -273,7 +283,9 @@ bool Corpse::IsHostileTo(Unit const* unit) const
bool Corpse::IsFriendlyTo(Unit const* unit) const bool Corpse::IsFriendlyTo(Unit const* unit) const
{ {
if (Player* owner = sObjectMgr.GetPlayer(GetOwnerGuid())) if (Player* owner = sObjectMgr.GetPlayer(GetOwnerGuid()))
{ return owner->IsFriendlyTo(unit); } {
return owner->IsFriendlyTo(unit);
}
else else
{ return true; } { return true; }
} }
@ -281,7 +293,9 @@ bool Corpse::IsFriendlyTo(Unit const* unit) const
bool Corpse::IsExpired(time_t t) const bool Corpse::IsExpired(time_t t) const
{ {
if (m_type == CORPSE_BONES) if (m_type == CORPSE_BONES)
{ return m_time < t - 60 * MINUTE; } {
return m_time < t - 60 * MINUTE;
}
else else
{ return m_time < t - 3 * DAY; } { return m_time < t - 3 * DAY; }
} }

File diff suppressed because it is too large Load diff

View file

@ -166,7 +166,9 @@ struct CreatureInfo
SkillType GetRequiredLootSkill() const SkillType GetRequiredLootSkill() const
{ {
if (CreatureTypeFlags & CREATURE_TYPEFLAGS_HERBLOOT) if (CreatureTypeFlags & CREATURE_TYPEFLAGS_HERBLOOT)
{ return SKILL_HERBALISM; } {
return SKILL_HERBALISM;
}
else if (CreatureTypeFlags & CREATURE_TYPEFLAGS_MININGLOOT) else if (CreatureTypeFlags & CREATURE_TYPEFLAGS_MININGLOOT)
{ return SKILL_MINING; } { return SKILL_MINING; }
else if (CreatureTypeFlags & CREATURE_TYPEFLAGS_ENGINEERLOOT) else if (CreatureTypeFlags & CREATURE_TYPEFLAGS_ENGINEERLOOT)
@ -565,7 +567,9 @@ class Creature : public Unit
bool IsElite() const bool IsElite() const
{ {
if (IsPet()) if (IsPet())
{ return false; } {
return false;
}
uint32 Rank = GetCreatureInfo()->Rank; uint32 Rank = GetCreatureInfo()->Rank;
return Rank != CREATURE_ELITE_NORMAL && Rank != CREATURE_ELITE_RARE; return Rank != CREATURE_ELITE_NORMAL && Rank != CREATURE_ELITE_RARE;
@ -574,7 +578,9 @@ class Creature : public Unit
bool IsWorldBoss() const bool IsWorldBoss() const
{ {
if (IsPet()) if (IsPet())
{ return false; } {
return false;
}
return GetCreatureInfo()->Rank == CREATURE_ELITE_WORLDBOSS; return GetCreatureInfo()->Rank == CREATURE_ELITE_WORLDBOSS;
} }
@ -785,7 +791,9 @@ class Creature : public Unit
virtual uint32 GetPetAutoSpellOnPos(uint8 pos) const virtual uint32 GetPetAutoSpellOnPos(uint8 pos) const
{ {
if (pos >= CREATURE_MAX_SPELLS || m_charmInfo->GetCharmSpell(pos)->GetType() != ACT_ENABLED) if (pos >= CREATURE_MAX_SPELLS || m_charmInfo->GetCharmSpell(pos)->GetType() != ACT_ENABLED)
{ return 0; } {
return 0;
}
else else
{ return m_charmInfo->GetCharmSpell(pos)->GetAction(); } { return m_charmInfo->GetCharmSpell(pos)->GetAction(); }
} }

View file

@ -40,7 +40,9 @@ CreatureAI::~CreatureAI()
void CreatureAI::AttackedBy(Unit* attacker) void CreatureAI::AttackedBy(Unit* attacker)
{ {
if (!m_creature->getVictim()) if (!m_creature->getVictim())
{ AttackStart(attacker); } {
AttackStart(attacker);
}
} }
CanCastResult CreatureAI::CanCastSpell(Unit* pTarget, const SpellEntry* pSpell, bool isTriggered) CanCastResult CreatureAI::CanCastSpell(Unit* pTarget, const SpellEntry* pSpell, bool isTriggered)
@ -50,17 +52,25 @@ CanCastResult CreatureAI::CanCastSpell(Unit* pTarget, const SpellEntry* pSpell,
{ {
// State does not allow // State does not allow
if (m_creature->hasUnitState(UNIT_STAT_CAN_NOT_REACT_OR_LOST_CONTROL)) if (m_creature->hasUnitState(UNIT_STAT_CAN_NOT_REACT_OR_LOST_CONTROL))
{ return CAST_FAIL_STATE; } {
return CAST_FAIL_STATE;
}
if (pSpell->GetPreventionType() == SPELL_PREVENTION_TYPE_SILENCE && m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED)) if (pSpell->GetPreventionType() == SPELL_PREVENTION_TYPE_SILENCE && m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_SILENCED))
{ return CAST_FAIL_STATE; } {
return CAST_FAIL_STATE;
}
if (pSpell->GetPreventionType() == SPELL_PREVENTION_TYPE_PACIFY && m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) if (pSpell->GetPreventionType() == SPELL_PREVENTION_TYPE_PACIFY && m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
{ return CAST_FAIL_STATE; } {
return CAST_FAIL_STATE;
}
// Check for power (also done by Spell::CheckCast()) // Check for power (also done by Spell::CheckCast())
if (m_creature->GetPower((Powers)pSpell->powerType) < Spell::CalculatePowerCost(pSpell, m_creature)) if (m_creature->GetPower((Powers)pSpell->powerType) < Spell::CalculatePowerCost(pSpell, m_creature))
{ return CAST_FAIL_POWER; } {
return CAST_FAIL_POWER;
}
if (!pSpell->HasAttribute(SPELL_ATTR_EX2_IGNORE_LOS) && !m_creature->IsWithinLOSInMap(pTarget) && m_creature != pTarget) if (!pSpell->HasAttribute(SPELL_ATTR_EX2_IGNORE_LOS) && !m_creature->IsWithinLOSInMap(pTarget) && m_creature != pTarget)
return CAST_FAIL_NOT_IN_LOS; return CAST_FAIL_NOT_IN_LOS;
@ -74,12 +84,16 @@ CanCastResult CreatureAI::CanCastSpell(Unit* pTarget, const SpellEntry* pSpell,
float fDistance = m_creature->GetCombatDistance(pTarget, pSpell->rangeIndex == SPELL_RANGE_IDX_COMBAT); float fDistance = m_creature->GetCombatDistance(pTarget, pSpell->rangeIndex == SPELL_RANGE_IDX_COMBAT);
if (fDistance > (m_creature->IsHostileTo(pTarget) ? pSpellRange->maxRange : pSpellRange->maxRangeFriendly)) if (fDistance > (m_creature->IsHostileTo(pTarget) ? pSpellRange->maxRange : pSpellRange->maxRangeFriendly))
{ return CAST_FAIL_TOO_FAR; } {
return CAST_FAIL_TOO_FAR;
}
float fMinRange = m_creature->IsHostileTo(pTarget) ? pSpellRange->minRange : pSpellRange->minRangeFriendly; float fMinRange = m_creature->IsHostileTo(pTarget) ? pSpellRange->minRange : pSpellRange->minRangeFriendly;
if (fMinRange && fDistance < fMinRange) if (fMinRange && fDistance < fMinRange)
{ return CAST_FAIL_TOO_CLOSE; } {
return CAST_FAIL_TOO_CLOSE;
}
} }
return CAST_OK; return CAST_OK;
@ -93,7 +107,9 @@ CanCastResult CreatureAI::DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32
Unit* pCaster = m_creature; Unit* pCaster = m_creature;
if (uiCastFlags & CAST_FORCE_TARGET_SELF) if (uiCastFlags & CAST_FORCE_TARGET_SELF)
{ pCaster = pTarget; } {
pCaster = pTarget;
}
// Allowed to cast only if not casting (unless we interrupt ourself) or if spell is triggered // Allowed to cast only if not casting (unless we interrupt ourself) or if spell is triggered
if (!pCaster->IsNonMeleeSpellCasted(false) || (uiCastFlags & (CAST_TRIGGERED | CAST_INTERRUPT_PREVIOUS))) if (!pCaster->IsNonMeleeSpellCasted(false) || (uiCastFlags & (CAST_TRIGGERED | CAST_INTERRUPT_PREVIOUS)))
@ -104,7 +120,9 @@ CanCastResult CreatureAI::DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32
if (uiCastFlags & CAST_AURA_NOT_PRESENT) if (uiCastFlags & CAST_AURA_NOT_PRESENT)
{ {
if (pTarget->HasAura(uiSpell)) if (pTarget->HasAura(uiSpell))
{ return CAST_FAIL_TARGET_AURA; } {
return CAST_FAIL_TARGET_AURA;
}
} }
// Check if can not cast spell // Check if can not cast spell
@ -120,7 +138,9 @@ CanCastResult CreatureAI::DoCastSpellIfCan(Unit* pTarget, uint32 uiSpell, uint32
// Interrupt any previous spell // Interrupt any previous spell
if ((uiCastFlags & CAST_INTERRUPT_PREVIOUS) && pCaster->IsNonMeleeSpellCasted(false)) if ((uiCastFlags & CAST_INTERRUPT_PREVIOUS) && pCaster->IsNonMeleeSpellCasted(false))
{ pCaster->InterruptNonMeleeSpells(false); } {
pCaster->InterruptNonMeleeSpells(false);
}
// Creature should always stop before it will cast a non-instant spell // Creature should always stop before it will cast a non-instant spell
if (GetSpellCastTime(pSpell)) if (GetSpellCastTime(pSpell))
@ -155,14 +175,18 @@ void CreatureAI::SetCombatMovement(bool enable, bool stopOrStartMovement /*=fals
m_isCombatMovement = enable; m_isCombatMovement = enable;
if (enable) if (enable)
{ m_creature->clearUnitState(UNIT_STAT_NO_COMBAT_MOVEMENT); } {
m_creature->clearUnitState(UNIT_STAT_NO_COMBAT_MOVEMENT);
}
else else
{ m_creature->addUnitState(UNIT_STAT_NO_COMBAT_MOVEMENT); } { m_creature->addUnitState(UNIT_STAT_NO_COMBAT_MOVEMENT); }
if (stopOrStartMovement && m_creature->getVictim()) // Only change current movement while in combat if (stopOrStartMovement && m_creature->getVictim()) // Only change current movement while in combat
{ {
if (enable) if (enable)
{ m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), m_attackDistance, m_attackAngle); } {
m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim(), m_attackDistance, m_attackAngle);
}
else if (!enable && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) else if (!enable && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
{ m_creature->StopMoving(); } { m_creature->StopMoving(); }
} }

View file

@ -48,7 +48,9 @@ namespace FactorySelector
// Allow scripting AI for normal creatures and not controlled pets (guardians and mini-pets) // Allow scripting AI for normal creatures and not controlled pets (guardians and mini-pets)
if (!creature->IsPet() || !static_cast<Pet*>(creature)->isControlled()) if (!creature->IsPet() || !static_cast<Pet*>(creature)->isControlled())
{ return scriptedAI; } {
return scriptedAI;
}
} }
CreatureAIRegistry& ai_registry(CreatureAIRepository::Instance()); CreatureAIRegistry& ai_registry(CreatureAIRepository::Instance());
@ -64,17 +66,23 @@ namespace FactorySelector
{ {
Unit* controler = creature->GetOwner() ? creature->GetOwner() : creature->GetCharmer(); Unit* controler = creature->GetOwner() ? creature->GetOwner() : creature->GetCharmer();
if (controler && controler->GetTypeId() == TYPEID_PLAYER && controler->IsAlive()) if (controler && controler->GetTypeId() == TYPEID_PLAYER && controler->IsAlive())
{ ai_factory = ai_registry.GetRegistryItem("PetAI"); } {
ai_factory = ai_registry.GetRegistryItem("PetAI");
}
} }
else if (creature->IsTotem()) else if (creature->IsTotem())
{ ai_factory = ai_registry.GetRegistryItem("TotemAI"); } { ai_factory = ai_registry.GetRegistryItem("TotemAI"); }
// select by script name // select by script name
if (!ai_factory && !ainame.empty()) if (!ai_factory && !ainame.empty())
{ ai_factory = ai_registry.GetRegistryItem(ainame.c_str()); } {
ai_factory = ai_registry.GetRegistryItem(ainame.c_str());
}
if (!ai_factory && creature->IsGuard()) if (!ai_factory && creature->IsGuard())
{ ai_factory = ai_registry.GetRegistryItem("GuardAI"); } {
ai_factory = ai_registry.GetRegistryItem("GuardAI");
}
// select by permit check // select by permit check
if (!ai_factory) if (!ai_factory)

File diff suppressed because it is too large Load diff

View file

@ -44,13 +44,17 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Texts(bool check_entry_use)
sObjectMgr.LoadMangosStrings(WorldDatabase, "creature_ai_texts", MIN_CREATURE_AI_TEXT_STRING_ID, MAX_CREATURE_AI_TEXT_STRING_ID, true); sObjectMgr.LoadMangosStrings(WorldDatabase, "creature_ai_texts", MIN_CREATURE_AI_TEXT_STRING_ID, MAX_CREATURE_AI_TEXT_STRING_ID, true);
if (check_entry_use) if (check_entry_use)
{ CheckUnusedAITexts(); } {
CheckUnusedAITexts();
}
} }
void CreatureEventAIMgr::CheckUnusedAITexts() void CreatureEventAIMgr::CheckUnusedAITexts()
{ {
if (m_usedTextsAmount == sObjectMgr.GetLoadedStringsCount(MIN_CREATURE_AI_TEXT_STRING_ID)) if (m_usedTextsAmount == sObjectMgr.GetLoadedStringsCount(MIN_CREATURE_AI_TEXT_STRING_ID))
{ return; } {
return;
}
sLog.outString("Checking EventAI for unused texts, this might take a while"); sLog.outString("Checking EventAI for unused texts, this might take a while");
@ -58,7 +62,9 @@ void CreatureEventAIMgr::CheckUnusedAITexts()
// check not used strings this is negative range // check not used strings this is negative range
for (int32 i = MAX_CREATURE_AI_TEXT_STRING_ID + 1; i <= MIN_CREATURE_AI_TEXT_STRING_ID; ++i) for (int32 i = MAX_CREATURE_AI_TEXT_STRING_ID + 1; i <= MIN_CREATURE_AI_TEXT_STRING_ID; ++i)
if (sObjectMgr.GetMangosStringLocale(i)) if (sObjectMgr.GetMangosStringLocale(i))
{ idx_set.insert(i); } {
idx_set.insert(i);
}
for (CreatureEventAI_Event_Map::const_iterator itr = m_CreatureEventAI_Event_Map.begin(); itr != m_CreatureEventAI_Event_Map.end(); ++itr) for (CreatureEventAI_Event_Map::const_iterator itr = m_CreatureEventAI_Event_Map.begin(); itr != m_CreatureEventAI_Event_Map.end(); ++itr)
{ {
@ -78,7 +84,9 @@ void CreatureEventAIMgr::CheckUnusedAITexts()
int k = action.type == ACTION_T_TEXT ? 0 : 1; int k = action.type == ACTION_T_TEXT ? 0 : 1;
for (; k < 3; ++k) for (; k < 3; ++k)
if (action.text.TextId[k]) if (action.text.TextId[k])
{ idx_set.erase(action.text.TextId[k]); } {
idx_set.erase(action.text.TextId[k]);
}
break; break;
} }
default: break; default: break;
@ -106,7 +114,9 @@ bool IsValidTargetType(EventAI_Type eventType, EventAI_ActionType actionType, ui
case TARGET_T_HOSTILE_RANDOM: case TARGET_T_HOSTILE_RANDOM:
case TARGET_T_HOSTILE_RANDOM_NOT_TOP: case TARGET_T_HOSTILE_RANDOM_NOT_TOP:
if (actionType == ACTION_T_QUEST_EVENT || actionType == ACTION_T_CAST_EVENT || actionType == ACTION_T_QUEST_EVENT_ALL || actionType == ACTION_T_KILLED_MONSTER) if (actionType == ACTION_T_QUEST_EVENT || actionType == ACTION_T_CAST_EVENT || actionType == ACTION_T_QUEST_EVENT_ALL || actionType == ACTION_T_KILLED_MONSTER)
{ sLog.outErrorEventAI("Event %u Action%u uses LIKELY bad Target type %u for event-type %u (must target player)", eventId, action, targetType, eventType); } {
sLog.outErrorEventAI("Event %u Action%u uses LIKELY bad Target type %u for event-type %u (must target player)", eventId, action, targetType, eventType);
}
// no break, check if valid at all // no break, check if valid at all
case TARGET_T_HOSTILE: case TARGET_T_HOSTILE:
case TARGET_T_HOSTILE_SECOND_AGGRO: case TARGET_T_HOSTILE_SECOND_AGGRO:
@ -305,7 +315,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
// No chance of this event occuring // No chance of this event occuring
if (temp.event_chance == 0) if (temp.event_chance == 0)
{ sLog.outErrorEventAI("Event %u has 0 percent chance. Event will never trigger!", i); } {
sLog.outErrorEventAI("Event %u has 0 percent chance. Event will never trigger!", i);
}
// Chance above 100, force it to be 100 // Chance above 100, force it to be 100
else if (temp.event_chance > 100) else if (temp.event_chance > 100)
{ {
@ -320,9 +332,13 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
case EVENT_T_TIMER_OOC: case EVENT_T_TIMER_OOC:
case EVENT_T_TIMER_GENERIC: case EVENT_T_TIMER_GENERIC:
if (temp.timer.initialMax < temp.timer.initialMin) if (temp.timer.initialMax < temp.timer.initialMin)
{ sLog.outErrorEventAI("Creature %u are using timed event(%u) with param2 < param1 (InitialMax < InitialMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using timed event(%u) with param2 < param1 (InitialMax < InitialMin). Event will never repeat.", temp.creature_id, i);
}
if (temp.timer.repeatMax < temp.timer.repeatMin) if (temp.timer.repeatMax < temp.timer.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_HP: case EVENT_T_HP:
case EVENT_T_MANA: case EVENT_T_MANA:
@ -330,10 +346,14 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
case EVENT_T_TARGET_MANA: case EVENT_T_TARGET_MANA:
case EVENT_T_ENERGY: case EVENT_T_ENERGY:
if (temp.percent_range.percentMax > 100) if (temp.percent_range.percentMax > 100)
{ sLog.outErrorEventAI("Creature %u are using percentage event(%u) with param2 (MinPercent) > 100. Event will never trigger! ", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using percentage event(%u) with param2 (MinPercent) > 100. Event will never trigger! ", temp.creature_id, i);
}
if (temp.percent_range.percentMax <= temp.percent_range.percentMin) if (temp.percent_range.percentMax <= temp.percent_range.percentMin)
{ sLog.outErrorEventAI("Creature %u are using percentage event(%u) with param1 <= param2 (MaxPercent <= MinPercent). Event will never trigger! ", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using percentage event(%u) with param1 <= param2 (MaxPercent <= MinPercent). Event will never trigger! ", temp.creature_id, i);
}
if (temp.event_flags & EFLAG_REPEATABLE && !temp.percent_range.repeatMin && !temp.percent_range.repeatMax) if (temp.event_flags & EFLAG_REPEATABLE && !temp.percent_range.repeatMin && !temp.percent_range.repeatMax)
{ {
@ -352,24 +372,36 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
} }
if ((temp.spell_hit.schoolMask & pSpell->SchoolMask) != pSpell->SchoolMask) if ((temp.spell_hit.schoolMask & pSpell->SchoolMask) != pSpell->SchoolMask)
{ sLog.outErrorEventAI("Creature %u has param1(spellId %u) but param2 is not -1 and not equal to spell's school mask. Event %u can never trigger.", temp.creature_id, temp.spell_hit.schoolMask, i); } {
sLog.outErrorEventAI("Creature %u has param1(spellId %u) but param2 is not -1 and not equal to spell's school mask. Event %u can never trigger.", temp.creature_id, temp.spell_hit.schoolMask, i);
}
} }
if (!temp.spell_hit.schoolMask) if (!temp.spell_hit.schoolMask)
{ sLog.outErrorEventAI("Creature %u is using invalid SpellSchoolMask(%u) defined in event %u.", temp.creature_id, temp.spell_hit.schoolMask, i); } {
sLog.outErrorEventAI("Creature %u is using invalid SpellSchoolMask(%u) defined in event %u.", temp.creature_id, temp.spell_hit.schoolMask, i);
}
if (temp.spell_hit.repeatMax < temp.spell_hit.repeatMin) if (temp.spell_hit.repeatMax < temp.spell_hit.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_RANGE: case EVENT_T_RANGE:
if (temp.range.maxDist < temp.range.minDist) if (temp.range.maxDist < temp.range.minDist)
{ sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (MaxDist < MinDist). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (MaxDist < MinDist). Event will never repeat.", temp.creature_id, i);
}
if (temp.range.repeatMax < temp.range.repeatMin) if (temp.range.repeatMax < temp.range.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_OOC_LOS: case EVENT_T_OOC_LOS:
if (temp.ooc_los.repeatMax < temp.ooc_los.repeatMin) if (temp.ooc_los.repeatMax < temp.ooc_los.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_SPAWNED: case EVENT_T_SPAWNED:
switch (temp.spawned.condition) switch (temp.spawned.condition)
@ -378,11 +410,15 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break; break;
case SPAWNED_EVENT_MAP: case SPAWNED_EVENT_MAP:
if (!sMapStore.LookupEntry(temp.spawned.conditionValue1)) if (!sMapStore.LookupEntry(temp.spawned.conditionValue1))
{ sLog.outErrorEventAI("Creature %u are using spawned event(%u) with param1 = %u 'map specific' but map (param2: %u) does not exist. Event will never repeat.", temp.creature_id, i, temp.spawned.condition, temp.spawned.conditionValue1); } {
sLog.outErrorEventAI("Creature %u are using spawned event(%u) with param1 = %u 'map specific' but map (param2: %u) does not exist. Event will never repeat.", temp.creature_id, i, temp.spawned.condition, temp.spawned.conditionValue1);
}
break; break;
case SPAWNED_EVENT_ZONE: case SPAWNED_EVENT_ZONE:
if (!GetAreaEntryByAreaID(temp.spawned.conditionValue1)) if (!GetAreaEntryByAreaID(temp.spawned.conditionValue1))
{ sLog.outErrorEventAI("Creature %u are using spawned event(%u) with param1 = %u 'area specific' but area (param2: %u) does not exist. Event will never repeat.", temp.creature_id, i, temp.spawned.condition, temp.spawned.conditionValue1); } {
sLog.outErrorEventAI("Creature %u are using spawned event(%u) with param1 = %u 'area specific' but area (param2: %u) does not exist. Event will never repeat.", temp.creature_id, i, temp.spawned.condition, temp.spawned.conditionValue1);
}
break; break;
default: default:
sLog.outErrorEventAI("Creature %u are using invalid spawned event %u mode (%u) in param1", temp.creature_id, i, temp.spawned.condition); sLog.outErrorEventAI("Creature %u are using invalid spawned event %u mode (%u) in param1", temp.creature_id, i, temp.spawned.condition);
@ -391,11 +427,15 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break; break;
case EVENT_T_FRIENDLY_HP: case EVENT_T_FRIENDLY_HP:
if (temp.friendly_hp.repeatMax < temp.friendly_hp.repeatMin) if (temp.friendly_hp.repeatMax < temp.friendly_hp.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_FRIENDLY_IS_CC: case EVENT_T_FRIENDLY_IS_CC:
if (temp.friendly_is_cc.repeatMax < temp.friendly_is_cc.repeatMin) if (temp.friendly_is_cc.repeatMax < temp.friendly_is_cc.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_FRIENDLY_MISSING_BUFF: case EVENT_T_FRIENDLY_MISSING_BUFF:
{ {
@ -411,29 +451,41 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
continue; continue;
} }
if (temp.friendly_buff.repeatMax < temp.friendly_buff.repeatMin) if (temp.friendly_buff.repeatMax < temp.friendly_buff.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
} }
case EVENT_T_KILL: case EVENT_T_KILL:
if (temp.kill.repeatMax < temp.kill.repeatMin) if (temp.kill.repeatMax < temp.kill.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_TARGET_CASTING: case EVENT_T_TARGET_CASTING:
if (temp.target_casting.repeatMax < temp.target_casting.repeatMin) if (temp.target_casting.repeatMax < temp.target_casting.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_SUMMONED_UNIT: case EVENT_T_SUMMONED_UNIT:
case EVENT_T_SUMMONED_JUST_DIED: case EVENT_T_SUMMONED_JUST_DIED:
case EVENT_T_SUMMONED_JUST_DESPAWN: case EVENT_T_SUMMONED_JUST_DESPAWN:
if (!sCreatureStorage.LookupEntry<CreatureInfo>(temp.summoned.creatureId)) if (!sCreatureStorage.LookupEntry<CreatureInfo>(temp.summoned.creatureId))
{ sLog.outErrorEventAI("Creature %u are using event(%u) with nonexistent creature template id (%u) in param1, skipped.", temp.creature_id, i, temp.summoned.creatureId); } {
sLog.outErrorEventAI("Creature %u are using event(%u) with nonexistent creature template id (%u) in param1, skipped.", temp.creature_id, i, temp.summoned.creatureId);
}
if (temp.summoned.repeatMax < temp.summoned.repeatMin) if (temp.summoned.repeatMax < temp.summoned.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using event(%u) with param2 < param1 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
case EVENT_T_QUEST_ACCEPT: case EVENT_T_QUEST_ACCEPT:
case EVENT_T_QUEST_COMPLETE: case EVENT_T_QUEST_COMPLETE:
if (!sObjectMgr.GetQuestTemplate(temp.quest.questId)) if (!sObjectMgr.GetQuestTemplate(temp.quest.questId))
{ sLog.outErrorEventAI("Creature %u are using event(%u) with nonexistent quest id (%u) in param1, skipped.", temp.creature_id, i, temp.quest.questId); } {
sLog.outErrorEventAI("Creature %u are using event(%u) with nonexistent quest id (%u) in param1, skipped.", temp.creature_id, i, temp.quest.questId);
}
sLog.outErrorEventAI("Creature %u using not implemented event (%u) in event %u.", temp.creature_id, temp.event_id, i); sLog.outErrorEventAI("Creature %u using not implemented event (%u) in event %u.", temp.creature_id, temp.event_id, i);
continue; continue;
@ -491,7 +543,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
continue; continue;
} }
if (temp.buffed.repeatMax < temp.buffed.repeatMin) if (temp.buffed.repeatMax < temp.buffed.repeatMin)
{ sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i); } {
sLog.outErrorEventAI("Creature %u are using repeatable event(%u) with param4 < param3 (RepeatMax < RepeatMin). Event will never repeat.", temp.creature_id, i);
}
break; break;
} }
case EVENT_T_RECEIVE_AI_EVENT: case EVENT_T_RECEIVE_AI_EVENT:
@ -540,7 +594,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
case ACTION_T_CHANCED_TEXT: case ACTION_T_CHANCED_TEXT:
// Check first param as chance // Check first param as chance
if (!action.chanced_text.chance) if (!action.chanced_text.chance)
{ sLog.outErrorEventAI("Event %u Action %u has not set chance param1. Text will not be displayed", i, j + 1); } {
sLog.outErrorEventAI("Event %u Action %u has not set chance param1. Text will not be displayed", i, j + 1);
}
else if (action.chanced_text.chance >= 100) else if (action.chanced_text.chance >= 100)
{ sLog.outErrorEventAI("Event %u Action %u has set chance param1 >= 100. Text will always be displayed", i, j + 1); } { sLog.outErrorEventAI("Event %u Action %u has set chance param1 >= 100. Text will always be displayed", i, j + 1); }
// no break here to check texts // no break here to check texts
@ -553,10 +609,14 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
if (action.text.TextId[k]) if (action.text.TextId[k])
{ {
if (k > firstTextParam && not_set) if (k > firstTextParam && not_set)
{ sLog.outErrorEventAI("Event %u Action %u has param%d, but it follow after not set param. Required for randomized text.", i, j + 1, k + 1); } {
sLog.outErrorEventAI("Event %u Action %u has param%d, but it follow after not set param. Required for randomized text.", i, j + 1, k + 1);
}
if (!action.text.TextId[k]) if (!action.text.TextId[k])
{ not_set = true; } {
not_set = true;
}
// range negative // range negative
else if (action.text.TextId[k] > MIN_CREATURE_AI_TEXT_STRING_ID || action.text.TextId[k] <= MAX_CREATURE_AI_TEXT_STRING_ID) else if (action.text.TextId[k] > MIN_CREATURE_AI_TEXT_STRING_ID || action.text.TextId[k] <= MAX_CREATURE_AI_TEXT_STRING_ID)
{ {
@ -607,33 +667,51 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break; break;
case ACTION_T_SOUND: case ACTION_T_SOUND:
if (!sSoundEntriesStore.LookupEntry(action.sound.soundId)) if (!sSoundEntriesStore.LookupEntry(action.sound.soundId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent SoundID %u.", i, j + 1, action.sound.soundId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent SoundID %u.", i, j + 1, action.sound.soundId);
}
break; break;
case ACTION_T_EMOTE: case ACTION_T_EMOTE:
if (!sEmotesStore.LookupEntry(action.emote.emoteId)) if (!sEmotesStore.LookupEntry(action.emote.emoteId))
{ sLog.outErrorEventAI("Event %u Action %u param1 (EmoteId: %u) are not valid.", i, j + 1, action.emote.emoteId); } {
sLog.outErrorEventAI("Event %u Action %u param1 (EmoteId: %u) are not valid.", i, j + 1, action.emote.emoteId);
}
break; break;
case ACTION_T_RANDOM_SOUND: case ACTION_T_RANDOM_SOUND:
if (!sSoundEntriesStore.LookupEntry(action.random_sound.soundId1)) if (!sSoundEntriesStore.LookupEntry(action.random_sound.soundId1))
{ sLog.outErrorEventAI("Event %u Action %u param1 uses nonexistent SoundID %u.", i, j + 1, action.random_sound.soundId1); } {
sLog.outErrorEventAI("Event %u Action %u param1 uses nonexistent SoundID %u.", i, j + 1, action.random_sound.soundId1);
}
if (action.random_sound.soundId2 >= 0 && !sSoundEntriesStore.LookupEntry(action.random_sound.soundId2)) if (action.random_sound.soundId2 >= 0 && !sSoundEntriesStore.LookupEntry(action.random_sound.soundId2))
{ sLog.outErrorEventAI("Event %u Action %u param2 uses nonexistent SoundID %u.", i, j + 1, action.random_sound.soundId2); } {
sLog.outErrorEventAI("Event %u Action %u param2 uses nonexistent SoundID %u.", i, j + 1, action.random_sound.soundId2);
}
if (action.random_sound.soundId3 >= 0 && !sSoundEntriesStore.LookupEntry(action.random_sound.soundId3)) if (action.random_sound.soundId3 >= 0 && !sSoundEntriesStore.LookupEntry(action.random_sound.soundId3))
{ sLog.outErrorEventAI("Event %u Action %u param3 uses nonexistent SoundID %u.", i, j + 1, action.random_sound.soundId3); } {
sLog.outErrorEventAI("Event %u Action %u param3 uses nonexistent SoundID %u.", i, j + 1, action.random_sound.soundId3);
}
break; break;
case ACTION_T_RANDOM_EMOTE: case ACTION_T_RANDOM_EMOTE:
if (!sEmotesStore.LookupEntry(action.random_emote.emoteId1)) if (!sEmotesStore.LookupEntry(action.random_emote.emoteId1))
{ sLog.outErrorEventAI("Event %u Action %u param1 (EmoteId: %u) are not valid.", i, j + 1, action.random_emote.emoteId1); } {
sLog.outErrorEventAI("Event %u Action %u param1 (EmoteId: %u) are not valid.", i, j + 1, action.random_emote.emoteId1);
}
if (action.random_emote.emoteId2 >= 0 && !sEmotesStore.LookupEntry(action.random_emote.emoteId2)) if (action.random_emote.emoteId2 >= 0 && !sEmotesStore.LookupEntry(action.random_emote.emoteId2))
{ sLog.outErrorEventAI("Event %u Action %u param2 (EmoteId: %u) are not valid.", i, j + 1, action.random_emote.emoteId2); } {
sLog.outErrorEventAI("Event %u Action %u param2 (EmoteId: %u) are not valid.", i, j + 1, action.random_emote.emoteId2);
}
if (action.random_emote.emoteId3 >= 0 && !sEmotesStore.LookupEntry(action.random_emote.emoteId3)) if (action.random_emote.emoteId3 >= 0 && !sEmotesStore.LookupEntry(action.random_emote.emoteId3))
{ sLog.outErrorEventAI("Event %u Action %u param3 (EmoteId: %u) are not valid.", i, j + 1, action.random_emote.emoteId3); } {
sLog.outErrorEventAI("Event %u Action %u param3 (EmoteId: %u) are not valid.", i, j + 1, action.random_emote.emoteId3);
}
break; break;
case ACTION_T_CAST: case ACTION_T_CAST:
{ {
const SpellEntry* spell = sSpellStore.LookupEntry(action.cast.spellId); const SpellEntry* spell = sSpellStore.LookupEntry(action.cast.spellId);
if (!spell) if (!spell)
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.cast.spellId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.cast.spellId);
}
/* FIXME: temp.raw.param3 not have event tipes with recovery time in it.... /* FIXME: temp.raw.param3 not have event tipes with recovery time in it....
else else
{ {
@ -648,7 +726,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
// Cast is always triggered if target is forced to cast on self // Cast is always triggered if target is forced to cast on self
if (action.cast.castFlags & CAST_FORCE_TARGET_SELF) if (action.cast.castFlags & CAST_FORCE_TARGET_SELF)
{ action.cast.castFlags |= CAST_TRIGGERED; } {
action.cast.castFlags |= CAST_TRIGGERED;
}
IsValidTargetType(temp.event_type, action.type, action.cast.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.cast.target, i, j + 1);
@ -657,7 +737,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
{ {
// spell must be cast on self, but is not // spell must be cast on self, but is not
if ((IsOnlySelfTargeting(spell) || spell->rangeIndex == SPELL_RANGE_IDX_SELF_ONLY) && action.cast.target != TARGET_T_SELF && !(action.cast.castFlags & CAST_FORCE_TARGET_SELF)) if ((IsOnlySelfTargeting(spell) || spell->rangeIndex == SPELL_RANGE_IDX_SELF_ONLY) && action.cast.target != TARGET_T_SELF && !(action.cast.castFlags & CAST_FORCE_TARGET_SELF))
{ sLog.outErrorEventAI("Event %u Action %u uses SpellID %u that must be self cast (target is %u)", i, j + 1, action.cast.spellId, action.cast.target); } {
sLog.outErrorEventAI("Event %u Action %u uses SpellID %u that must be self cast (target is %u)", i, j + 1, action.cast.spellId, action.cast.target);
}
// TODO: spell must be cast on enemy, but is not // TODO: spell must be cast on enemy, but is not
@ -676,24 +758,32 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
} }
case ACTION_T_SUMMON: case ACTION_T_SUMMON:
if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.summon.creatureId)) if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.summon.creatureId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.summon.creatureId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.summon.creatureId);
}
IsValidTargetType(temp.event_type, action.type, action.summon.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.summon.target, i, j + 1);
break; break;
case ACTION_T_THREAT_SINGLE_PCT: case ACTION_T_THREAT_SINGLE_PCT:
if (std::abs(action.threat_single_pct.percent) > 100) if (std::abs(action.threat_single_pct.percent) > 100)
{ sLog.outErrorEventAI("Event %u Action %u uses invalid percent value %u.", i, j + 1, action.threat_single_pct.percent); } {
sLog.outErrorEventAI("Event %u Action %u uses invalid percent value %u.", i, j + 1, action.threat_single_pct.percent);
}
IsValidTargetType(temp.event_type, action.type, action.threat_single_pct.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.threat_single_pct.target, i, j + 1);
break; break;
case ACTION_T_THREAT_ALL_PCT: case ACTION_T_THREAT_ALL_PCT:
if (std::abs(action.threat_all_pct.percent) > 100) if (std::abs(action.threat_all_pct.percent) > 100)
{ sLog.outErrorEventAI("Event %u Action %u uses invalid percent value %u.", i, j + 1, action.threat_all_pct.percent); } {
sLog.outErrorEventAI("Event %u Action %u uses invalid percent value %u.", i, j + 1, action.threat_all_pct.percent);
}
break; break;
case ACTION_T_QUEST_EVENT: case ACTION_T_QUEST_EVENT:
if (Quest const* qid = sObjectMgr.GetQuestTemplate(action.quest_event.questId)) if (Quest const* qid = sObjectMgr.GetQuestTemplate(action.quest_event.questId))
{ {
if (!qid->HasSpecialFlag(QUEST_SPECIAL_FLAG_EXPLORATION_OR_EVENT)) if (!qid->HasSpecialFlag(QUEST_SPECIAL_FLAG_EXPLORATION_OR_EVENT))
{ sLog.outErrorEventAI("Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j + 1, action.quest_event.questId); } {
sLog.outErrorEventAI("Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j + 1, action.quest_event.questId);
}
} }
else else
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent Quest entry %u.", i, j + 1, action.quest_event.questId); } { sLog.outErrorEventAI("Event %u Action %u uses nonexistent Quest entry %u.", i, j + 1, action.quest_event.questId); }
@ -702,14 +792,20 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break; break;
case ACTION_T_CAST_EVENT: case ACTION_T_CAST_EVENT:
if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.cast_event.creatureId)) if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.cast_event.creatureId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.cast_event.creatureId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.cast_event.creatureId);
}
if (!sSpellStore.LookupEntry(action.cast_event.spellId)) if (!sSpellStore.LookupEntry(action.cast_event.spellId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.cast_event.spellId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.cast_event.spellId);
}
IsValidTargetType(temp.event_type, action.type, action.cast_event.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.cast_event.target, i, j + 1);
break; break;
case ACTION_T_SET_UNIT_FIELD: case ACTION_T_SET_UNIT_FIELD:
if (action.set_unit_field.field < OBJECT_END || action.set_unit_field.field >= UNIT_END) if (action.set_unit_field.field < OBJECT_END || action.set_unit_field.field >= UNIT_END)
{ sLog.outErrorEventAI("Event %u Action %u param1 (UNIT_FIELD*). Index out of range for intended use.", i, j + 1); } {
sLog.outErrorEventAI("Event %u Action %u param1 (UNIT_FIELD*). Index out of range for intended use.", i, j + 1);
}
IsValidTargetType(temp.event_type, action.type, action.set_unit_field.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.set_unit_field.target, i, j + 1);
break; break;
case ACTION_T_SET_UNIT_FLAG: case ACTION_T_SET_UNIT_FLAG:
@ -718,11 +814,15 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break; break;
case ACTION_T_SET_PHASE: case ACTION_T_SET_PHASE:
if (action.set_phase.phase >= MAX_PHASE) if (action.set_phase.phase >= MAX_PHASE)
{ sLog.outErrorEventAI("Event %u Action %u attempts to set phase >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1); } {
sLog.outErrorEventAI("Event %u Action %u attempts to set phase >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1);
}
break; break;
case ACTION_T_INC_PHASE: case ACTION_T_INC_PHASE:
if (action.set_inc_phase.step == 0) if (action.set_inc_phase.step == 0)
{ sLog.outErrorEventAI("Event %u Action %u is incrementing phase by 0. Was this intended?", i, j + 1); } {
sLog.outErrorEventAI("Event %u Action %u is incrementing phase by 0. Was this intended?", i, j + 1);
}
else if (std::abs(action.set_inc_phase.step) > MAX_PHASE - 1) else if (std::abs(action.set_inc_phase.step) > MAX_PHASE - 1)
{ sLog.outErrorEventAI("Event %u Action %u is change phase by too large for any use %i.", i, j + 1, action.set_inc_phase.step); } { sLog.outErrorEventAI("Event %u Action %u is change phase by too large for any use %i.", i, j + 1, action.set_inc_phase.step); }
break; break;
@ -730,35 +830,53 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
if (Quest const* qid = sObjectMgr.GetQuestTemplate(action.quest_event_all.questId)) if (Quest const* qid = sObjectMgr.GetQuestTemplate(action.quest_event_all.questId))
{ {
if (!qid->HasSpecialFlag(QUEST_SPECIAL_FLAG_EXPLORATION_OR_EVENT)) if (!qid->HasSpecialFlag(QUEST_SPECIAL_FLAG_EXPLORATION_OR_EVENT))
{ sLog.outErrorEventAI("Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j + 1, action.quest_event_all.questId); } {
sLog.outErrorEventAI("Event %u Action %u. SpecialFlags for quest entry %u does not include |2, Action will not have any effect.", i, j + 1, action.quest_event_all.questId);
}
} }
else else
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent Quest entry %u.", i, j + 1, action.quest_event_all.questId); } { sLog.outErrorEventAI("Event %u Action %u uses nonexistent Quest entry %u.", i, j + 1, action.quest_event_all.questId); }
break; break;
case ACTION_T_CAST_EVENT_ALL: case ACTION_T_CAST_EVENT_ALL:
if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.cast_event_all.creatureId)) if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.cast_event_all.creatureId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.cast_event_all.creatureId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.cast_event_all.creatureId);
}
if (!sSpellStore.LookupEntry(action.cast_event_all.spellId)) if (!sSpellStore.LookupEntry(action.cast_event_all.spellId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.cast_event_all.spellId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.cast_event_all.spellId);
}
break; break;
case ACTION_T_REMOVEAURASFROMSPELL: case ACTION_T_REMOVEAURASFROMSPELL:
if (!sSpellStore.LookupEntry(action.remove_aura.spellId)) if (!sSpellStore.LookupEntry(action.remove_aura.spellId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.remove_aura.spellId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent SpellID %u.", i, j + 1, action.remove_aura.spellId);
}
IsValidTargetType(temp.event_type, action.type, action.remove_aura.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.remove_aura.target, i, j + 1);
break; break;
case ACTION_T_RANDOM_PHASE: // PhaseId1, PhaseId2, PhaseId3 case ACTION_T_RANDOM_PHASE: // PhaseId1, PhaseId2, PhaseId3
if (action.random_phase.phase1 >= MAX_PHASE) if (action.random_phase.phase1 >= MAX_PHASE)
{ sLog.outErrorEventAI("Event %u Action %u attempts to set phase1 >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1); } {
sLog.outErrorEventAI("Event %u Action %u attempts to set phase1 >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1);
}
if (action.random_phase.phase2 >= MAX_PHASE) if (action.random_phase.phase2 >= MAX_PHASE)
{ sLog.outErrorEventAI("Event %u Action %u attempts to set phase2 >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1); } {
sLog.outErrorEventAI("Event %u Action %u attempts to set phase2 >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1);
}
if (action.random_phase.phase3 >= MAX_PHASE) if (action.random_phase.phase3 >= MAX_PHASE)
{ sLog.outErrorEventAI("Event %u Action %u attempts to set phase3 >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1); } {
sLog.outErrorEventAI("Event %u Action %u attempts to set phase3 >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1);
}
break; break;
case ACTION_T_RANDOM_PHASE_RANGE: // PhaseMin, PhaseMax case ACTION_T_RANDOM_PHASE_RANGE: // PhaseMin, PhaseMax
if (action.random_phase_range.phaseMin >= MAX_PHASE) if (action.random_phase_range.phaseMin >= MAX_PHASE)
{ sLog.outErrorEventAI("Event %u Action %u attempts to set phaseMin >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1); } {
sLog.outErrorEventAI("Event %u Action %u attempts to set phaseMin >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1);
}
if (action.random_phase_range.phaseMin >= MAX_PHASE) if (action.random_phase_range.phaseMin >= MAX_PHASE)
{ sLog.outErrorEventAI("Event %u Action %u attempts to set phaseMax >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1); } {
sLog.outErrorEventAI("Event %u Action %u attempts to set phaseMax >= %u. Phase mask can not be used past phase %u.", i, j + 1, MAX_PHASE, MAX_PHASE - 1);
}
if (action.random_phase_range.phaseMin >= action.random_phase_range.phaseMax) if (action.random_phase_range.phaseMin >= action.random_phase_range.phaseMax)
{ {
sLog.outErrorEventAI("Event %u Action %u attempts to set phaseMax <= phaseMin.", i, j + 1); sLog.outErrorEventAI("Event %u Action %u attempts to set phaseMax <= phaseMin.", i, j + 1);
@ -768,21 +886,29 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break; break;
case ACTION_T_SUMMON_ID: case ACTION_T_SUMMON_ID:
if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.summon_id.creatureId)) if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.summon_id.creatureId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.summon_id.creatureId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.summon_id.creatureId);
}
IsValidTargetType(temp.event_type, action.type, action.summon_id.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.summon_id.target, i, j + 1);
if (m_CreatureEventAI_Summon_Map.find(action.summon_id.spawnId) == m_CreatureEventAI_Summon_Map.end()) if (m_CreatureEventAI_Summon_Map.find(action.summon_id.spawnId) == m_CreatureEventAI_Summon_Map.end())
{ sLog.outErrorEventAI("Event %u Action %u summons missing CreatureEventAI_Summon %u", i, j + 1, action.summon_id.spawnId); } {
sLog.outErrorEventAI("Event %u Action %u summons missing CreatureEventAI_Summon %u", i, j + 1, action.summon_id.spawnId);
}
break; break;
case ACTION_T_KILLED_MONSTER: case ACTION_T_KILLED_MONSTER:
if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.killed_monster.creatureId)) if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.killed_monster.creatureId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.killed_monster.creatureId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.killed_monster.creatureId);
}
IsValidTargetType(temp.event_type, action.type, action.killed_monster.target, i, j + 1); IsValidTargetType(temp.event_type, action.type, action.killed_monster.target, i, j + 1);
break; break;
case ACTION_T_SET_INST_DATA: case ACTION_T_SET_INST_DATA:
if (!(temp.event_flags & EFLAG_DIFFICULTY_ALL)) if (!(temp.event_flags & EFLAG_DIFFICULTY_ALL))
sLog.outErrorEventAI("Event %u Action %u. Cannot set instance data without difficulty event flags.", i, j + 1); sLog.outErrorEventAI("Event %u Action %u. Cannot set instance data without difficulty event flags.", i, j + 1);
if (action.set_inst_data.value > 4/*SPECIAL*/) if (action.set_inst_data.value > 4/*SPECIAL*/)
{ sLog.outErrorEventAI("Event %u Action %u attempts to set instance data above encounter state 4. Custom case?", i, j + 1); } {
sLog.outErrorEventAI("Event %u Action %u attempts to set instance data above encounter state 4. Custom case?", i, j + 1);
}
break; break;
case ACTION_T_SET_INST_DATA64: case ACTION_T_SET_INST_DATA64:
if (!(temp.event_flags & EFLAG_DIFFICULTY_ALL)) if (!(temp.event_flags & EFLAG_DIFFICULTY_ALL))
@ -791,7 +917,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
break; break;
case ACTION_T_UPDATE_TEMPLATE: case ACTION_T_UPDATE_TEMPLATE:
if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.update_template.creatureId)) if (!sCreatureStorage.LookupEntry<CreatureInfo>(action.update_template.creatureId))
{ sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.update_template.creatureId); } {
sLog.outErrorEventAI("Event %u Action %u uses nonexistent creature entry %u.", i, j + 1, action.update_template.creatureId);
}
break; break;
case ACTION_T_SET_SHEATH: case ACTION_T_SET_SHEATH:
if (action.set_sheath.sheath >= MAX_SHEATH_STATE) if (action.set_sheath.sheath >= MAX_SHEATH_STATE)
@ -859,7 +987,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
continue; continue;
} }
if (action.throwEvent.radius > SIZE_OF_GRIDS) if (action.throwEvent.radius > SIZE_OF_GRIDS)
{ sLog.outErrorEventAI("Event %u Action %u uses unexpectedly huge radius %u (expected to be less than %f)", i, j + 1, action.throwEvent.radius, SIZE_OF_GRIDS); } {
sLog.outErrorEventAI("Event %u Action %u uses unexpectedly huge radius %u (expected to be less than %f)", i, j + 1, action.throwEvent.radius, SIZE_OF_GRIDS);
}
if (action.throwEvent.radius == 0) if (action.throwEvent.radius == 0)
{ {
@ -913,7 +1043,9 @@ void CreatureEventAIMgr::LoadCreatureEventAI_Scripts()
bool ainame = strcmp(cInfo->AIName, "EventAI") == 0; bool ainame = strcmp(cInfo->AIName, "EventAI") == 0;
bool hasevent = m_CreatureEventAI_Event_Map.find(i) != m_CreatureEventAI_Event_Map.end(); bool hasevent = m_CreatureEventAI_Event_Map.find(i) != m_CreatureEventAI_Event_Map.end();
if (ainame && !hasevent) if (ainame && !hasevent)
{ sLog.outErrorEventAI("EventAI not has script for creature entry (%u), but AIName = '%s'.", i, cInfo->AIName); } {
sLog.outErrorEventAI("EventAI not has script for creature entry (%u), but AIName = '%s'.", i, cInfo->AIName);
}
else if (!ainame && hasevent) else if (!ainame && hasevent)
{ sLog.outErrorEventAI("EventAI has script for creature entry (%u), but AIName = '%s' instead 'EventAI'.", i, cInfo->AIName); } { sLog.outErrorEventAI("EventAI has script for creature entry (%u), but AIName = '%s' instead 'EventAI'.", i, cInfo->AIName); }
} }

View file

@ -48,7 +48,9 @@ void DynamicObject::AddToWorld()
{ {
///- Register the dynamicObject for guid lookup ///- Register the dynamicObject for guid lookup
if (!IsInWorld()) if (!IsInWorld())
{ GetMap()->GetObjectsStore().insert<DynamicObject>(GetObjectGuid(), (DynamicObject*)this); } {
GetMap()->GetObjectsStore().insert<DynamicObject>(GetObjectGuid(), (DynamicObject*)this);
}
Object::AddToWorld(); Object::AddToWorld();
} }
@ -134,7 +136,9 @@ void DynamicObject::Update(uint32 /*update_diff*/, uint32 p_time)
bool deleteThis = false; bool deleteThis = false;
if (m_aliveDuration > int32(p_time)) if (m_aliveDuration > int32(p_time))
{ m_aliveDuration -= p_time; } {
m_aliveDuration -= p_time;
}
else else
{ deleteThis = true; } { deleteThis = true; }
@ -204,11 +208,15 @@ void DynamicObject::Delay(int32 delaytime)
bool DynamicObject::isVisibleForInState(Player const* u, WorldObject const* viewPoint, bool inVisibleList) const bool DynamicObject::isVisibleForInState(Player const* u, WorldObject const* viewPoint, bool inVisibleList) const
{ {
if (!IsInWorld() || !u->IsInWorld()) if (!IsInWorld() || !u->IsInWorld())
{ return false; } {
return false;
}
// always seen by owner // always seen by owner
if (GetCasterGuid() == u->GetObjectGuid()) if (GetCasterGuid() == u->GetObjectGuid())
{ return true; } {
return true;
}
// normal case // normal case
return IsWithinDistInMap(viewPoint, GetMap()->GetVisibilityDistance() + (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false); return IsWithinDistInMap(viewPoint, GetMap()->GetVisibilityDistance() + (inVisibleList ? World::GetVisibleObjectGreyDistance() : 0.0f), false);
@ -217,7 +225,9 @@ bool DynamicObject::isVisibleForInState(Player const* u, WorldObject const* view
bool DynamicObject::IsHostileTo(Unit const* unit) const bool DynamicObject::IsHostileTo(Unit const* unit) const
{ {
if (Unit* owner = GetCaster()) if (Unit* owner = GetCaster())
{ return owner->IsHostileTo(unit); } {
return owner->IsHostileTo(unit);
}
else else
{ return false; } { return false; }
} }
@ -225,7 +235,9 @@ bool DynamicObject::IsHostileTo(Unit const* unit) const
bool DynamicObject::IsFriendlyTo(Unit const* unit) const bool DynamicObject::IsFriendlyTo(Unit const* unit) const
{ {
if (Unit* owner = GetCaster()) if (Unit* owner = GetCaster())
{ return owner->IsFriendlyTo(unit); } {
return owner->IsFriendlyTo(unit);
}
else else
{ return true; } { return true; }
} }

View file

@ -45,7 +45,9 @@ namespace MaNGOS
inline uint32 GetGrayLevel(uint32 pl_level) inline uint32 GetGrayLevel(uint32 pl_level)
{ {
if (pl_level <= 5) if (pl_level <= 5)
{ return 0; } {
return 0;
}
else if (pl_level <= 39) else if (pl_level <= 39)
{ return pl_level - 5 - pl_level / 10; } { return pl_level - 5 - pl_level / 10; }
else if (pl_level <= 59) else if (pl_level <= 59)
@ -57,7 +59,9 @@ namespace MaNGOS
inline XPColorChar GetColorCode(uint32 pl_level, uint32 mob_level) inline XPColorChar GetColorCode(uint32 pl_level, uint32 mob_level)
{ {
if (mob_level >= pl_level + 5) if (mob_level >= pl_level + 5)
{ return RED; } {
return RED;
}
else if (mob_level >= pl_level + 3) else if (mob_level >= pl_level + 3)
{ return ORANGE; } { return ORANGE; }
else if (mob_level >= pl_level - 2) else if (mob_level >= pl_level - 2)
@ -102,7 +106,9 @@ namespace MaNGOS
{ {
uint32 nLevelDiff = mob_level - pl_level; uint32 nLevelDiff = mob_level - pl_level;
if (nLevelDiff > 4) if (nLevelDiff > 4)
{ nLevelDiff = 4; } {
nLevelDiff = 4;
}
return ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2; return ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2;
} }
else else
@ -126,10 +132,14 @@ namespace MaNGOS
uint32 xp_gain = BaseGain(pl->getLevel(), u->getLevel(), GetContentLevelsForMapAndZone(pl->GetMapId(), pl->GetZoneId())); uint32 xp_gain = BaseGain(pl->getLevel(), u->getLevel(), GetContentLevelsForMapAndZone(pl->GetMapId(), pl->GetZoneId()));
if (xp_gain == 0) if (xp_gain == 0)
{ return 0; } {
return 0;
}
if (u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->IsElite()) if (u->GetTypeId() == TYPEID_UNIT && ((Creature*)u)->IsElite())
{ xp_gain *= 2; } {
xp_gain *= 2;
}
return (uint32)(xp_gain * sWorld.getConfig(CONFIG_FLOAT_RATE_XP_KILL)); return (uint32)(xp_gain * sWorld.getConfig(CONFIG_FLOAT_RATE_XP_KILL));
} }

View file

@ -63,7 +63,9 @@ void GMTicketMgr::LoadGMTickets()
uint32 guidlow = fields[0].GetUInt32(); uint32 guidlow = fields[0].GetUInt32();
if (!guidlow) if (!guidlow)
{ continue; } {
continue;
}
ObjectGuid guid = ObjectGuid(HIGHGUID_PLAYER, guidlow); ObjectGuid guid = ObjectGuid(HIGHGUID_PLAYER, guidlow);
GMTicket& ticket = m_GMTicketMap[guid]; GMTicket& ticket = m_GMTicketMap[guid];
@ -89,7 +91,9 @@ void GMTicketMgr::DeleteAll()
for (GMTicketMap::const_iterator itr = m_GMTicketMap.begin(); itr != m_GMTicketMap.end(); ++itr) for (GMTicketMap::const_iterator itr = m_GMTicketMap.begin(); itr != m_GMTicketMap.end(); ++itr)
{ {
if (Player* owner = sObjectMgr.GetPlayer(itr->first)) if (Player* owner = sObjectMgr.GetPlayer(itr->first))
{ owner->GetSession()->SendGMTicketGetTicket(0x0A); } {
owner->GetSession()->SendGMTicketGetTicket(0x0A);
}
} }
CharacterDatabase.Execute("DELETE FROM character_ticket"); CharacterDatabase.Execute("DELETE FROM character_ticket");
m_GMTicketListByCreatingOrder.clear(); m_GMTicketListByCreatingOrder.clear();

View file

@ -187,7 +187,9 @@ class GMTicketMgr
{ {
GMTicketMap::iterator itr = m_GMTicketMap.find(guid); GMTicketMap::iterator itr = m_GMTicketMap.find(guid);
if (itr == m_GMTicketMap.end()) if (itr == m_GMTicketMap.end())
{ return NULL; } {
return NULL;
}
return &(itr->second); return &(itr->second);
} }
@ -199,12 +201,16 @@ class GMTicketMgr
GMTicket* GetGMTicketByOrderPos(uint32 pos) GMTicket* GetGMTicketByOrderPos(uint32 pos)
{ {
if (pos >= GetTicketCount()) if (pos >= GetTicketCount())
{ return NULL; } {
return NULL;
}
GMTicketList::iterator itr = m_GMTicketListByCreatingOrder.begin(); GMTicketList::iterator itr = m_GMTicketListByCreatingOrder.begin();
std::advance(itr, pos); std::advance(itr, pos);
if (itr == m_GMTicketListByCreatingOrder.end()) if (itr == m_GMTicketListByCreatingOrder.end())
{ return NULL; } {
return NULL;
}
return *itr; return *itr;
} }
@ -220,7 +226,9 @@ class GMTicketMgr
{ {
GMTicketMap::iterator itr = m_GMTicketMap.find(guid); GMTicketMap::iterator itr = m_GMTicketMap.find(guid);
if (itr == m_GMTicketMap.end()) if (itr == m_GMTicketMap.end())
{ return; } {
return;
}
itr->second.DeleteFromDB(); itr->second.DeleteFromDB();
m_GMTicketListByCreatingOrder.remove(&itr->second); m_GMTicketListByCreatingOrder.remove(&itr->second);
m_GMTicketMap.erase(itr); m_GMTicketMap.erase(itr);

File diff suppressed because it is too large Load diff

View file

@ -690,7 +690,9 @@ class GameObject : public WorldObject
{ {
time_t now = time(NULL); time_t now = time(NULL);
if (m_respawnTime > now) if (m_respawnTime > now)
{ return m_respawnTime; } {
return m_respawnTime;
}
else else
{ return now; } { return now; }
} }

View file

@ -31,7 +31,9 @@
int GuardAI::Permissible(const Creature* creature) int GuardAI::Permissible(const Creature* creature)
{ {
if (creature->IsGuard()) if (creature->IsGuard())
{ return PERMIT_BASE_SPECIAL; } {
return PERMIT_BASE_SPECIAL;
}
return PERMIT_BASE_NO; return PERMIT_BASE_NO;
} }
@ -44,7 +46,9 @@ void GuardAI::MoveInLineOfSight(Unit* u)
{ {
// Ignore Z for flying creatures // Ignore Z for flying creatures
if (!m_creature->CanFly() && m_creature->GetDistanceZ(u) > CREATURE_Z_ATTACK_RANGE) if (!m_creature->CanFly() && m_creature->GetDistanceZ(u) > CREATURE_Z_ATTACK_RANGE)
{ return; } {
return;
}
if (!m_creature->getVictim() && u->IsTargetableForAttack() && if (!m_creature->getVictim() && u->IsTargetableForAttack() &&
(u->IsHostileToPlayers() || m_creature->IsHostileTo(u) /*|| u->getVictim() && m_creature->IsFriendlyTo(u->getVictim())*/) && (u->IsHostileToPlayers() || m_creature->IsHostileTo(u) /*|| u->getVictim() && m_creature->IsFriendlyTo(u->getVictim())*/) &&
@ -107,14 +111,18 @@ void GuardAI::EnterEvadeMode()
// Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead // Remove ChaseMovementGenerator from MotionMaster stack list, and add HomeMovementGenerator instead
if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) if (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE)
{ m_creature->GetMotionMaster()->MoveTargetedHome(); } {
m_creature->GetMotionMaster()->MoveTargetedHome();
}
} }
void GuardAI::UpdateAI(const uint32 /*diff*/) void GuardAI::UpdateAI(const uint32 /*diff*/)
{ {
// update i_victimGuid if i_creature.getVictim() !=0 and changed // update i_victimGuid if i_creature.getVictim() !=0 and changed
if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
{ return; } {
return;
}
i_victimGuid = m_creature->getVictim()->GetObjectGuid(); i_victimGuid = m_creature->getVictim()->GetObjectGuid();
@ -130,7 +138,9 @@ bool GuardAI::IsVisible(Unit* pl) const
void GuardAI::AttackStart(Unit* u) void GuardAI::AttackStart(Unit* u)
{ {
if (!u) if (!u)
{ return; } {
return;
}
if (m_creature->Attack(u, true)) if (m_creature->Attack(u, true))
{ {
@ -146,5 +156,7 @@ void GuardAI::AttackStart(Unit* u)
void GuardAI::JustDied(Unit* killer) void GuardAI::JustDied(Unit* killer)
{ {
if (Player* pkiller = killer->GetCharmerOrOwnerPlayerOrPlayerItself()) if (Player* pkiller = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
{ m_creature->SendZoneUnderAttackMessage(pkiller); } {
m_creature->SendZoneUnderAttackMessage(pkiller);
}
} }

View file

@ -79,7 +79,9 @@ void MemberSlot::ChangeRank(uint32 newRank)
Player* player = sObjectMgr.GetPlayer(guid); Player* player = sObjectMgr.GetPlayer(guid);
// If player not online data in data field will be loaded from guild tabs no need to update it !! // If player not online data in data field will be loaded from guild tabs no need to update it !!
if (player) if (player)
{ player->SetRank(newRank); } {
player->SetRank(newRank);
}
CharacterDatabase.PExecute("UPDATE guild_member SET rank='%u' WHERE guid='%u'", newRank, guid.GetCounter()); CharacterDatabase.PExecute("UPDATE guild_member SET rank='%u' WHERE guid='%u'", newRank, guid.GetCounter());
} }
@ -117,11 +119,15 @@ Guild::~Guild()
bool Guild::Create(Player* leader, std::string gname) bool Guild::Create(Player* leader, std::string gname)
{ {
if (sGuildMgr.GetGuildByName(gname)) if (sGuildMgr.GetGuildByName(gname))
{ return false; } {
return false;
}
WorldSession* lSession = leader->GetSession(); WorldSession* lSession = leader->GetSession();
if (!lSession) if (!lSession)
{ return false; } {
return false;
}
m_LeaderGuid = leader->GetObjectGuid(); m_LeaderGuid = leader->GetObjectGuid();
m_Name = gname; m_Name = gname;
@ -179,12 +185,16 @@ bool Guild::AddMember(ObjectGuid plGuid, uint32 plRank)
if (pl) if (pl)
{ {
if (pl->GetGuildId() != 0) if (pl->GetGuildId() != 0)
{ return false; } {
return false;
}
} }
else else
{ {
if (Player::GetGuildIdFromDB(plGuid) != 0) // player already in guild if (Player::GetGuildIdFromDB(plGuid) != 0) // player already in guild
{ return false; } {
return false;
}
} }
// remove all player signs from another petitions // remove all player signs from another petitions
@ -296,7 +306,9 @@ void Guild::SetGINFO(std::string ginfo)
bool Guild::LoadGuildFromDB(QueryResult* guildDataResult) bool Guild::LoadGuildFromDB(QueryResult* guildDataResult)
{ {
if (!guildDataResult) if (!guildDataResult)
{ return false; } {
return false;
}
Field* fields = guildDataResult->Fetch(); Field* fields = guildDataResult->Fetch();
@ -345,7 +357,9 @@ bool Guild::CheckGuildStructure()
{ {
MemberSlot &member = itr->second; MemberSlot &member = itr->second;
if (member.RankId == GR_GUILDMASTER && m_LeaderGuid != member.guid) if (member.RankId == GR_GUILDMASTER && m_LeaderGuid != member.guid)
{ member.ChangeRank(GR_OFFICER); } {
member.ChangeRank(GR_OFFICER);
}
} }
return true; return true;
@ -373,7 +387,9 @@ bool Guild::LoadRanksFromDB(QueryResult* guildRanksResult)
fields = guildRanksResult->Fetch(); fields = guildRanksResult->Fetch();
// condition that would be true when all ranks in QueryResult will be processed and guild without ranks is being processed // condition that would be true when all ranks in QueryResult will be processed and guild without ranks is being processed
if (!fields) if (!fields)
{ break; } {
break;
}
uint32 guildId = fields[0].GetUInt32(); uint32 guildId = fields[0].GetUInt32();
if (guildId < m_Id) if (guildId < m_Id)
@ -385,7 +401,9 @@ bool Guild::LoadRanksFromDB(QueryResult* guildRanksResult)
} }
if (guildId > m_Id) // we loaded all ranks for this guild already, break cycle if (guildId > m_Id) // we loaded all ranks for this guild already, break cycle
{ break; } {
break;
}
uint32 rankID = fields[1].GetUInt32(); uint32 rankID = fields[1].GetUInt32();
std::string rankName = fields[2].GetCppString(); std::string rankName = fields[2].GetCppString();
@ -393,11 +411,15 @@ bool Guild::LoadRanksFromDB(QueryResult* guildRanksResult)
uint32 rankMoney = fields[4].GetUInt32(); uint32 rankMoney = fields[4].GetUInt32();
if (rankID != m_Ranks.size()) // guild_rank.ids are sequence 0,1,2,3.. if (rankID != m_Ranks.size()) // guild_rank.ids are sequence 0,1,2,3..
{ broken_ranks = true; } {
broken_ranks = true;
}
// first rank is guildmaster, prevent loss leader rights // first rank is guildmaster, prevent loss leader rights
if (m_Ranks.empty()) if (m_Ranks.empty())
{ rankRights |= GR_RIGHT_ALL; } {
rankRights |= GR_RIGHT_ALL;
}
AddRank(rankName, rankRights, rankMoney); AddRank(rankName, rankRights, rankMoney);
} }
@ -432,14 +454,18 @@ bool Guild::LoadRanksFromDB(QueryResult* guildRanksResult)
bool Guild::LoadMembersFromDB(QueryResult* guildMembersResult) bool Guild::LoadMembersFromDB(QueryResult* guildMembersResult)
{ {
if (!guildMembersResult) if (!guildMembersResult)
{ return false; } {
return false;
}
do do
{ {
Field* fields = guildMembersResult->Fetch(); Field* fields = guildMembersResult->Fetch();
// this condition will be true when all rows in QueryResult are processed and new guild without members is going to be loaded - prevent crash // this condition will be true when all rows in QueryResult are processed and new guild without members is going to be loaded - prevent crash
if (!fields) if (!fields)
{ break; } {
break;
}
uint32 guildId = fields[0].GetUInt32(); uint32 guildId = fields[0].GetUInt32();
if (guildId < m_Id) if (guildId < m_Id)
{ {
@ -459,7 +485,9 @@ bool Guild::LoadMembersFromDB(QueryResult* guildMembersResult)
newmember.RankId = fields[2].GetUInt32(); newmember.RankId = fields[2].GetUInt32();
// don't allow member to have not existing rank! // don't allow member to have not existing rank!
if (newmember.RankId >= m_Ranks.size()) if (newmember.RankId >= m_Ranks.size())
{ newmember.RankId = GetLowestRank(); } {
newmember.RankId = GetLowestRank();
}
newmember.Pnote = fields[3].GetCppString(); newmember.Pnote = fields[3].GetCppString();
newmember.OFFnote = fields[4].GetCppString(); newmember.OFFnote = fields[4].GetCppString();
@ -504,7 +532,9 @@ bool Guild::LoadMembersFromDB(QueryResult* guildMembersResult)
while (guildMembersResult->NextRow()); while (guildMembersResult->NextRow());
if (members.empty()) if (members.empty())
{ return false; } {
return false;
}
UpdateAccountsNumber(); UpdateAccountsNumber();
@ -515,7 +545,9 @@ void Guild::SetLeader(ObjectGuid guid)
{ {
MemberSlot* slot = GetMemberSlot(guid); MemberSlot* slot = GetMemberSlot(guid);
if (!slot) if (!slot)
{ return; } {
return;
}
m_LeaderGuid = guid; m_LeaderGuid = guid;
slot->ChangeRank(GR_GUILDMASTER); slot->ChangeRank(GR_GUILDMASTER);
@ -558,13 +590,17 @@ bool Guild::DelMember(ObjectGuid guid, bool isDisbanding)
} }
if (!best) if (!best)
{ return true; } {
return true;
}
SetLeader(newLeaderGUID); SetLeader(newLeaderGUID);
// If player not online data in data field will be loaded from guild tabs no need to update it !! // If player not online data in data field will be loaded from guild tabs no need to update it !!
if (Player* newLeader = sObjectMgr.GetPlayer(newLeaderGUID)) if (Player* newLeader = sObjectMgr.GetPlayer(newLeaderGUID))
{ newLeader->SetRank(GR_GUILDMASTER); } {
newLeader->SetRank(GR_GUILDMASTER);
}
// when leader non-exist (at guild load with deleted leader only) not send broadcasts // when leader non-exist (at guild load with deleted leader only) not send broadcasts
if (oldLeader) if (oldLeader)
@ -588,7 +624,9 @@ bool Guild::DelMember(ObjectGuid guid, bool isDisbanding)
CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", lowguid);
if (!isDisbanding) if (!isDisbanding)
{ UpdateAccountsNumber(); } {
UpdateAccountsNumber();
}
// Used by Eluna // Used by Eluna
#ifdef ENABLE_ELUNA #ifdef ENABLE_ELUNA
@ -612,11 +650,15 @@ bool Guild::ChangeMemberRank(ObjectGuid guid, uint8 newRank)
void Guild::BroadcastToGuild(WorldSession* session, const std::string& msg, uint32 language) void Guild::BroadcastToGuild(WorldSession* session, const std::string& msg, uint32 language)
{ {
if (!session) if (!session)
{ return; } {
return;
}
Player* player = session->GetPlayer(); Player* player = session->GetPlayer();
if (!player || !HasRankRight(player->GetRank(), GR_RIGHT_GCHATSPEAK)) if (!player || !HasRankRight(player->GetRank(), GR_RIGHT_GCHATSPEAK))
{ return; } {
return;
}
WorldPacket data; WorldPacket data;
ChatHandler::BuildChatPacket(data, CHAT_MSG_GUILD, msg.c_str(), Language(language), player->GetChatTag(), player->GetObjectGuid(), player->GetName()); ChatHandler::BuildChatPacket(data, CHAT_MSG_GUILD, msg.c_str(), Language(language), player->GetChatTag(), player->GetObjectGuid(), player->GetName());
@ -626,7 +668,9 @@ void Guild::BroadcastToGuild(WorldSession* session, const std::string& msg, uint
Player* pl = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first)); Player* pl = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (pl && pl->GetSession() && HasRankRight(pl->GetRank(), GR_RIGHT_GCHATLISTEN) && !pl->GetSocial()->HasIgnore(player->GetObjectGuid())) if (pl && pl->GetSession() && HasRankRight(pl->GetRank(), GR_RIGHT_GCHATLISTEN) && !pl->GetSocial()->HasIgnore(player->GetObjectGuid()))
{ pl->GetSession()->SendPacket(&data); } {
pl->GetSession()->SendPacket(&data);
}
} }
} }
@ -650,11 +694,15 @@ void Guild::BroadcastAddonToGuild(WorldSession* session, const std::string& msg,
void Guild::BroadcastToOfficers(WorldSession* session, const std::string& msg, uint32 language) void Guild::BroadcastToOfficers(WorldSession* session, const std::string& msg, uint32 language)
{ {
if (!session) if (!session)
{ return; } {
return;
}
Player* player = session->GetPlayer(); Player* player = session->GetPlayer();
if (!player || !HasRankRight(player->GetRank(), GR_RIGHT_OFFCHATSPEAK)) if (!player || !HasRankRight(player->GetRank(), GR_RIGHT_OFFCHATSPEAK))
{ return; } {
return;
}
for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{ {
@ -691,7 +739,9 @@ void Guild::BroadcastPacket(WorldPacket* packet)
{ {
Player* player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first)); Player* player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (player) if (player)
{ player->GetSession()->SendPacket(packet); } {
player->GetSession()->SendPacket(packet);
}
} }
} }
@ -703,7 +753,9 @@ void Guild::BroadcastPacketToRank(WorldPacket* packet, uint32 rankId)
{ {
Player* player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first)); Player* player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (player) if (player)
{ player->GetSession()->SendPacket(packet); } {
player->GetSession()->SendPacket(packet);
}
} }
} }
} }
@ -744,7 +796,9 @@ void Guild::MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 max
void Guild::CreateRank(std::string name_, uint32 rights) void Guild::CreateRank(std::string name_, uint32 rights)
{ {
if (m_Ranks.size() >= GUILD_RANKS_MAX_COUNT) if (m_Ranks.size() >= GUILD_RANKS_MAX_COUNT)
{ return; } {
return;
}
// ranks are sequence 0,1,2,... where 0 means guildmaster // ranks are sequence 0,1,2,... where 0 means guildmaster
uint32 new_rank_id = m_Ranks.size(); uint32 new_rank_id = m_Ranks.size();
@ -775,7 +829,9 @@ void Guild::DelRank(uint32 rankId)
// client won't allow to have less than GUILD_RANKS_MIN_COUNT ranks in guild // client won't allow to have less than GUILD_RANKS_MIN_COUNT ranks in guild
if (m_Ranks.size() <= GUILD_RANKS_MIN_COUNT || rankId < GUILD_RANKS_MIN_COUNT) if (m_Ranks.size() <= GUILD_RANKS_MIN_COUNT || rankId < GUILD_RANKS_MIN_COUNT)
{ return; } {
return;
}
RankList::iterator itr = m_Ranks.erase(m_Ranks.begin() + rankId); RankList::iterator itr = m_Ranks.erase(m_Ranks.begin() + rankId);
// delete lowest guild_rank // delete lowest guild_rank
@ -826,7 +882,9 @@ void Guild::SwitchRank(uint32 rankId, bool up)
std::string Guild::GetRankName(uint32 rankId) std::string Guild::GetRankName(uint32 rankId)
{ {
if (rankId >= m_Ranks.size()) if (rankId >= m_Ranks.size())
{ return "<unknown>"; } {
return "<unknown>";
}
return m_Ranks[rankId].Name; return m_Ranks[rankId].Name;
} }
@ -834,7 +892,9 @@ std::string Guild::GetRankName(uint32 rankId)
uint32 Guild::GetRankRights(uint32 rankId) uint32 Guild::GetRankRights(uint32 rankId)
{ {
if (rankId >= m_Ranks.size()) if (rankId >= m_Ranks.size())
{ return 0; } {
return 0;
}
return m_Ranks[rankId].Rights; return m_Ranks[rankId].Rights;
} }
@ -842,7 +902,9 @@ uint32 Guild::GetRankRights(uint32 rankId)
void Guild::SetRankName(uint32 rankId, std::string name_) void Guild::SetRankName(uint32 rankId, std::string name_)
{ {
if (rankId >= m_Ranks.size()) if (rankId >= m_Ranks.size())
{ return; } {
return;
}
m_Ranks[rankId].Name = name_; m_Ranks[rankId].Name = name_;
@ -854,7 +916,9 @@ void Guild::SetRankName(uint32 rankId, std::string name_)
void Guild::SetRankRights(uint32 rankId, uint32 rights) void Guild::SetRankRights(uint32 rankId, uint32 rights)
{ {
if (rankId >= m_Ranks.size()) if (rankId >= m_Ranks.size())
{ return; } {
return;
}
m_Ranks[rankId].Rights = rights; m_Ranks[rankId].Rights = rights;
@ -980,7 +1044,9 @@ void Guild::Roster(WorldSession* session /*= NULL*/)
data << uint32(0); data << uint32(0);
if (session) if (session)
{ session->SendPacket(&data); } {
session->SendPacket(&data);
}
else else
{ BroadcastPacket(&data); } { BroadcastPacket(&data); }
DEBUG_LOG("WORLD: Sent (SMSG_GUILD_ROSTER)"); DEBUG_LOG("WORLD: Sent (SMSG_GUILD_ROSTER)");
@ -996,7 +1062,9 @@ void Guild::Query(WorldSession* session)
for (size_t i = 0 ; i < GUILD_RANKS_MAX_COUNT; ++i) // show always 10 ranks for (size_t i = 0 ; i < GUILD_RANKS_MAX_COUNT; ++i) // show always 10 ranks
{ {
if (i < m_Ranks.size()) if (i < m_Ranks.size())
{ data << m_Ranks[i].Name; } {
data << m_Ranks[i].Name;
}
else else
{ data << uint8(0); } // null string { data << uint8(0); } // null string
} }
@ -1079,7 +1147,9 @@ uint32 Guild::GetAccountsNumber()
{ {
// not need recalculation // not need recalculation
if (m_accountsNumber) if (m_accountsNumber)
{ return m_accountsNumber; } {
return m_accountsNumber;
}
// We use a set to be sure each element will be unique // We use a set to be sure each element will be unique
std::set<uint32> accountsIdSet; std::set<uint32> accountsIdSet;
@ -1119,7 +1189,9 @@ void Guild::LoadGuildEventLogFromDB()
// 0 1 2 3 4 5 // 0 1 2 3 4 5
QueryResult* result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog WHERE guildid=%u ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, GUILD_EVENTLOG_MAX_RECORDS); QueryResult* result = CharacterDatabase.PQuery("SELECT LogGuid, EventType, PlayerGuid1, PlayerGuid2, NewRank, TimeStamp FROM guild_eventlog WHERE guildid=%u ORDER BY TimeStamp DESC,LogGuid DESC LIMIT %u", m_Id, GUILD_EVENTLOG_MAX_RECORDS);
if (!result) if (!result)
{ return; } {
return;
}
bool isNextLogGuidSet = false; bool isNextLogGuidSet = false;
// uint32 configCount = sWorld.getConfig(CONFIG_UINT32_GUILD_EVENT_LOG_COUNT); // uint32 configCount = sWorld.getConfig(CONFIG_UINT32_GUILD_EVENT_LOG_COUNT);
// First event in list will be the oldest and the latest event is last event in list // First event in list will be the oldest and the latest event is last event in list
@ -1164,7 +1236,9 @@ void Guild::LogGuildEvent(uint8 EventType, ObjectGuid playerGuid1, ObjectGuid pl
m_GuildEventLogNextGuid = (m_GuildEventLogNextGuid + 1) % sWorld.getConfig(CONFIG_UINT32_GUILD_EVENT_LOG_COUNT); m_GuildEventLogNextGuid = (m_GuildEventLogNextGuid + 1) % sWorld.getConfig(CONFIG_UINT32_GUILD_EVENT_LOG_COUNT);
// Check max records limit // Check max records limit
if (m_GuildEventLog.size() >= GUILD_EVENTLOG_MAX_RECORDS) if (m_GuildEventLog.size() >= GUILD_EVENTLOG_MAX_RECORDS)
{ m_GuildEventLog.pop_front(); } {
m_GuildEventLog.pop_front();
}
// Add event to list // Add event to list
m_GuildEventLog.push_back(NewEvent); m_GuildEventLog.push_back(NewEvent);
// Save event to DB // Save event to DB

View file

@ -401,7 +401,9 @@ class Guild
for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
if (Player* player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first))) if (Player* player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first)))
if (player != except) if (player != except)
{ _do(player); } {
_do(player);
}
} }
void CreateRank(std::string name, uint32 rights); void CreateRank(std::string name, uint32 rights);
@ -443,7 +445,9 @@ class Guild
{ {
for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
if (itr->second.Name == name) if (itr->second.Name == name)
{ return &itr->second; } {
return &itr->second;
}
return NULL; return NULL;
} }

View file

@ -47,7 +47,9 @@ void AddItemsSetItem(Player* player, Item* item)
} }
if (set->required_skill_id && player->GetSkillValue(set->required_skill_id) < set->required_skill_value) if (set->required_skill_id && player->GetSkillValue(set->required_skill_id) < set->required_skill_value)
{ return; } {
return;
}
ItemSetEffect* eff = NULL; ItemSetEffect* eff = NULL;
@ -69,10 +71,14 @@ void AddItemsSetItem(Player* player, Item* item)
size_t x = 0; size_t x = 0;
for (; x < player->ItemSetEff.size(); ++x) for (; x < player->ItemSetEff.size(); ++x)
if (!player->ItemSetEff[x]) if (!player->ItemSetEff[x])
{ break; } {
break;
}
if (x < player->ItemSetEff.size()) if (x < player->ItemSetEff.size())
{ player->ItemSetEff[x] = eff; } {
player->ItemSetEff[x] = eff;
}
else else
{ player->ItemSetEff.push_back(eff); } { player->ItemSetEff.push_back(eff); }
} }
@ -82,18 +88,26 @@ void AddItemsSetItem(Player* player, Item* item)
for (uint32 x = 0; x < 8; ++x) for (uint32 x = 0; x < 8; ++x)
{ {
if (!set->spells[x]) if (!set->spells[x])
{ continue; } {
continue;
}
// not enough for spell // not enough for spell
if (set->items_to_triggerspell[x] > eff->item_count) if (set->items_to_triggerspell[x] > eff->item_count)
{ continue; } {
continue;
}
uint32 z = 0; uint32 z = 0;
for (; z < 8; ++z) for (; z < 8; ++z)
if (eff->spells[z] && eff->spells[z]->Id == set->spells[x]) if (eff->spells[z] && eff->spells[z]->Id == set->spells[x])
{ break; } {
break;
}
if (z < 8) if (z < 8)
{ continue; } {
continue;
}
// new spell // new spell
for (uint32 y = 0; y < 8; ++y) for (uint32 y = 0; y < 8; ++y)
@ -141,18 +155,24 @@ void RemoveItemsSetItem(Player* player, ItemPrototype const* proto)
// can be in case now enough skill requirement for set appling but set has been appliend when skill requirement not enough // can be in case now enough skill requirement for set appling but set has been appliend when skill requirement not enough
if (!eff) if (!eff)
{ return; } {
return;
}
--eff->item_count; --eff->item_count;
for (uint32 x = 0; x < 8; ++x) for (uint32 x = 0; x < 8; ++x)
{ {
if (!set->spells[x]) if (!set->spells[x])
{ continue; } {
continue;
}
// enough for spell // enough for spell
if (set->items_to_triggerspell[x] <= eff->item_count) if (set->items_to_triggerspell[x] <= eff->item_count)
{ continue; } {
continue;
}
for (uint32 z = 0; z < 8; ++z) for (uint32 z = 0; z < 8; ++z)
{ {
@ -177,7 +197,9 @@ void RemoveItemsSetItem(Player* player, ItemPrototype const* proto)
bool ItemCanGoIntoBag(ItemPrototype const* pProto, ItemPrototype const* pBagProto) bool ItemCanGoIntoBag(ItemPrototype const* pProto, ItemPrototype const* pBagProto)
{ {
if (!pProto || !pBagProto) if (!pProto || !pBagProto)
{ return false; } {
return false;
}
switch (pBagProto->Class) switch (pBagProto->Class)
{ {
@ -188,15 +210,21 @@ bool ItemCanGoIntoBag(ItemPrototype const* pProto, ItemPrototype const* pBagProt
return true; return true;
case ITEM_SUBCLASS_SOUL_CONTAINER: case ITEM_SUBCLASS_SOUL_CONTAINER:
if (!(pProto->BagFamily & BAG_FAMILY_SOUL_SHARDS)) if (!(pProto->BagFamily & BAG_FAMILY_SOUL_SHARDS))
{ return false; } {
return false;
}
return true; return true;
case ITEM_SUBCLASS_HERB_CONTAINER: case ITEM_SUBCLASS_HERB_CONTAINER:
if (!(pProto->BagFamily & BAG_FAMILY_HERBS)) if (!(pProto->BagFamily & BAG_FAMILY_HERBS))
{ return false; } {
return false;
}
return true; return true;
case ITEM_SUBCLASS_ENCHANTING_CONTAINER: case ITEM_SUBCLASS_ENCHANTING_CONTAINER:
if (!(pProto->BagFamily & BAG_FAMILY_ENCHANTING_SUPP)) if (!(pProto->BagFamily & BAG_FAMILY_ENCHANTING_SUPP))
{ return false; } {
return false;
}
return true; return true;
case ITEM_SUBCLASS_MINING_CONTAINER: case ITEM_SUBCLASS_MINING_CONTAINER:
if (!(pProto->BagFamily & BAG_FAMILY_MINING_SUPP)) if (!(pProto->BagFamily & BAG_FAMILY_MINING_SUPP))
@ -204,7 +232,9 @@ bool ItemCanGoIntoBag(ItemPrototype const* pProto, ItemPrototype const* pBagProt
return true; return true;
case ITEM_SUBCLASS_ENGINEERING_CONTAINER: case ITEM_SUBCLASS_ENGINEERING_CONTAINER:
if (!(pProto->BagFamily & BAG_FAMILY_ENGINEERING_SUPP)) if (!(pProto->BagFamily & BAG_FAMILY_ENGINEERING_SUPP))
{ return false; } {
return false;
}
return true; return true;
case ITEM_SUBCLASS_GEM_CONTAINER: case ITEM_SUBCLASS_GEM_CONTAINER:
if (!(pProto->BagFamily & BAG_FAMILY_GEMS)) if (!(pProto->BagFamily & BAG_FAMILY_GEMS))
@ -230,11 +260,15 @@ bool ItemCanGoIntoBag(ItemPrototype const* pProto, ItemPrototype const* pBagProt
{ {
case ITEM_SUBCLASS_QUIVER: case ITEM_SUBCLASS_QUIVER:
if (!(pProto->BagFamily & BAG_FAMILY_ARROWS)) if (!(pProto->BagFamily & BAG_FAMILY_ARROWS))
{ return false; } {
return false;
}
return true; return true;
case ITEM_SUBCLASS_AMMO_POUCH: case ITEM_SUBCLASS_AMMO_POUCH:
if (!(pProto->BagFamily & BAG_FAMILY_BULLETS)) if (!(pProto->BagFamily & BAG_FAMILY_BULLETS))
{ return false; } {
return false;
}
return true; return true;
default: default:
return false; return false;
@ -402,7 +436,9 @@ bool Item::Create(uint32 guidlow, uint32 itemid, Player const* owner)
ItemPrototype const* itemProto = ObjectMgr::GetItemPrototype(itemid); ItemPrototype const* itemProto = ObjectMgr::GetItemPrototype(itemid);
if (!itemProto) if (!itemProto)
{ return false; } {
return false;
}
SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1); SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1);
SetUInt32Value(ITEM_FIELD_MAXDURABILITY, itemProto->MaxDurability); SetUInt32Value(ITEM_FIELD_MAXDURABILITY, itemProto->MaxDurability);
@ -426,7 +462,9 @@ bool Item::IsNotEmptyBag() const
void Item::UpdateDuration(Player* owner, uint32 diff) void Item::UpdateDuration(Player* owner, uint32 diff)
{ {
if (!GetUInt32Value(ITEM_FIELD_DURATION)) if (!GetUInt32Value(ITEM_FIELD_DURATION))
{ return; } {
return;
}
// DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)", GetEntry(), GetUInt32Value(ITEM_FIELD_DURATION), diff); // DEBUG_LOG("Item::UpdateDuration Item (Entry: %u Duration %u Diff %u)", GetEntry(), GetUInt32Value(ITEM_FIELD_DURATION), diff);
@ -546,11 +584,15 @@ void Item::SaveToDB()
LootItem* item = loot.LootItemInSlot(i, owner, &qitem); LootItem* item = loot.LootItemInSlot(i, owner, &qitem);
if (!item) if (!item)
{ continue; } {
continue;
}
// questitems use the blocked field for other purposes // questitems use the blocked field for other purposes
if (!qitem && item->is_blocked) if (!qitem && item->is_blocked)
{ continue; } {
continue;
}
stmt.addUInt32(GetGUIDLow()); stmt.addUInt32(GetGUIDLow());
stmt.addUInt32(owner->GetGUIDLow()); stmt.addUInt32(owner->GetGUIDLow());
@ -565,7 +607,9 @@ void Item::SaveToDB()
} }
if (m_lootState != ITEM_LOOT_NONE && m_lootState != ITEM_LOOT_TEMPORARY) if (m_lootState != ITEM_LOOT_NONE && m_lootState != ITEM_LOOT_TEMPORARY)
{ SetLootState(ITEM_LOOT_UNCHANGED); } {
SetLootState(ITEM_LOOT_UNCHANGED);
}
SetState(ITEM_UNCHANGED); SetState(ITEM_UNCHANGED);
} }
@ -596,14 +640,18 @@ bool Item::LoadFromDB(uint32 guidLow, Field* fields, ObjectGuid ownerGuid)
ItemPrototype const* proto = GetProto(); ItemPrototype const* proto = GetProto();
if (!proto) if (!proto)
{ return false; } {
return false;
}
// update max durability (and durability) if need // update max durability (and durability) if need
if (proto->MaxDurability != GetUInt32Value(ITEM_FIELD_MAXDURABILITY)) if (proto->MaxDurability != GetUInt32Value(ITEM_FIELD_MAXDURABILITY))
{ {
SetUInt32Value(ITEM_FIELD_MAXDURABILITY, proto->MaxDurability); SetUInt32Value(ITEM_FIELD_MAXDURABILITY, proto->MaxDurability);
if (GetUInt32Value(ITEM_FIELD_DURABILITY) > proto->MaxDurability) if (GetUInt32Value(ITEM_FIELD_DURABILITY) > proto->MaxDurability)
{ SetUInt32Value(ITEM_FIELD_DURABILITY, proto->MaxDurability); } {
SetUInt32Value(ITEM_FIELD_DURABILITY, proto->MaxDurability);
}
need_save = true; need_save = true;
} }
@ -768,13 +816,17 @@ uint32 Item::GetSkill()
{ {
case ITEM_CLASS_WEAPON: case ITEM_CLASS_WEAPON:
if (proto->SubClass >= MAX_ITEM_SUBCLASS_WEAPON) if (proto->SubClass >= MAX_ITEM_SUBCLASS_WEAPON)
{ return 0; } {
return 0;
}
else else
{ return item_weapon_skills[proto->SubClass]; } { return item_weapon_skills[proto->SubClass]; }
case ITEM_CLASS_ARMOR: case ITEM_CLASS_ARMOR:
if (proto->SubClass >= MAX_ITEM_SUBCLASS_ARMOR) if (proto->SubClass >= MAX_ITEM_SUBCLASS_ARMOR)
{ return 0; } {
return 0;
}
else else
{ return item_armor_skills[proto->SubClass]; } { return item_armor_skills[proto->SubClass]; }
@ -788,7 +840,9 @@ int32 Item::GenerateItemRandomPropertyId(uint32 item_id)
ItemPrototype const* itemProto = sItemStorage.LookupEntry<ItemPrototype>(item_id); ItemPrototype const* itemProto = sItemStorage.LookupEntry<ItemPrototype>(item_id);
if (!itemProto) if (!itemProto)
{ return 0; } {
return 0;
}
// item must have one from this field values not null if it can have random enchantments // item must have one from this field values not null if it can have random enchantments
if ((!itemProto->RandomProperty) && (!itemProto->RandomSuffix)) if ((!itemProto->RandomProperty) && (!itemProto->RandomSuffix))
@ -825,7 +879,9 @@ int32 Item::GenerateItemRandomPropertyId(uint32 item_id)
void Item::SetItemRandomProperties(int32 randomPropId) void Item::SetItemRandomProperties(int32 randomPropId)
{ {
if (!randomPropId) if (!randomPropId)
{ return; } {
return;
}
if (randomPropId > 0) if (randomPropId > 0)
{ {
@ -875,7 +931,9 @@ void Item::SetState(ItemUpdateState state, Player* forplayer)
{ {
// pretend the item never existed // pretend the item never existed
if (forplayer || GetOwnerGuid()) if (forplayer || GetOwnerGuid())
{ RemoveFromUpdateQueueOf(forplayer); } {
RemoveFromUpdateQueueOf(forplayer);
}
delete this; delete this;
return; return;
} }
@ -886,7 +944,9 @@ void Item::SetState(ItemUpdateState state, Player* forplayer)
if (uState != ITEM_NEW) { uState = state; } if (uState != ITEM_NEW) { uState = state; }
if (forplayer || GetOwnerGuid()) if (forplayer || GetOwnerGuid())
{ AddToUpdateQueueOf(forplayer); } {
AddToUpdateQueueOf(forplayer);
}
} }
else else
{ {
@ -900,7 +960,9 @@ void Item::SetState(ItemUpdateState state, Player* forplayer)
void Item::AddToUpdateQueueOf(Player* player) void Item::AddToUpdateQueueOf(Player* player)
{ {
if (IsInUpdateQueue()) if (IsInUpdateQueue())
{ return; } {
return;
}
if (!player) if (!player)
{ {
@ -921,7 +983,9 @@ void Item::AddToUpdateQueueOf(Player* player)
} }
if (player->m_itemUpdateQueueBlocked) if (player->m_itemUpdateQueueBlocked)
{ return; } {
return;
}
player->m_itemUpdateQueue.push_back(this); player->m_itemUpdateQueue.push_back(this);
uQueuePos = player->m_itemUpdateQueue.size() - 1; uQueuePos = player->m_itemUpdateQueue.size() - 1;
@ -930,7 +994,9 @@ void Item::AddToUpdateQueueOf(Player* player)
void Item::RemoveFromUpdateQueueOf(Player* player) void Item::RemoveFromUpdateQueueOf(Player* player)
{ {
if (!IsInUpdateQueue()) if (!IsInUpdateQueue())
{ return; } {
return;
}
if (!player) if (!player)
{ {
@ -951,7 +1017,9 @@ void Item::RemoveFromUpdateQueueOf(Player* player)
} }
if (player->m_itemUpdateQueueBlocked) if (player->m_itemUpdateQueueBlocked)
{ return; } {
return;
}
player->m_itemUpdateQueue[uQueuePos] = NULL; player->m_itemUpdateQueue[uQueuePos] = NULL;
uQueuePos = -1; uQueuePos = -1;
@ -970,23 +1038,35 @@ bool Item::IsEquipped() const
bool Item::CanBeTraded(bool mail) const bool Item::CanBeTraded(bool mail) const
{ {
if ((!mail || !IsBoundAccountWide()) && IsSoulBound()) if ((!mail || !IsBoundAccountWide()) && IsSoulBound())
{ return false; } {
return false;
}
if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty())) if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()))
{ return false; } {
return false;
}
if (Player* owner = GetOwner()) if (Player* owner = GetOwner())
{ {
if (owner->CanUnequipItem(GetPos(), false) != EQUIP_ERR_OK) if (owner->CanUnequipItem(GetPos(), false) != EQUIP_ERR_OK)
{ return false; } {
return false;
}
if (owner->GetLootGuid() == GetObjectGuid()) if (owner->GetLootGuid() == GetObjectGuid())
{ return false; } {
return false;
}
} }
if (HasGeneratedLoot()) if (HasGeneratedLoot())
{ return false; } {
return false;
}
if (IsBoundByEnchant()) if (IsBoundByEnchant())
{ return false; } {
return false;
}
return true; return true;
} }
@ -998,7 +1078,9 @@ bool Item::IsBoundByEnchant() const
{ {
uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot)); uint32 enchant_id = GetEnchantmentId(EnchantmentSlot(enchant_slot));
if (!enchant_id) if (!enchant_id)
{ continue; } {
continue;
}
if (enchant_slot == TRANSMOGRIFY_ENCHANTMENT_SLOT) if (enchant_slot == TRANSMOGRIFY_ENCHANTMENT_SLOT)
return true; return true;
@ -1008,10 +1090,14 @@ bool Item::IsBoundByEnchant() const
SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id); SpellItemEnchantmentEntry const* enchantEntry = sSpellItemEnchantmentStore.LookupEntry(enchant_id);
if (!enchantEntry) if (!enchantEntry)
{ continue; } {
continue;
}
if (enchantEntry->slot & ENCHANTMENT_CAN_SOULBOUND) if (enchantEntry->slot & ENCHANTMENT_CAN_SOULBOUND)
{ return true; } {
return true;
}
} }
return false; return false;
} }
@ -1069,14 +1155,20 @@ bool Item::IsTargetValidForItemUse(Unit* pUnitTarget)
ItemRequiredTargetMapBounds bounds = sObjectMgr.GetItemRequiredTargetMapBounds(GetProto()->ItemId); ItemRequiredTargetMapBounds bounds = sObjectMgr.GetItemRequiredTargetMapBounds(GetProto()->ItemId);
if (bounds.first == bounds.second) if (bounds.first == bounds.second)
{ return true; } {
return true;
}
if (!pUnitTarget) if (!pUnitTarget)
{ return false; } {
return false;
}
for (ItemRequiredTargetMap::const_iterator itr = bounds.first; itr != bounds.second; ++itr) for (ItemRequiredTargetMap::const_iterator itr = bounds.first; itr != bounds.second; ++itr)
if (itr->second.IsFitToRequirements(pUnitTarget)) if (itr->second.IsFitToRequirements(pUnitTarget))
{ return true; } {
return true;
}
return false; return false;
} }
@ -1085,7 +1177,9 @@ void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint
{ {
// Better lost small time at check in comparison lost time at item save to DB. // Better lost small time at check in comparison lost time at item save to DB.
if ((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges)) if ((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges))
{ return; } {
return;
}
if (slot < MAX_INSPECTED_ENCHANTMENT_SLOT) if (slot < MAX_INSPECTED_ENCHANTMENT_SLOT)
{ {
@ -1106,7 +1200,9 @@ void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint
void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration) void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration)
{ {
if (GetEnchantmentDuration(slot) == duration) if (GetEnchantmentDuration(slot) == duration)
{ return; } {
return;
}
SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET, duration);
SetState(ITEM_CHANGED); SetState(ITEM_CHANGED);
@ -1115,7 +1211,9 @@ void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration)
void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges) void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
{ {
if (GetEnchantmentCharges(slot) == charges) if (GetEnchantmentCharges(slot) == charges)
{ return; } {
return;
}
SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, charges); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET, charges);
SetState(ITEM_CHANGED); SetState(ITEM_CHANGED);
@ -1124,7 +1222,9 @@ void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges)
void Item::ClearEnchantment(EnchantmentSlot slot) void Item::ClearEnchantment(EnchantmentSlot slot)
{ {
if (!GetEnchantmentId(slot)) if (!GetEnchantmentId(slot))
{ return; } {
return;
}
for (uint8 x = 0; x < 3; ++x) for (uint8 x = 0; x < 3; ++x)
SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + x, 0); SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot * MAX_ENCHANTMENT_OFFSET + x, 0);
@ -1241,7 +1341,9 @@ void Item::SendTimeUpdate(Player* owner)
uint32 duration = GetUInt32Value(ITEM_FIELD_DURATION); uint32 duration = GetUInt32Value(ITEM_FIELD_DURATION);
if (!duration) if (!duration)
{ return; } {
return;
}
WorldPacket data(SMSG_ITEM_TIME_UPDATE, (8 + 4)); WorldPacket data(SMSG_ITEM_TIME_UPDATE, (8 + 4));
data << ObjectGuid(GetObjectGuid()); data << ObjectGuid(GetObjectGuid());
@ -1257,7 +1359,9 @@ Item* Item::CreateItem(uint32 item, uint32 count, Player const* player, uint32 r
if (ItemPrototype const* pProto = ObjectMgr::GetItemPrototype(item)) if (ItemPrototype const* pProto = ObjectMgr::GetItemPrototype(item))
{ {
if (count > pProto->GetMaxStackSize()) if (count > pProto->GetMaxStackSize())
{ count = pProto->GetMaxStackSize(); } {
count = pProto->GetMaxStackSize();
}
MANGOS_ASSERT(count != 0 && "pProto->Stackable == 0 but checked at loading already"); MANGOS_ASSERT(count != 0 && "pProto->Stackable == 0 but checked at loading already");
@ -1266,7 +1370,9 @@ Item* Item::CreateItem(uint32 item, uint32 count, Player const* player, uint32 r
{ {
pItem->SetCount(count); pItem->SetCount(count);
if (uint32 randId = randomPropertyId ? randomPropertyId : Item::GenerateItemRandomPropertyId(item)) if (uint32 randId = randomPropertyId ? randomPropertyId : Item::GenerateItemRandomPropertyId(item))
{ pItem->SetItemRandomProperties(randId); } {
pItem->SetItemRandomProperties(randId);
}
return pItem; return pItem;
} }
@ -1280,7 +1386,9 @@ Item* Item::CloneItem(uint32 count, Player const* player) const
{ {
Item* newItem = CreateItem(GetEntry(), count, player, GetItemRandomPropertyId()); Item* newItem = CreateItem(GetEntry(), count, player, GetItemRandomPropertyId());
if (!newItem) if (!newItem)
{ return NULL; } {
return NULL;
}
newItem->SetGuidValue(ITEM_FIELD_CREATOR, GetGuidValue(ITEM_FIELD_CREATOR)); newItem->SetGuidValue(ITEM_FIELD_CREATOR, GetGuidValue(ITEM_FIELD_CREATOR));
newItem->SetGuidValue(ITEM_FIELD_GIFTCREATOR, GetGuidValue(ITEM_FIELD_GIFTCREATOR)); newItem->SetGuidValue(ITEM_FIELD_GIFTCREATOR, GetGuidValue(ITEM_FIELD_GIFTCREATOR));
@ -1293,15 +1401,21 @@ bool Item::IsBindedNotWith(Player const* player) const
{ {
// own item // own item
if (GetOwnerGuid() == player->GetObjectGuid()) if (GetOwnerGuid() == player->GetObjectGuid())
{ return false; } {
return false;
}
// has loot with diff owner // has loot with diff owner
if (HasGeneratedLoot()) if (HasGeneratedLoot())
{ return true; } {
return true;
}
// not binded item // not binded item
if (!IsSoulBound()) if (!IsSoulBound())
{ return false; } {
return false;
}
// not BOA item case // not BOA item case
if (!IsBoundAccountWide()) if (!IsBoundAccountWide())
@ -1322,19 +1436,25 @@ bool Item::IsBindedNotWith(Player const* player) const
void Item::AddToClientUpdateList() void Item::AddToClientUpdateList()
{ {
if (Player* pl = GetOwner()) if (Player* pl = GetOwner())
{ pl->GetMap()->AddUpdateObject(this); } {
pl->GetMap()->AddUpdateObject(this);
}
} }
void Item::RemoveFromClientUpdateList() void Item::RemoveFromClientUpdateList()
{ {
if (Player* pl = GetOwner()) if (Player* pl = GetOwner())
{ pl->GetMap()->RemoveUpdateObject(this); } {
pl->GetMap()->RemoveUpdateObject(this);
}
} }
void Item::BuildUpdateData(UpdateDataMapType& update_players) void Item::BuildUpdateData(UpdateDataMapType& update_players)
{ {
if (Player* pl = GetOwner()) if (Player* pl = GetOwner())
{ BuildUpdateDataForPlayer(pl, update_players); } {
BuildUpdateDataForPlayer(pl, update_players);
}
ClearUpdateMask(false); ClearUpdateMask(false);
} }
@ -1343,15 +1463,21 @@ InventoryResult Item::CanBeMergedPartlyWith(ItemPrototype const* proto) const
{ {
// check item type // check item type
if (GetEntry() != proto->ItemId) if (GetEntry() != proto->ItemId)
{ return EQUIP_ERR_ITEM_CANT_STACK; } {
return EQUIP_ERR_ITEM_CANT_STACK;
}
// check free space (full stacks can't be target of merge // check free space (full stacks can't be target of merge
if (GetCount() >= proto->GetMaxStackSize()) if (GetCount() >= proto->GetMaxStackSize())
{ return EQUIP_ERR_ITEM_CANT_STACK; } {
return EQUIP_ERR_ITEM_CANT_STACK;
}
// not allow merge looting currently items // not allow merge looting currently items
if (HasGeneratedLoot()) if (HasGeneratedLoot())
{ return EQUIP_ERR_ALREADY_LOOTED; } {
return EQUIP_ERR_ALREADY_LOOTED;
}
return EQUIP_ERR_OK; return EQUIP_ERR_OK;
} }
@ -1359,10 +1485,14 @@ InventoryResult Item::CanBeMergedPartlyWith(ItemPrototype const* proto) const
bool ItemRequiredTarget::IsFitToRequirements(Unit* pUnitTarget) const bool ItemRequiredTarget::IsFitToRequirements(Unit* pUnitTarget) const
{ {
if (pUnitTarget->GetTypeId() != TYPEID_UNIT) if (pUnitTarget->GetTypeId() != TYPEID_UNIT)
{ return false; } {
return false;
}
if (pUnitTarget->GetEntry() != m_uiTargetEntry) if (pUnitTarget->GetEntry() != m_uiTargetEntry)
{ return false; } {
return false;
}
switch (m_uiType) switch (m_uiType)
{ {
@ -1418,12 +1548,16 @@ void Item::SetLootState(ItemLootUpdateState state)
case ITEM_LOOT_CHANGED: case ITEM_LOOT_CHANGED:
// new loot must stay in new state until saved, temporary must stay until remove // new loot must stay in new state until saved, temporary must stay until remove
if (m_lootState != ITEM_LOOT_NEW && m_lootState != ITEM_LOOT_TEMPORARY) if (m_lootState != ITEM_LOOT_NEW && m_lootState != ITEM_LOOT_TEMPORARY)
{ m_lootState = m_lootState == ITEM_LOOT_NONE ? ITEM_LOOT_NEW : state; } {
m_lootState = m_lootState == ITEM_LOOT_NONE ? ITEM_LOOT_NEW : state;
}
break; break;
case ITEM_LOOT_UNCHANGED: case ITEM_LOOT_UNCHANGED:
// expected that called after DB update or load // expected that called after DB update or load
if (m_lootState == ITEM_LOOT_REMOVED) if (m_lootState == ITEM_LOOT_REMOVED)
{ m_lootState = ITEM_LOOT_NONE; } {
m_lootState = ITEM_LOOT_NONE;
}
// temporary must stay until remove (ignore any changes) // temporary must stay until remove (ignore any changes)
else if (m_lootState != ITEM_LOOT_TEMPORARY) else if (m_lootState != ITEM_LOOT_TEMPORARY)
{ m_lootState = ITEM_LOOT_UNCHANGED; } { m_lootState = ITEM_LOOT_UNCHANGED; }
@ -1441,7 +1575,9 @@ void Item::SetLootState(ItemLootUpdateState state)
} }
if (m_lootState != ITEM_LOOT_NONE && m_lootState != ITEM_LOOT_UNCHANGED && m_lootState != ITEM_LOOT_TEMPORARY) if (m_lootState != ITEM_LOOT_NONE && m_lootState != ITEM_LOOT_UNCHANGED && m_lootState != ITEM_LOOT_TEMPORARY)
{ SetState(ITEM_CHANGED); } {
SetState(ITEM_CHANGED);
}
} }
uint32 Item::GetScriptId() const uint32 Item::GetScriptId() const

View file

@ -150,7 +150,9 @@ void LootStore::LoadLootTable()
LootStoreItem storeitem = LootStoreItem(item, type, chanceOrQuestChance, group, conditionId, mincountOrRef, maxcount); LootStoreItem storeitem = LootStoreItem(item, type, chanceOrQuestChance, group, conditionId, mincountOrRef, maxcount);
if (!storeitem.IsValid(*this, entry)) // Validity checks if (!storeitem.IsValid(*this, entry)) // Validity checks
{ continue; } {
continue;
}
// Looking for the template of the entry // Looking for the template of the entry
// often entries are put together // often entries are put together
@ -191,7 +193,9 @@ bool LootStore::HaveQuestLootFor(uint32 loot_id) const
{ {
LootTemplateMap::const_iterator itr = m_LootTemplates.find(loot_id); LootTemplateMap::const_iterator itr = m_LootTemplates.find(loot_id);
if (itr == m_LootTemplates.end()) if (itr == m_LootTemplates.end())
{ return false; } {
return false;
}
// scan loot for quest items // scan loot for quest items
return itr->second->HasQuestDrop(m_LootTemplates); return itr->second->HasQuestDrop(m_LootTemplates);
@ -202,7 +206,9 @@ bool LootStore::HaveQuestLootForPlayer(uint32 loot_id, Player* player) const
LootTemplateMap::const_iterator tab = m_LootTemplates.find(loot_id); LootTemplateMap::const_iterator tab = m_LootTemplates.find(loot_id);
if (tab != m_LootTemplates.end()) if (tab != m_LootTemplates.end())
if (tab->second->HasQuestDropForPlayer(m_LootTemplates, player)) if (tab->second->HasQuestDropForPlayer(m_LootTemplates, player))
{ return true; } {
return true;
}
return false; return false;
} }
@ -212,7 +218,9 @@ LootTemplate const* LootStore::GetLootFor(uint32 loot_id) const
LootTemplateMap::const_iterator tab = m_LootTemplates.find(loot_id); LootTemplateMap::const_iterator tab = m_LootTemplates.find(loot_id);
if (tab == m_LootTemplates.end()) if (tab == m_LootTemplates.end())
{ return NULL; } {
return NULL;
}
return tab->second; return tab->second;
} }
@ -256,10 +264,14 @@ void LootStore::ReportNotExistedId(uint32 id) const
bool LootStoreItem::Roll(bool rate) const bool LootStoreItem::Roll(bool rate) const
{ {
if (chance >= 100.0f) if (chance >= 100.0f)
{ return true; } {
return true;
}
if (mincountOrRef < 0) // reference case if (mincountOrRef < 0) // reference case
{ return roll_chance_f(chance * (rate ? sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_ITEM_REFERENCED) : 1.0f)); } {
return roll_chance_f(chance * (rate ? sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_ITEM_REFERENCED) : 1.0f));
}
if (type == LOOTITEM_TYPE_CURRENCY) if (type == LOOTITEM_TYPE_CURRENCY)
return roll_chance_f(chance * (rate ? sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_CURRENCY) : 1.0f)); return roll_chance_f(chance * (rate ? sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_CURRENCY) : 1.0f));
@ -430,41 +442,57 @@ bool LootItem::AllowedForPlayer(Player const* player, WorldObject const* lootTar
{ {
ItemPrototype const* pProto = ObjectMgr::GetItemPrototype(itemid); ItemPrototype const* pProto = ObjectMgr::GetItemPrototype(itemid);
if (!pProto) if (!pProto)
{ return false; } {
return false;
}
// not show loot for not own team // not show loot for not own team
if ((pProto->Flags2 & ITEM_FLAG2_HORDE_ONLY) && player->GetTeam() != HORDE) if ((pProto->Flags2 & ITEM_FLAG2_HORDE_ONLY) && player->GetTeam() != HORDE)
{ return false; } {
return false;
}
if ((pProto->Flags2 & ITEM_FLAG2_ALLIANCE_ONLY) && player->GetTeam() != ALLIANCE) if ((pProto->Flags2 & ITEM_FLAG2_ALLIANCE_ONLY) && player->GetTeam() != ALLIANCE)
{ return false; } {
return false;
}
if (needs_quest) if (needs_quest)
{ {
// Checking quests for quest-only drop (check only quests requirements in this case) // Checking quests for quest-only drop (check only quests requirements in this case)
if (!player->HasQuestForItem(itemid)) if (!player->HasQuestForItem(itemid))
{ return false; } {
return false;
}
} }
else else
{ {
// Not quest only drop (check quest starting items for already accepted non-repeatable quests) // Not quest only drop (check quest starting items for already accepted non-repeatable quests)
if (pProto->StartQuest && player->GetQuestStatus(pProto->StartQuest) != QUEST_STATUS_NONE && !player->HasQuestForItem(itemid)) if (pProto->StartQuest && player->GetQuestStatus(pProto->StartQuest) != QUEST_STATUS_NONE && !player->HasQuestForItem(itemid))
{ return false; } {
return false;
}
} }
} }
else if (type == LOOT_ITEM_TYPE_CURRENCY) else if (type == LOOT_ITEM_TYPE_CURRENCY)
{ {
CurrencyTypesEntry const * currency = sCurrencyTypesStore.LookupEntry(itemid); CurrencyTypesEntry const * currency = sCurrencyTypesStore.LookupEntry(itemid);
if (!itemid) if (!itemid)
{ return false; } {
return false;
}
if (!player->isGameMaster()) if (!player->isGameMaster())
{ {
if (currency->Category == CURRENCY_CATEGORY_META) if (currency->Category == CURRENCY_CATEGORY_META)
{ return false; } {
return false;
}
if (currency->Category == CURRENCY_CATEGORY_ARCHAEOLOGY && !player->HasSkill(SKILL_ARCHAEOLOGY)) if (currency->Category == CURRENCY_CATEGORY_ARCHAEOLOGY && !player->HasSkill(SKILL_ARCHAEOLOGY))
{ return false; } {
return false;
}
} }
} }
@ -475,7 +503,9 @@ LootSlotType LootItem::GetSlotTypeForSharedLoot(PermissionTypes permission, Play
{ {
// ignore currencies, looted items, FFA (each player get own copy) and not allowed items // ignore currencies, looted items, FFA (each player get own copy) and not allowed items
if (currency || is_looted || freeforall || (conditionId && !condition_ok) || !AllowedForPlayer(viewer, lootTarget)) if (currency || is_looted || freeforall || (conditionId && !condition_ok) || !AllowedForPlayer(viewer, lootTarget))
{ return MAX_LOOT_SLOT_TYPE; } {
return MAX_LOOT_SLOT_TYPE;
}
switch (permission) switch (permission)
{ {
@ -502,7 +532,9 @@ void Loot::AddItem(LootStoreItem const& item)
if (item.needs_quest) // Quest drop if (item.needs_quest) // Quest drop
{ {
if (m_questItems.size() < MAX_NR_QUEST_ITEMS) if (m_questItems.size() < MAX_NR_QUEST_ITEMS)
{ m_questItems.push_back(LootItem(item)); } {
m_questItems.push_back(LootItem(item));
}
} }
else if (items.size() < MAX_NR_LOOT_ITEMS) // Non-quest drop else if (items.size() < MAX_NR_LOOT_ITEMS) // Non-quest drop
{ {
@ -516,7 +548,9 @@ void Loot::AddItem(LootStoreItem const& item)
{ {
ItemPrototype const* proto = ObjectMgr::GetItemPrototype(item.itemid); ItemPrototype const* proto = ObjectMgr::GetItemPrototype(item.itemid);
if (!proto || !(proto->Flags & ITEM_FLAG_PARTY_LOOT)) if (!proto || !(proto->Flags & ITEM_FLAG_PARTY_LOOT))
{ ++unlootedCount; } {
++unlootedCount;
}
} }
} }
} }
@ -526,14 +560,18 @@ bool Loot::FillLoot(uint32 loot_id, LootStore const& store, Player* loot_owner,
{ {
// Must be provided // Must be provided
if (!loot_owner) if (!loot_owner)
{ return false; } {
return false;
}
LootTemplate const* tab = store.GetLootFor(loot_id); LootTemplate const* tab = store.GetLootFor(loot_id);
if (!tab) if (!tab)
{ {
if (!noEmptyError) if (!noEmptyError)
{ sLog.outErrorDb("Table '%s' loot id #%u used but it doesn't have records.", store.GetName(), loot_id); } {
sLog.outErrorDb("Table '%s' loot id #%u used but it doesn't have records.", store.GetName(), loot_id);
}
return false; return false;
} }
@ -548,7 +586,9 @@ bool Loot::FillLoot(uint32 loot_id, LootStore const& store, Player* loot_owner,
{ {
for (GroupReference* itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next()) for (GroupReference* itr = pGroup->GetFirstMember(); itr != NULL; itr = itr->next())
if (Player* pl = itr->getSource()) if (Player* pl = itr->getSource())
{ FillNotNormalLootFor(pl); } {
FillNotNormalLootFor(pl);
}
} }
// ... for personal loot // ... for personal loot
else else
@ -567,11 +607,15 @@ void Loot::FillNotNormalLootFor(Player* pl)
qmapitr = m_playerQuestItems.find(plguid); qmapitr = m_playerQuestItems.find(plguid);
if (qmapitr == m_playerQuestItems.end()) if (qmapitr == m_playerQuestItems.end())
{ FillQuestLoot(pl); } {
FillQuestLoot(pl);
}
qmapitr = m_playerFFAItems.find(plguid); qmapitr = m_playerFFAItems.find(plguid);
if (qmapitr == m_playerFFAItems.end()) if (qmapitr == m_playerFFAItems.end())
{ FillFFALoot(pl); } {
FillFFALoot(pl);
}
qmapitr = m_playerNonQuestNonFFANonCurrencyConditionalItems.find(plguid); qmapitr = m_playerNonQuestNonFFANonCurrencyConditionalItems.find(plguid);
if (qmapitr == m_playerNonQuestNonFFANonCurrencyConditionalItems.end()) if (qmapitr == m_playerNonQuestNonFFANonCurrencyConditionalItems.end())
@ -641,12 +685,16 @@ QuestItemList* Loot::FillQuestLoot(Player* player)
// //
// increase once if one looter only, looter-times if free for all // increase once if one looter only, looter-times if free for all
if (item.freeforall || !item.is_blocked) if (item.freeforall || !item.is_blocked)
{ ++unlootedCount; } {
++unlootedCount;
}
item.is_blocked = true; item.is_blocked = true;
if (items.size() + ql->size() == MAX_NR_LOOT_ITEMS) if (items.size() + ql->size() == MAX_NR_LOOT_ITEMS)
{ break; } {
break;
}
} }
} }
if (ql->empty()) if (ql->empty())
@ -698,7 +746,9 @@ void Loot::NotifyItemRemoved(uint8 lootIndex)
i_next = i; i_next = i;
++i_next; ++i_next;
if (Player* pl = ObjectAccessor::FindPlayer(*i)) if (Player* pl = ObjectAccessor::FindPlayer(*i))
{ pl->SendNotifyLootItemRemoved(lootIndex); } {
pl->SendNotifyLootItemRemoved(lootIndex);
}
else else
{ m_playersLooting.erase(i); } { m_playersLooting.erase(i); }
} }
@ -713,7 +763,9 @@ void Loot::NotifyMoneyRemoved()
i_next = i; i_next = i;
++i_next; ++i_next;
if (Player* pl = ObjectAccessor::FindPlayer(*i)) if (Player* pl = ObjectAccessor::FindPlayer(*i))
{ pl->SendNotifyLootMoneyRemoved(); } {
pl->SendNotifyLootMoneyRemoved();
}
else else
{ m_playersLooting.erase(i); } { m_playersLooting.erase(i); }
} }
@ -742,10 +794,14 @@ void Loot::NotifyQuestItemRemoved(uint8 questIndex)
uint8 j; uint8 j;
for (j = 0; j < pql.size(); ++j) for (j = 0; j < pql.size(); ++j)
if (pql[j].index == questIndex) if (pql[j].index == questIndex)
{ break; } {
break;
}
if (j < pql.size()) if (j < pql.size())
{ pl->SendNotifyLootItemRemoved(items.size() + j); } {
pl->SendNotifyLootItemRemoved(items.size() + j);
}
} }
} }
else else
@ -758,7 +814,9 @@ void Loot::generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
if (maxAmount > 0) if (maxAmount > 0)
{ {
if (maxAmount <= minAmount) if (maxAmount <= minAmount)
{ gold = uint32(maxAmount * sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_MONEY)); } {
gold = uint32(maxAmount * sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_MONEY));
}
else if ((maxAmount - minAmount) < 32700) else if ((maxAmount - minAmount) < 32700)
{ gold = uint32(urand(minAmount, maxAmount) * sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_MONEY)); } { gold = uint32(urand(minAmount, maxAmount) * sWorld.getConfig(CONFIG_FLOAT_RATE_DROP_MONEY)); }
else else
@ -778,7 +836,9 @@ LootItem* Loot::LootItemInSlot(uint32 lootSlot, Player* player, QuestItem** qite
{ {
QuestItem* qitem2 = &itr->second->at(questSlot); QuestItem* qitem2 = &itr->second->at(questSlot);
if (qitem) if (qitem)
{ *qitem = qitem2; } {
*qitem = qitem2;
}
item = &m_questItems[qitem2->index]; item = &m_questItems[qitem2->index];
is_looted = qitem2->is_looted; is_looted = qitem2->is_looted;
} }
@ -815,7 +875,9 @@ LootItem* Loot::LootItemInSlot(uint32 lootSlot, Player* player, QuestItem** qite
{ {
QuestItem* ffaitem2 = (QuestItem*) & (*iter); QuestItem* ffaitem2 = (QuestItem*) & (*iter);
if (ffaitem) if (ffaitem)
{ *ffaitem = ffaitem2; } {
*ffaitem = ffaitem2;
}
is_looted = ffaitem2->is_looted; is_looted = ffaitem2->is_looted;
break; break;
} }
@ -832,7 +894,9 @@ LootItem* Loot::LootItemInSlot(uint32 lootSlot, Player* player, QuestItem** qite
{ {
QuestItem* conditem2 = (QuestItem*) & (*iter); QuestItem* conditem2 = (QuestItem*) & (*iter);
if (conditem) if (conditem)
{ *conditem = conditem2; } {
*conditem = conditem2;
}
is_looted = conditem2->is_looted; is_looted = conditem2->is_looted;
break; break;
} }
@ -842,7 +906,9 @@ LootItem* Loot::LootItemInSlot(uint32 lootSlot, Player* player, QuestItem** qite
} }
if (is_looted) if (is_looted)
{ return NULL; } {
return NULL;
}
return item; return item;
} }
@ -899,7 +965,9 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
{ {
LootSlotType slot_type = l.items[i].GetSlotTypeForSharedLoot(lv.permission, lv.viewer, l.GetLootTarget()); LootSlotType slot_type = l.items[i].GetSlotTypeForSharedLoot(lv.permission, lv.viewer, l.GetLootTarget());
if (slot_type >= MAX_LOOT_SLOT_TYPE) if (slot_type >= MAX_LOOT_SLOT_TYPE)
{ continue; } {
continue;
}
b << uint8(i) << l.items[i]; b << uint8(i) << l.items[i];
b << uint8(slot_type); // 0 - get 1 - look only 2 - master selection b << uint8(slot_type); // 0 - get 1 - look only 2 - master selection
@ -917,7 +985,9 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
LootSlotType slot_type = item.GetSlotTypeForSharedLoot(lv.permission, lv.viewer, l.GetLootTarget(), !ci->is_looted); LootSlotType slot_type = item.GetSlotTypeForSharedLoot(lv.permission, lv.viewer, l.GetLootTarget(), !ci->is_looted);
if (slot_type >= MAX_LOOT_SLOT_TYPE) if (slot_type >= MAX_LOOT_SLOT_TYPE)
{ continue; } {
continue;
}
b << uint8(ci->index) << item; b << uint8(ci->index) << item;
b << uint8(slot_type); // allow loot b << uint8(slot_type); // allow loot
@ -994,7 +1064,9 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
void LootTemplate::LootGroup::AddEntry(LootStoreItem& item) void LootTemplate::LootGroup::AddEntry(LootStoreItem& item)
{ {
if (item.chance != 0) if (item.chance != 0)
{ ExplicitlyChanced.push_back(item); } {
ExplicitlyChanced.push_back(item);
}
else else
{ EqualChanced.push_back(item); } { EqualChanced.push_back(item); }
} }
@ -1009,15 +1081,21 @@ LootStoreItem const* LootTemplate::LootGroup::Roll() const
for (uint32 i = 0; i < ExplicitlyChanced.size(); ++i) // check each explicitly chanced entry in the template and modify its chance based on quality. for (uint32 i = 0; i < ExplicitlyChanced.size(); ++i) // check each explicitly chanced entry in the template and modify its chance based on quality.
{ {
if (ExplicitlyChanced[i].chance >= 100.0f) if (ExplicitlyChanced[i].chance >= 100.0f)
{ return &ExplicitlyChanced[i]; } {
return &ExplicitlyChanced[i];
}
Roll -= ExplicitlyChanced[i].chance; Roll -= ExplicitlyChanced[i].chance;
if (Roll < 0) if (Roll < 0)
{ return &ExplicitlyChanced[i]; } {
return &ExplicitlyChanced[i];
}
} }
} }
if (!EqualChanced.empty()) // If nothing selected yet - an item is taken from equal-chanced part if (!EqualChanced.empty()) // If nothing selected yet - an item is taken from equal-chanced part
{ return &EqualChanced[irand(0, EqualChanced.size() - 1)]; } {
return &EqualChanced[irand(0, EqualChanced.size() - 1)];
}
return NULL; // Empty drop from the group return NULL; // Empty drop from the group
} }
@ -1027,10 +1105,14 @@ bool LootTemplate::LootGroup::HasQuestDrop() const
{ {
for (LootStoreItemList::const_iterator i = ExplicitlyChanced.begin(); i != ExplicitlyChanced.end(); ++i) for (LootStoreItemList::const_iterator i = ExplicitlyChanced.begin(); i != ExplicitlyChanced.end(); ++i)
if (i->needs_quest) if (i->needs_quest)
{ return true; } {
return true;
}
for (LootStoreItemList::const_iterator i = EqualChanced.begin(); i != EqualChanced.end(); ++i) for (LootStoreItemList::const_iterator i = EqualChanced.begin(); i != EqualChanced.end(); ++i)
if (i->needs_quest) if (i->needs_quest)
{ return true; } {
return true;
}
return false; return false;
} }
@ -1039,10 +1121,14 @@ bool LootTemplate::LootGroup::HasQuestDropForPlayer(Player const* player) const
{ {
for (LootStoreItemList::const_iterator i = ExplicitlyChanced.begin(); i != ExplicitlyChanced.end(); ++i) for (LootStoreItemList::const_iterator i = ExplicitlyChanced.begin(); i != ExplicitlyChanced.end(); ++i)
if (player->HasQuestForItem(i->itemid)) if (player->HasQuestForItem(i->itemid))
{ return true; } {
return true;
}
for (LootStoreItemList::const_iterator i = EqualChanced.begin(); i != EqualChanced.end(); ++i) for (LootStoreItemList::const_iterator i = EqualChanced.begin(); i != EqualChanced.end(); ++i)
if (player->HasQuestForItem(i->itemid)) if (player->HasQuestForItem(i->itemid))
{ return true; } {
return true;
}
return false; return false;
} }
@ -1051,7 +1137,9 @@ void LootTemplate::LootGroup::Process(Loot& loot) const
{ {
LootStoreItem const* item = Roll(); LootStoreItem const* item = Roll();
if (item != NULL) if (item != NULL)
{ loot.AddItem(*item); } {
loot.AddItem(*item);
}
} }
// Overall chance for the group without equal chanced items // Overall chance for the group without equal chanced items
@ -1061,7 +1149,9 @@ float LootTemplate::LootGroup::RawTotalChance() const
for (LootStoreItemList::const_iterator i = ExplicitlyChanced.begin(); i != ExplicitlyChanced.end(); ++i) for (LootStoreItemList::const_iterator i = ExplicitlyChanced.begin(); i != ExplicitlyChanced.end(); ++i)
if (!i->needs_quest) if (!i->needs_quest)
{ result += i->chance; } {
result += i->chance;
}
return result; return result;
} }
@ -1072,7 +1162,9 @@ float LootTemplate::LootGroup::TotalChance() const
float result = RawTotalChance(); float result = RawTotalChance();
if (!EqualChanced.empty() && result < 100.0f) if (!EqualChanced.empty() && result < 100.0f)
{ return 100.0f; } {
return 100.0f;
}
return result; return result;
} }
@ -1098,7 +1190,9 @@ void LootTemplate::LootGroup::CheckLootRefs(LootIdSet* ref_set) const
if (ieItr->mincountOrRef < 0) if (ieItr->mincountOrRef < 0)
{ {
if (!LootTemplates_Reference.GetLootFor(-ieItr->mincountOrRef)) if (!LootTemplates_Reference.GetLootFor(-ieItr->mincountOrRef))
{ LootTemplates_Reference.ReportNotExistedId(-ieItr->mincountOrRef); } {
LootTemplates_Reference.ReportNotExistedId(-ieItr->mincountOrRef);
}
else if (ref_set) else if (ref_set)
{ ref_set->erase(-ieItr->mincountOrRef); } { ref_set->erase(-ieItr->mincountOrRef); }
} }
@ -1109,7 +1203,9 @@ void LootTemplate::LootGroup::CheckLootRefs(LootIdSet* ref_set) const
if (ieItr->mincountOrRef < 0) if (ieItr->mincountOrRef < 0)
{ {
if (!LootTemplates_Reference.GetLootFor(-ieItr->mincountOrRef)) if (!LootTemplates_Reference.GetLootFor(-ieItr->mincountOrRef))
{ LootTemplates_Reference.ReportNotExistedId(-ieItr->mincountOrRef); } {
LootTemplates_Reference.ReportNotExistedId(-ieItr->mincountOrRef);
}
else if (ref_set) else if (ref_set)
{ ref_set->erase(-ieItr->mincountOrRef); } { ref_set->erase(-ieItr->mincountOrRef); }
} }
@ -1160,7 +1256,9 @@ void LootTemplate::Process(Loot& loot, LootStore const& store, bool rate, uint8
// Check condition // Check condition
if (i->conditionId && !sObjectMgr.IsPlayerMeetToCondition(i->conditionId, NULL, NULL, loot.GetLootTarget(), CONDITION_FROM_REFERING_LOOT)) if (i->conditionId && !sObjectMgr.IsPlayerMeetToCondition(i->conditionId, NULL, NULL, loot.GetLootTarget(), CONDITION_FROM_REFERING_LOOT))
{ continue; } {
continue;
}
for (uint32 loop = 0; loop < i->maxcount; ++loop) // Ref multiplicator for (uint32 loop = 0; loop < i->maxcount; ++loop) // Ref multiplicator
{ Referenced->Process(loot, store, rate, i->group); } { Referenced->Process(loot, store, rate, i->group); }
@ -1192,7 +1290,9 @@ bool LootTemplate::HasQuestDrop(LootTemplateMap const& store, uint8 groupId) con
if (Referenced == store.end()) if (Referenced == store.end())
{ continue; } // Error message [should be] already printed at loading stage { continue; } // Error message [should be] already printed at loading stage
if (Referenced->second->HasQuestDrop(store, i->group)) if (Referenced->second->HasQuestDrop(store, i->group))
{ return true; } {
return true;
}
} }
else if (i->needs_quest) else if (i->needs_quest)
{ return true; } // quest drop found { return true; } // quest drop found
@ -1201,7 +1301,9 @@ bool LootTemplate::HasQuestDrop(LootTemplateMap const& store, uint8 groupId) con
// Now processing groups // Now processing groups
for (LootGroups::const_iterator i = Groups.begin() ; i != Groups.end() ; ++i) for (LootGroups::const_iterator i = Groups.begin() ; i != Groups.end() ; ++i)
if (i->HasQuestDrop()) if (i->HasQuestDrop())
{ return true; } {
return true;
}
return false; return false;
} }
@ -1225,7 +1327,9 @@ bool LootTemplate::HasQuestDropForPlayer(LootTemplateMap const& store, Player co
if (Referenced == store.end()) if (Referenced == store.end())
{ continue; } // Error message already printed at loading stage { continue; } // Error message already printed at loading stage
if (Referenced->second->HasQuestDropForPlayer(store, player, i->group)) if (Referenced->second->HasQuestDropForPlayer(store, player, i->group))
{ return true; } {
return true;
}
} }
else if (player->HasQuestForItem(i->itemid)) else if (player->HasQuestForItem(i->itemid))
{ return true; } // active quest drop found { return true; } // active quest drop found
@ -1234,7 +1338,9 @@ bool LootTemplate::HasQuestDropForPlayer(LootTemplateMap const& store, Player co
// Now checking groups // Now checking groups
for (LootGroups::const_iterator i = Groups.begin(); i != Groups.end(); ++i) for (LootGroups::const_iterator i = Groups.begin(); i != Groups.end(); ++i)
if (i->HasQuestDropForPlayer(player)) if (i->HasQuestDropForPlayer(player))
{ return true; } {
return true;
}
return false; return false;
} }
@ -1256,7 +1362,9 @@ void LootTemplate::CheckLootRefs(LootIdSet* ref_set) const
if (ieItr->mincountOrRef < 0) if (ieItr->mincountOrRef < 0)
{ {
if (!LootTemplates_Reference.GetLootFor(-ieItr->mincountOrRef)) if (!LootTemplates_Reference.GetLootFor(-ieItr->mincountOrRef))
{ LootTemplates_Reference.ReportNotExistedId(-ieItr->mincountOrRef); } {
LootTemplates_Reference.ReportNotExistedId(-ieItr->mincountOrRef);
}
else if (ref_set) else if (ref_set)
{ ref_set->erase(-ieItr->mincountOrRef); } { ref_set->erase(-ieItr->mincountOrRef); }
} }
@ -1279,7 +1387,9 @@ void LoadLootTemplates_Creature()
if (uint32 lootid = cInfo->LootId) if (uint32 lootid = cInfo->LootId)
{ {
if (ids_set.find(lootid) == ids_set.end()) if (ids_set.find(lootid) == ids_set.end())
{ LootTemplates_Creature.ReportNotExistedId(lootid); } {
LootTemplates_Creature.ReportNotExistedId(lootid);
}
else else
{ ids_setUsed.insert(lootid); } { ids_setUsed.insert(lootid); }
} }
@ -1309,7 +1419,9 @@ void LoadLootTemplates_Disenchant()
if (uint32 lootid = proto->DisenchantID) if (uint32 lootid = proto->DisenchantID)
{ {
if (ids_set.find(lootid) == ids_set.end()) if (ids_set.find(lootid) == ids_set.end())
{ LootTemplates_Disenchant.ReportNotExistedId(lootid); } {
LootTemplates_Disenchant.ReportNotExistedId(lootid);
}
else else
{ ids_setUsed.insert(lootid); } { ids_setUsed.insert(lootid); }
} }
@ -1331,7 +1443,9 @@ void LoadLootTemplates_Fishing()
{ {
if (AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(i)) if (AreaTableEntry const* areaEntry = sAreaStore.LookupEntry(i))
if (ids_set.find(areaEntry->ID) != ids_set.end()) if (ids_set.find(areaEntry->ID) != ids_set.end())
{ ids_set.erase(areaEntry->ID); } {
ids_set.erase(areaEntry->ID);
}
} }
// by default (look config options) fishing at fail provide junk loot, entry 0 use for store this loot // by default (look config options) fishing at fail provide junk loot, entry 0 use for store this loot
@ -1352,7 +1466,9 @@ void LoadLootTemplates_Gameobject()
if (uint32 lootid = itr->GetLootId()) if (uint32 lootid = itr->GetLootId())
{ {
if (ids_set.find(lootid) == ids_set.end()) if (ids_set.find(lootid) == ids_set.end())
{ LootTemplates_Gameobject.ReportNotExistedId(lootid); } {
LootTemplates_Gameobject.ReportNotExistedId(lootid);
}
else else
{ ids_setUsed.insert(lootid); } { ids_setUsed.insert(lootid); }
} }
@ -1375,10 +1491,14 @@ void LoadLootTemplates_Item()
if (ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype>(i)) if (ItemPrototype const* proto = sItemStorage.LookupEntry<ItemPrototype>(i))
{ {
if (!(proto->Flags & ITEM_FLAG_LOOTABLE)) if (!(proto->Flags & ITEM_FLAG_LOOTABLE))
{ continue; } {
continue;
}
if (ids_set.find(proto->ItemId) != ids_set.end() || proto->MaxMoneyLoot > 0) if (ids_set.find(proto->ItemId) != ids_set.end() || proto->MaxMoneyLoot > 0)
{ ids_set.erase(proto->ItemId); } {
ids_set.erase(proto->ItemId);
}
// wdb have wrong data cases, so skip by default // wdb have wrong data cases, so skip by default
else if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK)) else if (!sLog.HasLogFilter(LOG_FILTER_DB_STRICTED_CHECK))
{ LootTemplates_Item.ReportNotExistedId(proto->ItemId); } { LootTemplates_Item.ReportNotExistedId(proto->ItemId); }
@ -1427,7 +1547,9 @@ void LoadLootTemplates_Pickpocketing()
if (uint32 lootid = cInfo->PickpocketLootId) if (uint32 lootid = cInfo->PickpocketLootId)
{ {
if (ids_set.find(lootid) == ids_set.end()) if (ids_set.find(lootid) == ids_set.end())
{ LootTemplates_Pickpocketing.ReportNotExistedId(lootid); } {
LootTemplates_Pickpocketing.ReportNotExistedId(lootid);
}
else else
{ ids_setUsed.insert(lootid); } { ids_setUsed.insert(lootid); }
} }
@ -1474,7 +1596,9 @@ void LoadLootTemplates_Mail()
for (uint32 i = 1; i < sMailTemplateStore.GetNumRows(); ++i) for (uint32 i = 1; i < sMailTemplateStore.GetNumRows(); ++i)
if (sMailTemplateStore.LookupEntry(i)) if (sMailTemplateStore.LookupEntry(i))
if (ids_set.find(i) != ids_set.end()) if (ids_set.find(i) != ids_set.end())
{ ids_set.erase(i); } {
ids_set.erase(i);
}
// output error for any still listed (not referenced from appropriate table) ids // output error for any still listed (not referenced from appropriate table) ids
LootTemplates_Mail.ReportUnusedIds(ids_set); LootTemplates_Mail.ReportUnusedIds(ids_set);
@ -1493,7 +1617,9 @@ void LoadLootTemplates_Skinning()
if (uint32 lootid = cInfo->SkinningLootId) if (uint32 lootid = cInfo->SkinningLootId)
{ {
if (ids_set.find(lootid) == ids_set.end()) if (ids_set.find(lootid) == ids_set.end())
{ LootTemplates_Skinning.ReportNotExistedId(lootid); } {
LootTemplates_Skinning.ReportNotExistedId(lootid);
}
else else
{ ids_setUsed.insert(lootid); } { ids_setUsed.insert(lootid); }
} }

View file

@ -98,7 +98,9 @@ void Object::_InitValues()
void Object::_Create(uint32 guidlow, uint32 entry, HighGuid guidhigh) void Object::_Create(uint32 guidlow, uint32 entry, HighGuid guidhigh)
{ {
if (!m_uint32Values) if (!m_uint32Values)
{ _InitValues(); } {
_InitValues();
}
ObjectGuid guid = ObjectGuid(guidhigh, entry, guidlow); ObjectGuid guid = ObjectGuid(guidhigh, entry, guidlow);
SetGuidValue(OBJECT_FIELD_GUID, guid); SetGuidValue(OBJECT_FIELD_GUID, guid);
@ -114,7 +116,9 @@ void Object::SetObjectScale(float newScale)
void Object::SendForcedObjectUpdate() void Object::SendForcedObjectUpdate()
{ {
if (!m_inWorld || !m_objectUpdated) if (!m_inWorld || !m_objectUpdated)
{ return; } {
return;
}
UpdateDataMapType update_players; UpdateDataMapType update_players;
@ -133,14 +137,18 @@ void Object::SendForcedObjectUpdate()
void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
{ {
if (!target) if (!target)
{ return; } {
return;
}
uint8 updatetype = UPDATETYPE_CREATE_OBJECT; uint8 updatetype = UPDATETYPE_CREATE_OBJECT;
uint16 updateFlags = m_updateFlag; uint16 updateFlags = m_updateFlag;
/** lower flag1 **/ /** lower flag1 **/
if (target == this) // building packet for yourself if (target == this) // building packet for yourself
{ updateFlags |= UPDATEFLAG_SELF; } {
updateFlags |= UPDATEFLAG_SELF;
}
if (m_itsNewObject) if (m_itsNewObject)
{ {
@ -518,7 +526,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 updateFlags) const
void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* updateMask, Player* target) const void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* updateMask, Player* target) const
{ {
if (!target) if (!target)
{ return; } {
return;
}
uint32 valuesCount = m_valuesCount; uint32 valuesCount = m_valuesCount;
if(GetTypeId() == TYPEID_PLAYER && target != this) if(GetTypeId() == TYPEID_PLAYER && target != this)
@ -532,7 +542,9 @@ void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* u
if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport()) if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
{ {
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster()) if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
{ IsActivateToQuest = true; } {
IsActivateToQuest = true;
}
updateMask->SetBit(GAMEOBJECT_DYNAMIC); updateMask->SetBit(GAMEOBJECT_DYNAMIC);
} }
@ -550,7 +562,9 @@ void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* u
if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport()) if (isType(TYPEMASK_GAMEOBJECT) && !((GameObject*)this)->IsTransport())
{ {
if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster()) if (((GameObject*)this)->ActivateToQuest(target) || target->isGameMaster())
{ IsActivateToQuest = true; } {
IsActivateToQuest = true;
}
updateMask->SetBit(GAMEOBJECT_DYNAMIC); updateMask->SetBit(GAMEOBJECT_DYNAMIC);
updateMask->SetBit(GAMEOBJECT_BYTES_1); // why do we need this here? updateMask->SetBit(GAMEOBJECT_BYTES_1); // why do we need this here?
@ -595,7 +609,9 @@ void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* u
if (appendValue & UNIT_NPC_FLAG_STABLEMASTER) if (appendValue & UNIT_NPC_FLAG_STABLEMASTER)
{ {
if (target->getClass() != CLASS_HUNTER) if (target->getClass() != CLASS_HUNTER)
{ appendValue &= ~UNIT_NPC_FLAG_STABLEMASTER; } {
appendValue &= ~UNIT_NPC_FLAG_STABLEMASTER;
}
} }
} }
@ -656,14 +672,18 @@ void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* u
/* If we're not allowed to loot the target, destroy the lootable flag */ /* If we're not allowed to loot the target, destroy the lootable flag */
if (!target->isAllowedToLoot((Creature*)this)) if (!target->isAllowedToLoot((Creature*)this))
if (send_value & UNIT_DYNFLAG_LOOTABLE) if (send_value & UNIT_DYNFLAG_LOOTABLE)
{ send_value = send_value & ~UNIT_DYNFLAG_LOOTABLE; } {
send_value = send_value & ~UNIT_DYNFLAG_LOOTABLE;
}
/* If we are allowed to loot it and mob is tapped by us, destroy the tapped flag */ /* If we are allowed to loot it and mob is tapped by us, destroy the tapped flag */
bool is_tapped = target->IsTappedByMeOrMyGroup((Creature*)this); bool is_tapped = target->IsTappedByMeOrMyGroup((Creature*)this);
/* If the creature has tapped flag but is tapped by us, remove the flag */ /* If the creature has tapped flag but is tapped by us, remove the flag */
if (send_value & UNIT_DYNFLAG_TAPPED && is_tapped) if (send_value & UNIT_DYNFLAG_TAPPED && is_tapped)
{ send_value = send_value & ~UNIT_DYNFLAG_TAPPED; } {
send_value = send_value & ~UNIT_DYNFLAG_TAPPED;
}
*data << send_value; *data << send_value;
} }
@ -753,7 +773,9 @@ void Object::ClearUpdateMask(bool remove)
if (m_objectUpdated) if (m_objectUpdated)
{ {
if (remove) if (remove)
{ RemoveFromClientUpdateList(); } {
RemoveFromClientUpdateList();
}
m_objectUpdated = false; m_objectUpdated = false;
} }
} }
@ -765,7 +787,9 @@ bool Object::LoadValues(const char* data)
Tokens tokens = StrSplit(data, " "); Tokens tokens = StrSplit(data, " ");
if (tokens.size() != m_valuesCount) if (tokens.size() != m_valuesCount)
{ return false; } {
return false;
}
Tokens::iterator iter; Tokens::iterator iter;
int index; int index;
@ -785,7 +809,9 @@ void Object::_SetUpdateBits(UpdateMask* updateMask, Player* target) const
for (uint16 index = 0; index < valuesCount; ++index ) for (uint16 index = 0; index < valuesCount; ++index )
if (m_changedValues[index]) if (m_changedValues[index])
{ updateMask->SetBit(index); } {
updateMask->SetBit(index);
}
} }
void Object::_SetCreateBits(UpdateMask* updateMask, Player* target) const void Object::_SetCreateBits(UpdateMask* updateMask, Player* target) const
@ -796,7 +822,9 @@ void Object::_SetCreateBits(UpdateMask* updateMask, Player* target) const
for (uint16 index = 0; index < valuesCount; ++index) for (uint16 index = 0; index < valuesCount; ++index)
if (GetUInt32Value(index) != 0) if (GetUInt32Value(index) != 0)
{ updateMask->SetBit(index); } {
updateMask->SetBit(index);
}
} }
void Object::SetInt32Value(uint16 index, int32 value) void Object::SetInt32Value(uint16 index, int32 value)
@ -897,7 +925,9 @@ void Object::SetUInt16Value(uint16 index, uint8 offset, uint16 value)
void Object::SetStatFloatValue(uint16 index, float value) void Object::SetStatFloatValue(uint16 index, float value)
{ {
if (value < 0) if (value < 0)
{ value = 0.0f; } {
value = 0.0f;
}
SetFloatValue(index, value); SetFloatValue(index, value);
} }
@ -905,7 +935,9 @@ void Object::SetStatFloatValue(uint16 index, float value)
void Object::SetStatInt32Value(uint16 index, int32 value) void Object::SetStatInt32Value(uint16 index, int32 value)
{ {
if (value < 0) if (value < 0)
{ value = 0; } {
value = 0;
}
SetUInt32Value(index, uint32(value)); SetUInt32Value(index, uint32(value));
} }
@ -915,7 +947,9 @@ void Object::ApplyModUInt32Value(uint16 index, int32 val, bool apply)
int32 cur = GetUInt32Value(index); int32 cur = GetUInt32Value(index);
cur += (apply ? val : -val); cur += (apply ? val : -val);
if (cur < 0) if (cur < 0)
{ cur = 0; } {
cur = 0;
}
SetUInt32Value(index, cur); SetUInt32Value(index, cur);
} }
@ -938,7 +972,9 @@ void Object::ApplyModPositiveFloatValue(uint16 index, float val, bool apply)
float cur = GetFloatValue(index); float cur = GetFloatValue(index);
cur += (apply ? val : -val); cur += (apply ? val : -val);
if (cur < 0) if (cur < 0)
{ cur = 0; } {
cur = 0;
}
SetFloatValue(index, cur); SetFloatValue(index, cur);
} }
@ -1145,7 +1181,9 @@ void WorldObject::Relocate(float x, float y, float z, float orientation)
m_position.o = NormalizeOrientation(orientation); m_position.o = NormalizeOrientation(orientation);
if (isType(TYPEMASK_UNIT)) if (isType(TYPEMASK_UNIT))
{ ((Unit*)this)->m_movementInfo.ChangePosition(x, y, z, orientation); } {
((Unit*)this)->m_movementInfo.ChangePosition(x, y, z, orientation);
}
} }
void WorldObject::Relocate(float x, float y, float z) void WorldObject::Relocate(float x, float y, float z)
@ -1155,7 +1193,9 @@ void WorldObject::Relocate(float x, float y, float z)
m_position.z = z; m_position.z = z;
if (isType(TYPEMASK_UNIT)) if (isType(TYPEMASK_UNIT))
{ ((Unit*)this)->m_movementInfo.ChangePosition(x, y, z, GetOrientation()); } {
((Unit*)this)->m_movementInfo.ChangePosition(x, y, z, GetOrientation());
}
} }
void WorldObject::SetOrientation(float orientation) void WorldObject::SetOrientation(float orientation)
@ -1163,7 +1203,9 @@ void WorldObject::SetOrientation(float orientation)
m_position.o = NormalizeOrientation(orientation); m_position.o = NormalizeOrientation(orientation);
if (isType(TYPEMASK_UNIT)) if (isType(TYPEMASK_UNIT))
{ ((Unit*)this)->m_movementInfo.ChangeOrientation(orientation); } {
((Unit*)this)->m_movementInfo.ChangeOrientation(orientation);
}
} }
uint32 WorldObject::GetZoneId() const uint32 WorldObject::GetZoneId() const
@ -1330,7 +1372,9 @@ bool WorldObject::IsInRange(WorldObject const* obj, float minRange, float maxRan
{ {
float mindist = minRange + sizefactor; float mindist = minRange + sizefactor;
if (distsq < mindist * mindist) if (distsq < mindist * mindist)
{ return false; } {
return false;
}
} }
float maxdist = maxRange + sizefactor; float maxdist = maxRange + sizefactor;
@ -1350,7 +1394,9 @@ bool WorldObject::IsInRange2d(float x, float y, float minRange, float maxRange)
{ {
float mindist = minRange + sizefactor; float mindist = minRange + sizefactor;
if (distsq < mindist * mindist) if (distsq < mindist * mindist)
{ return false; } {
return false;
}
} }
float maxdist = maxRange + sizefactor; float maxdist = maxRange + sizefactor;
@ -1371,7 +1417,9 @@ bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float m
{ {
float mindist = minRange + sizefactor; float mindist = minRange + sizefactor;
if (distsq < mindist * mindist) if (distsq < mindist * mindist)
{ return false; } {
return false;
}
} }
float maxdist = maxRange + sizefactor; float maxdist = maxRange + sizefactor;
@ -1381,7 +1429,9 @@ bool WorldObject::IsInRange3d(float x, float y, float z, float minRange, float m
float WorldObject::GetAngle(const WorldObject* obj) const float WorldObject::GetAngle(const WorldObject* obj) const
{ {
if (!obj) if (!obj)
{ return 0.0f; } {
return 0.0f;
}
// Rework the assert, when more cases where such a call can happen have been fixed // Rework the assert, when more cases where such a call can happen have been fixed
// MANGOS_ASSERT(obj != this || PrintEntryError("GetAngle (for self)")); // MANGOS_ASSERT(obj != this || PrintEntryError("GetAngle (for self)"));
@ -1408,7 +1458,9 @@ bool WorldObject::HasInArc(const float arcangle, const WorldObject* obj) const
{ {
// always have self in arc // always have self in arc
if (obj == this) if (obj == this)
{ return true; } {
return true;
}
float arc = arcangle; float arc = arcangle;
@ -1421,7 +1473,9 @@ bool WorldObject::HasInArc(const float arcangle, const WorldObject* obj) const
// move angle to range -pi ... +pi // move angle to range -pi ... +pi
angle = NormalizeOrientation(angle); angle = NormalizeOrientation(angle);
if (angle > M_PI_F) if (angle > M_PI_F)
{ angle -= 2.0f * M_PI_F; } {
angle -= 2.0f * M_PI_F;
}
float lborder = -1 * (arc / 2.0f); // in range -pi..0 float lborder = -1 * (arc / 2.0f); // in range -pi..0
float rborder = (arc / 2.0f); // in range 0..pi float rborder = (arc / 2.0f); // in range 0..pi
@ -1490,7 +1544,9 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float& z) const
void WorldObject::UpdateAllowedPositionZ(float x, float y, float& z, Map* atMap /*=NULL*/) const void WorldObject::UpdateAllowedPositionZ(float x, float y, float& z, Map* atMap /*=NULL*/) const
{ {
if (!atMap) if (!atMap)
{ atMap = GetMap(); } {
atMap = GetMap();
}
switch (GetTypeId()) switch (GetTypeId())
{ {
@ -1508,7 +1564,9 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float& z, Map* atMap
if (max_z > INVALID_HEIGHT) if (max_z > INVALID_HEIGHT)
{ {
if (z > max_z) if (z > max_z)
{ z = max_z; } {
z = max_z;
}
else if (z < ground_z) else if (z < ground_z)
{ z = ground_z; } { z = ground_z; }
} }
@ -1517,7 +1575,9 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float& z, Map* atMap
{ {
float ground_z = atMap->GetHeight(GetPhaseMask(), x, y, z); float ground_z = atMap->GetHeight(GetPhaseMask(), x, y, z);
if (z < ground_z) if (z < ground_z)
{ z = ground_z; } {
z = ground_z;
}
} }
break; break;
} }
@ -1531,7 +1591,9 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float& z, Map* atMap
if (max_z > INVALID_HEIGHT) if (max_z > INVALID_HEIGHT)
{ {
if (z > max_z) if (z > max_z)
{ z = max_z; } {
z = max_z;
}
else if (z < ground_z) else if (z < ground_z)
{ z = ground_z; } { z = ground_z; }
} }
@ -1548,7 +1610,9 @@ void WorldObject::UpdateAllowedPositionZ(float x, float y, float& z, Map* atMap
{ {
float ground_z = atMap->GetHeight(GetPhaseMask(), x, y, z); float ground_z = atMap->GetHeight(GetPhaseMask(), x, y, z);
if (ground_z > INVALID_HEIGHT) if (ground_z > INVALID_HEIGHT)
{ z = ground_z; } {
z = ground_z;
}
break; break;
} }
} }
@ -1586,7 +1650,9 @@ void WorldObject::MonsterTextEmote(const char* text, Unit const* target, bool Is
void WorldObject::MonsterWhisper(const char* text, Unit const* target, bool IsBossWhisper) const void WorldObject::MonsterWhisper(const char* text, Unit const* target, bool IsBossWhisper) const
{ {
if (!target || target->GetTypeId() != TYPEID_PLAYER) if (!target || target->GetTypeId() != TYPEID_PLAYER)
{ return; } {
return;
}
WorldPacket data(SMSG_MESSAGECHAT, 200); WorldPacket data(SMSG_MESSAGECHAT, 200);
ChatHandler::BuildChatPacket(data, IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, text, LANG_UNIVERSAL, CHAT_TAG_NONE, GetObjectGuid(), GetName(), ChatHandler::BuildChatPacket(data, IsBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, text, LANG_UNIVERSAL, CHAT_TAG_NONE, GetObjectGuid(), GetName(),
@ -1605,7 +1671,9 @@ namespace MaNGOS
{ {
char const* text = NULL; char const* text = NULL;
if ((int32)i_textData->Content.size() > loc_idx + 1 && !i_textData->Content[loc_idx + 1].empty()) if ((int32)i_textData->Content.size() > loc_idx + 1 && !i_textData->Content[loc_idx + 1].empty())
{ text = i_textData->Content[loc_idx + 1].c_str(); } {
text = i_textData->Content[loc_idx + 1].c_str();
}
else else
{ text = i_textData->Content[0].c_str(); } { text = i_textData->Content[0].c_str(); }
@ -1653,7 +1721,9 @@ void WorldObject::MonsterText(MangosStringLocale const* textData, Unit const* ta
case CHAT_TYPE_WHISPER: case CHAT_TYPE_WHISPER:
{ {
if (!target || target->GetTypeId() != TYPEID_PLAYER) if (!target || target->GetTypeId() != TYPEID_PLAYER)
{ return; } {
return;
}
MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_WHISPER, textData, LANG_UNIVERSAL, target); MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_MONSTER_WHISPER, textData, LANG_UNIVERSAL, target);
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build); MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
say_do((Player*)target); say_do((Player*)target);
@ -1662,7 +1732,9 @@ void WorldObject::MonsterText(MangosStringLocale const* textData, Unit const* ta
case CHAT_TYPE_BOSS_WHISPER: case CHAT_TYPE_BOSS_WHISPER:
{ {
if (!target || target->GetTypeId() != TYPEID_PLAYER) if (!target || target->GetTypeId() != TYPEID_PLAYER)
{ return; } {
return;
}
MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_RAID_BOSS_WHISPER, textData, LANG_UNIVERSAL, target); MaNGOS::MonsterChatBuilder say_build(*this, CHAT_MSG_RAID_BOSS_WHISPER, textData, LANG_UNIVERSAL, target);
MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build); MaNGOS::LocalizedPacketDo<MaNGOS::MonsterChatBuilder> say_do(say_build);
say_do((Player*)target); say_do((Player*)target);
@ -1676,7 +1748,9 @@ void WorldObject::MonsterText(MangosStringLocale const* textData, Unit const* ta
Map::PlayerList const& pList = GetMap()->GetPlayers(); Map::PlayerList const& pList = GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
if (itr->getSource()->GetZoneId() == zoneid) if (itr->getSource()->GetZoneId() == zoneid)
{ say_do(itr->getSource()); } {
say_do(itr->getSource());
}
break; break;
} }
} }
@ -1686,14 +1760,18 @@ void WorldObject::SendMessageToSet(WorldPacket* data, bool /*bToSelf*/) const
{ {
// if object is in world, map for it already created! // if object is in world, map for it already created!
if (IsInWorld()) if (IsInWorld())
{ GetMap()->MessageBroadcast(this, data); } {
GetMap()->MessageBroadcast(this, data);
}
} }
void WorldObject::SendMessageToSetInRange(WorldPacket* data, float dist, bool /*bToSelf*/) const void WorldObject::SendMessageToSetInRange(WorldPacket* data, float dist, bool /*bToSelf*/) const
{ {
// if object is in world, map for it already created! // if object is in world, map for it already created!
if (IsInWorld()) if (IsInWorld())
{ GetMap()->MessageDistBroadcast(this, data, dist); } {
GetMap()->MessageDistBroadcast(this, data, dist);
}
} }
void WorldObject::SendMessageToSetExcept(WorldPacket* data, Player const* skipped_receiver) const void WorldObject::SendMessageToSetExcept(WorldPacket* data, Player const* skipped_receiver) const
@ -1768,12 +1846,16 @@ Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, floa
Team team = TEAM_NONE; Team team = TEAM_NONE;
if (GetTypeId() == TYPEID_PLAYER) if (GetTypeId() == TYPEID_PLAYER)
{ team = ((Player*)this)->GetTeam(); } {
team = ((Player*)this)->GetTeam();
}
CreatureCreatePos pos(GetMap(), x, y, z, ang, GetPhaseMask()); CreatureCreatePos pos(GetMap(), x, y, z, ang, GetPhaseMask());
if (x == 0.0f && y == 0.0f && z == 0.0f) if (x == 0.0f && y == 0.0f && z == 0.0f)
{ pos = CreatureCreatePos(this, GetOrientation(), CONTACT_DISTANCE, ang); } {
pos = CreatureCreatePos(this, GetOrientation(), CONTACT_DISTANCE, ang);
}
if (!pCreature->Create(GetMap()->GenerateLocalLowGuid(cinfo->GetHighGuid()), pos, cinfo, team)) if (!pCreature->Create(GetMap()->GenerateLocalLowGuid(cinfo->GetHighGuid()), pos, cinfo, team))
{ {
@ -1792,7 +1874,9 @@ Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, floa
pCreature->Summon(spwtype, despwtime); // Also initializes the AI and MMGen pCreature->Summon(spwtype, despwtime); // Also initializes the AI and MMGen
if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->AI()) if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->AI())
{ ((Creature*)this)->AI()->JustSummoned(pCreature); } {
((Creature*)this)->AI()->JustSummoned(pCreature);
}
#ifdef ENABLE_ELUNA #ifdef ENABLE_ELUNA
if (Unit* summoner = ToUnit()) if (Unit* summoner = ToUnit())
@ -1801,7 +1885,9 @@ Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, floa
// Creature Linking, Initial load is handled like respawn // Creature Linking, Initial load is handled like respawn
if (pCreature->IsLinkingEventTrigger()) if (pCreature->IsLinkingEventTrigger())
{ GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_RESPAWN, pCreature); } {
GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_RESPAWN, pCreature);
}
// return the creature therewith the summoner has access to it // return the creature therewith the summoner has access to it
return pCreature; return pCreature;
@ -1847,7 +1933,9 @@ namespace MaNGOS
{ {
// skip self or target // skip self or target
if (c == i_searcher || c == &i_object) if (c == i_searcher || c == &i_object)
{ return; } {
return;
}
float x, y, z; float x, y, z;
@ -1865,7 +1953,9 @@ namespace MaNGOS
{ {
// skip self or target // skip self or target
if (u == i_searcher || u == &i_object) if (u == i_searcher || u == &i_object)
{ return; } {
return;
}
float x, y; float x, y;
@ -1885,19 +1975,25 @@ namespace MaNGOS
// It is ok for the objects to require a bit more space // It is ok for the objects to require a bit more space
float delta = u->GetObjectBoundingRadius(); float delta = u->GetObjectBoundingRadius();
if (i_selector.m_searchPosFor && i_selector.m_searchPosFor != u) if (i_selector.m_searchPosFor && i_selector.m_searchPosFor != u)
{ delta += i_selector.m_searchPosFor->GetObjectBoundingRadius(); } {
delta += i_selector.m_searchPosFor->GetObjectBoundingRadius();
}
delta *= OCCUPY_POS_DEPTH_FACTOR; // Increase by factor delta *= OCCUPY_POS_DEPTH_FACTOR; // Increase by factor
// u is too near/far away from i_object. Do not consider it to occupy space // u is too near/far away from i_object. Do not consider it to occupy space
if (fabs(i_selector.m_searcherDist - dist2d) > delta) if (fabs(i_selector.m_searcherDist - dist2d) > delta)
{ return; } {
return;
}
float angle = i_object.GetAngle(u) - i_absAngle; float angle = i_object.GetAngle(u) - i_absAngle;
// move angle to range -pi ... +pi, range before is -2Pi..2Pi // move angle to range -pi ... +pi, range before is -2Pi..2Pi
if (angle > M_PI_F) if (angle > M_PI_F)
{ angle -= 2.0f * M_PI_F; } {
angle -= 2.0f * M_PI_F;
}
else if (angle < -M_PI_F) else if (angle < -M_PI_F)
{ angle += 2.0f * M_PI_F; } { angle += 2.0f * M_PI_F; }
@ -1964,7 +2060,9 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float& x, float& y,
{ UpdateGroundPositionZ(x, y, z); } { UpdateGroundPositionZ(x, y, z); }
if (fabs(init_z - z) < dist && IsWithinLOS(x, y, z)) if (fabs(init_z - z) < dist && IsWithinLOS(x, y, z))
{ return; } {
return;
}
first_los_conflict = true; // first point have LOS problems first_los_conflict = true; // first point have LOS problems
} }
@ -1986,7 +2084,9 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float& x, float& y,
{ UpdateGroundPositionZ(x, y, z); } { UpdateGroundPositionZ(x, y, z); }
if (fabs(init_z - z) < dist && IsWithinLOS(x, y, z)) if (fabs(init_z - z) < dist && IsWithinLOS(x, y, z))
{ return; } {
return;
}
} }
// BAD NEWS: not free pos (or used or have LOS problems) // BAD NEWS: not free pos (or used or have LOS problems)
@ -2018,7 +2118,9 @@ void WorldObject::GetNearPoint(WorldObject const* searcher, float& x, float& y,
{ UpdateGroundPositionZ(x, y, z); } { UpdateGroundPositionZ(x, y, z); }
if (fabs(init_z - z) < dist && IsWithinLOS(x, y, z)) if (fabs(init_z - z) < dist && IsWithinLOS(x, y, z))
{ return; } {
return;
}
} }
// BAD BAD NEWS: all found pos (free and used) have LOS problem :( // BAD BAD NEWS: all found pos (free and used) have LOS problem :(
@ -2046,7 +2148,9 @@ void WorldObject::PlayDistanceSound(uint32 sound_id, Player const* target /*= NU
data << GetObjectGuid(); data << GetObjectGuid();
data << GetObjectGuid(); data << GetObjectGuid();
if (target) if (target)
{ target->SendDirectMessage(&data); } {
target->SendDirectMessage(&data);
}
else else
{ SendMessageToSet(&data, true); } { SendMessageToSet(&data, true); }
} }
@ -2057,7 +2161,9 @@ void WorldObject::PlayDirectSound(uint32 sound_id, Player const* target /*= NULL
data << uint32(sound_id); data << uint32(sound_id);
data << ObjectGuid(); data << ObjectGuid();
if (target) if (target)
{ target->SendDirectMessage(&data); } {
target->SendDirectMessage(&data);
}
else else
{ SendMessageToSet(&data, true); } { SendMessageToSet(&data, true); }
} }
@ -2067,7 +2173,9 @@ void WorldObject::PlayMusic(uint32 sound_id, Player const* target /*= NULL*/) co
WorldPacket data(SMSG_PLAY_MUSIC, 4); WorldPacket data(SMSG_PLAY_MUSIC, 4);
data << uint32(sound_id); data << uint32(sound_id);
if (target) if (target)
{ target->SendDirectMessage(&data); } {
target->SendDirectMessage(&data);
}
else else
{ SendMessageToSet(&data, true); } { SendMessageToSet(&data, true); }
} }
@ -2106,7 +2214,9 @@ struct WorldObjectChangeAccumulator
// send self fields changes in another way, otherwise // send self fields changes in another way, otherwise
// with new camera system when player's camera too far from player, camera wouldn't receive packets and changes from player // with new camera system when player's camera too far from player, camera wouldn't receive packets and changes from player
if (i_object.isType(TYPEMASK_PLAYER)) if (i_object.isType(TYPEMASK_PLAYER))
{ i_object.BuildUpdateDataForPlayer((Player*)&i_object, i_updateDatas); } {
i_object.BuildUpdateDataForPlayer((Player*)&i_object, i_updateDatas);
}
} }
void Visit(CameraMapType& m) void Visit(CameraMapType& m)
@ -2115,7 +2225,9 @@ struct WorldObjectChangeAccumulator
{ {
Player* owner = iter->getSource()->GetOwner(); Player* owner = iter->getSource()->GetOwner();
if (owner != &i_object && owner->HaveAtClient(&i_object)) if (owner != &i_object && owner->HaveAtClient(&i_object))
{ i_object.BuildUpdateDataForPlayer(owner, i_updateDatas); } {
i_object.BuildUpdateDataForPlayer(owner, i_updateDatas);
}
} }
} }
@ -2157,14 +2269,18 @@ bool WorldObject::PrintCoordinatesError(float x, float y, float z, char const* d
void WorldObject::SetActiveObjectState(bool active) void WorldObject::SetActiveObjectState(bool active)
{ {
if (m_isActiveObject == active || (isType(TYPEMASK_PLAYER) && !active)) // player shouldn't became inactive, never if (m_isActiveObject == active || (isType(TYPEMASK_PLAYER) && !active)) // player shouldn't became inactive, never
{ return; } {
return;
}
if (IsInWorld() && !isType(TYPEMASK_PLAYER)) if (IsInWorld() && !isType(TYPEMASK_PLAYER))
// player's update implemented in a different from other active worldobject's way // player's update implemented in a different from other active worldobject's way
// it's considired to use generic way in future // it's considired to use generic way in future
{ {
if (IsActiveObject() && !active) if (IsActiveObject() && !active)
{ GetMap()->RemoveFromActive(this); } {
GetMap()->RemoveFromActive(this);
}
else if (!IsActiveObject() && active) else if (!IsActiveObject() && active)
{ GetMap()->AddToActive(this); } { GetMap()->AddToActive(this); }
} }

View file

@ -128,7 +128,9 @@ class WorldUpdateCounter
time_t timeElapsed() time_t timeElapsed()
{ {
if (!m_tmStart) if (!m_tmStart)
{ m_tmStart = WorldTimer::tickPrevTime(); } {
m_tmStart = WorldTimer::tickPrevTime();
}
return WorldTimer::getMSTimeDiff(m_tmStart, WorldTimer::tickTime()); return WorldTimer::getMSTimeDiff(m_tmStart, WorldTimer::tickTime());
} }
@ -148,7 +150,9 @@ class Object
virtual void AddToWorld() virtual void AddToWorld()
{ {
if (m_inWorld) if (m_inWorld)
{ return; } {
return;
}
m_inWorld = true; m_inWorld = true;
@ -284,7 +288,9 @@ class Object
void ToggleFlag(uint16 index, uint32 flag) void ToggleFlag(uint16 index, uint32 flag)
{ {
if (HasFlag(index, flag)) if (HasFlag(index, flag))
{ RemoveFlag(index, flag); } {
RemoveFlag(index, flag);
}
else else
{ SetFlag(index, flag); } { SetFlag(index, flag); }
} }
@ -306,7 +312,9 @@ class Object
void ApplyModFlag(uint16 index, uint32 flag, bool apply) void ApplyModFlag(uint16 index, uint32 flag, bool apply)
{ {
if (apply) if (apply)
{ SetFlag(index, flag); } {
SetFlag(index, flag);
}
else else
{ RemoveFlag(index, flag); } { RemoveFlag(index, flag); }
} }
@ -317,7 +325,9 @@ class Object
void ToggleByteFlag(uint16 index, uint8 offset, uint8 flag) void ToggleByteFlag(uint16 index, uint8 offset, uint8 flag)
{ {
if (HasByteFlag(index, offset, flag)) if (HasByteFlag(index, offset, flag))
{ RemoveByteFlag(index, offset, flag); } {
RemoveByteFlag(index, offset, flag);
}
else else
{ SetByteFlag(index, offset, flag); } { SetByteFlag(index, offset, flag); }
} }
@ -332,7 +342,9 @@ class Object
void ApplyModByteFlag(uint16 index, uint8 offset, uint32 flag, bool apply) void ApplyModByteFlag(uint16 index, uint8 offset, uint32 flag, bool apply)
{ {
if (apply) if (apply)
{ SetByteFlag(index, offset, flag); } {
SetByteFlag(index, offset, flag);
}
else else
{ RemoveByteFlag(index, offset, flag); } { RemoveByteFlag(index, offset, flag); }
} }
@ -343,7 +355,9 @@ class Object
void ToggleShortFlag(uint16 index, bool highpart, uint8 flag) void ToggleShortFlag(uint16 index, bool highpart, uint8 flag)
{ {
if (HasShortFlag(index, highpart, flag)) if (HasShortFlag(index, highpart, flag))
{ RemoveShortFlag(index, highpart, flag); } {
RemoveShortFlag(index, highpart, flag);
}
else else
{ SetShortFlag(index, highpart, flag); } { SetShortFlag(index, highpart, flag); }
} }
@ -357,7 +371,9 @@ class Object
void ApplyModShortFlag(uint16 index, bool highpart, uint32 flag, bool apply) void ApplyModShortFlag(uint16 index, bool highpart, uint32 flag, bool apply)
{ {
if (apply) if (apply)
{ SetShortFlag(index, highpart, flag); } {
SetShortFlag(index, highpart, flag);
}
else else
{ RemoveShortFlag(index, highpart, flag); } { RemoveShortFlag(index, highpart, flag); }
} }
@ -379,7 +395,9 @@ class Object
void ToggleFlag64(uint16 index, uint64 flag) void ToggleFlag64(uint16 index, uint64 flag)
{ {
if (HasFlag64(index, flag)) if (HasFlag64(index, flag))
{ RemoveFlag64(index, flag); } {
RemoveFlag64(index, flag);
}
else else
{ SetFlag64(index, flag); } { SetFlag64(index, flag); }
} }
@ -393,7 +411,9 @@ class Object
void ApplyModFlag64(uint16 index, uint64 flag, bool apply) void ApplyModFlag64(uint16 index, uint64 flag, bool apply)
{ {
if (apply) if (apply)
{ SetFlag64(index, flag); } {
SetFlag64(index, flag);
}
else else
{ RemoveFlag64(index, flag); } { RemoveFlag64(index, flag); }
} }

View file

@ -59,13 +59,19 @@ Unit*
ObjectAccessor::GetUnit(WorldObject const& u, ObjectGuid guid) ObjectAccessor::GetUnit(WorldObject const& u, ObjectGuid guid)
{ {
if (!guid) if (!guid)
{ return NULL; } {
return NULL;
}
if (guid.IsPlayer()) if (guid.IsPlayer())
{ return FindPlayer(guid); } {
return FindPlayer(guid);
}
if (!u.IsInWorld()) if (!u.IsInWorld())
{ return NULL; } {
return NULL;
}
return u.GetMap()->GetAnyTypeCreature(guid); return u.GetMap()->GetAnyTypeCreature(guid);
} }
@ -74,9 +80,13 @@ Corpse* ObjectAccessor::GetCorpseInMap(ObjectGuid guid, uint32 mapid)
{ {
Corpse* ret = HashMapHolder<Corpse>::Find(guid); Corpse* ret = HashMapHolder<Corpse>::Find(guid);
if (!ret) if (!ret)
{ return NULL; } {
return NULL;
}
if (ret->GetMapId() != mapid) if (ret->GetMapId() != mapid)
{ return NULL; } {
return NULL;
}
return ret; return ret;
} }
@ -84,11 +94,15 @@ Corpse* ObjectAccessor::GetCorpseInMap(ObjectGuid guid, uint32 mapid)
Player* ObjectAccessor::FindPlayer(ObjectGuid guid, bool inWorld /*= true*/) Player* ObjectAccessor::FindPlayer(ObjectGuid guid, bool inWorld /*= true*/)
{ {
if (!guid) if (!guid)
{ return NULL; } {
return NULL;
}
Player* plr = HashMapHolder<Player>::Find(guid); Player* plr = HashMapHolder<Player>::Find(guid);
if (!plr || (!plr->IsInWorld() && inWorld)) if (!plr || (!plr->IsInWorld() && inWorld))
{ return NULL; } {
return NULL;
}
return plr; return plr;
} }
@ -99,7 +113,9 @@ Player* ObjectAccessor::FindPlayerByName(const char* name)
HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers(); HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers();
for (HashMapHolder<Player>::MapType::iterator iter = m.begin(); iter != m.end(); ++iter) for (HashMapHolder<Player>::MapType::iterator iter = m.begin(); iter != m.end(); ++iter)
if (iter->second->IsInWorld() && (::strcmp(name, iter->second->GetName()) == 0)) if (iter->second->IsInWorld() && (::strcmp(name, iter->second->GetName()) == 0))
{ return iter->second; } {
return iter->second;
}
return NULL; return NULL;
} }
@ -130,7 +146,9 @@ ObjectAccessor::GetCorpseForPlayerGUID(ObjectGuid guid)
Player2CorpsesMapType::iterator iter = i_player2corpse.find(guid); Player2CorpsesMapType::iterator iter = i_player2corpse.find(guid);
if (iter == i_player2corpse.end()) if (iter == i_player2corpse.end())
{ return NULL; } {
return NULL;
}
MANGOS_ASSERT(iter->second->GetType() != CORPSE_BONES); MANGOS_ASSERT(iter->second->GetType() != CORPSE_BONES);
return iter->second; return iter->second;
@ -145,7 +163,9 @@ ObjectAccessor::RemoveCorpse(Corpse* corpse)
Player2CorpsesMapType::iterator iter = i_player2corpse.find(corpse->GetOwnerGuid()); Player2CorpsesMapType::iterator iter = i_player2corpse.find(corpse->GetOwnerGuid());
if (iter == i_player2corpse.end()) if (iter == i_player2corpse.end())
{ return; } {
return;
}
// build mapid*cellid -> guid_set map // build mapid*cellid -> guid_set map
CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY()); CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY());
@ -218,7 +238,9 @@ ObjectAccessor::ConvertCorpseForPlayer(ObjectGuid player_guid, bool insignia)
// do not load the map if it's not loaded // do not load the map if it's not loaded
Map* map = sMapMgr.FindMap(corpse->GetMapId(), corpse->GetInstanceId()); Map* map = sMapMgr.FindMap(corpse->GetMapId(), corpse->GetInstanceId());
if (map) if (map)
{ map->Remove(corpse, false); } {
map->Remove(corpse, false);
}
// remove corpse from DB // remove corpse from DB
corpse->DeleteFromDB(); corpse->DeleteFromDB();
@ -250,7 +272,9 @@ ObjectAccessor::ConvertCorpseForPlayer(ObjectGuid player_guid, bool insignia)
for (int i = 0; i < EQUIPMENT_SLOT_END; ++i) for (int i = 0; i < EQUIPMENT_SLOT_END; ++i)
{ {
if (corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i)) if (corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i))
{ bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0); } {
bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0);
}
} }
// add bones in grid store if grid loaded where corpse placed // add bones in grid store if grid loaded where corpse placed
@ -273,7 +297,9 @@ void ObjectAccessor::RemoveOldCorpses()
++next; ++next;
if (!itr->second->IsExpired(now)) if (!itr->second->IsExpired(now))
{ continue; } {
continue;
}
ConvertCorpseForPlayer(itr->first); ConvertCorpseForPlayer(itr->first);
} }

View file

@ -60,12 +60,16 @@ std::string ObjectGuid::GetString() const
{ {
std::string name; std::string name;
if (sObjectMgr.GetPlayerNameByGUID(*this, name)) if (sObjectMgr.GetPlayerNameByGUID(*this, name))
{ str << " " << name; } {
str << " " << name;
}
} }
str << " ("; str << " (";
if (HasEntry()) if (HasEntry())
{ str << (IsPet() ? "Petnumber: " : "Entry: ") << GetEntry() << " "; } {
str << (IsPet() ? "Petnumber: " : "Entry: ") << GetEntry() << " ";
}
str << "Guid: " << GetCounter() << ")"; str << "Guid: " << GetCounter() << ")";
return str.str(); return str.str();
} }

File diff suppressed because it is too large Load diff

View file

@ -649,7 +649,9 @@ class ObjectMgr
{ {
QuestAreaTriggerMap::const_iterator itr = mQuestAreaTriggerMap.find(Trigger_ID); QuestAreaTriggerMap::const_iterator itr = mQuestAreaTriggerMap.find(Trigger_ID);
if (itr != mQuestAreaTriggerMap.end()) if (itr != mQuestAreaTriggerMap.end())
{ return itr->second; } {
return itr->second;
}
return 0; return 0;
} }
bool IsTavernAreaTrigger(uint32 Trigger_ID) const bool IsTavernAreaTrigger(uint32 Trigger_ID) const
@ -674,7 +676,9 @@ class ObjectMgr
{ {
AreaTriggerMap::const_iterator itr = mAreaTriggers.find(trigger); AreaTriggerMap::const_iterator itr = mAreaTriggers.find(trigger);
if (itr != mAreaTriggers.end()) if (itr != mAreaTriggers.end())
{ return &itr->second; } {
return &itr->second;
}
return NULL; return NULL;
} }
@ -685,7 +689,9 @@ class ObjectMgr
{ {
RepRewardRateMap::const_iterator itr = m_RepRewardRateMap.find(factionId); RepRewardRateMap::const_iterator itr = m_RepRewardRateMap.find(factionId);
if (itr != m_RepRewardRateMap.end()) if (itr != m_RepRewardRateMap.end())
{ return &itr->second; } {
return &itr->second;
}
return NULL; return NULL;
} }
@ -694,7 +700,9 @@ class ObjectMgr
{ {
RepOnKillMap::const_iterator itr = mRepOnKill.find(id); RepOnKillMap::const_iterator itr = mRepOnKill.find(id);
if (itr != mRepOnKill.end()) if (itr != mRepOnKill.end())
{ return &itr->second; } {
return &itr->second;
}
return NULL; return NULL;
} }
@ -702,7 +710,9 @@ class ObjectMgr
{ {
RepSpilloverTemplateMap::const_iterator itr = m_RepSpilloverTemplateMap.find(factionId); RepSpilloverTemplateMap::const_iterator itr = m_RepSpilloverTemplateMap.find(factionId);
if (itr != m_RepSpilloverTemplateMap.end()) if (itr != m_RepSpilloverTemplateMap.end())
{ return &itr->second; } {
return &itr->second;
}
return NULL; return NULL;
} }
@ -711,7 +721,9 @@ class ObjectMgr
{ {
PointOfInterestMap::const_iterator itr = mPointsOfInterest.find(id); PointOfInterestMap::const_iterator itr = mPointsOfInterest.find(id);
if (itr != mPointsOfInterest.end()) if (itr != mPointsOfInterest.end())
{ return &itr->second; } {
return &itr->second;
}
return NULL; return NULL;
} }
@ -735,7 +747,9 @@ class ObjectMgr
{ {
DungeonFinderRewardsMap::const_iterator itr = mDungeonFinderRewardsMap.find(level); DungeonFinderRewardsMap::const_iterator itr = mDungeonFinderRewardsMap.find(level);
if (itr != mDungeonFinderRewardsMap.end()) if (itr != mDungeonFinderRewardsMap.end())
{ return &itr->second; } {
return &itr->second;
}
return NULL; return NULL;
} }
@ -884,13 +898,17 @@ class ObjectMgr
uint32 GenerateStaticCreatureLowGuid() uint32 GenerateStaticCreatureLowGuid()
{ {
if (m_StaticCreatureGuids.GetNextAfterMaxUsed() >= m_FirstTemporaryCreatureGuid) if (m_StaticCreatureGuids.GetNextAfterMaxUsed() >= m_FirstTemporaryCreatureGuid)
{ return 0; } {
return 0;
}
return m_StaticCreatureGuids.Generate(); return m_StaticCreatureGuids.Generate();
} }
uint32 GenerateStaticGameObjectLowGuid() uint32 GenerateStaticGameObjectLowGuid()
{ {
if (m_StaticGameObjectGuids.GetNextAfterMaxUsed() >= m_FirstTemporaryGameObjectGuid) if (m_StaticGameObjectGuids.GetNextAfterMaxUsed() >= m_FirstTemporaryGameObjectGuid)
{ return 0; } {
return 0;
}
return m_StaticGameObjectGuids.Generate(); return m_StaticGameObjectGuids.Generate();
} }
@ -966,7 +984,9 @@ class ObjectMgr
{ {
for (CreatureDataMap::const_iterator itr = mCreatureDataMap.begin(); itr != mCreatureDataMap.end(); ++itr) for (CreatureDataMap::const_iterator itr = mCreatureDataMap.begin(); itr != mCreatureDataMap.end(); ++itr)
if (worker(*itr)) if (worker(*itr))
{ break; } {
break;
}
} }
CreatureLocale const* GetCreatureLocale(uint32 entry) const CreatureLocale const* GetCreatureLocale(uint32 entry) const
@ -1059,7 +1079,9 @@ class ObjectMgr
{ {
for (GameObjectDataMap::const_iterator itr = mGameObjectDataMap.begin(); itr != mGameObjectDataMap.end(); ++itr) for (GameObjectDataMap::const_iterator itr = mGameObjectDataMap.begin(); itr != mGameObjectDataMap.end(); ++itr)
if (worker(*itr)) // arg = GameObjectDataPair if (worker(*itr)) // arg = GameObjectDataPair
{ break; } {
break;
}
} }
MangosStringLocale const* GetMangosStringLocale(int32 entry) const MangosStringLocale const* GetMangosStringLocale(int32 entry) const
@ -1072,7 +1094,9 @@ class ObjectMgr
{ {
std::map<int32, uint32>::const_iterator itr = m_loadedStringCount.find(minEntry); std::map<int32, uint32>::const_iterator itr = m_loadedStringCount.find(minEntry);
if (itr != m_loadedStringCount.end()) if (itr != m_loadedStringCount.end())
{ return itr->second; } {
return itr->second;
}
return 0; return 0;
} }
@ -1134,7 +1158,9 @@ class ObjectMgr
{ {
CacheNpcTextIdMap::const_iterator iter = m_mCacheNpcTextIdMap.find(entry); CacheNpcTextIdMap::const_iterator iter = m_mCacheNpcTextIdMap.find(entry);
if (iter == m_mCacheNpcTextIdMap.end()) if (iter == m_mCacheNpcTextIdMap.end())
{ return 0; } {
return 0;
}
return iter->second; return iter->second;
} }
@ -1143,7 +1169,9 @@ class ObjectMgr
{ {
CacheTrainerSpellMap::const_iterator iter = m_mCacheTrainerSpellMap.find(entry); CacheTrainerSpellMap::const_iterator iter = m_mCacheTrainerSpellMap.find(entry);
if (iter == m_mCacheTrainerSpellMap.end()) if (iter == m_mCacheTrainerSpellMap.end())
{ return NULL; } {
return NULL;
}
return &iter->second; return &iter->second;
} }
@ -1152,7 +1180,9 @@ class ObjectMgr
{ {
CacheTrainerSpellMap::const_iterator iter = m_mCacheTrainerTemplateSpellMap.find(entry); CacheTrainerSpellMap::const_iterator iter = m_mCacheTrainerTemplateSpellMap.find(entry);
if (iter == m_mCacheTrainerTemplateSpellMap.end()) if (iter == m_mCacheTrainerTemplateSpellMap.end())
{ return NULL; } {
return NULL;
}
return &iter->second; return &iter->second;
} }
@ -1161,7 +1191,9 @@ class ObjectMgr
{ {
CacheVendorItemMap::const_iterator iter = m_mCacheVendorItemMap.find(entry); CacheVendorItemMap::const_iterator iter = m_mCacheVendorItemMap.find(entry);
if (iter == m_mCacheVendorItemMap.end()) if (iter == m_mCacheVendorItemMap.end())
{ return NULL; } {
return NULL;
}
return &iter->second; return &iter->second;
} }
@ -1170,7 +1202,9 @@ class ObjectMgr
{ {
CacheVendorItemMap::const_iterator iter = m_mCacheVendorTemplateItemMap.find(entry); CacheVendorItemMap::const_iterator iter = m_mCacheVendorTemplateItemMap.find(entry);
if (iter == m_mCacheVendorTemplateItemMap.end()) if (iter == m_mCacheVendorTemplateItemMap.end())
{ return NULL; } {
return NULL;
}
return &iter->second; return &iter->second;
} }

View file

@ -33,11 +33,15 @@ ObjectPosSelector::ObjectPosSelector(float x, float y, float dist, float searche
{ {
// if size == 0, m_anglestep will become 0 -> freeze // if size == 0, m_anglestep will become 0 -> freeze
if (searchedForSize == 0.0f) if (searchedForSize == 0.0f)
{ searchedForSize = DEFAULT_WORLD_OBJECT_SIZE; } {
searchedForSize = DEFAULT_WORLD_OBJECT_SIZE;
}
// undefined behaviour // undefined behaviour
if (m_searcherDist == 0.0f) if (m_searcherDist == 0.0f)
{ m_searcherDist = DEFAULT_WORLD_OBJECT_SIZE; } {
m_searcherDist = DEFAULT_WORLD_OBJECT_SIZE;
}
m_searchedForReqHAngle = atan(OCCUPY_POS_ANGLE_ATAN_FACTOR * searchedForSize / m_searcherDist); m_searchedForReqHAngle = atan(OCCUPY_POS_ANGLE_ATAN_FACTOR * searchedForSize / m_searcherDist);
@ -64,13 +68,17 @@ void ObjectPosSelector::AddUsedArea(WorldObject const* obj, float angle, float d
// skip some unexpected results. // skip some unexpected results.
if (dist == 0.0f) if (dist == 0.0f)
{ return; } {
return;
}
// (half) angle that obj occupies // (half) angle that obj occupies
float sr_angle = atan(OCCUPY_POS_ANGLE_ATAN_FACTOR * obj->GetObjectBoundingRadius() / dist); float sr_angle = atan(OCCUPY_POS_ANGLE_ATAN_FACTOR * obj->GetObjectBoundingRadius() / dist);
if (angle >= 0) if (angle >= 0)
{ m_UsedAreaLists[USED_POS_PLUS].insert(UsedArea(angle, OccupiedArea(sr_angle, obj))); } {
m_UsedAreaLists[USED_POS_PLUS].insert(UsedArea(angle, OccupiedArea(sr_angle, obj)));
}
else else
{ m_UsedAreaLists[USED_POS_MINUS].insert(UsedArea(-angle, OccupiedArea(sr_angle, obj))); } { m_UsedAreaLists[USED_POS_MINUS].insert(UsedArea(-angle, OccupiedArea(sr_angle, obj))); }
} }
@ -149,13 +157,17 @@ bool ObjectPosSelector::NextAngle(float& angle)
if (m_stepAngle[USED_POS_PLUS] < M_PI_F && m_stepAngle[USED_POS_PLUS] <= m_stepAngle[USED_POS_MINUS]) if (m_stepAngle[USED_POS_PLUS] < M_PI_F && m_stepAngle[USED_POS_PLUS] <= m_stepAngle[USED_POS_MINUS])
{ {
if (NextSideAngle(USED_POS_PLUS, angle)) if (NextSideAngle(USED_POS_PLUS, angle))
{ return true; } {
return true;
}
} }
// -- direction less updated // -- direction less updated
else if (m_stepAngle[USED_POS_MINUS] < M_PI_F) else if (m_stepAngle[USED_POS_MINUS] < M_PI_F)
{ {
if (NextSideAngle(USED_POS_MINUS, angle)) if (NextSideAngle(USED_POS_MINUS, angle))
{ return true; } {
return true;
}
} }
// both sides finishes // both sides finishes
else else
@ -182,7 +194,9 @@ bool ObjectPosSelector::NextSideAngle(UsedAreaSide side, float& angle)
// prevent jump to another side // prevent jump to another side
if (m_stepAngle[side] > M_PI_F) if (m_stepAngle[side] > M_PI_F)
{ return false; } {
return false;
}
// no used area anymore on this side // no used area anymore on this side
if (m_nextUsedAreaItr[side] == m_UsedAreaLists[side].end()) if (m_nextUsedAreaItr[side] == m_UsedAreaLists[side].end())

View file

@ -51,7 +51,9 @@ Pet::Pet(PetType type) :
CharmInfo* charmInfo = InitCharmInfo(this); CharmInfo* charmInfo = InitCharmInfo(this);
if (type == MINI_PET) // always passive if (type == MINI_PET) // always passive
{ charmInfo->SetReactState(REACT_PASSIVE); } {
charmInfo->SetReactState(REACT_PASSIVE);
}
} }
Pet::~Pet() Pet::~Pet()
@ -63,7 +65,9 @@ void Pet::AddToWorld()
{ {
///- Register the pet for guid lookup ///- Register the pet for guid lookup
if (!IsInWorld()) if (!IsInWorld())
{ GetMap()->GetObjectsStore().insert<Pet>(GetObjectGuid(), (Pet*)this); } {
GetMap()->GetObjectsStore().insert<Pet>(GetObjectGuid(), (Pet*)this);
}
Unit::AddToWorld(); Unit::AddToWorld();
} }
@ -72,7 +76,9 @@ void Pet::RemoveFromWorld()
{ {
///- Remove the pet from the accessor ///- Remove the pet from the accessor
if (IsInWorld()) if (IsInWorld())
{ GetMap()->GetObjectsStore().erase<Pet>(GetObjectGuid(), (Pet*)NULL); } {
GetMap()->GetObjectsStore().erase<Pet>(GetObjectGuid(), (Pet*)NULL);
}
///- Don't call the function for Creature, normal mobs + totems go in a different storage ///- Don't call the function for Creature, normal mobs + totems go in a different storage
Unit::RemoveFromWorld(); Unit::RemoveFromWorld();
@ -200,7 +206,9 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c
sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType()); sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType());
if (owner->IsPvP()) if (owner->IsPvP())
{ SetPvP(true); } {
SetPvP(true);
}
if (owner->IsFFAPvP()) if (owner->IsFFAPvP())
SetFFAPvP(true); SetFFAPvP(true);
@ -292,7 +300,9 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c
{ {
((Player*)owner)->PetSpellInitialize(); ((Player*)owner)->PetSpellInitialize();
if (((Player*)owner)->GetGroup()) if (((Player*)owner)->GetGroup())
{ ((Player*)owner)->SetGroupUpdateFlag(GROUP_UPDATE_PET); } {
((Player*)owner)->SetGroupUpdateFlag(GROUP_UPDATE_PET);
}
((Player*)owner)->SendTalentsInfoData(true); ((Player*)owner)->SendTalentsInfoData(true);
} }
@ -323,19 +333,27 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petentry, uint32 petnumber, bool c
void Pet::SavePetToDB(PetSaveMode mode) void Pet::SavePetToDB(PetSaveMode mode)
{ {
if (!GetEntry()) if (!GetEntry())
{ return; } {
return;
}
// save only fully controlled creature // save only fully controlled creature
if (!isControlled()) if (!isControlled())
{ return; } {
return;
}
// not save not player pets // not save not player pets
if (!GetOwnerGuid().IsPlayer()) if (!GetOwnerGuid().IsPlayer())
{ return; } {
return;
}
Player* pOwner = (Player*)GetOwner(); Player* pOwner = (Player*)GetOwner();
if (!pOwner) if (!pOwner)
{ return; } {
return;
}
// current/stable/not_in_slot // current/stable/not_in_slot
if (mode >= PET_SAVE_AS_CURRENT) if (mode >= PET_SAVE_AS_CURRENT)
@ -355,7 +373,9 @@ void Pet::SavePetToDB(PetSaveMode mode)
{ {
// pet will lost anyway at restore temporary unsummoned // pet will lost anyway at restore temporary unsummoned
if (getPetType() == HUNTER_PET) if (getPetType() == HUNTER_PET)
{ return; } {
return;
}
// for warlock case // for warlock case
mode = PET_SAVE_NOT_IN_SLOT; mode = PET_SAVE_NOT_IN_SLOT;
@ -366,7 +386,9 @@ void Pet::SavePetToDB(PetSaveMode mode)
// stable and not in slot saves // stable and not in slot saves
if (mode != PET_SAVE_AS_CURRENT) if (mode != PET_SAVE_AS_CURRENT)
{ RemoveAllAuras(); } {
RemoveAllAuras();
}
// save pet's data as one single transaction // save pet's data as one single transaction
CharacterDatabase.BeginTransaction(); CharacterDatabase.BeginTransaction();
@ -445,7 +467,9 @@ void Pet::SavePetToDB(PetSaveMode mode)
void Pet::DeleteFromDB(uint32 guidlow, bool separate_transaction) void Pet::DeleteFromDB(uint32 guidlow, bool separate_transaction)
{ {
if (separate_transaction) if (separate_transaction)
{ CharacterDatabase.BeginTransaction(); } {
CharacterDatabase.BeginTransaction();
}
static SqlStatementID delPet ; static SqlStatementID delPet ;
static SqlStatementID delDeclName ; static SqlStatementID delDeclName ;
@ -469,7 +493,9 @@ void Pet::DeleteFromDB(uint32 guidlow, bool separate_transaction)
stmt.PExecute(guidlow); stmt.PExecute(guidlow);
if (separate_transaction) if (separate_transaction)
{ CharacterDatabase.CommitTransaction(); } {
CharacterDatabase.CommitTransaction();
}
} }
void Pet::SetDeathState(DeathState s) // overwrite virtual Creature::SetDeathState and Unit::SetDeathState void Pet::SetDeathState(DeathState s) // overwrite virtual Creature::SetDeathState and Unit::SetDeathState
@ -479,7 +505,9 @@ void Pet::SetDeathState(DeathState s) // overwrite virtual
{ {
// remove summoned pet (no corpse) // remove summoned pet (no corpse)
if (getPetType() == SUMMON_PET) if (getPetType() == SUMMON_PET)
{ Unsummon(PET_SAVE_NOT_IN_SLOT); } {
Unsummon(PET_SAVE_NOT_IN_SLOT);
}
// other will despawn at corpse desppawning (Pet::Update code) // other will despawn at corpse desppawning (Pet::Update code)
else else
{ {
@ -500,7 +528,9 @@ void Pet::SetDeathState(DeathState s) // overwrite virtual
void Pet::Update(uint32 update_diff, uint32 diff) void Pet::Update(uint32 update_diff, uint32 diff)
{ {
if (m_removed) // pet already removed, just wait in remove queue, no updates if (m_removed) // pet already removed, just wait in remove queue, no updates
{ return; } {
return;
}
switch (m_deathState) switch (m_deathState)
{ {
@ -538,7 +568,9 @@ void Pet::Update(uint32 update_diff, uint32 diff)
if (m_duration > 0) if (m_duration > 0)
{ {
if (m_duration > (int32)update_diff) if (m_duration > (int32)update_diff)
{ m_duration -= (int32)update_diff; } {
m_duration -= (int32)update_diff;
}
else else
{ {
Unsummon(getPetType() != SUMMON_PET ? PET_SAVE_AS_DELETED : PET_SAVE_NOT_IN_SLOT, owner); Unsummon(getPetType() != SUMMON_PET ? PET_SAVE_AS_DELETED : PET_SAVE_NOT_IN_SLOT, owner);
@ -560,7 +592,9 @@ void Pet::RegenerateAll(uint32 update_diff)
if (m_regenTimer <= update_diff) if (m_regenTimer <= update_diff)
{ {
if (!IsInCombat() || IsPolymorphed()) if (!IsInCombat() || IsPolymorphed())
{ RegenerateHealth(); } {
RegenerateHealth();
}
RegeneratePower(); RegeneratePower();
@ -576,17 +610,23 @@ bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
uint32 chainstartstore[ACTIVE_SPELLS_MAX]; uint32 chainstartstore[ACTIVE_SPELLS_MAX];
if (IsPassiveSpell(spellid)) if (IsPassiveSpell(spellid))
{ return true; } {
return true;
}
chainstartstore[0] = sSpellMgr.GetFirstSpellInChain(spellid); chainstartstore[0] = sSpellMgr.GetFirstSpellInChain(spellid);
for (PetSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr) for (PetSpellMap::const_iterator itr = m_spells.begin(); itr != m_spells.end(); ++itr)
{ {
if (itr->second.state == PETSPELL_REMOVED) if (itr->second.state == PETSPELL_REMOVED)
{ continue; } {
continue;
}
if (IsPassiveSpell(itr->first)) if (IsPassiveSpell(itr->first))
{ continue; } {
continue;
}
uint32 chainstart = sSpellMgr.GetFirstSpellInChain(itr->first); uint32 chainstart = sSpellMgr.GetFirstSpellInChain(itr->first);
@ -595,14 +635,18 @@ bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
for (x = 0; x < activecount; ++x) for (x = 0; x < activecount; ++x)
{ {
if (chainstart == chainstartstore[x]) if (chainstart == chainstartstore[x])
{ break; } {
break;
}
} }
if (x == activecount) // spellchain not yet saved -> add active count if (x == activecount) // spellchain not yet saved -> add active count
{ {
++activecount; ++activecount;
if (activecount > ACTIVE_SPELLS_MAX) if (activecount > ACTIVE_SPELLS_MAX)
{ return false; } {
return false;
}
chainstartstore[x] = chainstart; chainstartstore[x] = chainstart;
} }
} }
@ -612,14 +656,18 @@ bool Pet::CanTakeMoreActiveSpells(uint32 spellid)
void Pet::Unsummon(PetSaveMode mode, Unit* owner /*= NULL*/) void Pet::Unsummon(PetSaveMode mode, Unit* owner /*= NULL*/)
{ {
if (!owner) if (!owner)
{ owner = GetOwner(); } {
owner = GetOwner();
}
CombatStop(); CombatStop();
if (owner) if (owner)
{ {
if (GetOwnerGuid() != owner->GetObjectGuid()) if (GetOwnerGuid() != owner->GetObjectGuid())
{ return; } {
return;
}
Player* p_owner = owner->GetTypeId() == TYPEID_PLAYER ? (Player*)owner : NULL; Player* p_owner = owner->GetTypeId() == TYPEID_PLAYER ? (Player*)owner : NULL;
@ -661,7 +709,9 @@ void Pet::Unsummon(PetSaveMode mode, Unit* owner /*= NULL*/)
p_owner->RemovePetActionBar(); p_owner->RemovePetActionBar();
if (p_owner->GetGroup()) if (p_owner->GetGroup())
{ p_owner->SetGroupUpdateFlag(GROUP_UPDATE_PET); } {
p_owner->SetGroupUpdateFlag(GROUP_UPDATE_PET);
}
} }
} }
@ -678,7 +728,9 @@ void Pet::Unsummon(PetSaveMode mode, Unit* owner /*= NULL*/)
break; break;
default: default:
if (owner->GetPetGuid() == GetObjectGuid()) if (owner->GetPetGuid() == GetObjectGuid())
{ owner->SetPet(NULL); } {
owner->SetPet(NULL);
}
break; break;
} }
} }
@ -691,20 +743,28 @@ void Pet::Unsummon(PetSaveMode mode, Unit* owner /*= NULL*/)
void Pet::GivePetXP(uint32 xp) void Pet::GivePetXP(uint32 xp)
{ {
if (getPetType() != HUNTER_PET) if (getPetType() != HUNTER_PET)
{ return; } {
return;
}
if (xp < 1) if (xp < 1)
{ return; } {
return;
}
if (!IsAlive()) if (!IsAlive())
{ return; } {
return;
}
uint32 level = getLevel(); uint32 level = getLevel();
uint32 maxlevel = std::min(sWorld.getConfig(CONFIG_UINT32_MAX_PLAYER_LEVEL), GetOwner()->getLevel()); uint32 maxlevel = std::min(sWorld.getConfig(CONFIG_UINT32_MAX_PLAYER_LEVEL), GetOwner()->getLevel());
// pet not receive xp for level equal to owner level // pet not receive xp for level equal to owner level
if (level >= maxlevel) if (level >= maxlevel)
{ return; } {
return;
}
xp *= sWorld.getConfig(CONFIG_FLOAT_RATE_PET_XP_KILL); xp *= sWorld.getConfig(CONFIG_FLOAT_RATE_PET_XP_KILL);
@ -728,7 +788,9 @@ void Pet::GivePetXP(uint32 xp)
void Pet::GivePetLevel(uint32 level) void Pet::GivePetLevel(uint32 level)
{ {
if (!level || level == getLevel()) if (!level || level == getLevel())
{ return; } {
return;
}
if (getPetType() == HUNTER_PET) if (getPetType() == HUNTER_PET)
{ {
@ -756,7 +818,9 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
BASIC_LOG("Create pet"); BASIC_LOG("Create pet");
uint32 pet_number = sObjectMgr.GeneratePetNumber(); uint32 pet_number = sObjectMgr.GeneratePetNumber();
if (!Create(guid, pos, creature->GetCreatureInfo(), pet_number)) if (!Create(guid, pos, creature->GetCreatureInfo(), pet_number))
{ return false; } {
return false;
}
CreatureInfo const* cInfo = GetCreatureInfo(); CreatureInfo const* cInfo = GetCreatureInfo();
if (!cInfo) if (!cInfo)
@ -774,7 +838,9 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE); SetUInt32Value(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_NONE);
if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cInfo->Family)) if (CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cInfo->Family))
{ SetName(cFamily->Name[sWorld.GetDefaultDbcLocale()]); } {
SetName(cFamily->Name[sWorld.GetDefaultDbcLocale()]);
}
else else
{ SetName(creature->GetNameForLocaleIdx(sObjectMgr.GetDBCLocaleIndex())); } { SetName(creature->GetNameForLocaleIdx(sObjectMgr.GetDBCLocaleIndex())); }
@ -918,7 +984,9 @@ void Pet::InitStatsForLevel(uint32 petlevel)
// 40% damage bonus of mage's frost damage // 40% damage bonus of mage's frost damage
float val = owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FROST) * 0.4f; float val = owner->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_FROST) * 0.4f;
if (val < 0) if (val < 0)
{ val = 0; } {
val = 0;
}
SetBonusDamage(int32(val)); SetBonusDamage(int32(val));
break; break;
} }
@ -1097,15 +1165,21 @@ void Pet::InitStatsForLevel(uint32 petlevel)
bool Pet::HaveInDiet(ItemPrototype const* item) const bool Pet::HaveInDiet(ItemPrototype const* item) const
{ {
if (!item->FoodType) if (!item->FoodType)
{ return false; } {
return false;
}
CreatureInfo const* cInfo = GetCreatureInfo(); CreatureInfo const* cInfo = GetCreatureInfo();
if (!cInfo) if (!cInfo)
{ return false; } {
return false;
}
CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cInfo->Family); CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cInfo->Family);
if (!cFamily) if (!cFamily)
{ return false; } {
return false;
}
uint32 diet = cFamily->petFoodMask; uint32 diet = cFamily->petFoodMask;
uint32 FoodMask = 1 << (item->FoodType - 1); uint32 FoodMask = 1 << (item->FoodType - 1);
@ -1116,7 +1190,9 @@ uint32 Pet::GetCurrentFoodBenefitLevel(uint32 itemlevel)
{ {
// -5 or greater food level // -5 or greater food level
if (getLevel() <= itemlevel + 5) // possible to feed level 60 pet with level 55 level food for full effect if (getLevel() <= itemlevel + 5) // possible to feed level 60 pet with level 55 level food for full effect
{ return 35000; } {
return 35000;
}
// -10..-6 // -10..-6
else if (getLevel() <= itemlevel + 10) // pure guess, but sounds good else if (getLevel() <= itemlevel + 10) // pure guess, but sounds good
{ return 17000; } { return 17000; }
@ -1158,7 +1234,9 @@ void Pet::_LoadSpellCooldowns()
// skip outdated cooldown // skip outdated cooldown
if (db_time <= curTime) if (db_time <= curTime)
{ continue; } {
continue;
}
data << uint32(spell_id); data << uint32(spell_id);
data << uint32(uint32(db_time - curTime)*IN_MILLISECONDS); data << uint32(uint32(db_time - curTime)*IN_MILLISECONDS);
@ -1192,7 +1270,9 @@ void Pet::_SaveSpellCooldowns()
for (CreatureSpellCooldowns::iterator itr = m_CreatureSpellCooldowns.begin(); itr != m_CreatureSpellCooldowns.end();) for (CreatureSpellCooldowns::iterator itr = m_CreatureSpellCooldowns.begin(); itr != m_CreatureSpellCooldowns.end();)
{ {
if (itr->second <= curTime) if (itr->second <= curTime)
{ m_CreatureSpellCooldowns.erase(itr++); } {
m_CreatureSpellCooldowns.erase(itr++);
}
else else
{ {
stmt = CharacterDatabase.CreateStatement(insSpellCD, "INSERT INTO pet_spell_cooldown (guid,spell,time) VALUES (?, ?, ?)"); stmt = CharacterDatabase.CreateStatement(insSpellCD, "INSERT INTO pet_spell_cooldown (guid,spell,time) VALUES (?, ?, ?)");
@ -1231,7 +1311,9 @@ void Pet::_SaveSpells()
// prevent saving family passives to DB // prevent saving family passives to DB
if (itr->second.type == PETSPELL_FAMILY) if (itr->second.type == PETSPELL_FAMILY)
{ continue; } {
continue;
}
switch (itr->second.state) switch (itr->second.state)
{ {
@ -1303,12 +1385,16 @@ void Pet::_LoadAuras(uint32 timediff)
// do not load single target auras (unless they were cast by the player) // do not load single target auras (unless they were cast by the player)
if (casterGuid != GetObjectGuid() && IsSingleTargetSpell(spellproto)) if (casterGuid != GetObjectGuid() && IsSingleTargetSpell(spellproto))
{ continue; } {
continue;
}
if (remaintime != -1 && !IsPositiveSpell(spellproto)) if (remaintime != -1 && !IsPositiveSpell(spellproto))
{ {
if (remaintime / IN_MILLISECONDS <= int32(timediff)) if (remaintime / IN_MILLISECONDS <= int32(timediff))
{ continue; } {
continue;
}
remaintime -= timediff * IN_MILLISECONDS; remaintime -= timediff * IN_MILLISECONDS;
} }
@ -1325,7 +1411,9 @@ void Pet::_LoadAuras(uint32 timediff)
uint32 defstackamount = spellproto->GetStackAmount(); uint32 defstackamount = spellproto->GetStackAmount();
if (!defstackamount) if (!defstackamount)
{ stackcount = 1; } {
stackcount = 1;
}
else if (defstackamount < stackcount) else if (defstackamount < stackcount)
stackcount = defstackamount; stackcount = defstackamount;
else if (!stackcount) else if (!stackcount)
@ -1337,18 +1425,24 @@ void Pet::_LoadAuras(uint32 timediff)
for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i) for (int32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
if ((effIndexMask & (1 << i)) == 0) if ((effIndexMask & (1 << i)) == 0)
{ continue; } {
continue;
}
Aura* aura = CreateAura(spellproto, SpellEffectIndex(i), NULL, holder, this); Aura* aura = CreateAura(spellproto, SpellEffectIndex(i), NULL, holder, this);
if (!damage[i]) if (!damage[i])
{ damage[i] = aura->GetModifier()->m_amount; } {
damage[i] = aura->GetModifier()->m_amount;
}
aura->SetLoadedState(damage[i], periodicTime[i]); aura->SetLoadedState(damage[i], periodicTime[i]);
holder->AddAura(aura, SpellEffectIndex(i)); holder->AddAura(aura, SpellEffectIndex(i));
} }
if (!holder->IsEmptyHolder()) if (!holder->IsEmptyHolder())
{ AddSpellAuraHolder(holder); } {
AddSpellAuraHolder(holder);
}
else else
{ delete holder; } { delete holder; }
} }
@ -1369,7 +1463,9 @@ void Pet::_SaveAuras()
SpellAuraHolderMap const& auraHolders = GetSpellAuraHolderMap(); SpellAuraHolderMap const& auraHolders = GetSpellAuraHolderMap();
if (auraHolders.empty()) if (auraHolders.empty())
{ return; } {
return;
}
stmt = CharacterDatabase.CreateStatement(insAuras, "INSERT INTO pet_aura (guid, caster_guid, item_guid, spell, stackcount, remaincharges, " stmt = CharacterDatabase.CreateStatement(insAuras, "INSERT INTO pet_aura (guid, caster_guid, item_guid, spell, stackcount, remaincharges, "
"basepoints0, basepoints1, basepoints2, periodictime0, periodictime1, periodictime2, maxduration, remaintime, effIndexMask) " "basepoints0, basepoints1, basepoints2, periodictime0, periodictime1, periodictime2, maxduration, remaintime, effIndexMask) "
@ -1413,7 +1509,9 @@ void Pet::_SaveAuras()
{ {
// don't save not own area auras // don't save not own area auras
if (aur->IsAreaAura() && holder->GetCasterGuid() != GetObjectGuid()) if (aur->IsAreaAura() && holder->GetCasterGuid() != GetObjectGuid())
{ continue; } {
continue;
}
damage[i] = aur->GetModifier()->m_amount; damage[i] = aur->GetModifier()->m_amount;
periodicTime[i] = aur->GetModifier()->periodictime; periodicTime[i] = aur->GetModifier()->periodictime;
@ -1422,7 +1520,9 @@ void Pet::_SaveAuras()
} }
if (!effIndexMask) if (!effIndexMask)
{ continue; } {
continue;
}
stmt.addUInt32(m_charmInfo->GetPetNumber()); stmt.addUInt32(m_charmInfo->GetPetNumber());
stmt.addUInt64(holder->GetCasterGuid().GetRawValue()); stmt.addUInt64(holder->GetCasterGuid().GetRawValue());
@ -1476,7 +1576,9 @@ bool Pet::addSpell(uint32 spell_id, ActiveStates active /*= ACT_DECIDE*/, PetSpe
itr->second.state = PETSPELL_UNCHANGED; itr->second.state = PETSPELL_UNCHANGED;
if (active == ACT_ENABLED) if (active == ACT_ENABLED)
{ ToggleAutocast(spell_id, true); } {
ToggleAutocast(spell_id, true);
}
else if (active == ACT_DISABLED) else if (active == ACT_DISABLED)
{ ToggleAutocast(spell_id, false); } { ToggleAutocast(spell_id, false); }
@ -1495,7 +1597,9 @@ bool Pet::addSpell(uint32 spell_id, ActiveStates active /*= ACT_DECIDE*/, PetSpe
if (active == ACT_DECIDE) // active was not used before, so we save it's autocast/passive state here if (active == ACT_DECIDE) // active was not used before, so we save it's autocast/passive state here
{ {
if (IsPassiveSpell(spellInfo)) if (IsPassiveSpell(spellInfo))
{ newspell.active = ACT_PASSIVE; } {
newspell.active = ACT_PASSIVE;
}
else else
{ newspell.active = ACT_DISABLED; } { newspell.active = ACT_DISABLED; }
} }
@ -1551,12 +1655,16 @@ bool Pet::addSpell(uint32 spell_id, ActiveStates active /*= ACT_DECIDE*/, PetSpe
m_spells[spell_id] = newspell; m_spells[spell_id] = newspell;
if (IsPassiveSpell(spellInfo)) if (IsPassiveSpell(spellInfo))
{ CastSpell(this, spell_id, true); } {
CastSpell(this, spell_id, true);
}
else else
{ m_charmInfo->AddSpellToActionBar(spell_id, ActiveStates(newspell.active)); } { m_charmInfo->AddSpellToActionBar(spell_id, ActiveStates(newspell.active)); }
if (newspell.active == ACT_ENABLED) if (newspell.active == ACT_ENABLED)
{ ToggleAutocast(spell_id, true); } {
ToggleAutocast(spell_id, true);
}
uint32 talentCost = GetTalentSpellCost(spell_id); uint32 talentCost = GetTalentSpellCost(spell_id);
if (talentCost) if (talentCost)
@ -1571,7 +1679,9 @@ bool Pet::learnSpell(uint32 spell_id)
{ {
// prevent duplicated entires in spell book // prevent duplicated entires in spell book
if (!addSpell(spell_id)) if (!addSpell(spell_id))
{ return false; } {
return false;
}
if (!m_loading) if (!m_loading)
{ {
@ -1652,13 +1762,19 @@ bool Pet::removeSpell(uint32 spell_id, bool learn_prev, bool clear_ab)
{ {
PetSpellMap::iterator itr = m_spells.find(spell_id); PetSpellMap::iterator itr = m_spells.find(spell_id);
if (itr == m_spells.end()) if (itr == m_spells.end())
{ return false; } {
return false;
}
if (itr->second.state == PETSPELL_REMOVED) if (itr->second.state == PETSPELL_REMOVED)
{ return false; } {
return false;
}
if (itr->second.state == PETSPELL_NEW) if (itr->second.state == PETSPELL_NEW)
{ m_spells.erase(itr); } {
m_spells.erase(itr);
}
else else
{ itr->second.state = PETSPELL_REMOVED; } { itr->second.state = PETSPELL_REMOVED; }
@ -1678,7 +1794,9 @@ bool Pet::removeSpell(uint32 spell_id, bool learn_prev, bool clear_ab)
if (learn_prev) if (learn_prev)
{ {
if (uint32 prev_id = sSpellMgr.GetPrevSpellInChain(spell_id)) if (uint32 prev_id = sSpellMgr.GetPrevSpellInChain(spell_id))
{ learnSpell(prev_id); } {
learnSpell(prev_id);
}
else else
{ learn_prev = false; } { learn_prev = false; }
} }
@ -1691,7 +1809,9 @@ bool Pet::removeSpell(uint32 spell_id, bool learn_prev, bool clear_ab)
// need update action bar for last removed rank // need update action bar for last removed rank
if (Unit* owner = GetOwner()) if (Unit* owner = GetOwner())
if (owner->GetTypeId() == TYPEID_PLAYER) if (owner->GetTypeId() == TYPEID_PLAYER)
{ ((Player*)owner)->PetSpellInitialize(); } {
((Player*)owner)->PetSpellInitialize();
}
} }
} }
@ -1704,7 +1824,9 @@ void Pet::CleanupActionBar()
if (UnitActionBarEntry const* ab = m_charmInfo->GetActionBarEntry(i)) if (UnitActionBarEntry const* ab = m_charmInfo->GetActionBarEntry(i))
if (uint32 action = ab->GetAction()) if (uint32 action = ab->GetAction())
if (ab->IsActionBarForSpell() && !HasSpell(action)) if (ab->IsActionBarForSpell() && !HasSpell(action))
{ m_charmInfo->SetActionBar(i, 0, ACT_DISABLED); } {
m_charmInfo->SetActionBar(i, 0, ACT_DISABLED);
}
} }
void Pet::InitPetCreateSpells() void Pet::InitPetCreateSpells()
@ -1914,7 +2036,9 @@ uint32 Pet::resetTalentsCost() const
// The first time reset costs 10 silver; after 1 day cost is reset to 10 silver // The first time reset costs 10 silver; after 1 day cost is reset to 10 silver
if (m_resetTalentsCost < 10 * SILVER || days > 0) if (m_resetTalentsCost < 10 * SILVER || days > 0)
{ return 10 * SILVER; } {
return 10 * SILVER;
}
// then 50 silver // then 50 silver
else if (m_resetTalentsCost < 50 * SILVER) else if (m_resetTalentsCost < 50 * SILVER)
{ return 50 * SILVER; } { return 50 * SILVER; }
@ -1938,7 +2062,9 @@ uint8 Pet::GetMaxTalentPointsForLevel(uint32 level)
void Pet::ToggleAutocast(uint32 spellid, bool apply) void Pet::ToggleAutocast(uint32 spellid, bool apply)
{ {
if (IsPassiveSpell(spellid)) if (IsPassiveSpell(spellid))
{ return; } {
return;
}
PetSpellMap::iterator itr = m_spells.find(spellid); PetSpellMap::iterator itr = m_spells.find(spellid);
PetSpell &petSpell = itr->second; PetSpell &petSpell = itr->second;
@ -1958,7 +2084,9 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
{ {
petSpell.active = ACT_ENABLED; petSpell.active = ACT_ENABLED;
if (petSpell.state != PETSPELL_NEW) if (petSpell.state != PETSPELL_NEW)
{ petSpell.state = PETSPELL_CHANGED; } {
petSpell.state = PETSPELL_CHANGED;
}
} }
} }
} }
@ -1975,7 +2103,9 @@ void Pet::ToggleAutocast(uint32 spellid, bool apply)
{ {
petSpell.active = ACT_DISABLED; petSpell.active = ACT_DISABLED;
if (petSpell.state != PETSPELL_NEW) if (petSpell.state != PETSPELL_NEW)
{ petSpell.state = PETSPELL_CHANGED; } {
petSpell.state = PETSPELL_CHANGED;
}
} }
} }
} }
@ -1991,17 +2121,23 @@ bool Pet::Create(uint32 guidlow, CreatureCreatePos& cPos, CreatureInfo const* ci
m_originalEntry = cinfo->Entry; m_originalEntry = cinfo->Entry;
if (!InitEntry(cinfo->Entry)) if (!InitEntry(cinfo->Entry))
{ return false; } {
return false;
}
cPos.SelectFinalPoint(this); cPos.SelectFinalPoint(this);
if (!cPos.Relocate(this)) if (!cPos.Relocate(this))
{ return false; } {
return false;
}
SetSheath(SHEATH_STATE_MELEE); SetSheath(SHEATH_STATE_MELEE);
if (getPetType() == MINI_PET) // always non-attackable if (getPetType() == MINI_PET) // always non-attackable
{ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } {
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
return true; return true;
} }
@ -2017,11 +2153,15 @@ void Pet::LearnPetPassives()
{ {
CreatureInfo const* cInfo = GetCreatureInfo(); CreatureInfo const* cInfo = GetCreatureInfo();
if (!cInfo) if (!cInfo)
{ return; } {
return;
}
CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cInfo->Family); CreatureFamilyEntry const* cFamily = sCreatureFamilyStore.LookupEntry(cInfo->Family);
if (!cFamily) if (!cFamily)
{ return; } {
return;
}
PetFamilySpellsStore::const_iterator petStore = sPetFamilySpellsStore.find(cFamily->ID); PetFamilySpellsStore::const_iterator petStore = sPetFamilySpellsStore.find(cFamily->ID);
if (petStore != sPetFamilySpellsStore.end()) if (petStore != sPetFamilySpellsStore.end())
@ -2044,7 +2184,9 @@ void Pet::CastPetAuras(bool current)
++itr; ++itr;
if (!current && pa->IsRemovedOnChangePet()) if (!current && pa->IsRemovedOnChangePet())
{ owner->RemovePetAura(pa); } {
owner->RemovePetAura(pa);
}
else else
{ CastPetAura(pa); } { CastPetAura(pa); }
} }
@ -2092,7 +2234,9 @@ void Pet::CastPetAura(PetAura const* aura)
{ {
uint32 auraId = aura->GetAura(GetEntry()); uint32 auraId = aura->GetAura(GetEntry());
if (!auraId) if (!auraId)
{ return; } {
return;
}
if (auraId == 35696) // Demonic Knowledge if (auraId == 35696) // Demonic Knowledge
{ {
@ -2122,7 +2266,9 @@ void Pet::SynchronizeLevelWithOwner()
{ {
Unit* owner = GetOwner(); Unit* owner = GetOwner();
if (!owner || owner->GetTypeId() != TYPEID_PLAYER) if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
{ return; } {
return;
}
switch (getPetType()) switch (getPetType())
{ {
@ -2133,7 +2279,9 @@ void Pet::SynchronizeLevelWithOwner()
// can't be greater owner level // can't be greater owner level
case HUNTER_PET: case HUNTER_PET:
if (getLevel() > owner->getLevel()) if (getLevel() > owner->getLevel())
{ GivePetLevel(owner->getLevel()); } {
GivePetLevel(owner->getLevel());
}
else if (getLevel() + 5 < owner->getLevel()) else if (getLevel() + 5 < owner->getLevel())
GivePetLevel(owner->getLevel() - 5); GivePetLevel(owner->getLevel() - 5);
break; break;
@ -2148,7 +2296,9 @@ void Pet::SetModeFlags(PetModeFlags mode)
Unit* owner = GetOwner(); Unit* owner = GetOwner();
if (!owner || owner->GetTypeId() != TYPEID_PLAYER) if (!owner || owner->GetTypeId() != TYPEID_PLAYER)
{ return; } {
return;
}
WorldPacket data(SMSG_PET_MODE, 12); WorldPacket data(SMSG_PET_MODE, 12);
data << GetObjectGuid(); data << GetObjectGuid();

View file

@ -37,7 +37,9 @@
int PetAI::Permissible(const Creature* creature) int PetAI::Permissible(const Creature* creature)
{ {
if (creature->IsPet()) if (creature->IsPet())
{ return PERMIT_BASE_SPECIAL; } {
return PERMIT_BASE_SPECIAL;
}
return PERMIT_BASE_NO; return PERMIT_BASE_NO;
} }
@ -75,7 +77,9 @@ void PetAI::MoveInLineOfSight(Unit* pWho)
void PetAI::AttackStart(Unit* u) void PetAI::AttackStart(Unit* u)
{ {
if (!u || (m_creature->IsPet() && ((Pet*)m_creature)->getPetType() == MINI_PET)) if (!u || (m_creature->IsPet() && ((Pet*)m_creature)->getPetType() == MINI_PET))
{ return; } {
return;
}
if (m_creature->Attack(u, true)) if (m_creature->Attack(u, true))
{ {
@ -103,7 +107,9 @@ bool PetAI::_needToStop() const
{ {
// This is needed for charmed creatures, as once their target was reset other effects can trigger threat // This is needed for charmed creatures, as once their target was reset other effects can trigger threat
if (m_creature->IsCharmed() && m_creature->getVictim() == m_creature->GetCharmer()) if (m_creature->IsCharmed() && m_creature->getVictim() == m_creature->GetCharmer())
{ return true; } {
return true;
}
return !m_creature->getVictim()->IsTargetableForAttack(); return !m_creature->getVictim()->IsTargetableForAttack();
} }
@ -129,7 +135,9 @@ void PetAI::_stopAttack()
void PetAI::UpdateAI(const uint32 diff) void PetAI::UpdateAI(const uint32 diff)
{ {
if (!m_creature->IsAlive()) if (!m_creature->IsAlive())
{ return; } {
return;
}
Unit* owner = m_creature->GetCharmerOrOwner(); Unit* owner = m_creature->GetCharmerOrOwner();
Unit* victim = NULL; Unit* victim = NULL;
@ -218,21 +226,29 @@ void PetAI::UpdateAI(const uint32 diff)
{ {
uint32 spellID = m_creature->GetPetAutoSpellOnPos(i); uint32 spellID = m_creature->GetPetAutoSpellOnPos(i);
if (!spellID) if (!spellID)
{ continue; } {
continue;
}
SpellEntry const* spellInfo = sSpellStore.LookupEntry(spellID); SpellEntry const* spellInfo = sSpellStore.LookupEntry(spellID);
if (!spellInfo) if (!spellInfo)
{ continue; } {
continue;
}
if (m_creature->GetCharmInfo() && m_creature->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo)) if (m_creature->GetCharmInfo() && m_creature->GetCharmInfo()->GetGlobalCooldownMgr().HasGlobalCooldown(spellInfo))
{ continue; } {
continue;
}
// ignore some combinations of combat state and combat/noncombat spells // ignore some combinations of combat state and combat/noncombat spells
if (!inCombat) if (!inCombat)
{ {
// ignore attacking spells, and allow only self/around spells // ignore attacking spells, and allow only self/around spells
if (!IsPositiveSpell(spellInfo->Id)) if (!IsPositiveSpell(spellInfo->Id))
{ continue; } {
continue;
}
// non combat spells allowed // non combat spells allowed
// only pet spells have IsNonCombatSpell and not fit this reqs: // only pet spells have IsNonCombatSpell and not fit this reqs:
@ -242,14 +258,18 @@ void PetAI::UpdateAI(const uint32 diff)
int32 duration = GetSpellDuration(spellInfo); int32 duration = GetSpellDuration(spellInfo);
SpellPowerEntry const* spellPower = spellInfo->GetSpellPower(); SpellPowerEntry const* spellPower = spellInfo->GetSpellPower();
if (spellPower && (spellPower->manaCost || spellPower->ManaCostPercentage || spellPower->manaPerSecond) && duration > 0) if (spellPower && (spellPower->manaCost || spellPower->ManaCostPercentage || spellPower->manaPerSecond) && duration > 0)
{ continue; } {
continue;
}
// allow only spell without cooldown > duration // allow only spell without cooldown > duration
int32 cooldown = GetSpellRecoveryTime(spellInfo); int32 cooldown = GetSpellRecoveryTime(spellInfo);
// allow only spell not on cooldown // allow only spell not on cooldown
if (cooldown != 0 && duration < cooldown) if (cooldown != 0 && duration < cooldown)
{ continue; } {
continue;
}
} }
} }
// just ignore non-combat spells // just ignore non-combat spells
@ -272,7 +292,9 @@ void PetAI::UpdateAI(const uint32 diff)
// only buff targets that are in combat, unless the spell can only be cast while out of combat // only buff targets that are in combat, unless the spell can only be cast while out of combat
if (!Target) if (!Target)
{ continue; } {
continue;
}
if (spell->CanAutoCast(Target)) if (spell->CanAutoCast(Target))
{ {
@ -282,7 +304,9 @@ void PetAI::UpdateAI(const uint32 diff)
} }
} }
if (!spellUsed) if (!spellUsed)
{ delete spell; } {
delete spell;
}
} }
} }
@ -303,10 +327,14 @@ void PetAI::UpdateAI(const uint32 diff)
{ {
m_creature->SetInFront(target); m_creature->SetInFront(target);
if (target->GetTypeId() == TYPEID_PLAYER) if (target->GetTypeId() == TYPEID_PLAYER)
{ m_creature->SendCreateUpdateToPlayer((Player*)target); } {
m_creature->SendCreateUpdateToPlayer((Player*)target);
}
if (owner && owner->GetTypeId() == TYPEID_PLAYER) if (owner && owner->GetTypeId() == TYPEID_PLAYER)
{ m_creature->SendCreateUpdateToPlayer((Player*)owner); } {
m_creature->SendCreateUpdateToPlayer((Player*)owner);
}
} }
m_creature->AddCreatureSpellCooldown(spell->m_spellInfo->Id); m_creature->AddCreatureSpellCooldown(spell->m_spellInfo->Id);
@ -433,16 +461,22 @@ void PetAI::UpdateAllies()
m_updateAlliesTimer = 10 * IN_MILLISECONDS; // update friendly targets every 10 seconds, lesser checks increase performance m_updateAlliesTimer = 10 * IN_MILLISECONDS; // update friendly targets every 10 seconds, lesser checks increase performance
if (!owner) if (!owner)
{ return; } {
return;
}
else if (owner->GetTypeId() == TYPEID_PLAYER) else if (owner->GetTypeId() == TYPEID_PLAYER)
{ pGroup = ((Player*)owner)->GetGroup(); } { pGroup = ((Player*)owner)->GetGroup(); }
// only pet and owner/not in group->ok // only pet and owner/not in group->ok
if (m_AllySet.size() == 2 && !pGroup) if (m_AllySet.size() == 2 && !pGroup)
{ return; } {
return;
}
// owner is in group; group members filled in already (no raid -> subgroupcount = whole count) // owner is in group; group members filled in already (no raid -> subgroupcount = whole count)
if (pGroup && !pGroup->isRaidGroup() && m_AllySet.size() == (pGroup->GetMembersCount() + 2)) if (pGroup && !pGroup->isRaidGroup() && m_AllySet.size() == (pGroup->GetMembersCount() + 2))
{ return; } {
return;
}
m_AllySet.clear(); m_AllySet.clear();
m_AllySet.insert(m_creature->GetObjectGuid()); m_AllySet.insert(m_creature->GetObjectGuid());
@ -452,10 +486,14 @@ void PetAI::UpdateAllies()
{ {
Player* target = itr->getSource(); Player* target = itr->getSource();
if (!target || !pGroup->SameSubGroup((Player*)owner, target)) if (!target || !pGroup->SameSubGroup((Player*)owner, target))
{ continue; } {
continue;
}
if (target->GetObjectGuid() == owner->GetObjectGuid()) if (target->GetObjectGuid() == owner->GetObjectGuid())
{ continue; } {
continue;
}
m_AllySet.insert(target->GetObjectGuid()); m_AllySet.insert(target->GetObjectGuid());
} }

View file

@ -224,11 +224,15 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, Team
} }
if (m_TaxiDestinations.empty()) if (m_TaxiDestinations.empty())
{ return true; } {
return true;
}
// Check integrity // Check integrity
if (m_TaxiDestinations.size() < 2) if (m_TaxiDestinations.size() < 2)
{ return false; } {
return false;
}
for (size_t i = 1; i < m_TaxiDestinations.size(); ++i) for (size_t i = 1; i < m_TaxiDestinations.size(); ++i)
{ {
@ -236,12 +240,16 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, Team
uint32 path; uint32 path;
sObjectMgr.GetTaxiPath(m_TaxiDestinations[i - 1], m_TaxiDestinations[i], path, cost); sObjectMgr.GetTaxiPath(m_TaxiDestinations[i - 1], m_TaxiDestinations[i], path, cost);
if (!path) if (!path)
{ return false; } {
return false;
}
} }
// can't load taxi path without mount set (quest taxi path?) // can't load taxi path without mount set (quest taxi path?)
if (!sObjectMgr.GetTaxiMountDisplayId(GetTaxiSource(), team, true)) if (!sObjectMgr.GetTaxiMountDisplayId(GetTaxiSource(), team, true))
{ return false; } {
return false;
}
return true; return true;
} }
@ -249,7 +257,9 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, Team
std::string PlayerTaxi::SaveTaxiDestinationsToString() std::string PlayerTaxi::SaveTaxiDestinationsToString()
{ {
if (m_TaxiDestinations.empty()) if (m_TaxiDestinations.empty())
{ return ""; } {
return "";
}
std::ostringstream ss; std::ostringstream ss;
@ -262,7 +272,9 @@ std::string PlayerTaxi::SaveTaxiDestinationsToString()
uint32 PlayerTaxi::GetCurrentTaxiPath() const uint32 PlayerTaxi::GetCurrentTaxiPath() const
{ {
if (m_TaxiDestinations.size() < 2) if (m_TaxiDestinations.size() < 2)
{ return 0; } {
return 0;
}
uint32 path; uint32 path;
uint32 cost; uint32 cost;
@ -294,7 +306,9 @@ bool TradeData::HasItem(ObjectGuid item_guid) const
{ {
for (int i = 0; i < TRADE_SLOT_COUNT; ++i) for (int i = 0; i < TRADE_SLOT_COUNT; ++i)
if (m_items[i] == item_guid) if (m_items[i] == item_guid)
{ return true; } {
return true;
}
return false; return false;
} }
@ -309,7 +323,9 @@ void TradeData::SetItem(TradeSlots slot, Item* item)
ObjectGuid itemGuid = item ? item->GetObjectGuid() : ObjectGuid(); ObjectGuid itemGuid = item ? item->GetObjectGuid() : ObjectGuid();
if (m_items[slot] == itemGuid) if (m_items[slot] == itemGuid)
{ return; } {
return;
}
m_items[slot] = itemGuid; m_items[slot] = itemGuid;
@ -320,7 +336,9 @@ void TradeData::SetItem(TradeSlots slot, Item* item)
// need remove possible trader spell applied to changed item // need remove possible trader spell applied to changed item
if (slot == TRADE_SLOT_NONTRADED) if (slot == TRADE_SLOT_NONTRADED)
{ GetTraderData()->SetSpell(0); } {
GetTraderData()->SetSpell(0);
}
// need remove possible player spell applied (possible move reagent) // need remove possible player spell applied (possible move reagent)
SetSpell(0); SetSpell(0);
@ -331,7 +349,9 @@ void TradeData::SetSpell(uint32 spell_id, Item* castItem /*= NULL*/)
ObjectGuid itemGuid = castItem ? castItem->GetObjectGuid() : ObjectGuid(); ObjectGuid itemGuid = castItem ? castItem->GetObjectGuid() : ObjectGuid();
if (m_spell == spell_id && m_spellCastItem == itemGuid) if (m_spell == spell_id && m_spellCastItem == itemGuid)
{ return; } {
return;
}
m_spell = spell_id; m_spell = spell_id;
m_spellCastItem = itemGuid; m_spellCastItem = itemGuid;
@ -346,7 +366,9 @@ void TradeData::SetSpell(uint32 spell_id, Item* castItem /*= NULL*/)
void TradeData::SetMoney(uint64 money) void TradeData::SetMoney(uint64 money)
{ {
if (m_money == money) if (m_money == money)
{ return; } {
return;
}
if (money > m_player->GetMoney()) if (money > m_player->GetMoney())
{ {
@ -377,7 +399,9 @@ void TradeData::SetAccepted(bool state, bool crosssend /*= false*/)
if (!state) if (!state)
{ {
if (crosssend) if (crosssend)
{ m_trader->GetSession()->SendTradeStatus(TRADE_STATUS_BACK_TO_TRADE); } {
m_trader->GetSession()->SendTradeStatus(TRADE_STATUS_BACK_TO_TRADE);
}
else else
{ m_player->GetSession()->SendTradeStatus(TRADE_STATUS_BACK_TO_TRADE); } { m_player->GetSession()->SendTradeStatus(TRADE_STATUS_BACK_TO_TRADE); }
} }
@ -405,11 +429,15 @@ Player::Player(WorldSession* session): Unit(), m_mover(this), m_camera(this), m_
m_ExtraFlags = 0; m_ExtraFlags = 0;
if (GetSession()->GetSecurity() >= SEC_GAMEMASTER) if (GetSession()->GetSecurity() >= SEC_GAMEMASTER)
{ SetAcceptTicket(true); } {
SetAcceptTicket(true);
}
// players always accept // players always accept
if (GetSession()->GetSecurity() == SEC_PLAYER) if (GetSession()->GetSecurity() == SEC_PLAYER)
{ SetAcceptWhispers(true); } {
SetAcceptWhispers(true);
}
m_comboPoints = 0; m_comboPoints = 0;
@ -786,14 +814,18 @@ bool Player::Create(uint32 guidlow, const std::string& name, uint8 race, uint8 c
for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j) for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j)
{ {
if (oEntry->ItemId[j] <= 0) if (oEntry->ItemId[j] <= 0)
{ continue; } {
continue;
}
uint32 item_id = oEntry->ItemId[j]; uint32 item_id = oEntry->ItemId[j];
// just skip, reported in ObjectMgr::LoadItemPrototypes // just skip, reported in ObjectMgr::LoadItemPrototypes
ItemPrototype const* iProto = ObjectMgr::GetItemPrototype(item_id); ItemPrototype const* iProto = ObjectMgr::GetItemPrototype(item_id);
if (!iProto) if (!iProto)
{ continue; } {
continue;
}
// BuyCount by default // BuyCount by default
int32 count = iProto->BuyCount; int32 count = iProto->BuyCount;
@ -850,7 +882,9 @@ bool Player::Create(uint32 guidlow, const std::string& name, uint8 race, uint8 c
// if this is ammo then use it // if this is ammo then use it
msg = CanUseAmmo(pItem->GetEntry()); msg = CanUseAmmo(pItem->GetEntry());
if (msg == EQUIP_ERR_OK) if (msg == EQUIP_ERR_OK)
{ SetAmmo(pItem->GetEntry()); } {
SetAmmo(pItem->GetEntry());
}
} }
} }
} }
@ -872,7 +906,9 @@ bool Player::StoreNewItemInBestSlots(uint32 titem_id, uint32 titem_amount)
uint16 eDest; uint16 eDest;
uint8 msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false); uint8 msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false);
if (msg != EQUIP_ERR_OK) if (msg != EQUIP_ERR_OK)
{ break; } {
break;
}
EquipNewItem(eDest, titem_id, true); EquipNewItem(eDest, titem_id, true);
AutoUnequipOffhandIfNeed(); AutoUnequipOffhandIfNeed();
@ -907,7 +943,9 @@ Item* Player::StoreNewItemInInventorySlot(uint32 itemEntry, uint32 amount)
if (msg == EQUIP_ERR_OK) if (msg == EQUIP_ERR_OK)
{ {
if (Item* pItem = StoreNewItem(vDest, itemEntry, true, Item::GenerateItemRandomPropertyId(itemEntry))) if (Item* pItem = StoreNewItem(vDest, itemEntry, true, Item::GenerateItemRandomPropertyId(itemEntry)))
{ return pItem; } {
return pItem;
}
} }
return NULL; return NULL;
@ -918,7 +956,9 @@ void Player::SendMirrorTimer(MirrorTimerType Type, uint32 MaxValue, uint32 Curre
if (int(MaxValue) == DISABLED_MIRROR_TIMER) if (int(MaxValue) == DISABLED_MIRROR_TIMER)
{ {
if (int(CurrentValue) != DISABLED_MIRROR_TIMER) if (int(CurrentValue) != DISABLED_MIRROR_TIMER)
{ StopMirrorTimer(Type); } {
StopMirrorTimer(Type);
}
return; return;
} }
WorldPacket data(SMSG_START_MIRROR_TIMER, (21)); WorldPacket data(SMSG_START_MIRROR_TIMER, (21));
@ -942,13 +982,17 @@ void Player::StopMirrorTimer(MirrorTimerType Type)
uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage) uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
{ {
if (!IsAlive() || isGameMaster()) if (!IsAlive() || isGameMaster())
{ return 0; } {
return 0;
}
// Absorb, resist some environmental damage type // Absorb, resist some environmental damage type
uint32 absorb = 0; uint32 absorb = 0;
uint32 resist = 0; uint32 resist = 0;
if (type == DAMAGE_LAVA) if (type == DAMAGE_LAVA)
{ CalculateDamageAbsorbAndResist(this, SPELL_SCHOOL_MASK_FIRE, DIRECT_DAMAGE, damage, &absorb, &resist); } {
CalculateDamageAbsorbAndResist(this, SPELL_SCHOOL_MASK_FIRE, DIRECT_DAMAGE, damage, &absorb, &resist);
}
else if (type == DAMAGE_SLIME) else if (type == DAMAGE_SLIME)
{ CalculateDamageAbsorbAndResist(this, SPELL_SCHOOL_MASK_NATURE, DIRECT_DAMAGE, damage, &absorb, &resist); } { CalculateDamageAbsorbAndResist(this, SPELL_SCHOOL_MASK_NATURE, DIRECT_DAMAGE, damage, &absorb, &resist); }
@ -993,7 +1037,9 @@ int32 Player::getMaxTimer(MirrorTimerType timer)
{ {
case FATIGUE_TIMER: case FATIGUE_TIMER:
if (GetSession()->GetSecurity() >= (AccountTypes)sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FATIGUE_GMLEVEL)) if (GetSession()->GetSecurity() >= (AccountTypes)sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FATIGUE_GMLEVEL))
{ return DISABLED_MIRROR_TIMER; } {
return DISABLED_MIRROR_TIMER;
}
return sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FATIGUE_MAX) * IN_MILLISECONDS; return sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FATIGUE_MAX) * IN_MILLISECONDS;
case BREATH_TIMER: case BREATH_TIMER:
{ {
@ -1009,7 +1055,9 @@ int32 Player::getMaxTimer(MirrorTimerType timer)
case FIRE_TIMER: case FIRE_TIMER:
{ {
if (!IsAlive() || GetSession()->GetSecurity() >= (AccountTypes)sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FIRE_GMLEVEL)) if (!IsAlive() || GetSession()->GetSecurity() >= (AccountTypes)sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FIRE_GMLEVEL))
{ return DISABLED_MIRROR_TIMER; } {
return DISABLED_MIRROR_TIMER;
}
return sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FIRE_MAX) * IN_MILLISECONDS; return sWorld.getConfig(CONFIG_UINT32_TIMERBAR_FIRE_MAX) * IN_MILLISECONDS;
} }
default: default:
@ -1022,13 +1070,17 @@ void Player::UpdateMirrorTimers()
{ {
// Desync flags for update on next HandleDrowning // Desync flags for update on next HandleDrowning
if (m_MirrorTimerFlags) if (m_MirrorTimerFlags)
{ m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags; } {
m_MirrorTimerFlagsLast = ~m_MirrorTimerFlags;
}
} }
void Player::HandleDrowning(uint32 time_diff) void Player::HandleDrowning(uint32 time_diff)
{ {
if (!m_MirrorTimerFlags) if (!m_MirrorTimerFlags)
{ return; } {
return;
}
// In water // In water
if (m_MirrorTimerFlags & UNDERWATER_INWATER) if (m_MirrorTimerFlags & UNDERWATER_INWATER)
@ -1061,7 +1113,9 @@ void Player::HandleDrowning(uint32 time_diff)
// Need breath regen // Need breath regen
m_MirrorTimer[BREATH_TIMER] += 10 * time_diff; m_MirrorTimer[BREATH_TIMER] += 10 * time_diff;
if (m_MirrorTimer[BREATH_TIMER] >= UnderWaterTime || !IsAlive()) if (m_MirrorTimer[BREATH_TIMER] >= UnderWaterTime || !IsAlive())
{ StopMirrorTimer(BREATH_TIMER); } {
StopMirrorTimer(BREATH_TIMER);
}
else if (m_MirrorTimerFlagsLast & UNDERWATER_INWATER) else if (m_MirrorTimerFlagsLast & UNDERWATER_INWATER)
{ SendMirrorTimer(BREATH_TIMER, UnderWaterTime, m_MirrorTimer[BREATH_TIMER], 10); } { SendMirrorTimer(BREATH_TIMER, UnderWaterTime, m_MirrorTimer[BREATH_TIMER], 10); }
} }
@ -1099,7 +1153,9 @@ void Player::HandleDrowning(uint32 time_diff)
int32 DarkWaterTime = getMaxTimer(FATIGUE_TIMER); int32 DarkWaterTime = getMaxTimer(FATIGUE_TIMER);
m_MirrorTimer[FATIGUE_TIMER] += 10 * time_diff; m_MirrorTimer[FATIGUE_TIMER] += 10 * time_diff;
if (m_MirrorTimer[FATIGUE_TIMER] >= DarkWaterTime || !IsAlive()) if (m_MirrorTimer[FATIGUE_TIMER] >= DarkWaterTime || !IsAlive())
{ StopMirrorTimer(FATIGUE_TIMER); } {
StopMirrorTimer(FATIGUE_TIMER);
}
else if (m_MirrorTimerFlagsLast & UNDERWATER_INDARKWATER) else if (m_MirrorTimerFlagsLast & UNDERWATER_INDARKWATER)
{ SendMirrorTimer(FATIGUE_TIMER, DarkWaterTime, m_MirrorTimer[FATIGUE_TIMER], 10); } { SendMirrorTimer(FATIGUE_TIMER, DarkWaterTime, m_MirrorTimer[FATIGUE_TIMER], 10); }
} }
@ -1108,7 +1164,9 @@ void Player::HandleDrowning(uint32 time_diff)
{ {
// Breath timer not activated - activate it // Breath timer not activated - activate it
if (m_MirrorTimer[FIRE_TIMER] == DISABLED_MIRROR_TIMER) if (m_MirrorTimer[FIRE_TIMER] == DISABLED_MIRROR_TIMER)
{ m_MirrorTimer[FIRE_TIMER] = getMaxTimer(FIRE_TIMER); } {
m_MirrorTimer[FIRE_TIMER] = getMaxTimer(FIRE_TIMER);
}
else else
{ {
m_MirrorTimer[FIRE_TIMER] -= time_diff; m_MirrorTimer[FIRE_TIMER] -= time_diff;
@ -1119,7 +1177,9 @@ void Player::HandleDrowning(uint32 time_diff)
// TODO: Check this formula // TODO: Check this formula
uint32 damage = urand(600, 700); uint32 damage = urand(600, 700);
if (m_MirrorTimerFlags & UNDERWATER_INLAVA) if (m_MirrorTimerFlags & UNDERWATER_INLAVA)
{ EnvironmentalDamage(DAMAGE_LAVA, damage); } {
EnvironmentalDamage(DAMAGE_LAVA, damage);
}
// need to skip Slime damage in Undercity, // need to skip Slime damage in Undercity,
// maybe someone can find better way to handle environmental damage // maybe someone can find better way to handle environmental damage
//else if (m_zoneUpdateId != 1497) //else if (m_zoneUpdateId != 1497)
@ -13117,7 +13177,9 @@ void Player::OnGossipSelect(WorldObject* pSource, uint32 gossipListId, uint32 me
if (pMenuData.m_gAction_script) if (pMenuData.m_gAction_script)
{ {
if (pSource->GetTypeId() == TYPEID_UNIT) if (pSource->GetTypeId() == TYPEID_UNIT)
{ GetMap()->ScriptsStart(DBS_ON_GOSSIP, pMenuData.m_gAction_script, pSource, this, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE); } {
GetMap()->ScriptsStart(DBS_ON_GOSSIP, pMenuData.m_gAction_script, pSource, this, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE);
}
else if (pSource->GetTypeId() == TYPEID_GAMEOBJECT) else if (pSource->GetTypeId() == TYPEID_GAMEOBJECT)
{ GetMap()->ScriptsStart(DBS_ON_GOSSIP, pMenuData.m_gAction_script, this, pSource, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_TARGET); } { GetMap()->ScriptsStart(DBS_ON_GOSSIP, pMenuData.m_gAction_script, this, pSource, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_TARGET); }
} }
@ -13160,7 +13222,9 @@ uint32 Player::GetGossipTextId(uint32 menuId, WorldObject* pSource)
// Start related script // Start related script
if (scriptId) if (scriptId)
{ GetMap()->ScriptsStart(DBS_ON_GOSSIP, scriptId, this, pSource, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_TARGET); } {
GetMap()->ScriptsStart(DBS_ON_GOSSIP, scriptId, this, pSource, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_TARGET);
}
return textId; return textId;
} }
@ -13705,7 +13769,9 @@ void Player::AddQuest(Quest const* pQuest, Object* questGiver)
// starting initial DB quest script // starting initial DB quest script
if (pQuest->GetQuestStartScript() != 0) if (pQuest->GetQuestStartScript() != 0)
{ GetMap()->ScriptsStart(DBS_ON_QUEST_START, pQuest->GetQuestStartScript(), questGiver, this, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE); } {
GetMap()->ScriptsStart(DBS_ON_QUEST_START, pQuest->GetQuestStartScript(), questGiver, this, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE);
}
} }
// remove start item if not need // remove start item if not need
@ -13928,7 +13994,9 @@ void Player::RewardQuest(Quest const* pQuest, uint32 reward, Object* questGiver,
} }
if (!handled && pQuest->GetQuestCompleteScript() != 0) if (!handled && pQuest->GetQuestCompleteScript() != 0)
{ GetMap()->ScriptsStart(DBS_ON_QUEST_END, pQuest->GetQuestCompleteScript(), questGiver, this, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE); } {
GetMap()->ScriptsStart(DBS_ON_QUEST_END, pQuest->GetQuestCompleteScript(), questGiver, this, Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE);
}
// cast spells after mark quest complete (some spells have quest completed state reqyurements in spell_area data) // cast spells after mark quest complete (some spells have quest completed state reqyurements in spell_area data)
if (pQuest->GetRewSpellCast() > 0) if (pQuest->GetRewSpellCast() > 0)
@ -16022,7 +16090,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SqlQueryHolder* holder)
case 1: SetGameMaster(true); break; // enable case 1: SetGameMaster(true); break; // enable
case 2: // save state case 2: // save state
if (extraflags & PLAYER_EXTRA_GM_ON) if (extraflags & PLAYER_EXTRA_GM_ON)
{ SetGameMaster(true); } {
SetGameMaster(true);
}
break; break;
} }
@ -16084,7 +16154,9 @@ bool Player::IsTappedByMeOrMyGroup(Creature* creature)
{ {
/* Nobody tapped the monster (solo kill by another NPC) */ /* Nobody tapped the monster (solo kill by another NPC) */
if (!creature->HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED)) if (!creature->HasFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_TAPPED))
{ return false; } {
return false;
}
/* If there is a loot recipient, assign it to recipient */ /* If there is a loot recipient, assign it to recipient */
if (Player* recipient = creature->GetLootRecipient()) if (Player* recipient = creature->GetLootRecipient())
@ -18183,7 +18255,9 @@ void Player::outDebugStatsValues() const
{ {
// optimize disabled debug output // optimize disabled debug output
if (!sLog.HasLogLevelOrHigher(LOG_LVL_DEBUG) || sLog.HasLogFilter(LOG_FILTER_PLAYER_STATS)) if (!sLog.HasLogLevelOrHigher(LOG_LVL_DEBUG) || sLog.HasLogFilter(LOG_FILTER_PLAYER_STATS))
{ return; } {
return;
}
sLog.outDebug("HP is: \t\t\t%u\t\tMP is: \t\t\t%u", GetMaxHealth(), GetMaxPower(POWER_MANA)); sLog.outDebug("HP is: \t\t\t%u\t\tMP is: \t\t\t%u", GetMaxHealth(), GetMaxPower(POWER_MANA));
sLog.outDebug("AGILITY is: \t\t%f\t\tSTRENGTH is: \t\t%f", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH)); sLog.outDebug("AGILITY is: \t\t%f\t\tSTRENGTH is: \t\t%f", GetStat(STAT_AGILITY), GetStat(STAT_STRENGTH));

View file

@ -209,7 +209,9 @@ struct ActionButton
{ {
packedData = newData; packedData = newData;
if (uState != ACTIONBUTTON_NEW) if (uState != ACTIONBUTTON_NEW)
{ uState = ACTIONBUTTON_CHANGED; } {
uState = ACTIONBUTTON_CHANGED;
}
} }
} }
}; };
@ -1185,7 +1187,9 @@ class Player : public Unit
m_ExtraFlags &= ~(PLAYER_EXTRA_AUCTION_ENEMY | PLAYER_EXTRA_AUCTION_NEUTRAL); m_ExtraFlags &= ~(PLAYER_EXTRA_AUCTION_ENEMY | PLAYER_EXTRA_AUCTION_NEUTRAL);
if (state < 0) if (state < 0)
{ m_ExtraFlags |= PLAYER_EXTRA_AUCTION_ENEMY; } {
m_ExtraFlags |= PLAYER_EXTRA_AUCTION_ENEMY;
}
else if (state > 0) else if (state > 0)
{ m_ExtraFlags |= PLAYER_EXTRA_AUCTION_NEUTRAL; } { m_ExtraFlags |= PLAYER_EXTRA_AUCTION_NEUTRAL; }
} }
@ -1308,7 +1312,9 @@ class Player : public Unit
InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap = false) const InventoryResult CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& dest, Item* pItem, bool swap = false) const
{ {
if (!pItem) if (!pItem)
{ return EQUIP_ERR_ITEM_NOT_FOUND; } {
return EQUIP_ERR_ITEM_NOT_FOUND;
}
uint32 count = pItem->GetCount(); uint32 count = pItem->GetCount();
return _CanStoreItem(bag, slot, dest, pItem->GetEntry(), count, pItem, swap, NULL); return _CanStoreItem(bag, slot, dest, pItem->GetEntry(), count, pItem, swap, NULL);
} }
@ -2284,7 +2290,9 @@ class Player : public Unit
{ {
for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
if (m_bgBattleGroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_NONE) if (m_bgBattleGroundQueueID[i].bgQueueTypeId != BATTLEGROUND_QUEUE_NONE)
{ return true; } {
return true;
}
return false; return false;
} }
@ -2300,14 +2308,18 @@ class Player : public Unit
{ {
for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId) if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
{ return i; } {
return i;
}
return PLAYER_MAX_BATTLEGROUND_QUEUES; return PLAYER_MAX_BATTLEGROUND_QUEUES;
} }
bool IsInvitedForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const bool IsInvitedForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const
{ {
for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId) if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
{ return m_bgBattleGroundQueueID[i].invitedToInstance != 0; } {
return m_bgBattleGroundQueueID[i].invitedToInstance != 0;
}
return false; return false;
} }
bool InBattleGroundQueueForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const bool InBattleGroundQueueForBattleGroundQueueType(BattleGroundQueueTypeId bgQueueTypeId) const
@ -2338,7 +2350,9 @@ class Player : public Unit
{ {
for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE) if (m_bgBattleGroundQueueID[i].bgQueueTypeId == BATTLEGROUND_QUEUE_NONE)
{ return true; } {
return true;
}
return false; return false;
} }
void RemoveBattleGroundQueueId(BattleGroundQueueTypeId val) void RemoveBattleGroundQueueId(BattleGroundQueueTypeId val)
@ -2357,13 +2371,17 @@ class Player : public Unit
{ {
for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId) if (m_bgBattleGroundQueueID[i].bgQueueTypeId == bgQueueTypeId)
{ m_bgBattleGroundQueueID[i].invitedToInstance = instanceId; } {
m_bgBattleGroundQueueID[i].invitedToInstance = instanceId;
}
} }
bool IsInvitedForBattleGroundInstance(uint32 instanceId) const bool IsInvitedForBattleGroundInstance(uint32 instanceId) const
{ {
for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i) for (int i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
if (m_bgBattleGroundQueueID[i].invitedToInstance == instanceId) if (m_bgBattleGroundQueueID[i].invitedToInstance == instanceId)
{ return true; } {
return true;
}
return false; return false;
} }
WorldLocation const& GetBattleGroundEntryPoint() const { return m_bgData.joinPos; } WorldLocation const& GetBattleGroundEntryPoint() const { return m_bgData.joinPos; }
@ -2876,7 +2894,9 @@ class Player : public Unit
void ScheduleDelayedOperation(uint32 operation) void ScheduleDelayedOperation(uint32 operation)
{ {
if (operation < DELAYED_END) if (operation < DELAYED_END)
{ m_DelayedOperations |= operation; } {
m_DelayedOperations |= operation;
}
} }
void _fillGearScoreData(Item* item, GearScoreVec* gearScore, uint32& twoHandScore); void _fillGearScoreData(Item* item, GearScoreVec* gearScore, uint32& twoHandScore);

View file

@ -40,7 +40,9 @@
bool Player::UpdateStats(Stats stat) bool Player::UpdateStats(Stats stat)
{ {
if (stat > STAT_SPIRIT) if (stat > STAT_SPIRIT)
{ return false; } {
return false;
}
// value = ((base_value * base_pct) + total_value) * total_pct // value = ((base_value * base_pct) + total_value) * total_pct
float value = GetTotalStatValue(stat); float value = GetTotalStatValue(stat);
@ -346,7 +348,9 @@ void Player::UpdateAttackPowerAndDamage(bool ranged)
{ {
UpdateDamagePhysical(BASE_ATTACK); UpdateDamagePhysical(BASE_ATTACK);
if (CanDualWield() && haveOffhandWeapon()) // allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon if (CanDualWield() && haveOffhandWeapon()) // allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon
{ UpdateDamagePhysical(OFF_ATTACK); } {
UpdateDamagePhysical(OFF_ATTACK);
}
} }
} }
@ -711,7 +715,9 @@ void Player::UpdateManaRegen()
// Set regen rate in cast state apply only on spirit based regen // Set regen rate in cast state apply only on spirit based regen
int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT); int32 modManaRegenInterrupt = GetTotalAuraModifier(SPELL_AURA_MOD_MANA_REGEN_INTERRUPT);
if (modManaRegenInterrupt > 100) if (modManaRegenInterrupt > 100)
{ modManaRegenInterrupt = 100; } {
modManaRegenInterrupt = 100;
}
SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, base_regen + power_regen_mp5 + spirit_regen * modManaRegenInterrupt / 100.0f); SetStatFloatValue(UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER, base_regen + power_regen_mp5 + spirit_regen * modManaRegenInterrupt / 100.0f);
SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, base_regen + 0.001f + power_regen_mp5 + spirit_regen); SetStatFloatValue(UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER, base_regen + 0.001f + power_regen_mp5 + spirit_regen);
@ -868,7 +874,9 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged)
SetFloatValue(index_mult, attPowerMultiplier); // UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field SetFloatValue(index_mult, attPowerMultiplier); // UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field
if (ranged) if (ranged)
{ return; } {
return;
}
// automatically update weapon damage after attack power modification // automatically update weapon damage after attack power modification
UpdateDamagePhysical(BASE_ATTACK); UpdateDamagePhysical(BASE_ATTACK);
@ -878,7 +886,9 @@ void Creature::UpdateAttackPowerAndDamage(bool ranged)
void Creature::UpdateDamagePhysical(WeaponAttackType attType) void Creature::UpdateDamagePhysical(WeaponAttackType attType)
{ {
if (attType > OFF_ATTACK) if (attType > OFF_ATTACK)
{ return; } {
return;
}
UnitMods unitMod = (attType == BASE_ATTACK ? UNIT_MOD_DAMAGE_MAINHAND : UNIT_MOD_DAMAGE_OFFHAND); UnitMods unitMod = (attType == BASE_ATTACK ? UNIT_MOD_DAMAGE_MAINHAND : UNIT_MOD_DAMAGE_OFFHAND);
@ -909,7 +919,9 @@ void Creature::UpdateDamagePhysical(WeaponAttackType attType)
bool Pet::UpdateStats(Stats stat) bool Pet::UpdateStats(Stats stat)
{ {
if (stat > STAT_SPIRIT) if (stat > STAT_SPIRIT)
{ return false; } {
return false;
}
// value = ((base_value * base_pct) + total_value) * total_pct // value = ((base_value * base_pct) + total_value) * total_pct
float value = GetTotalStatValue(stat); float value = GetTotalStatValue(stat);
@ -1026,14 +1038,18 @@ void Pet::UpdateMaxPower(Powers power)
void Pet::UpdateAttackPowerAndDamage(bool ranged) void Pet::UpdateAttackPowerAndDamage(bool ranged)
{ {
if (ranged) if (ranged)
{ return; } {
return;
}
float val = 0.0f; float val = 0.0f;
float bonusAP = 0.0f; float bonusAP = 0.0f;
UnitMods unitMod = UNIT_MOD_ATTACK_POWER; UnitMods unitMod = UNIT_MOD_ATTACK_POWER;
if (GetEntry() == 416) // imp's attack power if (GetEntry() == 416) // imp's attack power
{ val = GetStat(STAT_STRENGTH) - 10.0f; } {
val = GetStat(STAT_STRENGTH) - 10.0f;
}
else else
{ val = 2 * GetStat(STAT_STRENGTH) - 20.0f; } { val = 2 * GetStat(STAT_STRENGTH) - 20.0f; }
@ -1087,7 +1103,9 @@ void Pet::UpdateAttackPowerAndDamage(bool ranged)
void Pet::UpdateDamagePhysical(WeaponAttackType attType) void Pet::UpdateDamagePhysical(WeaponAttackType attType)
{ {
if (attType > BASE_ATTACK) if (attType > BASE_ATTACK)
{ return; } {
return;
}
UnitMods unitMod = UNIT_MOD_DAMAGE_MAINHAND; UnitMods unitMod = UNIT_MOD_DAMAGE_MAINHAND;

View file

@ -604,7 +604,9 @@ Unit::~Unit()
void Unit::Update(uint32 update_diff, uint32 p_time) void Unit::Update(uint32 update_diff, uint32 p_time)
{ {
if (!IsInWorld()) if (!IsInWorld())
{ return; } {
return;
}
/*if(p_time > m_AurasCheck) /*if(p_time > m_AurasCheck)
{ {
@ -639,7 +641,9 @@ void Unit::Update(uint32 update_diff, uint32 p_time)
{ {
// m_CombatTimer set at aura start and it will be freeze until aura removing // m_CombatTimer set at aura start and it will be freeze until aura removing
if (m_CombatTimer <= update_diff) if (m_CombatTimer <= update_diff)
{ CombatStop(); } {
CombatStop();
}
else else
{ m_CombatTimer -= update_diff; } { m_CombatTimer -= update_diff; }
} }
@ -684,10 +688,14 @@ bool Unit::UpdateMeleeAttackingState()
{ {
Unit* victim = getVictim(); Unit* victim = getVictim();
if (!victim || IsNonMeleeSpellCasted(false)) if (!victim || IsNonMeleeSpellCasted(false))
{ return false; } {
return false;
}
if (!isAttackReady(BASE_ATTACK) && !(isAttackReady(OFF_ATTACK) && haveOffhandWeapon())) if (!isAttackReady(BASE_ATTACK) && !(isAttackReady(OFF_ATTACK) && haveOffhandWeapon()))
{ return false; } {
return false;
}
uint8 swingError = 0; uint8 swingError = 0;
if (!CanReachWithMeleeAttack(victim)) if (!CanReachWithMeleeAttack(victim))
@ -711,7 +719,9 @@ bool Unit::UpdateMeleeAttackingState()
if (haveOffhandWeapon()) if (haveOffhandWeapon())
{ {
if (getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY) if (getAttackTimer(OFF_ATTACK) < ATTACK_DISPLAY_DELAY)
{ setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY); } {
setAttackTimer(OFF_ATTACK, ATTACK_DISPLAY_DELAY);
}
} }
AttackerStateUpdate(victim, BASE_ATTACK); AttackerStateUpdate(victim, BASE_ATTACK);
resetAttackTimer(BASE_ATTACK); resetAttackTimer(BASE_ATTACK);
@ -721,7 +731,9 @@ bool Unit::UpdateMeleeAttackingState()
// prevent base and off attack in same time, delay attack at 0.2 sec // prevent base and off attack in same time, delay attack at 0.2 sec
uint32 base_att = getAttackTimer(BASE_ATTACK); uint32 base_att = getAttackTimer(BASE_ATTACK);
if (base_att < ATTACK_DISPLAY_DELAY) if (base_att < ATTACK_DISPLAY_DELAY)
{ setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY); } {
setAttackTimer(BASE_ATTACK, ATTACK_DISPLAY_DELAY);
}
// do attack // do attack
AttackerStateUpdate(victim, OFF_ATTACK); AttackerStateUpdate(victim, OFF_ATTACK);
resetAttackTimer(OFF_ATTACK); resetAttackTimer(OFF_ATTACK);
@ -732,7 +744,9 @@ bool Unit::UpdateMeleeAttackingState()
if (player && swingError != player->LastSwingErrorMsg()) if (player && swingError != player->LastSwingErrorMsg())
{ {
if (swingError == 1) if (swingError == 1)
{ player->SendAttackSwingNotInRange(); } {
player->SendAttackSwingNotInRange();
}
else if (swingError == 2) else if (swingError == 2)
{ player->SendAttackSwingBadFacingAttack(); } { player->SendAttackSwingBadFacingAttack(); }
player->SwingErrorMsg(swingError); player->SwingErrorMsg(swingError);
@ -744,10 +758,14 @@ bool Unit::UpdateMeleeAttackingState()
bool Unit::haveOffhandWeapon() const bool Unit::haveOffhandWeapon() const
{ {
if (!CanUseEquippedWeapon(OFF_ATTACK)) if (!CanUseEquippedWeapon(OFF_ATTACK))
{ return false; } {
return false;
}
if (GetTypeId() == TYPEID_PLAYER) if (GetTypeId() == TYPEID_PLAYER)
{ return ((Player*)this)->GetWeaponForAttack(OFF_ATTACK, true, true); } {
return ((Player*)this)->GetWeaponForAttack(OFF_ATTACK, true, true);
}
else else
{ {
uint32 ItemId = GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1); uint32 ItemId = GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1);
@ -781,7 +799,9 @@ float Unit::GetCombatReach(Unit const* pVictim, bool forMeleeRange /*=true*/, fl
BASE_MELEERANGE_OFFSET + flat_mod; BASE_MELEERANGE_OFFSET + flat_mod;
if (forMeleeRange && reach < ATTACK_DISTANCE) if (forMeleeRange && reach < ATTACK_DISTANCE)
{ reach = ATTACK_DISTANCE; } {
reach = ATTACK_DISTANCE;
}
return reach; return reach;
} }
@ -856,7 +876,9 @@ void Unit::DealDamageMods(Unit* pVictim, uint32& damage, uint32* absorb)
if (!pVictim->IsAlive() || pVictim->IsTaxiFlying() || (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())) if (!pVictim->IsAlive() || pVictim->IsTaxiFlying() || (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode()))
{ {
if (absorb) if (absorb)
{ *absorb += damage; } {
*absorb += damage;
}
damage = 0; damage = 0;
return; return;
} }
@ -874,13 +896,19 @@ void Unit::DealDamageMods(Unit* pVictim, uint32& damage, uint32* absorb)
// Script Event damage Deal // Script Event damage Deal
if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->AI()) if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->AI())
{ ((Creature*)this)->AI()->DamageDeal(pVictim, damage); } {
((Creature*)this)->AI()->DamageDeal(pVictim, damage);
}
// Script Event damage taken // Script Event damage taken
if (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->AI()) if (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->AI())
{ ((Creature*)pVictim)->AI()->DamageTaken(this, damage); } {
((Creature*)pVictim)->AI()->DamageTaken(this, damage);
}
if (absorb && originalDamage > damage) if (absorb && originalDamage > damage)
{ *absorb += (originalDamage - damage); } {
*absorb += (originalDamage - damage);
}
} }
uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const* spellProto, bool durabilityLoss) uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const* spellProto, bool durabilityLoss)
@ -1030,7 +1058,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); ((Player*)pVictim)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage);
if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->IsPet() && !((Creature*)pVictim)->HasLootRecipient()) if (pVictim->GetTypeId() == TYPEID_UNIT && !((Creature*)pVictim)->IsPet() && !((Creature*)pVictim)->HasLootRecipient())
{ ((Creature*)pVictim)->SetLootRecipient(this); } {
((Creature*)pVictim)->SetLootRecipient(this);
}
if (health <= damage) if (health <= damage)
{ {
@ -1049,13 +1079,17 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
group_tap = ((Creature*)pVictim)->GetGroupLootRecipient(); group_tap = ((Creature*)pVictim)->GetGroupLootRecipient();
if (Player* recipient = ((Creature*)pVictim)->GetOriginalLootRecipient()) if (Player* recipient = ((Creature*)pVictim)->GetOriginalLootRecipient())
{ player_tap = recipient; } {
player_tap = recipient;
}
} }
// in player kill case group tap selected by player_tap (killer-player itself, or charmer, or owner, etc) // in player kill case group tap selected by player_tap (killer-player itself, or charmer, or owner, etc)
else else
{ {
if (player_tap) if (player_tap)
{ group_tap = player_tap->GetGroup(); } {
group_tap = player_tap->GetGroup();
}
} }
// Spirit of Redemtion Talent // Spirit of Redemtion Talent
@ -1089,7 +1123,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
data << pVictim->GetObjectGuid(); // victim data << pVictim->GetObjectGuid(); // victim
if (group_tap) if (group_tap)
{ group_tap->BroadcastPacket(&data, false, group_tap->GetMemberGroup(player_tap->GetObjectGuid()), player_tap->GetObjectGuid()); } {
group_tap->BroadcastPacket(&data, false, group_tap->GetMemberGroup(player_tap->GetObjectGuid()), player_tap->GetObjectGuid());
}
player_tap->SendDirectMessage(&data); player_tap->SendDirectMessage(&data);
} }
@ -1100,7 +1136,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
if (player_tap != pVictim) if (player_tap != pVictim)
{ {
if (group_tap) if (group_tap)
{ group_tap->RewardGroupAtKill(pVictim, player_tap); } {
group_tap->RewardGroupAtKill(pVictim, player_tap);
}
else if (player_tap) else if (player_tap)
{ player_tap->RewardSinglePlayerAtKill(pVictim); } { player_tap->RewardSinglePlayerAtKill(pVictim); }
} }
@ -1120,7 +1158,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
// save value before aura remove // save value before aura remove
uint32 ressSpellId = pVictim->GetUInt32Value(PLAYER_SELF_RES_SPELL); uint32 ressSpellId = pVictim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
if (!ressSpellId) if (!ressSpellId)
{ ressSpellId = ((Player*)pVictim)->GetResurrectionSpellId(); } {
ressSpellId = ((Player*)pVictim)->GetResurrectionSpellId();
}
// Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers) // Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
pVictim->RemoveAllAurasOnDeath(); pVictim->RemoveAllAurasOnDeath();
@ -1136,7 +1176,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
// Call KilledUnit for creatures // Call KilledUnit for creatures
if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->AI()) if (GetTypeId() == TYPEID_UNIT && ((Creature*)this)->AI())
{ ((Creature*)this)->AI()->KilledUnit(pVictim); } {
((Creature*)this)->AI()->KilledUnit(pVictim);
}
if (Creature* killer = ToCreature()) if (Creature* killer = ToCreature())
{ {
@ -1160,7 +1202,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
// remember victim PvP death for corpse type and corpse reclaim delay // remember victim PvP death for corpse type and corpse reclaim delay
// at original death (not at SpiritOfRedemtionTalent timeout) // at original death (not at SpiritOfRedemtionTalent timeout)
if (!damageFromSpiritOfRedemtionTalent) if (!damageFromSpiritOfRedemtionTalent)
{ playerVictim->SetPvPDeath(player_tap != NULL); } {
playerVictim->SetPvPDeath(player_tap != NULL);
}
// achievement stuff // achievement stuff
playerVictim->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); playerVictim->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health);
@ -1208,7 +1252,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
{ {
// selfkills are not handled in outdoor pvp scripts // selfkills are not handled in outdoor pvp scripts
if (OutdoorPvP* outdoorPvP = sOutdoorPvPMgr.GetScript(playerVictim->GetCachedZoneId())) if (OutdoorPvP* outdoorPvP = sOutdoorPvPMgr.GetScript(playerVictim->GetCachedZoneId()))
{ outdoorPvP->HandlePlayerKill(player_tap, playerVictim); } {
outdoorPvP->HandlePlayerKill(player_tap, playerVictim);
}
} }
// Used by Eluna // Used by Eluna
@ -1282,14 +1328,18 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
{ {
// skip channeled spell (processed differently below) // skip channeled spell (processed differently below)
if (i == CURRENT_CHANNELED_SPELL) if (i == CURRENT_CHANNELED_SPELL)
{ continue; } {
continue;
}
if (Spell* spell = pVictim->GetCurrentSpell(CurrentSpellTypes(i))) if (Spell* spell = pVictim->GetCurrentSpell(CurrentSpellTypes(i)))
{ {
if (spell->getState() == SPELL_STATE_PREPARING) if (spell->getState() == SPELL_STATE_PREPARING)
{ {
if(spell->m_spellInfo->GetInterruptFlags() & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG) if(spell->m_spellInfo->GetInterruptFlags() & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
{ pVictim->InterruptSpell(CurrentSpellTypes(i)); } {
pVictim->InterruptSpell(CurrentSpellTypes(i));
}
else else
{ spell->Delayed(); } { spell->Delayed(); }
} }
@ -1305,7 +1355,9 @@ uint32 Unit::DealDamage(Unit* pVictim, uint32 damage, CleanDamage const* cleanDa
if (channelInterruptFlags & CHANNEL_FLAG_DELAY) if (channelInterruptFlags & CHANNEL_FLAG_DELAY)
{ {
if (pVictim != this) // don't shorten the duration of channeling if you damage yourself if (pVictim != this) // don't shorten the duration of channeling if you damage yourself
{ spell->DelayedChannel(); } {
spell->DelayedChannel();
}
} }
else if ((channelInterruptFlags & (CHANNEL_FLAG_DAMAGE | CHANNEL_FLAG_DAMAGE2))) else if ((channelInterruptFlags & (CHANNEL_FLAG_DAMAGE | CHANNEL_FLAG_DAMAGE2)))
{ {
@ -1353,7 +1405,9 @@ struct PetOwnerKilledUnitHelper
if (pTarget->GetTypeId() == TYPEID_UNIT) if (pTarget->GetTypeId() == TYPEID_UNIT)
{ {
if (((Creature*)pTarget)->AI()) if (((Creature*)pTarget)->AI())
{ ((Creature*)pTarget)->AI()->OwnerKilledUnit(m_victim); } {
((Creature*)pTarget)->AI()->OwnerKilledUnit(m_victim);
}
} }
} }
@ -1369,7 +1423,9 @@ void Unit::JustKilledCreature(Creature* victim, Player* responsiblePlayer)
if (victim->GetCreatureType() == CREATURE_TYPE_CRITTER && GetTypeId() == TYPEID_PLAYER) if (victim->GetCreatureType() == CREATURE_TYPE_CRITTER && GetTypeId() == TYPEID_PLAYER)
{ {
if (CreatureInfo const* normalInfo = ObjectMgr::GetCreatureTemplate(victim->GetEntry())) if (CreatureInfo const* normalInfo = ObjectMgr::GetCreatureTemplate(victim->GetEntry()))
{ ((Player*)this)->KilledMonster(normalInfo, victim->GetObjectGuid()); } {
((Player*)this)->KilledMonster(normalInfo, victim->GetObjectGuid());
}
} }
// Interrupt channeling spell when a Possessed Summoned is killed // Interrupt channeling spell when a Possessed Summoned is killed
@ -1381,14 +1437,18 @@ void Unit::JustKilledCreature(Creature* victim, Player* responsiblePlayer)
{ {
Spell* channeledSpell = creator->GetCurrentSpell(CURRENT_CHANNELED_SPELL); Spell* channeledSpell = creator->GetCurrentSpell(CURRENT_CHANNELED_SPELL);
if (channeledSpell && channeledSpell->m_spellInfo->Id == spellInfo->Id) if (channeledSpell && channeledSpell->m_spellInfo->Id == spellInfo->Id)
{ creator->InterruptNonMeleeSpells(false); } {
creator->InterruptNonMeleeSpells(false);
}
} }
} }
/* ******************************* Inform various hooks ************************************ */ /* ******************************* Inform various hooks ************************************ */
// Inform victim's AI // Inform victim's AI
if (victim->AI()) if (victim->AI())
{ victim->AI()->JustDied(this); } {
victim->AI()->JustDied(this);
}
// Inform Owner // Inform Owner
Unit* pOwner = victim->GetCharmerOrOwner(); Unit* pOwner = victim->GetCharmerOrOwner();
@ -1398,17 +1458,23 @@ void Unit::JustKilledCreature(Creature* victim, Player* responsiblePlayer)
if (pSummon->GetSummonerGuid().IsCreatureOrVehicle()) if (pSummon->GetSummonerGuid().IsCreatureOrVehicle())
if (Creature* pSummoner = victim->GetMap()->GetCreature(pSummon->GetSummonerGuid())) if (Creature* pSummoner = victim->GetMap()->GetCreature(pSummon->GetSummonerGuid()))
if (pSummoner->AI()) if (pSummoner->AI())
{ pSummoner->AI()->SummonedCreatureJustDied(victim); } {
pSummoner->AI()->SummonedCreatureJustDied(victim);
}
} }
else if (pOwner && pOwner->GetTypeId() == TYPEID_UNIT) else if (pOwner && pOwner->GetTypeId() == TYPEID_UNIT)
{ {
if (((Creature*)pOwner)->AI()) if (((Creature*)pOwner)->AI())
{ ((Creature*)pOwner)->AI()->SummonedCreatureJustDied(victim); } {
((Creature*)pOwner)->AI()->SummonedCreatureJustDied(victim);
}
} }
// Inform Instance Data and Linking // Inform Instance Data and Linking
if (InstanceData* mapInstance = victim->GetInstanceData()) if (InstanceData* mapInstance = victim->GetInstanceData())
{ mapInstance->OnCreatureDeath(victim); } {
mapInstance->OnCreatureDeath(victim);
}
if (responsiblePlayer) // killedby Player, inform BG if (responsiblePlayer) // killedby Player, inform BG
if (BattleGround* bg = responsiblePlayer->GetBattleGround()) if (BattleGround* bg = responsiblePlayer->GetBattleGround())
@ -1421,13 +1487,17 @@ void Unit::JustKilledCreature(Creature* victim, Player* responsiblePlayer)
// Notify the outdoor pvp script // Notify the outdoor pvp script
if (OutdoorPvP* outdoorPvP = sOutdoorPvPMgr.GetScript(responsiblePlayer ? responsiblePlayer->GetCachedZoneId() : GetZoneId())) if (OutdoorPvP* outdoorPvP = sOutdoorPvPMgr.GetScript(responsiblePlayer ? responsiblePlayer->GetCachedZoneId() : GetZoneId()))
{ outdoorPvP->HandleCreatureDeath(victim); } {
outdoorPvP->HandleCreatureDeath(victim);
}
// Start creature death script // Start creature death script
GetMap()->ScriptsStart(DBS_ON_CREATURE_DEATH, victim->GetEntry(), victim, responsiblePlayer ? responsiblePlayer : this); GetMap()->ScriptsStart(DBS_ON_CREATURE_DEATH, victim->GetEntry(), victim, responsiblePlayer ? responsiblePlayer : this);
if (victim->IsLinkingEventTrigger()) if (victim->IsLinkingEventTrigger())
{ victim->GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_DIE, victim); } {
victim->GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_DIE, victim);
}
// Dungeon specific stuff // Dungeon specific stuff
if (victim->GetInstanceId()) if (victim->GetInstanceId())
@ -1441,7 +1511,9 @@ void Unit::JustKilledCreature(Creature* victim, Player* responsiblePlayer)
if (m->IsRaidOrHeroicDungeon()) if (m->IsRaidOrHeroicDungeon())
{ {
if (victim->GetCreatureInfo()->ExtraFlags & CREATURE_EXTRA_FLAG_INSTANCE_BIND) if (victim->GetCreatureInfo()->ExtraFlags & CREATURE_EXTRA_FLAG_INSTANCE_BIND)
{ ((DungeonMap*)m)->PermBindAllPlayers(creditedPlayer); } {
((DungeonMap*)m)->PermBindAllPlayers(creditedPlayer);
}
} }
else else
{ {
@ -1450,7 +1522,9 @@ void Unit::JustKilledCreature(Creature* victim, Player* responsiblePlayer)
// until the players leave the instance // until the players leave the instance
time_t resettime = victim->GetRespawnTimeEx() + 2 * HOUR; time_t resettime = victim->GetRespawnTimeEx() + 2 * HOUR;
if (save->GetResetTime() < resettime) if (save->GetResetTime() < resettime)
{ save->SetResetTime(resettime); } {
save->SetResetTime(resettime);
}
} }
// update encounter state if needed // update encounter state if needed
((DungeonMap*)m)->GetPersistanceState()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, victim->GetEntry()); ((DungeonMap*)m)->GetPersistanceState()->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, victim->GetEntry());
@ -1484,7 +1558,9 @@ void Unit::CastStop(uint32 except_spellid)
{ {
for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i) for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i)
if (m_currentSpells[i] && m_currentSpells[i]->m_spellInfo->Id != except_spellid) if (m_currentSpells[i] && m_currentSpells[i]->m_spellInfo->Id != except_spellid)
{ InterruptSpell(CurrentSpellTypes(i), false); } {
InterruptSpell(CurrentSpellTypes(i), false);
}
} }
void Unit::CastSpell(Unit* Victim, uint32 spellId, bool triggered, Item* castItem, Aura* triggeredByAura, ObjectGuid originalCaster, SpellEntry const* triggeredBy) void Unit::CastSpell(Unit* Victim, uint32 spellId, bool triggered, Item* castItem, Aura* triggeredByAura, ObjectGuid originalCaster, SpellEntry const* triggeredBy)
@ -1494,7 +1570,9 @@ void Unit::CastSpell(Unit* Victim, uint32 spellId, bool triggered, Item* castIte
if (!spellInfo) if (!spellInfo)
{ {
if (triggeredByAura) if (triggeredByAura)
{ sLog.outError("CastSpell: unknown spell id %i by caster: %s triggered by aura %u (eff %u)", spellId, GetGuidStr().c_str(), triggeredByAura->GetId(), triggeredByAura->GetEffIndex()); } {
sLog.outError("CastSpell: unknown spell id %i by caster: %s triggered by aura %u (eff %u)", spellId, GetGuidStr().c_str(), triggeredByAura->GetId(), triggeredByAura->GetEffIndex());
}
else else
{ sLog.outError("CastSpell: unknown spell id %i by caster: %s", spellId, GetGuidStr().c_str()); } { sLog.outError("CastSpell: unknown spell id %i by caster: %s", spellId, GetGuidStr().c_str()); }
return; return;
@ -1508,19 +1586,25 @@ void Unit::CastSpell(Unit* Victim, SpellEntry const* spellInfo, bool triggered,
if (!spellInfo) if (!spellInfo)
{ {
if (triggeredByAura) if (triggeredByAura)
{ sLog.outError("CastSpell: unknown spell by caster: %s triggered by aura %u (eff %u)", GetGuidStr().c_str(), triggeredByAura->GetId(), triggeredByAura->GetEffIndex()); } {
sLog.outError("CastSpell: unknown spell by caster: %s triggered by aura %u (eff %u)", GetGuidStr().c_str(), triggeredByAura->GetId(), triggeredByAura->GetEffIndex());
}
else else
{ sLog.outError("CastSpell: unknown spell by caster: %s", GetGuidStr().c_str()); } { sLog.outError("CastSpell: unknown spell by caster: %s", GetGuidStr().c_str()); }
return; return;
} }
if (castItem) if (castItem)
{ DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "WORLD: cast Item spellId - %i", spellInfo->Id); } {
DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "WORLD: cast Item spellId - %i", spellInfo->Id);
}
if (triggeredByAura) if (triggeredByAura)
{ {
if (!originalCaster) if (!originalCaster)
{ originalCaster = triggeredByAura->GetCasterGuid(); } {
originalCaster = triggeredByAura->GetCasterGuid();
}
triggeredBy = triggeredByAura->GetSpellProto(); triggeredBy = triggeredByAura->GetSpellProto();
} }
@ -1540,7 +1624,9 @@ void Unit::CastSpell(Unit* Victim, SpellEntry const* spellInfo, bool triggered,
targets.setUnitTarget(Victim); targets.setUnitTarget(Victim);
if (spellInfo->GetTargets() & TARGET_FLAG_DEST_LOCATION) if (spellInfo->GetTargets() & TARGET_FLAG_DEST_LOCATION)
{ targets.setDestination(Victim->GetPositionX(), Victim->GetPositionY(), Victim->GetPositionZ()); } {
targets.setDestination(Victim->GetPositionX(), Victim->GetPositionY(), Victim->GetPositionZ());
}
if (spellInfo->GetTargets() & TARGET_FLAG_SOURCE_LOCATION) if (spellInfo->GetTargets() & TARGET_FLAG_SOURCE_LOCATION)
if (WorldObject* caster = spell->GetCastingObject()) if (WorldObject* caster = spell->GetCastingObject())
targets.setSource(caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); targets.setSource(caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ());
@ -1577,12 +1663,16 @@ void Unit::CastCustomSpell(Unit* Victim, SpellEntry const* spellInfo, int32 cons
} }
if (castItem) if (castItem)
{ DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "WORLD: cast Item spellId - %i", spellInfo->Id); } {
DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "WORLD: cast Item spellId - %i", spellInfo->Id);
}
if (triggeredByAura) if (triggeredByAura)
{ {
if (!originalCaster) if (!originalCaster)
{ originalCaster = triggeredByAura->GetCasterGuid(); } {
originalCaster = triggeredByAura->GetCasterGuid();
}
triggeredBy = triggeredByAura->GetSpellProto(); triggeredBy = triggeredByAura->GetSpellProto();
} }
@ -1590,23 +1680,33 @@ void Unit::CastCustomSpell(Unit* Victim, SpellEntry const* spellInfo, int32 cons
Spell* spell = new Spell(this, spellInfo, triggered, originalCaster, triggeredBy); Spell* spell = new Spell(this, spellInfo, triggered, originalCaster, triggeredBy);
if (bp0) if (bp0)
{ spell->m_currentBasePoints[EFFECT_INDEX_0] = *bp0; } {
spell->m_currentBasePoints[EFFECT_INDEX_0] = *bp0;
}
if (bp1) if (bp1)
{ spell->m_currentBasePoints[EFFECT_INDEX_1] = *bp1; } {
spell->m_currentBasePoints[EFFECT_INDEX_1] = *bp1;
}
if (bp2) if (bp2)
{ spell->m_currentBasePoints[EFFECT_INDEX_2] = *bp2; } {
spell->m_currentBasePoints[EFFECT_INDEX_2] = *bp2;
}
SpellCastTargets targets; SpellCastTargets targets;
targets.setUnitTarget(Victim); targets.setUnitTarget(Victim);
spell->m_CastItem = castItem; spell->m_CastItem = castItem;
if (spellInfo->GetTargets() & TARGET_FLAG_DEST_LOCATION) if (spellInfo->GetTargets() & TARGET_FLAG_DEST_LOCATION)
{ targets.setDestination(Victim->GetPositionX(), Victim->GetPositionY(), Victim->GetPositionZ()); } {
targets.setDestination(Victim->GetPositionX(), Victim->GetPositionY(), Victim->GetPositionZ());
}
if (spellInfo->GetTargets() & TARGET_FLAG_SOURCE_LOCATION) if (spellInfo->GetTargets() & TARGET_FLAG_SOURCE_LOCATION)
if (WorldObject* caster = spell->GetCastingObject()) if (WorldObject* caster = spell->GetCastingObject())
{ targets.setSource(caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ()); } {
targets.setSource(caster->GetPositionX(), caster->GetPositionY(), caster->GetPositionZ());
}
spell->SpellStart(&targets, triggeredByAura); spell->SpellStart(&targets, triggeredByAura);
} }
@ -1641,12 +1741,16 @@ void Unit::CastSpell(float x, float y, float z, SpellEntry const* spellInfo, boo
} }
if (castItem) if (castItem)
{ DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "WORLD: cast Item spellId - %i", spellInfo->Id); } {
DEBUG_FILTER_LOG(LOG_FILTER_SPELL_CAST, "WORLD: cast Item spellId - %i", spellInfo->Id);
}
if (triggeredByAura) if (triggeredByAura)
{ {
if (!originalCaster) if (!originalCaster)
{ originalCaster = triggeredByAura->GetCasterGuid(); } {
originalCaster = triggeredByAura->GetCasterGuid();
}
triggeredBy = triggeredByAura->GetSpellProto(); triggeredBy = triggeredByAura->GetSpellProto();
} }
@ -1656,13 +1760,19 @@ void Unit::CastSpell(float x, float y, float z, SpellEntry const* spellInfo, boo
SpellCastTargets targets; SpellCastTargets targets;
if (spellInfo->GetTargets() & TARGET_FLAG_DEST_LOCATION) if (spellInfo->GetTargets() & TARGET_FLAG_DEST_LOCATION)
{ targets.setDestination(x, y, z); } {
targets.setDestination(x, y, z);
}
if (spellInfo->GetTargets() & TARGET_FLAG_SOURCE_LOCATION) if (spellInfo->GetTargets() & TARGET_FLAG_SOURCE_LOCATION)
{ targets.setSource(x, y, z); } {
targets.setSource(x, y, z);
}
// Spell cast with x,y,z but without dbc target-mask, set destination // Spell cast with x,y,z but without dbc target-mask, set destination
if (!(targets.m_targetMask & (TARGET_FLAG_DEST_LOCATION | TARGET_FLAG_SOURCE_LOCATION))) if (!(targets.m_targetMask & (TARGET_FLAG_DEST_LOCATION | TARGET_FLAG_SOURCE_LOCATION)))
{ targets.setDestination(x, y, z); } {
targets.setDestination(x, y, z);
}
spell->m_CastItem = castItem; spell->m_CastItem = castItem;
spell->SpellStart(&targets, triggeredByAura); spell->SpellStart(&targets, triggeredByAura);
@ -1687,7 +1797,9 @@ void Unit::CalculateSpellDamage(SpellNonMeleeDamage* damageInfo, int32 damage, S
Unit* pVictim = damageInfo->target; Unit* pVictim = damageInfo->target;
if (damage < 0) if (damage < 0)
{ return; } {
return;
}
if (!this || !pVictim) if (!this || !pVictim)
return; return;
@ -1767,15 +1879,21 @@ void Unit::CalculateSpellDamage(SpellNonMeleeDamage* damageInfo, int32 damage, S
void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss) void Unit::DealSpellDamage(SpellNonMeleeDamage* damageInfo, bool durabilityLoss)
{ {
if (!damageInfo) if (!damageInfo)
{ return; } {
return;
}
Unit* pVictim = damageInfo->target; Unit* pVictim = damageInfo->target;
if (!this || !pVictim) if (!this || !pVictim)
{ return; } {
return;
}
if (!pVictim->IsAlive() || pVictim->IsTaxiFlying() || (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())) if (!pVictim->IsAlive() || pVictim->IsTaxiFlying() || (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode()))
{ return; } {
return;
}
SpellEntry const* spellProto = sSpellStore.LookupEntry(damageInfo->SpellID); SpellEntry const* spellProto = sSpellStore.LookupEntry(damageInfo->SpellID);
if (spellProto == NULL) if (spellProto == NULL)
@ -1815,9 +1933,13 @@ void Unit::CalculateMeleeDamage(Unit* pVictim, CalcDamageInfo* damageInfo, Weapo
damageInfo->hitOutCome = MELEE_HIT_EVADE; damageInfo->hitOutCome = MELEE_HIT_EVADE;
if (!this || !pVictim) if (!this || !pVictim)
{ return; } {
return;
}
if (!this->IsAlive() || !pVictim->IsAlive()) if (!this->IsAlive() || !pVictim->IsAlive())
{ return; } {
return;
}
// Select HitInfo/procAttacker/procVictim flag based on attack type // Select HitInfo/procAttacker/procVictim flag based on attack type
switch (attackType) switch (attackType)
@ -2001,17 +2123,25 @@ void Unit::CalculateMeleeDamage(Unit* pVictim, CalcDamageInfo* damageInfo, Weapo
// apply max/min bounds // apply max/min bounds
if (lowEnd < 0.01f) // the low end must not go bellow 0.01f if (lowEnd < 0.01f) // the low end must not go bellow 0.01f
{ lowEnd = 0.01f; } {
lowEnd = 0.01f;
}
else if (lowEnd > maxLowEnd) // the smaller value of this and 0.6 is kept as the low end else if (lowEnd > maxLowEnd) // the smaller value of this and 0.6 is kept as the low end
{ lowEnd = maxLowEnd; } { lowEnd = maxLowEnd; }
if (highEnd < 0.2f) // high end limits if (highEnd < 0.2f) // high end limits
{ highEnd = 0.2f; } {
highEnd = 0.2f;
}
if (highEnd > 0.99f) if (highEnd > 0.99f)
{ highEnd = 0.99f; } {
highEnd = 0.99f;
}
if (lowEnd > highEnd) // prevent negative range size if (lowEnd > highEnd) // prevent negative range size
{ lowEnd = highEnd; } {
lowEnd = highEnd;
}
reducePercent = lowEnd + rand_norm_f() * (highEnd - lowEnd); reducePercent = lowEnd + rand_norm_f() * (highEnd - lowEnd);
@ -2057,7 +2187,9 @@ void Unit::CalculateMeleeDamage(Unit* pVictim, CalcDamageInfo* damageInfo, Weapo
damageInfo->procEx |= PROC_EX_ABSORB; damageInfo->procEx |= PROC_EX_ABSORB;
} }
if (damageInfo->resist) if (damageInfo->resist)
{ damageInfo->HitInfo |= HITINFO_RESIST; } {
damageInfo->HitInfo |= HITINFO_RESIST;
}
} }
else // Umpossible get negative result but.... else // Umpossible get negative result but....
{ damageInfo->damage = 0; } { damageInfo->damage = 0; }
@ -2069,10 +2201,14 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
Unit* pVictim = damageInfo->target; Unit* pVictim = damageInfo->target;
if (!this || !pVictim) if (!this || !pVictim)
{ return; } {
return;
}
if (!pVictim->IsAlive() || pVictim->IsTaxiFlying() || (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode())) if (!pVictim->IsAlive() || pVictim->IsTaxiFlying() || (pVictim->GetTypeId() == TYPEID_UNIT && ((Creature*)pVictim)->IsInEvadeMode()))
{ return; } {
return;
}
// You don't lose health from damage taken from another player while in a sanctuary // You don't lose health from damage taken from another player while in a sanctuary
// You still see it in the combat log though // You still see it in the combat log though
@ -2081,9 +2217,13 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
// Hmmmm dont like this emotes client must by self do all animations // Hmmmm dont like this emotes client must by self do all animations
if (damageInfo->HitInfo & HITINFO_CRITICALHIT) if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
{ pVictim->HandleEmoteCommand(EMOTE_ONESHOT_WOUNDCRITICAL); } {
pVictim->HandleEmoteCommand(EMOTE_ONESHOT_WOUNDCRITICAL);
}
if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS) if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
{ pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYSHIELD); } {
pVictim->HandleEmoteCommand(EMOTE_ONESHOT_PARRYSHIELD);
}
// This seems to reduce the victims time until next attack if your attack was parried // This seems to reduce the victims time until next attack if your attack was parried
if (damageInfo->TargetState == VICTIMSTATE_PARRY) if (damageInfo->TargetState == VICTIMSTATE_PARRY)
@ -2140,7 +2280,9 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
// there is a newbie protection, at level 10 just 7% base chance; assuming linear function // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
if (pVictim->getLevel() < 30) if (pVictim->getLevel() < 30)
{ Probability = 0.65f * pVictim->getLevel() + 0.5f; } {
Probability = 0.65f * pVictim->getLevel() + 0.5f;
}
uint32 VictimDefense = pVictim->GetMaxSkillValueForLevel(this); uint32 VictimDefense = pVictim->GetMaxSkillValueForLevel(this);
uint32 AttackerMeleeSkill = GetMaxSkillValueForLevel(); uint32 AttackerMeleeSkill = GetMaxSkillValueForLevel();
@ -2148,10 +2290,14 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
Probability *= AttackerMeleeSkill / (float)VictimDefense; Probability *= AttackerMeleeSkill / (float)VictimDefense;
if (Probability > 40.0f) if (Probability > 40.0f)
{ Probability = 40.0f; } {
Probability = 40.0f;
}
if (roll_chance_f(Probability)) if (roll_chance_f(Probability))
{ CastSpell(pVictim, 1604, true); } {
CastSpell(pVictim, 1604, true);
}
} }
// If not miss // If not miss
@ -2159,7 +2305,9 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
{ {
// on weapon hit casts // on weapon hit casts
if (GetTypeId() == TYPEID_PLAYER && pVictim->IsAlive()) if (GetTypeId() == TYPEID_PLAYER && pVictim->IsAlive())
{ ((Player*)this)->CastItemCombatSpell(pVictim, damageInfo->attackType); } {
((Player*)this)->CastItemCombatSpell(pVictim, damageInfo->attackType);
}
// victim's damage shield // victim's damage shield
std::set<Aura*> alreadyDone; std::set<Aura*> alreadyDone;
@ -2219,11 +2367,15 @@ void Unit::HandleEmoteState(uint32 emote_id)
void Unit::HandleEmote(uint32 emote_id) void Unit::HandleEmote(uint32 emote_id)
{ {
if (!emote_id) if (!emote_id)
{ HandleEmoteState(0); } {
HandleEmoteState(0);
}
else if (EmotesEntry const* emoteEntry = sEmotesStore.LookupEntry(emote_id)) else if (EmotesEntry const* emoteEntry = sEmotesStore.LookupEntry(emote_id))
{ {
if (emoteEntry->EmoteType) // 1,2 states, 0 command if (emoteEntry->EmoteType) // 1,2 states, 0 command
{ HandleEmoteState(emote_id); } {
HandleEmoteState(emote_id);
}
else else
{ HandleEmoteCommand(emote_id); } { HandleEmoteCommand(emote_id); }
} }
@ -2282,7 +2434,9 @@ uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage)
} }
if (armor < 0.0f) if (armor < 0.0f)
{ armor = 0.0f; } {
armor = 0.0f;
}
float levelModifier = (float)getLevel(); float levelModifier = (float)getLevel();
if (levelModifier > 59) if (levelModifier > 59)
@ -2292,9 +2446,13 @@ uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage)
tmpvalue = tmpvalue / (1.0f + tmpvalue); tmpvalue = tmpvalue / (1.0f + tmpvalue);
if (tmpvalue < 0.0f) if (tmpvalue < 0.0f)
{ tmpvalue = 0.0f; } {
tmpvalue = 0.0f;
}
if (tmpvalue > 0.75f) if (tmpvalue > 0.75f)
{ tmpvalue = 0.75f; } {
tmpvalue = 0.75f;
}
newdamage = uint32(damage - (damage * tmpvalue)); newdamage = uint32(damage - (damage * tmpvalue));
@ -2304,7 +2462,9 @@ uint32 Unit::CalcArmorReducedDamage(Unit* pVictim, const uint32 damage)
void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32* absorb, uint32* resist, bool canReflect) void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32* absorb, uint32* resist, bool canReflect)
{ {
if (!pCaster || !IsAlive() || !damage) if (!pCaster || !IsAlive() || !damage)
{ return; } {
return;
}
// Magic damage, check for resists // Magic damage, check for resists
if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0) if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
@ -2319,9 +2479,13 @@ void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolM
tmpvalue2 *= (float)(0.15f / getLevel()); tmpvalue2 *= (float)(0.15f / getLevel());
if (tmpvalue2 < 0.0f) if (tmpvalue2 < 0.0f)
{ tmpvalue2 = 0.0f; } {
tmpvalue2 = 0.0f;
}
if (tmpvalue2 > 0.75f) if (tmpvalue2 > 0.75f)
{ tmpvalue2 = 0.75f; } {
tmpvalue2 = 0.75f;
}
uint32 ran = urand(0, 100); uint32 ran = urand(0, 100);
float faq[4] = {24.0f, 6.0f, 4.0f, 6.0f}; float faq[4] = {24.0f, 6.0f, 4.0f, 6.0f};
uint8 m = 0; uint8 m = 0;
@ -2330,16 +2494,22 @@ void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolM
{ {
Binom += 2400 * (powf(tmpvalue2, float(i)) * powf((1 - tmpvalue2), float(4 - i))) / faq[i]; Binom += 2400 * (powf(tmpvalue2, float(i)) * powf((1 - tmpvalue2), float(4 - i))) / faq[i];
if (ran > Binom) if (ran > Binom)
{ ++m; } {
++m;
}
else else
{ break; } { break; }
} }
if (damagetype == DOT && m == 4) if (damagetype == DOT && m == 4)
{ *resist += uint32(damage - 1); } {
*resist += uint32(damage - 1);
}
else else
{ *resist += uint32(damage * m / 4); } { *resist += uint32(damage * m / 4); }
if (*resist > damage) if (*resist > damage)
{ *resist = damage; } {
*resist = damage;
}
} }
else else
{ *resist = 0; } { *resist = 0; }
@ -2620,7 +2790,9 @@ void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolM
// currentAbsorb - damage can be absorbed by shield // currentAbsorb - damage can be absorbed by shield
// If need absorb less damage // If need absorb less damage
if (RemainingDamage < currentAbsorb) if (RemainingDamage < currentAbsorb)
{ currentAbsorb = RemainingDamage; } {
currentAbsorb = RemainingDamage;
}
RemainingDamage -= currentAbsorb; RemainingDamage -= currentAbsorb;
@ -2632,10 +2804,14 @@ void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolM
// Reduce shield amount // Reduce shield amount
mod->m_amount -= currentAbsorb; mod->m_amount -= currentAbsorb;
if ((*i)->GetHolder()->DropAuraCharge()) if ((*i)->GetHolder()->DropAuraCharge())
{ mod->m_amount = 0; } {
mod->m_amount = 0;
}
// Need remove it later // Need remove it later
if (mod->m_amount <= 0) if (mod->m_amount <= 0)
{ existExpired = true; } {
existExpired = true;
}
} }
// Remove all expired absorb auras // Remove all expired absorb auras
@ -2668,11 +2844,15 @@ void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolM
// check damage school mask // check damage school mask
if (((*i)->GetModifier()->m_miscvalue & schoolMask) == 0) if (((*i)->GetModifier()->m_miscvalue & schoolMask) == 0)
{ continue; } {
continue;
}
int32 currentAbsorb; int32 currentAbsorb;
if (RemainingDamage >= (*i)->GetModifier()->m_amount) if (RemainingDamage >= (*i)->GetModifier()->m_amount)
{ currentAbsorb = (*i)->GetModifier()->m_amount; } {
currentAbsorb = (*i)->GetModifier()->m_amount;
}
else else
{ currentAbsorb = RemainingDamage; } { currentAbsorb = RemainingDamage; }
@ -2681,11 +2861,15 @@ void Unit::CalculateDamageAbsorbAndResist(Unit* pCaster, SpellSchoolMask schoolM
if (float manaMultiplier = (spellEffect ? spellEffect->EffectMultipleValue : 0)) if (float manaMultiplier = (spellEffect ? spellEffect->EffectMultipleValue : 0))
{ {
if (Player* modOwner = GetSpellModOwner()) if (Player* modOwner = GetSpellModOwner())
{ modOwner->ApplySpellMod((*i)->GetId(), SPELLMOD_MULTIPLE_VALUE, manaMultiplier); } {
modOwner->ApplySpellMod((*i)->GetId(), SPELLMOD_MULTIPLE_VALUE, manaMultiplier);
}
int32 maxAbsorb = int32(GetPower(POWER_MANA) / manaMultiplier); int32 maxAbsorb = int32(GetPower(POWER_MANA) / manaMultiplier);
if (currentAbsorb > maxAbsorb) if (currentAbsorb > maxAbsorb)
{ currentAbsorb = maxAbsorb; } {
currentAbsorb = maxAbsorb;
}
int32 manaReduction = int32(currentAbsorb * manaMultiplier); int32 manaReduction = int32(currentAbsorb * manaMultiplier);
ApplyPowerMod(POWER_MANA, manaReduction, false); ApplyPowerMod(POWER_MANA, manaReduction, false);
@ -3941,7 +4125,7 @@ void Unit::SetCurrentCastedSpell(Spell* pSpell)
m_currentSpells[CSpellType] = pSpell; m_currentSpells[CSpellType] = pSpell;
pSpell->SetReferencedFromCurrent(true); pSpell->SetReferencedFromCurrent(true);
pSpell->SetSelfContainer(&(m_currentSpells[pSpell->GetCurrentContainer()])); // this works, but is not safe - <looks at Cédric> pSpell->SetSelfContainer(&(m_currentSpells[pSpell->GetCurrentContainer()])); // this works, but is not safe - <looks at C<EFBFBD>dric>
// original and faulty code - delete once the above has been proven to work // original and faulty code - delete once the above has been proven to work
// pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]); // m_selfContainer is not accessible, due to being a protected member // pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]); // m_selfContainer is not accessible, due to being a protected member
@ -8529,23 +8713,31 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy)
{ {
// only alive units can be in combat // only alive units can be in combat
if (!IsAlive()) if (!IsAlive())
{ return; } {
return;
}
if (PvP) if (PvP)
{ m_CombatTimer = 5000; } {
m_CombatTimer = 5000;
}
bool creatureNotInCombat = GetTypeId() == TYPEID_UNIT && !HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); bool creatureNotInCombat = GetTypeId() == TYPEID_UNIT && !HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
if (IsCharmed() || (GetTypeId() != TYPEID_PLAYER && ((Creature*)this)->IsPet())) if (IsCharmed() || (GetTypeId() != TYPEID_PLAYER && ((Creature*)this)->IsPet()))
{ SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT); } {
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT);
}
// interrupt all delayed non-combat casts // interrupt all delayed non-combat casts
for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i) for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i)
if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i))) if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i)))
if (IsNonCombatSpell(spell->m_spellInfo)) if (IsNonCombatSpell(spell->m_spellInfo))
{ InterruptSpell(CurrentSpellTypes(i), false); } {
InterruptSpell(CurrentSpellTypes(i), false);
}
if (getRace() == RACE_WORGEN && !IsInWorgenForm(true) && HasWorgenForm()) if (getRace() == RACE_WORGEN && !IsInWorgenForm(true) && HasWorgenForm())
CastSpell(this, 97709, true); // cast Altered Form CastSpell(this, 97709, true); // cast Altered Form
@ -8562,17 +8754,25 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy)
Creature* pCreature = (Creature*)this; Creature* pCreature = (Creature*)this;
if (pCreature->AI()) if (pCreature->AI())
{ pCreature->AI()->EnterCombat(enemy); } {
pCreature->AI()->EnterCombat(enemy);
}
// Some bosses are set into combat with zone // Some bosses are set into combat with zone
if (GetMap()->IsDungeon() && (pCreature->GetCreatureInfo()->ExtraFlags & CREATURE_EXTRA_FLAG_AGGRO_ZONE) && enemy && enemy->IsControlledByPlayer()) if (GetMap()->IsDungeon() && (pCreature->GetCreatureInfo()->ExtraFlags & CREATURE_EXTRA_FLAG_AGGRO_ZONE) && enemy && enemy->IsControlledByPlayer())
{ pCreature->SetInCombatWithZone(); } {
pCreature->SetInCombatWithZone();
}
if (InstanceData* mapInstance = GetInstanceData()) if (InstanceData* mapInstance = GetInstanceData())
{ mapInstance->OnCreatureEnterCombat(pCreature); } {
mapInstance->OnCreatureEnterCombat(pCreature);
}
if (m_isCreatureLinkingTrigger) if (m_isCreatureLinkingTrigger)
{ GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_AGGRO, pCreature, enemy); } {
GetMap()->GetCreatureLinkingHolder()->DoCreatureLinkingEvent(LINKING_EVENT_AGGRO, pCreature, enemy);
}
} }
// Used by Eluna // Used by Eluna
@ -8588,7 +8788,9 @@ void Unit::ClearInCombat()
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT);
if (IsCharmed() || (GetTypeId() != TYPEID_PLAYER && ((Creature*)this)->IsPet())) if (IsCharmed() || (GetTypeId() != TYPEID_PLAYER && ((Creature*)this)->IsPet()))
{ RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT); } {
RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PET_IN_COMBAT);
}
// Used by Eluna // Used by Eluna
#ifdef ENABLE_ELUNA #ifdef ENABLE_ELUNA

View file

@ -2779,7 +2779,9 @@ class Unit : public WorldObject
ObjectGuid const& GetCharmerOrOwnerOrOwnGuid() const ObjectGuid const& GetCharmerOrOwnerOrOwnGuid() const
{ {
if (ObjectGuid const& guid = GetCharmerOrOwnerGuid()) if (ObjectGuid const& guid = GetCharmerOrOwnerGuid())
{ return guid; } {
return guid;
}
return GetObjectGuid(); return GetObjectGuid();
} }
/** /**
@ -2839,7 +2841,9 @@ class Unit : public WorldObject
Unit* GetCharmerOrOwnerOrSelf() Unit* GetCharmerOrOwnerOrSelf()
{ {
if (Unit* u = GetCharmerOrOwner()) if (Unit* u = GetCharmerOrOwner())
{ return u; } {
return u;
}
return this; return this;
} }
@ -3658,29 +3662,39 @@ void Unit::CallForAllControlledUnits(Func const& func, uint32 controlledMask)
{ {
if (controlledMask & CONTROLLED_PET) if (controlledMask & CONTROLLED_PET)
if (Pet* pet = GetPet()) if (Pet* pet = GetPet())
{ func(pet); } {
func(pet);
}
if (controlledMask & CONTROLLED_MINIPET) if (controlledMask & CONTROLLED_MINIPET)
if (Pet* mini = GetMiniPet()) if (Pet* mini = GetMiniPet())
{ func(mini); } {
func(mini);
}
if (controlledMask & CONTROLLED_GUARDIANS) if (controlledMask & CONTROLLED_GUARDIANS)
{ {
for (GuidSet::const_iterator itr = m_guardianPets.begin(); itr != m_guardianPets.end();) for (GuidSet::const_iterator itr = m_guardianPets.begin(); itr != m_guardianPets.end();)
if (Pet* guardian = _GetPet(*(itr++))) if (Pet* guardian = _GetPet(*(itr++)))
{ func(guardian); } {
func(guardian);
}
} }
if (controlledMask & CONTROLLED_TOTEMS) if (controlledMask & CONTROLLED_TOTEMS)
{ {
for (int i = 0; i < MAX_TOTEM_SLOT; ++i) for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (Unit* totem = _GetTotem(TotemSlot(i))) if (Unit* totem = _GetTotem(TotemSlot(i)))
{ func(totem); } {
func(totem);
}
} }
if (controlledMask & CONTROLLED_CHARM) if (controlledMask & CONTROLLED_CHARM)
if (Unit* charm = GetCharm()) if (Unit* charm = GetCharm())
{ func(charm); } {
func(charm);
}
} }
@ -3690,19 +3704,25 @@ bool Unit::CheckAllControlledUnits(Func const& func, uint32 controlledMask) cons
if (controlledMask & CONTROLLED_PET) if (controlledMask & CONTROLLED_PET)
if (Pet const* pet = GetPet()) if (Pet const* pet = GetPet())
if (func(pet)) if (func(pet))
{ return true; } {
return true;
}
if (controlledMask & CONTROLLED_MINIPET) if (controlledMask & CONTROLLED_MINIPET)
if (Pet const* mini = GetMiniPet()) if (Pet const* mini = GetMiniPet())
if (func(mini)) if (func(mini))
{ return true; } {
return true;
}
if (controlledMask & CONTROLLED_GUARDIANS) if (controlledMask & CONTROLLED_GUARDIANS)
{ {
for (GuidSet::const_iterator itr = m_guardianPets.begin(); itr != m_guardianPets.end();) for (GuidSet::const_iterator itr = m_guardianPets.begin(); itr != m_guardianPets.end();)
if (Pet const* guardian = _GetPet(*(itr++))) if (Pet const* guardian = _GetPet(*(itr++)))
if (func(guardian)) if (func(guardian))
{ return true; } {
return true;
}
} }
if (controlledMask & CONTROLLED_TOTEMS) if (controlledMask & CONTROLLED_TOTEMS)
@ -3710,13 +3730,17 @@ bool Unit::CheckAllControlledUnits(Func const& func, uint32 controlledMask) cons
for (int i = 0; i < MAX_TOTEM_SLOT; ++i) for (int i = 0; i < MAX_TOTEM_SLOT; ++i)
if (Unit const* totem = _GetTotem(TotemSlot(i))) if (Unit const* totem = _GetTotem(TotemSlot(i)))
if (func(totem)) if (func(totem))
{ return true; } {
return true;
}
} }
if (controlledMask & CONTROLLED_CHARM) if (controlledMask & CONTROLLED_CHARM)
if (Unit const* charm = GetCharm()) if (Unit const* charm = GetCharm())
if (func(charm)) if (func(charm))
{ return true; } {
return true;
}
return false; return false;
} }

View file

@ -53,7 +53,9 @@ void OutdoorPvP::HandlePlayerLeaveZone(Player* player, bool isMainZone)
{ {
// remove the world state information from the player // remove the world state information from the player
if (isMainZone && !player->GetSession()->PlayerLogout()) if (isMainZone && !player->GetSession()->PlayerLogout())
{ SendRemoveWorldStates(player); } {
SendRemoveWorldStates(player);
}
sLog.outDebug("Player %s left an Outdoor PvP zone", player->GetName()); sLog.outDebug("Player %s left an Outdoor PvP zone", player->GetName());
} }
@ -71,10 +73,14 @@ void OutdoorPvP::SendUpdateWorldState(uint32 field, uint32 value)
{ {
// only send world state update to main zone // only send world state update to main zone
if (!itr->second) if (!itr->second)
{ continue; } {
continue;
}
if (Player* player = sObjectMgr.GetPlayer(itr->first)) if (Player* player = sObjectMgr.GetPlayer(itr->first))
{ player->SendUpdateWorldState(field, value); } {
player->SendUpdateWorldState(field, value);
}
} }
} }
@ -117,23 +123,31 @@ void OutdoorPvP::HandlePlayerKill(Player* killer, Player* victim)
Player* groupMember = itr->getSource(); Player* groupMember = itr->getSource();
if (!groupMember) if (!groupMember)
{ continue; } {
continue;
}
// skip if too far away // skip if too far away
if (!groupMember->IsAtGroupRewardDistance(victim)) if (!groupMember->IsAtGroupRewardDistance(victim))
{ continue; } {
continue;
}
// creature kills must be notified, even if not inside objective / not outdoor pvp active // creature kills must be notified, even if not inside objective / not outdoor pvp active
// player kills only count if active and inside objective // player kills only count if active and inside objective
if (groupMember->CanUseCapturePoint()) if (groupMember->CanUseCapturePoint())
{ HandlePlayerKillInsideArea(groupMember); } {
HandlePlayerKillInsideArea(groupMember);
}
} }
} }
else else
{ {
// creature kills must be notified, even if not inside objective / not outdoor pvp active // creature kills must be notified, even if not inside objective / not outdoor pvp active
if (killer && killer->CanUseCapturePoint()) if (killer && killer->CanUseCapturePoint())
{ HandlePlayerKillInsideArea(killer); } {
HandlePlayerKillInsideArea(killer);
}
} }
} }
@ -146,7 +160,9 @@ void OutdoorPvP::BuffTeam(Team team, uint32 spellId, bool remove /*= false*/)
if (player && player->GetTeam() == team) if (player && player->GetTeam() == team)
{ {
if (remove) if (remove)
{ player->RemoveAurasDueToSpell(spellId); } {
player->RemoveAurasDueToSpell(spellId);
}
else else
{ player->CastSpell(player, spellId, true); } { player->CastSpell(player, spellId, true); }
} }
@ -169,7 +185,9 @@ uint32 OutdoorPvP::GetBannerArtKit(Team team, uint32 artKitAlliance /*= CAPTURE_
void OutdoorPvP::SetBannerVisual(const WorldObject* objRef, ObjectGuid goGuid, uint32 artKit, uint32 animId) void OutdoorPvP::SetBannerVisual(const WorldObject* objRef, ObjectGuid goGuid, uint32 artKit, uint32 animId)
{ {
if (GameObject* go = objRef->GetMap()->GetGameObject(goGuid)) if (GameObject* go = objRef->GetMap()->GetGameObject(goGuid))
{ SetBannerVisual(go, artKit, animId); } {
SetBannerVisual(go, artKit, animId);
}
} }
void OutdoorPvP::SetBannerVisual(GameObject* go, uint32 artKit, uint32 animId) void OutdoorPvP::SetBannerVisual(GameObject* go, uint32 artKit, uint32 animId)
@ -186,7 +204,9 @@ void OutdoorPvP::RespawnGO(const WorldObject* objRef, ObjectGuid goGuid, bool re
go->SetRespawnTime(7 * DAY); go->SetRespawnTime(7 * DAY);
if (respawn) if (respawn)
{ go->Refresh(); } {
go->Refresh();
}
else if (go->isSpawned()) else if (go->isSpawned())
{ go->SetLootState(GO_JUST_DEACTIVATED); } { go->SetLootState(GO_JUST_DEACTIVATED); }
} }

View file

@ -75,11 +75,15 @@ void OutdoorPvPEP::HandlePlayerEnterZone(Player* player, bool isMainZone)
{ {
case ALLIANCE: case ALLIANCE:
if (m_towersAlliance > 0) if (m_towersAlliance > 0)
{ player->CastSpell(player, plaguelandsTowerBuffs[m_towersAlliance - 1].spellIdAlliance, true); } {
player->CastSpell(player, plaguelandsTowerBuffs[m_towersAlliance - 1].spellIdAlliance, true);
}
break; break;
case HORDE: case HORDE:
if (m_towersHorde > 0) if (m_towersHorde > 0)
{ player->CastSpell(player, plaguelandsTowerBuffs[m_towersHorde - 1].spellIdHorde, true); } {
player->CastSpell(player, plaguelandsTowerBuffs[m_towersHorde - 1].spellIdHorde, true);
}
break; break;
default: default:
break; break;
@ -134,7 +138,9 @@ void OutdoorPvPEP::HandleGameObjectCreate(GameObject* go)
case GO_TOWER_BANNER: case GO_TOWER_BANNER:
// sort banners // sort banners
if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_NORTHPASS][0], plaguelandsTowerLocations[TOWER_ID_NORTHPASS][1], 50.0f)) if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_NORTHPASS][0], plaguelandsTowerLocations[TOWER_ID_NORTHPASS][1], 50.0f))
{ InitBanner(go, TOWER_ID_NORTHPASS); } {
InitBanner(go, TOWER_ID_NORTHPASS);
}
else if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_CROWNGUARD][0], plaguelandsTowerLocations[TOWER_ID_CROWNGUARD][1], 50.0f)) else if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_CROWNGUARD][0], plaguelandsTowerLocations[TOWER_ID_CROWNGUARD][1], 50.0f))
{ InitBanner(go, TOWER_ID_CROWNGUARD); } { InitBanner(go, TOWER_ID_CROWNGUARD); }
else if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_EASTWALL][0], plaguelandsTowerLocations[TOWER_ID_EASTWALL][1], 50.0f)) else if (go->IsWithinDist2d(plaguelandsTowerLocations[TOWER_ID_EASTWALL][0], plaguelandsTowerLocations[TOWER_ID_EASTWALL][1], 50.0f))
@ -202,7 +208,9 @@ bool OutdoorPvPEP::HandleEvent(uint32 eventId, GameObject* go)
if (plaguelandsTowerEvents[i][j].team != m_towerOwner[i]) if (plaguelandsTowerEvents[i][j].team != m_towerOwner[i])
{ {
if (plaguelandsTowerEvents[i][j].defenseMessage) if (plaguelandsTowerEvents[i][j].defenseMessage)
{ sWorld.SendDefenseMessage(ZONE_ID_EASTERN_PLAGUELANDS, plaguelandsTowerEvents[i][j].defenseMessage); } {
sWorld.SendDefenseMessage(ZONE_ID_EASTERN_PLAGUELANDS, plaguelandsTowerEvents[i][j].defenseMessage);
}
return ProcessCaptureEvent(go, i, plaguelandsTowerEvents[i][j].team, plaguelandsTowerEvents[i][j].worldState); return ProcessCaptureEvent(go, i, plaguelandsTowerEvents[i][j].team, plaguelandsTowerEvents[i][j].worldState);
} }
@ -259,7 +267,9 @@ bool OutdoorPvPEP::ProcessCaptureEvent(GameObject* go, uint32 towerId, Team team
SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_ALLIANCE, m_towersAlliance); SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_ALLIANCE, m_towersAlliance);
if (m_towersAlliance == 0) if (m_towersAlliance == 0)
{ BuffTeam(ALLIANCE, plaguelandsTowerBuffs[0].spellIdAlliance, true); } {
BuffTeam(ALLIANCE, plaguelandsTowerBuffs[0].spellIdAlliance, true);
}
} }
else else
{ {
@ -268,7 +278,9 @@ bool OutdoorPvPEP::ProcessCaptureEvent(GameObject* go, uint32 towerId, Team team
SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_HORDE, m_towersHorde); SendUpdateWorldState(WORLD_STATE_EP_TOWER_COUNT_HORDE, m_towersHorde);
if (m_towersHorde == 0) if (m_towersHorde == 0)
{ BuffTeam(HORDE, plaguelandsTowerBuffs[0].spellIdHorde, true); } {
BuffTeam(HORDE, plaguelandsTowerBuffs[0].spellIdHorde, true);
}
} }
} }
@ -291,7 +303,9 @@ bool OutdoorPvPEP::ProcessCaptureEvent(GameObject* go, uint32 towerId, Team team
case TOWER_ID_EASTWALL: case TOWER_ID_EASTWALL:
// Return false - allow the DB to handle summons // Return false - allow the DB to handle summons
if (m_towerOwner[TOWER_ID_NORTHPASS] != team) if (m_towerOwner[TOWER_ID_NORTHPASS] != team)
{ eventHandled = false; } {
eventHandled = false;
}
break; break;
case TOWER_ID_PLAGUEWOOD: case TOWER_ID_PLAGUEWOOD:
// Return false - allow the DB to handle summons // Return false - allow the DB to handle summons
@ -335,7 +349,9 @@ bool OutdoorPvPEP::HandleGameObjectUse(Player* /*player*/, GameObject* go)
{ {
// prevent despawning after go use // prevent despawning after go use
if (go->GetEntry() == GO_LORDAERON_SHRINE_ALLIANCE || go->GetEntry() == GO_LORDAERON_SHRINE_HORDE) if (go->GetEntry() == GO_LORDAERON_SHRINE_ALLIANCE || go->GetEntry() == GO_LORDAERON_SHRINE_HORDE)
{ go->SetRespawnTime(0); } {
go->SetRespawnTime(0);
}
return false; return false;
} }
@ -350,7 +366,9 @@ void OutdoorPvPEP::InitBanner(GameObject* go, uint32 towerId)
void OutdoorPvPEP::UnsummonFlightMaster(const WorldObject* objRef) void OutdoorPvPEP::UnsummonFlightMaster(const WorldObject* objRef)
{ {
if (Creature* flightMaster = objRef->GetMap()->GetCreature(m_flightMaster)) if (Creature* flightMaster = objRef->GetMap()->GetCreature(m_flightMaster))
{ flightMaster->ForcedDespawn(); } {
flightMaster->ForcedDespawn();
}
} }
// Handle the unsummon of the soldiers when the Eastwall tower is lost // Handle the unsummon of the soldiers when the Eastwall tower is lost
@ -359,7 +377,9 @@ void OutdoorPvPEP::UnsummonSoldiers(const WorldObject* objRef)
for (GuidList::const_iterator itr = m_soldiers.begin(); itr != m_soldiers.end(); ++itr) for (GuidList::const_iterator itr = m_soldiers.begin(); itr != m_soldiers.end(); ++itr)
{ {
if (Creature* soldier = objRef->GetMap()->GetCreature(*itr)) if (Creature* soldier = objRef->GetMap()->GetCreature(*itr))
{ soldier->ForcedDespawn(); } {
soldier->ForcedDespawn();
}
} }
m_soldiers.clear(); m_soldiers.clear();

View file

@ -139,7 +139,9 @@ OutdoorPvP* OutdoorPvPMgr::GetScriptOfAffectedZone(uint32 zoneId)
void OutdoorPvPMgr::HandlePlayerEnterZone(Player* player, uint32 zoneId) void OutdoorPvPMgr::HandlePlayerEnterZone(Player* player, uint32 zoneId)
{ {
if (OutdoorPvP* script = GetScript(zoneId)) if (OutdoorPvP* script = GetScript(zoneId))
{ script->HandlePlayerEnterZone(player, true); } {
script->HandlePlayerEnterZone(player, true);
}
else if (OutdoorPvP* affectedScript = GetScriptOfAffectedZone(zoneId)) else if (OutdoorPvP* affectedScript = GetScriptOfAffectedZone(zoneId))
affectedScript->HandlePlayerEnterZone(player, false); affectedScript->HandlePlayerEnterZone(player, false);
} }
@ -154,7 +156,9 @@ void OutdoorPvPMgr::HandlePlayerLeaveZone(Player* player, uint32 zoneId)
{ {
// teleport: called once from Player::CleanupsBeforeDelete, once from Player::UpdateZone // teleport: called once from Player::CleanupsBeforeDelete, once from Player::UpdateZone
if (OutdoorPvP* script = GetScript(zoneId)) if (OutdoorPvP* script = GetScript(zoneId))
{ script->HandlePlayerLeaveZone(player, true); } {
script->HandlePlayerLeaveZone(player, true);
}
else if (OutdoorPvP* affectedScript = GetScriptOfAffectedZone(zoneId)) else if (OutdoorPvP* affectedScript = GetScriptOfAffectedZone(zoneId))
affectedScript->HandlePlayerLeaveZone(player, false); affectedScript->HandlePlayerLeaveZone(player, false);
} }
@ -163,11 +167,15 @@ void OutdoorPvPMgr::Update(uint32 diff)
{ {
m_updateTimer.Update(diff); m_updateTimer.Update(diff);
if (!m_updateTimer.Passed()) if (!m_updateTimer.Passed())
{ return; } {
return;
}
for (uint8 i = 0; i < MAX_OPVP_ID; ++i) for (uint8 i = 0; i < MAX_OPVP_ID; ++i)
if (m_scripts[i]) if (m_scripts[i])
{ m_scripts[i]->Update(m_updateTimer.GetCurrent()); } {
m_scripts[i]->Update(m_updateTimer.GetCurrent());
}
m_updateTimer.Reset(); m_updateTimer.Reset();
} }

View file

@ -56,7 +56,9 @@ void OutdoorPvPSI::HandlePlayerEnterZone(Player* player, bool isMainZone)
// buff the player if same team is controlling the zone // buff the player if same team is controlling the zone
if (player->GetTeam() == m_zoneOwner) if (player->GetTeam() == m_zoneOwner)
{ player->CastSpell(player, SPELL_CENARION_FAVOR, true); } {
player->CastSpell(player, SPELL_CENARION_FAVOR, true);
}
} }
// Remove buffs when player leaves zone // Remove buffs when player leaves zone
@ -72,13 +74,17 @@ void OutdoorPvPSI::HandlePlayerLeaveZone(Player* player, bool isMainZone)
bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 triggerId) bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 triggerId)
{ {
if (player->isGameMaster() || player->IsDead()) if (player->isGameMaster() || player->IsDead())
{ return false; } {
return false;
}
switch (triggerId) switch (triggerId)
{ {
case AREATRIGGER_SILITHUS_ALLIANCE: case AREATRIGGER_SILITHUS_ALLIANCE:
if (player->GetTeam() != ALLIANCE || !player->HasAura(SPELL_SILITHYST)) if (player->GetTeam() != ALLIANCE || !player->HasAura(SPELL_SILITHYST))
{ return false; } {
return false;
}
// update counter // update counter
++ m_resourcesAlliance; ++ m_resourcesAlliance;
@ -104,11 +110,15 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 triggerId)
// give quest credit if necessary // give quest credit if necessary
if (player->GetQuestStatus(QUEST_SCOURING_DESERT_ALLIANCE) == QUEST_STATUS_INCOMPLETE) if (player->GetQuestStatus(QUEST_SCOURING_DESERT_ALLIANCE) == QUEST_STATUS_INCOMPLETE)
{ player->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_ALLIANCE); } {
player->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_ALLIANCE);
}
break; break;
case AREATRIGGER_SILITHUS_HORDE: case AREATRIGGER_SILITHUS_HORDE:
if (player->GetTeam() != HORDE || !player->HasAura(SPELL_SILITHYST)) if (player->GetTeam() != HORDE || !player->HasAura(SPELL_SILITHYST))
{ return false; } {
return false;
}
// update counter // update counter
++ m_resourcesHorde; ++ m_resourcesHorde;
@ -134,7 +144,9 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 triggerId)
// give quest credit if necessary // give quest credit if necessary
if (player->GetQuestStatus(QUEST_SCOURING_DESERT_HORDE) == QUEST_STATUS_INCOMPLETE) if (player->GetQuestStatus(QUEST_SCOURING_DESERT_HORDE) == QUEST_STATUS_INCOMPLETE)
{ player->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_HORDE); } {
player->KilledMonsterCredit(NPC_SILITHUS_DUST_QUEST_HORDE);
}
break; break;
default: default:
return false; return false;
@ -167,7 +179,9 @@ static SilithusSpawnLocation silithusFlagDropLocations[2] =
bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId) bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId)
{ {
if (spellId != SPELL_SILITHYST) if (spellId != SPELL_SILITHYST)
{ return false; } {
return false;
}
// don't drop flag at area trigger // don't drop flag at area trigger
// we are checking distance from the AT hard-coded coordinates because it's much faster than checking the area trigger store // we are checking distance from the AT hard-coded coordinates because it's much faster than checking the area trigger store
@ -175,11 +189,15 @@ bool OutdoorPvPSI::HandleDropFlag(Player* player, uint32 spellId)
{ {
case ALLIANCE: case ALLIANCE:
if (player->IsWithinDist3d(silithusFlagDropLocations[0].x, silithusFlagDropLocations[0].y, silithusFlagDropLocations[0].z, 5.0f)) if (player->IsWithinDist3d(silithusFlagDropLocations[0].x, silithusFlagDropLocations[0].y, silithusFlagDropLocations[0].z, 5.0f))
{ return false; } {
return false;
}
break; break;
case HORDE: case HORDE:
if (player->IsWithinDist3d(silithusFlagDropLocations[1].x, silithusFlagDropLocations[1].y, silithusFlagDropLocations[1].z, 5.0f)) if (player->IsWithinDist3d(silithusFlagDropLocations[1].x, silithusFlagDropLocations[1].y, silithusFlagDropLocations[1].z, 5.0f))
{ return false; } {
return false;
}
break; break;
default: default:
break; break;

View file

@ -40,18 +40,26 @@ float ThreatCalcHelper::CalcThreat(Unit* pHatedUnit, Unit* /*pHatingUnit*/, floa
{ {
// all flat mods applied early // all flat mods applied early
if (!threat) if (!threat)
{ return 0.0f; } {
return 0.0f;
}
if (pThreatSpell) if (pThreatSpell)
{ {
if (pThreatSpell->HasAttribute(SPELL_ATTR_EX_NO_THREAT)) if (pThreatSpell->HasAttribute(SPELL_ATTR_EX_NO_THREAT))
{ return 0.0f; } {
return 0.0f;
}
if (Player* modOwner = pHatedUnit->GetSpellModOwner()) if (Player* modOwner = pHatedUnit->GetSpellModOwner())
{ modOwner->ApplySpellMod(pThreatSpell->Id, SPELLMOD_THREAT, threat); } {
modOwner->ApplySpellMod(pThreatSpell->Id, SPELLMOD_THREAT, threat);
}
if (crit) if (crit)
{ threat *= pHatedUnit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRITICAL_THREAT, schoolMask); } {
threat *= pHatedUnit->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRITICAL_THREAT, schoolMask);
}
} }
threat = pHatedUnit->ApplyTotalThreatModifier(threat, schoolMask); threat = pHatedUnit->ApplyTotalThreatModifier(threat, schoolMask);
@ -100,7 +108,9 @@ void HostileReference::sourceObjectDestroyLink()
void HostileReference::fireStatusChanged(ThreatRefStatusChangeEvent& pThreatRefStatusChangeEvent) void HostileReference::fireStatusChanged(ThreatRefStatusChangeEvent& pThreatRefStatusChangeEvent)
{ {
if (getSource()) if (getSource())
{ getSource()->processThreatEvent(&pThreatRefStatusChangeEvent); } {
getSource()->processThreatEvent(&pThreatRefStatusChangeEvent);
}
} }
//============================================================ //============================================================
@ -114,7 +124,9 @@ void HostileReference::addThreat(float pMod)
// the threat is changed. Source and target unit have to be availabe // the threat is changed. Source and target unit have to be availabe
// if the link was cut before relink it again // if the link was cut before relink it again
if (!isOnline()) if (!isOnline())
{ updateOnlineStatus(); } {
updateOnlineStatus();
}
if (pMod != 0.0f) if (pMod != 0.0f)
{ {
ThreatRefStatusChangeEvent event(UEV_THREAT_REF_THREAT_CHANGE, this, pMod); ThreatRefStatusChangeEvent event(UEV_THREAT_REF_THREAT_CHANGE, this, pMod);
@ -140,7 +152,9 @@ void HostileReference::updateOnlineStatus()
if (!isValid()) if (!isValid())
{ {
if (Unit* target = ObjectAccessor::GetUnit(*getSourceUnit(), getUnitGuid())) if (Unit* target = ObjectAccessor::GetUnit(*getSourceUnit(), getUnitGuid()))
{ link(target, getSource()); } {
link(target, getSource());
}
} }
// only check for online status if // only check for online status if
// ref is valid // ref is valid
@ -251,7 +265,9 @@ HostileReference* ThreatContainer::addThreat(Unit* pVictim, float pThreat)
{ {
HostileReference* ref = getReferenceByTarget(pVictim); HostileReference* ref = getReferenceByTarget(pVictim);
if (ref) if (ref)
{ ref->addThreat(pThreat); } {
ref->addThreat(pThreat);
}
return ref; return ref;
} }
@ -318,7 +334,9 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* pAttacker, Hostile
if (!onlySecondChoiceTargetsFound && pAttacker->IsSecondChoiceTarget(pTarget, pCurrentRef == pCurrentVictim)) if (!onlySecondChoiceTargetsFound && pAttacker->IsSecondChoiceTarget(pTarget, pCurrentRef == pCurrentVictim))
{ {
if (iter != lastRef) if (iter != lastRef)
{ ++iter; } {
++iter;
}
else else
{ {
// if we reached to this point, everyone in the threatlist is a second choice target. In such a situation the target with the highest threat should be attacked. // if we reached to this point, everyone in the threatlist is a second choice target. In such a situation the target with the highest threat should be attacked.
@ -328,7 +346,9 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* pAttacker, Hostile
// current victim is a second choice target, so don't compare threat with it below // current victim is a second choice target, so don't compare threat with it below
if (pCurrentRef == pCurrentVictim) if (pCurrentRef == pCurrentVictim)
{ pCurrentVictim = NULL; } {
pCurrentVictim = NULL;
}
// second choice targets are only handled threat dependend if we have only have second choice targets // second choice targets are only handled threat dependend if we have only have second choice targets
continue; continue;
@ -385,7 +405,9 @@ HostileReference* ThreatContainer::selectNextVictim(Creature* pAttacker, Hostile
++iter; ++iter;
} }
if (!found) if (!found)
{ pCurrentRef = NULL; } {
pCurrentRef = NULL;
}
return pCurrentRef; return pCurrentRef;
} }
@ -421,15 +443,21 @@ void ThreatManager::addThreat(Unit* pVictim, float pThreat, bool crit, SpellScho
// not to self // not to self
if (pVictim == getOwner()) if (pVictim == getOwner())
{ return; } {
return;
}
// not to GM // not to GM
if (!pVictim || (pVictim->GetTypeId() == TYPEID_PLAYER && ((Player*)pVictim)->isGameMaster())) if (!pVictim || (pVictim->GetTypeId() == TYPEID_PLAYER && ((Player*)pVictim)->isGameMaster()))
{ return; } {
return;
}
// not to dead and not for dead // not to dead and not for dead
if (!pVictim->IsAlive() || !getOwner()->IsAlive()) if (!pVictim->IsAlive() || !getOwner()->IsAlive())
{ return; } {
return;
}
MANGOS_ASSERT(getOwner()->GetTypeId() == TYPEID_UNIT); MANGOS_ASSERT(getOwner()->GetTypeId() == TYPEID_UNIT);
@ -588,7 +616,9 @@ void ThreatManager::processThreatEvent(ThreatRefStatusChangeEvent* threatRefStat
else else
{ {
if (getCurrentVictim() && hostileReference->getThreat() > (1.1f * getCurrentVictim()->getThreat())) if (getCurrentVictim() && hostileReference->getThreat() > (1.1f * getCurrentVictim()->getThreat()))
{ setDirty(true); } {
setDirty(true);
}
iThreatContainer.addReference(hostileReference); iThreatContainer.addReference(hostileReference);
iUpdateNeed = true; iUpdateNeed = true;
iThreatOfflineContainer.remove(hostileReference); iThreatOfflineContainer.remove(hostileReference);

View file

@ -260,7 +260,9 @@ bool IsAcceptableClientBuild(uint32 build)
int accepted_versions[] = EXPECTED_MANGOSD_CLIENT_BUILD; int accepted_versions[] = EXPECTED_MANGOSD_CLIENT_BUILD;
for (int i = 0; accepted_versions[i]; ++i) for (int i = 0; accepted_versions[i]; ++i)
if (int(build) == accepted_versions[i]) if (int(build) == accepted_versions[i])
{ return true; } {
return true;
}
return false; return false;
} }

View file

@ -237,7 +237,9 @@ inline SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
{ {
for (int i = 0; i < MAX_SPELL_SCHOOL; ++i) for (int i = 0; i < MAX_SPELL_SCHOOL; ++i)
if (mask & (1 << i)) if (mask & (1 << i))
{ return SpellSchools(i); } {
return SpellSchools(i);
}
return SPELL_SCHOOL_NORMAL; return SPELL_SCHOOL_NORMAL;
} }

View file

@ -65,12 +65,16 @@ static bool MapSessionFilterHelper(WorldSession* session, OpcodeHandler const& o
{ {
// we do not process thread-unsafe packets // we do not process thread-unsafe packets
if (opHandle.packetProcessing == PROCESS_THREADUNSAFE) if (opHandle.packetProcessing == PROCESS_THREADUNSAFE)
{ return false; } {
return false;
}
// we do not process not loggined player packets // we do not process not loggined player packets
Player* plr = session->GetPlayer(); Player* plr = session->GetPlayer();
if (!plr) if (!plr)
{ return false; } {
return false;
}
// in Map::Update() we do not process packets where player is not in world! // in Map::Update() we do not process packets where player is not in world!
return plr->IsInWorld(); return plr->IsInWorld();
@ -81,7 +85,9 @@ bool MapSessionFilter::Process(WorldPacket* packet)
{ {
OpcodeHandler const& opHandle = opcodeTable[packet->GetOpcode()]; OpcodeHandler const& opHandle = opcodeTable[packet->GetOpcode()];
if (opHandle.packetProcessing == PROCESS_INPLACE) if (opHandle.packetProcessing == PROCESS_INPLACE)
{ return true; } {
return true;
}
// let's check if our opcode can be really processed in Map::Update() // let's check if our opcode can be really processed in Map::Update()
return MapSessionFilterHelper(m_pSession, opHandle); return MapSessionFilterHelper(m_pSession, opHandle);
@ -94,7 +100,9 @@ bool WorldSessionFilter::Process(WorldPacket* packet)
OpcodeHandler const& opHandle = opcodeTable[packet->GetOpcode()]; OpcodeHandler const& opHandle = opcodeTable[packet->GetOpcode()];
// check if packet handler is supposed to be safe // check if packet handler is supposed to be safe
if (opHandle.packetProcessing == PROCESS_INPLACE) if (opHandle.packetProcessing == PROCESS_INPLACE)
{ return true; } {
return true;
}
// let's check if our opcode can't be processed in Map::Update() // let's check if our opcode can't be processed in Map::Update()
return !MapSessionFilterHelper(m_pSession, opHandle); return !MapSessionFilterHelper(m_pSession, opHandle);
@ -119,7 +127,9 @@ WorldSession::~WorldSession()
{ {
///- unload player if not unloaded ///- unload player if not unloaded
if (_player) if (_player)
{ LogoutPlayer(true); } {
LogoutPlayer(true);
}
/// - If have unclosed socket, close it /// - If have unclosed socket, close it
if (m_Socket) if (m_Socket)
@ -165,7 +175,9 @@ void WorldSession::SendPacket(WorldPacket const* packet)
#endif #endif
if (!m_Socket) if (!m_Socket)
{ return; } {
return;
}
if (opcodeTable[packet->GetOpcode()].status == STATUS_UNHANDLED) if (opcodeTable[packet->GetOpcode()].status == STATUS_UNHANDLED)
{ {
@ -212,7 +224,9 @@ void WorldSession::SendPacket(WorldPacket const* packet)
#endif // !MANGOS_DEBUG #endif // !MANGOS_DEBUG
if (m_Socket->SendPacket(*packet) == -1) if (m_Socket->SendPacket(*packet) == -1)
{ m_Socket->CloseSocket(); } {
m_Socket->CloseSocket();
}
} }
/// Add an incoming packet to the queue /// Add an incoming packet to the queue
@ -263,7 +277,9 @@ bool WorldSession::Update(PacketFilter& updater)
{ {
// skip STATUS_LOGGEDIN opcode unexpected errors if player logout sometime ago - this can be network lag delayed packets // skip STATUS_LOGGEDIN opcode unexpected errors if player logout sometime ago - this can be network lag delayed packets
if (!m_playerRecentlyLogout) if (!m_playerRecentlyLogout)
{ LogUnexpectedOpcode(packet, "the player has not logged in yet"); } {
LogUnexpectedOpcode(packet, "the player has not logged in yet");
}
} }
else if (_player->IsInWorld()) else if (_player->IsInWorld())
{ ExecuteOpcode(opHandle, packet); } { ExecuteOpcode(opHandle, packet); }
@ -286,7 +302,9 @@ bool WorldSession::Update(PacketFilter& updater)
break; break;
case STATUS_TRANSFER: case STATUS_TRANSFER:
if (!_player) if (!_player)
{ LogUnexpectedOpcode(packet, "the player has not logged in yet"); } {
LogUnexpectedOpcode(packet, "the player has not logged in yet");
}
else if (_player->IsInWorld()) else if (_player->IsInWorld())
{ LogUnexpectedOpcode(packet, "the player is still in world"); } { LogUnexpectedOpcode(packet, "the player is still in world"); }
else else
@ -369,7 +387,9 @@ bool WorldSession::Update(PacketFilter& updater)
///- If necessary, log the player out ///- If necessary, log the player out
time_t currTime = time(NULL); time_t currTime = time(NULL);
if (!m_Socket || (ShouldLogOut(currTime) && !m_playerLoading)) if (!m_Socket || (ShouldLogOut(currTime) && !m_playerLoading))
{ LogoutPlayer(true); } {
LogoutPlayer(true);
}
// WARDEN ISSUE - commented out to stop crash // WARDEN ISSUE - commented out to stop crash
// if (m_Socket && GetPlayer() && _warden) // if (m_Socket && GetPlayer() && _warden)
// _warden->Update(); // _warden->Update();
@ -414,7 +434,9 @@ void WorldSession::LogoutPlayer(bool Save)
sLog.outChar("Account: %d (IP: %s) Logout Character:[%s] (guid: %u)", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName() , _player->GetGUIDLow()); sLog.outChar("Account: %d (IP: %s) Logout Character:[%s] (guid: %u)", GetAccountId(), GetRemoteAddress().c_str(), _player->GetName() , _player->GetGUIDLow());
if (ObjectGuid lootGuid = GetPlayer()->GetLootGuid()) if (ObjectGuid lootGuid = GetPlayer()->GetLootGuid())
{ DoLootRelease(lootGuid); } {
DoLootRelease(lootGuid);
}
#ifdef ENABLE_PLAYERBOTS #ifdef ENABLE_PLAYERBOTS
if (_player->GetPlayerbotMgr()) if (_player->GetPlayerbotMgr())
@ -444,7 +466,9 @@ void WorldSession::LogoutPlayer(bool Save)
if (owner) if (owner)
{ {
if (owner->GetTypeId() == TYPEID_PLAYER) if (owner->GetTypeId() == TYPEID_PLAYER)
{ aset.insert((Player*)owner); } {
aset.insert((Player*)owner);
}
} }
else if ((*itr)->GetTypeId() == TYPEID_PLAYER) else if ((*itr)->GetTypeId() == TYPEID_PLAYER)
{ aset.insert((Player*)(*itr)); } { aset.insert((Player*)(*itr)); }
@ -463,7 +487,9 @@ void WorldSession::LogoutPlayer(bool Save)
// this can't be called for all attackers. // this can't be called for all attackers.
if (!aset.empty()) if (!aset.empty())
if (BattleGround* bg = _player->GetBattleGround()) if (BattleGround* bg = _player->GetBattleGround())
{ bg->HandleKillPlayer(_player, *aset.begin()); } {
bg->HandleKillPlayer(_player, *aset.begin());
}
} }
else if (_player->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION)) else if (_player->HasAuraType(SPELL_AURA_SPIRIT_OF_REDEMPTION))
{ {
@ -476,7 +502,9 @@ void WorldSession::LogoutPlayer(bool Save)
} }
// drop a flag if player is carrying it // drop a flag if player is carrying it
if (BattleGround* bg = _player->GetBattleGround()) if (BattleGround* bg = _player->GetBattleGround())
{ bg->EventPlayerLoggedOut(_player); } {
bg->EventPlayerLoggedOut(_player);
}
///- Teleport to home if the player is in an invalid instance ///- Teleport to home if the player is in an invalid instance
if (!_player->m_InstanceValid && !_player->isGameMaster()) if (!_player->m_InstanceValid && !_player->isGameMaster())
@ -538,7 +566,9 @@ void WorldSession::LogoutPlayer(bool Save)
///- empty buyback items and save the player in the database ///- empty buyback items and save the player in the database
// some save parts only correctly work in case player present in map/player_lists (pets, etc) // some save parts only correctly work in case player present in map/player_lists (pets, etc)
if (Save) if (Save)
{ _player->SaveToDB(); } {
_player->SaveToDB();
}
///- Leave all channels before player delete... ///- Leave all channels before player delete...
_player->CleanupChannels(); _player->CleanupChannels();
@ -549,11 +579,15 @@ void WorldSession::LogoutPlayer(bool Save)
// remove player from the group if he is: // remove player from the group if he is:
// a) in group; b) not in raid group; c) logging out normally (not being kicked or disconnected) // a) in group; b) not in raid group; c) logging out normally (not being kicked or disconnected)
if (_player->GetGroup() && !_player->GetGroup()->isRaidGroup() && m_Socket) if (_player->GetGroup() && !_player->GetGroup()->isRaidGroup() && m_Socket)
{ _player->RemoveFromGroup(); } {
_player->RemoveFromGroup();
}
#endif #endif
///- Send update to group ///- Send update to group
if (_player->GetGroup()) if (_player->GetGroup())
{ _player->GetGroup()->SendUpdate(); } {
_player->GetGroup()->SendUpdate();
}
///- Broadcast a logout message to the player's friends ///- Broadcast a logout message to the player's friends
sSocialMgr.SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetObjectGuid(), true); sSocialMgr.SendFriendStatus(_player, FRIEND_OFFLINE, _player->GetObjectGuid(), true);
@ -613,7 +647,9 @@ void WorldSession::LogoutPlayer(bool Save)
void WorldSession::KickPlayer() void WorldSession::KickPlayer()
{ {
if (m_Socket) if (m_Socket)
{ m_Socket->CloseSocket(); } {
m_Socket->CloseSocket();
}
} }
/// Cancel channeling handler /// Cancel channeling handler
@ -1152,7 +1188,9 @@ void WorldSession::ExecuteOpcode(OpcodeHandler const& opHandle, WorldPacket* pac
// need prevent do internal far teleports in handlers because some handlers do lot steps // need prevent do internal far teleports in handlers because some handlers do lot steps
// or call code that can do far teleports in some conditions unexpectedly for generic way work code // or call code that can do far teleports in some conditions unexpectedly for generic way work code
if (_player) if (_player)
{ _player->SetCanDelayTeleport(true); } {
_player->SetCanDelayTeleport(true);
}
(this->*opHandle.handler)(*packet); (this->*opHandle.handler)(*packet);
@ -1164,11 +1202,15 @@ void WorldSession::ExecuteOpcode(OpcodeHandler const& opHandle, WorldPacket* pac
// we should execute delayed teleports only for alive(!) players // we should execute delayed teleports only for alive(!) players
// because we don't want player's ghost teleported from graveyard // because we don't want player's ghost teleported from graveyard
if (_player->IsHasDelayedTeleport()) if (_player->IsHasDelayedTeleport())
{ _player->TeleportTo(_player->m_teleport_dest, _player->m_teleport_options); } {
_player->TeleportTo(_player->m_teleport_dest, _player->m_teleport_options);
}
} }
if (packet->rpos() < packet->wpos() && sLog.HasLogLevelOrHigher(LOG_LVL_DEBUG)) if (packet->rpos() < packet->wpos() && sLog.HasLogLevelOrHigher(LOG_LVL_DEBUG))
{ LogUnprocessedTail(packet); } {
LogUnprocessedTail(packet);
}
} }
void WorldSession::InitWarden(uint16 build, BigNumber* k, std::string const& os) void WorldSession::InitWarden(uint16 build, BigNumber* k, std::string const& os)

View file

@ -400,7 +400,9 @@ class WorldSession
{ {
m_Tutorials[intId] = value; m_Tutorials[intId] = value;
if (m_tutorialState == TUTORIALDATA_UNCHANGED) if (m_tutorialState == TUTORIALDATA_UNCHANGED)
{ m_tutorialState = TUTORIALDATA_CHANGED; } {
m_tutorialState = TUTORIALDATA_CHANGED;
}
} }
} }
// used with item_page table // used with item_page table

View file

@ -129,7 +129,9 @@ WorldSocket::~WorldSocket(void)
delete m_RecvWPct; delete m_RecvWPct;
if (m_OutBuffer) if (m_OutBuffer)
{ m_OutBuffer->release(); } {
m_OutBuffer->release();
}
closing_ = true; closing_ = true;
@ -147,7 +149,9 @@ void WorldSocket::CloseSocket(void)
ACE_GUARD(LockType, Guard, m_OutBufferLock); ACE_GUARD(LockType, Guard, m_OutBufferLock);
if (closing_) if (closing_)
{ return; } {
return;
}
closing_ = true; closing_ = true;
peer().close_writer(); peer().close_writer();
@ -170,7 +174,9 @@ int WorldSocket::SendPacket(const WorldPacket& pct)
ACE_GUARD_RETURN(LockType, Guard, m_OutBufferLock, -1); ACE_GUARD_RETURN(LockType, Guard, m_OutBufferLock, -1);
if (closing_) if (closing_)
{ return -1; } {
return -1;
}
// Dump outgoing packet. // Dump outgoing packet.
sLog.outWorldPacketDump(uint32(get_handle()), pct.GetOpcode(), pct.GetOpcodeName(), &pct, false); sLog.outWorldPacketDump(uint32(get_handle()), pct.GetOpcode(), pct.GetOpcodeName(), &pct, false);
@ -232,7 +238,9 @@ int WorldSocket::open(void* a)
// Prevent double call to this func. // Prevent double call to this func.
if (m_OutBuffer) if (m_OutBuffer)
{ return -1; } {
return -1;
}
// This will also prevent the socket from being Updated // This will also prevent the socket from being Updated
// while we are initializing it. // while we are initializing it.
@ -240,7 +248,9 @@ int WorldSocket::open(void* a)
// Hook for the manager. // Hook for the manager.
if (sWorldSocketMgr->OnSocketOpen(this) == -1) if (sWorldSocketMgr->OnSocketOpen(this) == -1)
{ return -1; } {
return -1;
}
// Allocate the buffer. // Allocate the buffer.
ACE_NEW_RETURN(m_OutBuffer, ACE_Message_Block(m_OutBufferSize), -1); ACE_NEW_RETURN(m_OutBuffer, ACE_Message_Block(m_OutBufferSize), -1);
@ -273,7 +283,9 @@ int WorldSocket::open(void* a)
packet << uint8(1); packet << uint8(1);
if (SendPacket(packet) == -1) if (SendPacket(packet) == -1)
{ return -1; } {
return -1;
}
// Register with ACE Reactor // Register with ACE Reactor
if (reactor()->register_handler(this, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK) == -1) if (reactor()->register_handler(this, ACE_Event_Handler::READ_MASK | ACE_Event_Handler::WRITE_MASK) == -1)
@ -309,7 +321,9 @@ int WorldSocket::close(int)
int WorldSocket::handle_input(ACE_HANDLE) int WorldSocket::handle_input(ACE_HANDLE)
{ {
if (closing_) if (closing_)
{ return -1; } {
return -1;
}
switch (handle_input_missing_data()) switch (handle_input_missing_data())
{ {
@ -347,7 +361,9 @@ int WorldSocket::handle_output(ACE_HANDLE)
ACE_GUARD_RETURN(LockType, Guard, m_OutBufferLock, -1); ACE_GUARD_RETURN(LockType, Guard, m_OutBufferLock, -1);
if (closing_) if (closing_)
{ return -1; } {
return -1;
}
const size_t send_len = m_OutBuffer->length(); const size_t send_len = m_OutBuffer->length();
@ -361,11 +377,15 @@ int WorldSocket::handle_output(ACE_HANDLE)
#endif // MSG_NOSIGNAL #endif // MSG_NOSIGNAL
if (n == 0) if (n == 0)
{ return -1; } {
return -1;
}
else if (n == -1) else if (n == -1)
{ {
if (errno == EWOULDBLOCK || errno == EAGAIN) if (errno == EWOULDBLOCK || errno == EAGAIN)
{ return schedule_wakeup_output(Guard); } {
return schedule_wakeup_output(Guard);
}
return -1; return -1;
} }
@ -458,7 +478,9 @@ int WorldSocket::handle_close(ACE_HANDLE h, ACE_Reactor_Mask)
closing_ = true; closing_ = true;
if (h == ACE_INVALID_HANDLE) if (h == ACE_INVALID_HANDLE)
{ peer().close_writer(); } {
peer().close_writer();
}
} }
// Critical section // Critical section
@ -475,10 +497,14 @@ int WorldSocket::handle_close(ACE_HANDLE h, ACE_Reactor_Mask)
int WorldSocket::Update(void) int WorldSocket::Update(void)
{ {
if (closing_) if (closing_)
{ return -1; } {
return -1;
}
if (m_OutActive || (m_OutBuffer->length() == 0 && msg_queue()->is_empty())) if (m_OutActive || (m_OutBuffer->length() == 0 && msg_queue()->is_empty()))
{ return 0; } {
return 0;
}
int ret; int ret;
do do
@ -545,7 +571,9 @@ int WorldSocket::handle_input_payload(void)
m_Header.reset(); m_Header.reset();
if (ret == -1) if (ret == -1)
{ errno = EINVAL; } {
errno = EINVAL;
}
return ret; return ret;
} }
@ -572,7 +600,9 @@ int WorldSocket::handle_input_missing_data(void)
recv_size); recv_size);
if (n <= 0) if (n <= 0)
{ return (int)n; } {
return (int)n;
}
message_block.wr_ptr(n); message_block.wr_ptr(n);
@ -642,7 +672,9 @@ int WorldSocket::handle_input_missing_data(void)
int WorldSocket::cancel_wakeup_output(GuardType& g) int WorldSocket::cancel_wakeup_output(GuardType& g)
{ {
if (!m_OutActive) if (!m_OutActive)
{ return 0; } {
return 0;
}
m_OutActive = false; m_OutActive = false;
@ -662,7 +694,9 @@ int WorldSocket::cancel_wakeup_output(GuardType& g)
int WorldSocket::schedule_wakeup_output(GuardType& g) int WorldSocket::schedule_wakeup_output(GuardType& g)
{ {
if (m_OutActive) if (m_OutActive)
{ return 0; } {
return 0;
}
m_OutActive = true; m_OutActive = true;
@ -688,7 +722,9 @@ int WorldSocket::ProcessIncoming(WorldPacket* new_pct)
const ACE_UINT16 opcode = new_pct->GetOpcode(); const ACE_UINT16 opcode = new_pct->GetOpcode();
if (closing_) if (closing_)
{ return -1; } {
return -1;
}
// Dump received packet. // Dump received packet.
sLog.outWorldPacketDump(uint32(get_handle()), new_pct->GetOpcode(), new_pct->GetOpcodeName(), new_pct, true); sLog.outWorldPacketDump(uint32(get_handle()), new_pct->GetOpcode(), new_pct->GetOpcodeName(), new_pct, true);
@ -917,7 +953,9 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
id = fields[0].GetUInt32(); id = fields[0].GetUInt32();
security = fields[1].GetUInt16(); security = fields[1].GetUInt16();
if (security > SEC_ADMINISTRATOR) // prevent invalid security settings in DB if (security > SEC_ADMINISTRATOR) // prevent invalid security settings in DB
{ security = SEC_ADMINISTRATOR; } {
security = SEC_ADMINISTRATOR;
}
K.SetHexStr(fields[2].GetString()); K.SetHexStr(fields[2].GetString());
@ -925,7 +963,9 @@ int WorldSocket::HandleAuthSession(WorldPacket& recvPacket)
locale = LocaleConstant(fields[9].GetUInt8()); locale = LocaleConstant(fields[9].GetUInt8());
if (locale >= MAX_LOCALE) if (locale >= MAX_LOCALE)
{ locale = LOCALE_enUS; } {
locale = LOCALE_enUS;
}
delete result; delete result;

View file

@ -67,7 +67,9 @@ int WorldSocketMgr::svc()
{ {
ACE_Time_Value interval(0, 10000); ACE_Time_Value interval(0, 10000);
if (reactor_->run_reactor_event_loop(interval) == -1) if (reactor_->run_reactor_event_loop(interval) == -1)
{ break; } {
break;
}
for (i = sockets_->begin(); i != sockets_->end();) for (i = sockets_->begin(); i != sockets_->end();)
{ {

View file

@ -33,14 +33,18 @@ void CharacterDatabaseCleaner::CleanDatabase()
{ {
// config to disable // config to disable
if (!sWorld.getConfig(CONFIG_BOOL_CLEAN_CHARACTER_DB)) if (!sWorld.getConfig(CONFIG_BOOL_CLEAN_CHARACTER_DB))
{ return; } {
return;
}
sLog.outString("Cleaning character database..."); sLog.outString("Cleaning character database...");
// check flags which clean ups are necessary // check flags which clean ups are necessary
QueryResult* result = CharacterDatabase.PQuery("SELECT cleaning_flags FROM saved_variables"); QueryResult* result = CharacterDatabase.PQuery("SELECT cleaning_flags FROM saved_variables");
if (!result) if (!result)
{ return; } {
return;
}
uint32 flags = (*result)[0].GetUInt32(); uint32 flags = (*result)[0].GetUInt32();
delete result; delete result;
@ -48,9 +52,13 @@ void CharacterDatabaseCleaner::CleanDatabase()
if (flags & CLEANING_FLAG_ACHIEVEMENT_PROGRESS) if (flags & CLEANING_FLAG_ACHIEVEMENT_PROGRESS)
CleanCharacterAchievementProgress(); CleanCharacterAchievementProgress();
if (flags & CLEANING_FLAG_SKILLS) if (flags & CLEANING_FLAG_SKILLS)
{ CleanCharacterSkills(); } {
CleanCharacterSkills();
}
if (flags & CLEANING_FLAG_SPELLS) if (flags & CLEANING_FLAG_SPELLS)
{ CleanCharacterSpell(); } {
CleanCharacterSpell();
}
if (flags & CLEANING_FLAG_TALENTS) if (flags & CLEANING_FLAG_TALENTS)
CleanCharacterTalent(); CleanCharacterTalent();
CharacterDatabase.Execute("UPDATE saved_variables SET cleaning_flags = 0"); CharacterDatabase.Execute("UPDATE saved_variables SET cleaning_flags = 0");

View file

@ -80,7 +80,9 @@ static bool findtoknth(std::string& str, int n, std::string::size_type& s, std::
std::string::size_type size = str.size(); std::string::size_type size = str.size();
for (i = 1; s < size && i < n; ++s) if (str[s] == ' ') { ++i; } for (i = 1; s < size && i < n; ++s) if (str[s] == ' ') { ++i; }
if (i < n) if (i < n)
{ return false; } {
return false;
}
e = str.find(' ', s); e = str.find(' ', s);
@ -91,7 +93,9 @@ std::string gettoknth(std::string& str, int n)
{ {
std::string::size_type s = 0, e = 0; std::string::size_type s = 0, e = 0;
if (!findtoknth(str, n, s, e)) if (!findtoknth(str, n, s, e))
{ return ""; } {
return "";
}
return str.substr(s, e - s); return str.substr(s, e - s);
} }
@ -100,13 +104,17 @@ bool findnth(std::string& str, int n, std::string::size_type& s, std::string::si
{ {
s = str.find("VALUES ('") + 9; s = str.find("VALUES ('") + 9;
if (s == std::string::npos) if (s == std::string::npos)
{ return false; } {
return false;
}
do do
{ {
e = str.find("'", s); e = str.find("'", s);
if (e == std::string::npos) if (e == std::string::npos)
{ return false; } {
return false;
}
} }
while (str[e - 1] == '\\'); while (str[e - 1] == '\\');
@ -117,7 +125,9 @@ bool findnth(std::string& str, int n, std::string::size_type& s, std::string::si
s = e + 4; s = e + 4;
e = str.find("'", s); e = str.find("'", s);
if (e == std::string::npos) if (e == std::string::npos)
{ return false; } {
return false;
}
} }
while (str[e - 1] == '\\'); while (str[e - 1] == '\\');
} }
@ -129,7 +139,9 @@ std::string gettablename(std::string& str)
std::string::size_type s = 13; std::string::size_type s = 13;
std::string::size_type e = str.find(_TABLE_SIM_, s); std::string::size_type e = str.find(_TABLE_SIM_, s);
if (e == std::string::npos) if (e == std::string::npos)
{ return ""; } {
return "";
}
return str.substr(s, e - s); return str.substr(s, e - s);
} }
@ -138,12 +150,16 @@ bool changenth(std::string& str, int n, const char* with, bool insert = false, b
{ {
std::string::size_type s, e; std::string::size_type s, e;
if (!findnth(str, n, s, e)) if (!findnth(str, n, s, e))
{ return false; } {
return false;
}
if (nonzero && str.substr(s, e - s) == "0") if (nonzero && str.substr(s, e - s) == "0")
{ return true; } // not an error { return true; } // not an error
if (!insert) if (!insert)
{ str.replace(s, e - s, with); } {
str.replace(s, e - s, with);
}
else else
{ str.insert(s, with); } { str.insert(s, with); }
@ -154,7 +170,9 @@ std::string getnth(std::string& str, int n)
{ {
std::string::size_type s, e; std::string::size_type s, e;
if (!findnth(str, n, s, e)) if (!findnth(str, n, s, e))
{ return ""; } {
return "";
}
return str.substr(s, e - s); return str.substr(s, e - s);
} }
@ -163,11 +181,15 @@ bool changetoknth(std::string& str, int n, const char* with, bool insert = false
{ {
std::string::size_type s = 0, e = 0; std::string::size_type s = 0, e = 0;
if (!findtoknth(str, n, s, e)) if (!findtoknth(str, n, s, e))
{ return false; } {
return false;
}
if (nonzero && str.substr(s, e - s) == "0") if (nonzero && str.substr(s, e - s) == "0")
{ return true; } // not an error { return true; } // not an error
if (!insert) if (!insert)
{ str.replace(s, e - s, with); } {
str.replace(s, e - s, with);
}
else else
{ str.insert(s, with); } { str.insert(s, with); }
@ -178,7 +200,9 @@ uint32 registerNewGuid(uint32 oldGuid, std::map<uint32, uint32>& guidMap, uint32
{ {
std::map<uint32, uint32>::const_iterator itr = guidMap.find(oldGuid); std::map<uint32, uint32>::const_iterator itr = guidMap.find(oldGuid);
if (itr != guidMap.end()) if (itr != guidMap.end())
{ return itr->second; } {
return itr->second;
}
uint32 newguid = hiGuid + guidMap.size(); uint32 newguid = hiGuid + guidMap.size();
guidMap[oldGuid] = newguid; guidMap[oldGuid] = newguid;
@ -214,7 +238,9 @@ bool changetokGuid(std::string& str, int n, std::map<uint32, uint32>& guidMap, u
std::string CreateDumpString(char const* tableName, QueryResult* result) std::string CreateDumpString(char const* tableName, QueryResult* result)
{ {
if (!tableName || !result) if (!tableName || !result)
{ return ""; } {
return "";
}
std::ostringstream ss; std::ostringstream ss;
ss << "INSERT INTO " << _TABLE_SIM_ << tableName << _TABLE_SIM_ << " VALUES ("; ss << "INSERT INTO " << _TABLE_SIM_ << tableName << _TABLE_SIM_ << " VALUES (";
@ -222,10 +248,14 @@ std::string CreateDumpString(char const* tableName, QueryResult* result)
for (uint32 i = 0; i < result->GetFieldCount(); ++i) for (uint32 i = 0; i < result->GetFieldCount(); ++i)
{ {
if (i != 0) if (i != 0)
{ ss << ", "; } {
ss << ", ";
}
if (fields[i].IsNULL()) if (fields[i].IsNULL())
{ ss << "NULL"; } {
ss << "NULL";
}
else else
{ {
std::string s = fields[i].GetCppString(); std::string s = fields[i].GetCppString();
@ -261,7 +291,9 @@ std::string PlayerDumpWriter::GenerateWhereStr(char const* field, GUIDs const& g
GUIDs::const_iterator itr2 = itr; GUIDs::const_iterator itr2 = itr;
if (++itr2 != guids.end()) if (++itr2 != guids.end())
{ wherestr << "','"; } {
wherestr << "','";
}
} }
wherestr << "')"; wherestr << "')";
return wherestr.str(); return wherestr.str();
@ -272,7 +304,9 @@ void StoreGUID(QueryResult* result, uint32 field, std::set<uint32>& guids)
Field* fields = result->Fetch(); Field* fields = result->Fetch();
uint32 guid = fields[field].GetUInt32(); uint32 guid = fields[field].GetUInt32();
if (guid) if (guid)
{ guids.insert(guid); } {
guids.insert(guid);
}
} }
void StoreGUID(QueryResult* result, uint32 data, uint32 field, std::set<uint32>& guids) void StoreGUID(QueryResult* result, uint32 data, uint32 field, std::set<uint32>& guids)
@ -281,7 +315,9 @@ void StoreGUID(QueryResult* result, uint32 data, uint32 field, std::set<uint32>&
std::string dataStr = fields[data].GetCppString(); std::string dataStr = fields[data].GetCppString();
uint32 guid = atoi(gettoknth(dataStr, field).c_str()); uint32 guid = atoi(gettoknth(dataStr, field).c_str());
if (guid) if (guid)
{ guids.insert(guid); } {
guids.insert(guid);
}
} }
// Writing - High-level functions // Writing - High-level functions
@ -310,20 +346,26 @@ void PlayerDumpWriter::DumpTableContent(std::string& dump, uint32 guid, char con
// setup for guids case start position // setup for guids case start position
GUIDs::const_iterator guids_itr; GUIDs::const_iterator guids_itr;
if (guids) if (guids)
{ guids_itr = guids->begin(); } {
guids_itr = guids->begin();
}
do do
{ {
std::string wherestr; std::string wherestr;
if (guids) // set case, get next guids string if (guids) // set case, get next guids string
{ wherestr = GenerateWhereStr(fieldname, *guids, guids_itr); } {
wherestr = GenerateWhereStr(fieldname, *guids, guids_itr);
}
else // not set case, get single guid string else // not set case, get single guid string
{ wherestr = GenerateWhereStr(fieldname, guid); } { wherestr = GenerateWhereStr(fieldname, guid); }
QueryResult* result = CharacterDatabase.PQuery("SELECT * FROM %s WHERE %s", tableFrom, wherestr.c_str()); QueryResult* result = CharacterDatabase.PQuery("SELECT * FROM %s WHERE %s", tableFrom, wherestr.c_str());
if (!result) if (!result)
{ return; } {
return;
}
do do
{ {
@ -399,7 +441,9 @@ DumpReturn PlayerDumpWriter::WriteDump(const std::string& file, uint32 guid)
{ {
FILE* fout = fopen(file.c_str(), "w"); FILE* fout = fopen(file.c_str(), "w");
if (!fout) if (!fout)
{ return DUMP_FILE_OPEN_ERROR; } {
return DUMP_FILE_OPEN_ERROR;
}
std::string dump = GetDump(guid); std::string dump = GetDump(guid);
@ -418,11 +462,15 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
// check character count // check character count
uint32 charcount = sAccountMgr.GetCharactersCount(account); uint32 charcount = sAccountMgr.GetCharactersCount(account);
if (charcount >= 10) if (charcount >= 10)
{ return DUMP_TOO_MANY_CHARS; } {
return DUMP_TOO_MANY_CHARS;
}
FILE* fin = fopen(file.c_str(), "r"); FILE* fin = fopen(file.c_str(), "r");
if (!fin) if (!fin)
{ return DUMP_FILE_OPEN_ERROR; } {
return DUMP_FILE_OPEN_ERROR;
}
QueryResult* result = NULL; QueryResult* result = NULL;
char newguid[20], chraccount[20], newpetid[20], currpetid[20], lastpetid[20]; char newguid[20], chraccount[20], newpetid[20], currpetid[20], lastpetid[20];
@ -489,17 +537,23 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
// skip empty strings // skip empty strings
size_t nw_pos = line.find_first_not_of(" \t\n\r\7"); size_t nw_pos = line.find_first_not_of(" \t\n\r\7");
if (nw_pos == std::string::npos) if (nw_pos == std::string::npos)
{ continue; } {
continue;
}
// skip NOTE // skip NOTE
if (line.substr(nw_pos, 15) == "IMPORTANT NOTE:") if (line.substr(nw_pos, 15) == "IMPORTANT NOTE:")
{ continue; } {
continue;
}
// add required_ check // add required_ check
if (line.substr(nw_pos, 41) == "UPDATE character_db_version SET required_") if (line.substr(nw_pos, 41) == "UPDATE character_db_version SET required_")
{ {
if (!CharacterDatabase.Execute(line.c_str())) if (!CharacterDatabase.Execute(line.c_str()))
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
continue; continue;
} }
@ -536,7 +590,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
{ {
case DTT_CHAR_TABLE: case DTT_CHAR_TABLE:
if (!changenth(line, 1, newguid)) // character_*.guid update if (!changenth(line, 1, newguid)) // character_*.guid update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
break; break;
case DTT_CHAR_NAME_TABLE: case DTT_CHAR_NAME_TABLE:
@ -553,10 +609,14 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
case DTT_CHARACTER: case DTT_CHARACTER:
{ {
if (!changenth(line, 1, newguid)) // characters.guid update if (!changenth(line, 1, newguid)) // characters.guid update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
if (!changenth(line, 2, chraccount)) // characters.account update if (!changenth(line, 2, chraccount)) // characters.account update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
if (name.empty()) if (name.empty())
{ {
@ -570,7 +630,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
delete result; delete result;
if (!changenth(line, 36, "1")) // characters.at_login set to "rename on login" if (!changenth(line, 36, "1")) // characters.at_login set to "rename on login"
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
nameInvalidated = true; nameInvalidated = true;
} }
@ -578,7 +640,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
else else
{ {
if (!changenth(line, 3, name.c_str())) // characters.name update if (!changenth(line, 3, name.c_str())) // characters.name update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
nameInvalidated = true; nameInvalidated = true;
} }
@ -588,7 +652,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
case DTT_INVENTORY: case DTT_INVENTORY:
{ {
if (!changenth(line, 1, newguid)) // character_inventory.guid update if (!changenth(line, 1, newguid)) // character_inventory.guid update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
if (!changeGuid(line, 2, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed(), true)) if (!changeGuid(line, 2, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed(), true))
{ ROLLBACK(DUMP_FILE_BROKEN); } // character_inventory.bag update { ROLLBACK(DUMP_FILE_BROKEN); } // character_inventory.bag update
@ -602,20 +668,26 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
if (!changeGuid(line, 1, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed())) if (!changeGuid(line, 1, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed()))
{ ROLLBACK(DUMP_FILE_BROKEN); } // item_instance.guid update { ROLLBACK(DUMP_FILE_BROKEN); } // item_instance.guid update
if (!changenth(line, 2, newguid)) // item_instance.owner_guid update if (!changenth(line, 2, newguid)) // item_instance.owner_guid update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
std::string vals = getnth(line, 3); // item_instance.data get std::string vals = getnth(line, 3); // item_instance.data get
if (!changetokGuid(vals, OBJECT_FIELD_GUID + 1, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed())) if (!changetokGuid(vals, OBJECT_FIELD_GUID + 1, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed()))
{ ROLLBACK(DUMP_FILE_BROKEN); } // item_instance.data.OBJECT_FIELD_GUID update { ROLLBACK(DUMP_FILE_BROKEN); } // item_instance.data.OBJECT_FIELD_GUID update
if (!changetoknth(vals, ITEM_FIELD_OWNER + 1, newguid)) if (!changetoknth(vals, ITEM_FIELD_OWNER + 1, newguid))
{ ROLLBACK(DUMP_FILE_BROKEN); } // item_instance.data.ITEM_FIELD_OWNER update { ROLLBACK(DUMP_FILE_BROKEN); } // item_instance.data.ITEM_FIELD_OWNER update
if (!changenth(line, 3, vals.c_str())) // item_instance.data update if (!changenth(line, 3, vals.c_str())) // item_instance.data update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
break; break;
} }
case DTT_ITEM_GIFT: case DTT_ITEM_GIFT:
{ {
if (!changenth(line, 1, newguid)) // character_gifts.guid update if (!changenth(line, 1, newguid)) // character_gifts.guid update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
if (!changeGuid(line, 2, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed())) if (!changeGuid(line, 2, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed()))
{ ROLLBACK(DUMP_FILE_BROKEN); } // character_gifts.item_guid update { ROLLBACK(DUMP_FILE_BROKEN); } // character_gifts.item_guid update
break; break;
@ -626,7 +698,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
if (!changeGuid(line, 1, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed())) if (!changeGuid(line, 1, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed()))
{ ROLLBACK(DUMP_FILE_BROKEN); } // item_loot.guid update { ROLLBACK(DUMP_FILE_BROKEN); } // item_loot.guid update
if (!changenth(line, 2, newguid)) // item_Loot.owner_guid update if (!changenth(line, 2, newguid)) // item_Loot.owner_guid update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
break; break;
} }
case DTT_PET: case DTT_PET:
@ -634,7 +708,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
// store a map of old pet id to new inserted pet id for use by type 5 tables // store a map of old pet id to new inserted pet id for use by type 5 tables
snprintf(currpetid, 20, "%s", getnth(line, 1).c_str()); snprintf(currpetid, 20, "%s", getnth(line, 1).c_str());
if (strlen(lastpetid) == 0) if (strlen(lastpetid) == 0)
{ snprintf(lastpetid, 20, "%s", currpetid); } {
snprintf(lastpetid, 20, "%s", currpetid);
}
if (strcmp(lastpetid, currpetid) != 0) if (strcmp(lastpetid, currpetid) != 0)
{ {
@ -650,9 +726,13 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
} }
if (!changenth(line, 1, newpetid)) // character_pet.id update if (!changenth(line, 1, newpetid)) // character_pet.id update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
if (!changenth(line, 3, newguid)) // character_pet.owner update if (!changenth(line, 3, newguid)) // character_pet.owner update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
break; break;
} }
@ -663,12 +743,16 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
// lookup currpetid and match to new inserted pet id // lookup currpetid and match to new inserted pet id
std::map<uint32, uint32> :: const_iterator petids_iter = petids.find(atoi(currpetid)); std::map<uint32, uint32> :: const_iterator petids_iter = petids.find(atoi(currpetid));
if (petids_iter == petids.end()) // couldn't find new inserted id if (petids_iter == petids.end()) // couldn't find new inserted id
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
snprintf(newpetid, 20, "%d", petids_iter->second); snprintf(newpetid, 20, "%d", petids_iter->second);
if (!changenth(line, 1, newpetid)) // pet_*.guid -> petid in fact if (!changenth(line, 1, newpetid)) // pet_*.guid -> petid in fact
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
break; break;
} }
@ -696,7 +780,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
if (!changeGuid(line, 1, mails, sObjectMgr.m_MailIds.GetNextAfterMaxUsed())) if (!changeGuid(line, 1, mails, sObjectMgr.m_MailIds.GetNextAfterMaxUsed()))
{ ROLLBACK(DUMP_FILE_BROKEN); } // mail.id update { ROLLBACK(DUMP_FILE_BROKEN); } // mail.id update
if (!changenth(line, 6, newguid)) // mail.receiver update if (!changenth(line, 6, newguid)) // mail.receiver update
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
break; break;
} }
case DTT_MAIL_ITEM: // mail_items case DTT_MAIL_ITEM: // mail_items
@ -706,7 +792,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
if (!changeGuid(line, 2, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed())) if (!changeGuid(line, 2, items, sObjectMgr.m_ItemGuids.GetNextAfterMaxUsed()))
{ ROLLBACK(DUMP_FILE_BROKEN); } // mail_items.item_guid { ROLLBACK(DUMP_FILE_BROKEN); } // mail_items.item_guid
if (!changenth(line, 4, newguid)) // mail_items.receiver if (!changenth(line, 4, newguid)) // mail_items.receiver
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
break; break;
} }
case DTT_EQSET_TABLE: case DTT_EQSET_TABLE:
@ -726,7 +814,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
} }
if (execute_ok && !CharacterDatabase.Execute(line.c_str())) if (execute_ok && !CharacterDatabase.Execute(line.c_str()))
{ ROLLBACK(DUMP_FILE_BROKEN); } {
ROLLBACK(DUMP_FILE_BROKEN);
}
} }
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
@ -737,7 +827,9 @@ DumpReturn PlayerDumpReader::LoadDump(const std::string& file, uint32 account, s
sObjectMgr.m_EquipmentSetIds.Set(sObjectMgr.m_EquipmentSetIds.GetNextAfterMaxUsed() + eqsets.size()); sObjectMgr.m_EquipmentSetIds.Set(sObjectMgr.m_EquipmentSetIds.GetNextAfterMaxUsed() + eqsets.size());
if (incHighest) if (incHighest)
{ sObjectMgr.m_CharGuids.Set(sObjectMgr.m_CharGuids.GetNextAfterMaxUsed() + 1); } {
sObjectMgr.m_CharGuids.Set(sObjectMgr.m_CharGuids.GetNextAfterMaxUsed() + 1);
}
fclose(fin); fclose(fin);

View file

@ -132,10 +132,14 @@ AccountOpResult AccountMgr::ChangeUsername(uint32 accid, std::string new_uname,
delete result; delete result;
if (utf8length(new_uname) > MAX_ACCOUNT_STR) if (utf8length(new_uname) > MAX_ACCOUNT_STR)
{ return AOR_NAME_TOO_LONG; } {
return AOR_NAME_TOO_LONG;
}
if (utf8length(new_passwd) > MAX_ACCOUNT_STR) if (utf8length(new_passwd) > MAX_ACCOUNT_STR)
{ return AOR_PASS_TOO_LONG; } {
return AOR_PASS_TOO_LONG;
}
normalizeString(new_uname); normalizeString(new_uname);
normalizeString(new_passwd); normalizeString(new_passwd);
@ -158,7 +162,9 @@ AccountOpResult AccountMgr::ChangePassword(uint32 accid, std::string new_passwd)
{ return AOR_NAME_NOT_EXIST; } // account doesn't exist { return AOR_NAME_NOT_EXIST; } // account doesn't exist
if (utf8length(new_passwd) > MAX_ACCOUNT_STR) if (utf8length(new_passwd) > MAX_ACCOUNT_STR)
{ return AOR_PASS_TOO_LONG; } {
return AOR_PASS_TOO_LONG;
}
normalizeString(new_passwd); normalizeString(new_passwd);
@ -175,7 +181,9 @@ uint32 AccountMgr::GetId(std::string username)
LoginDatabase.escape_string(username); LoginDatabase.escape_string(username);
QueryResult* result = LoginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'", username.c_str()); QueryResult* result = LoginDatabase.PQuery("SELECT id FROM account WHERE username = '%s'", username.c_str());
if (!result) if (!result)
{ return 0; } {
return 0;
}
else else
{ {
uint32 id = (*result)[0].GetUInt32(); uint32 id = (*result)[0].GetUInt32();
@ -229,7 +237,9 @@ bool AccountMgr::CheckPassword(uint32 accid, std::string passwd)
{ {
std::string username; std::string username;
if (!GetName(accid, username)) if (!GetName(accid, username))
{ return false; } {
return false;
}
normalizeString(passwd); normalizeString(passwd);
normalizeString(username); normalizeString(username);
@ -250,7 +260,9 @@ bool AccountMgr::normalizeString(std::string& utf8str)
size_t wstr_len = MAX_ACCOUNT_STR; size_t wstr_len = MAX_ACCOUNT_STR;
if (!Utf8toWStr(utf8str, wstr_buf, wstr_len)) if (!Utf8toWStr(utf8str, wstr_buf, wstr_len))
{ return false; } {
return false;
}
for (uint32 i = 0; i <= wstr_len; ++i) for (uint32 i = 0; i <= wstr_len; ++i)
wstr_buf[i] = wcharToUpperOnlyLatin(wstr_buf[i]); wstr_buf[i] = wcharToUpperOnlyLatin(wstr_buf[i]);

View file

@ -243,13 +243,19 @@ void WorldSession::HandleMessagechatOpcode(WorldPacket& recv_data)
msg = recv_data.ReadString(msgLength); msg = recv_data.ReadString(msgLength);
if (msg.empty()) if (msg.empty())
{ break; } {
break;
}
if (ChatHandler(this).ParseCommands(msg.c_str())) if (ChatHandler(this).ParseCommands(msg.c_str()))
{ break; } {
break;
}
if (!processChatmessageFurtherAfterSecurityChecks(msg, lang)) if (!processChatmessageFurtherAfterSecurityChecks(msg, lang))
{ return; } {
return;
}
if (!normalizePlayerName(to)) if (!normalizePlayerName(to))
{ {

View file

@ -97,7 +97,9 @@ struct CoordPair
void operator<<(const uint32 val) void operator<<(const uint32 val)
{ {
if (x_coord > val) if (x_coord > val)
{ x_coord -= val; } {
x_coord -= val;
}
else else
{ x_coord = 0; } { x_coord = 0; }
} }
@ -105,7 +107,9 @@ struct CoordPair
void operator>>(const uint32 val) void operator>>(const uint32 val)
{ {
if (x_coord + val < LIMIT) if (x_coord + val < LIMIT)
{ x_coord += val; } {
x_coord += val;
}
else else
{ x_coord = LIMIT - 1; } { x_coord = LIMIT - 1; }
} }
@ -113,7 +117,9 @@ struct CoordPair
void operator-=(const uint32 val) void operator-=(const uint32 val)
{ {
if (y_coord > val) if (y_coord > val)
{ y_coord -= val; } {
y_coord -= val;
}
else else
{ y_coord = 0; } { y_coord = 0; }
} }
@ -121,7 +127,9 @@ struct CoordPair
void operator+=(const uint32 val) void operator+=(const uint32 val)
{ {
if (y_coord + val < LIMIT) if (y_coord + val < LIMIT)
{ y_coord += val; } {
y_coord += val;
}
else else
{ y_coord = LIMIT - 1; } { y_coord = LIMIT - 1; }
} }
@ -167,7 +175,9 @@ namespace MaNGOS
inline void NormalizeMapCoord(float& c) inline void NormalizeMapCoord(float& c)
{ {
if (c > MAP_HALFSIZE - 0.5) if (c > MAP_HALFSIZE - 0.5)
{ c = MAP_HALFSIZE - 0.5; } {
c = MAP_HALFSIZE - 0.5;
}
else if (c < -(MAP_HALFSIZE - 0.5)) else if (c < -(MAP_HALFSIZE - 0.5))
{ c = -(MAP_HALFSIZE - 0.5); } { c = -(MAP_HALFSIZE - 0.5); }
} }

View file

@ -787,7 +787,9 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i) for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i))) if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i)))
{ *data << int32(aura->GetModifier()->m_amount); } {
*data << int32(aura->GetModifier()->m_amount);
}
else else
{ *data << int32(0); } { *data << int32(0); }
} }
@ -884,7 +886,9 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i) for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i))) if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i)))
{ *data << int32(aura->GetModifier()->m_amount); } {
*data << int32(aura->GetModifier()->m_amount);
}
else else
{ *data << int32(0); } { *data << int32(0); }
} }
@ -1018,7 +1022,9 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recv_data)
for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i) for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i))) if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i)))
{ data << int32(aura->GetModifier()->m_amount); } {
data << int32(aura->GetModifier()->m_amount);
}
else else
{ data << int32(0); } { data << int32(0); }
} }
@ -1057,7 +1063,9 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recv_data)
for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i) for (uint32 i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i))) if (Aura* aura = holder->GetAuraByEffectIndex(SpellEffectIndex(i)))
{ data << int32(aura->GetModifier()->m_amount); } {
data << int32(aura->GetModifier()->m_amount);
}
else else
{ data << int32(0); } { data << int32(0); }
} }

View file

@ -32,16 +32,22 @@ void InstanceData::SaveToDB() const
{ {
// no reason to save BGs/Arenas // no reason to save BGs/Arenas
if (instance->IsBattleGroundOrArena()) if (instance->IsBattleGroundOrArena())
{ return; } {
return;
}
if (!Save()) if (!Save())
{ return; } {
return;
}
std::string data = Save(); std::string data = Save();
CharacterDatabase.escape_string(data); CharacterDatabase.escape_string(data);
if (instance->Instanceable()) if (instance->Instanceable())
{ CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%u'", data.c_str(), instance->GetInstanceId()); } {
CharacterDatabase.PExecute("UPDATE instance SET data = '%s' WHERE id = '%u'", data.c_str(), instance->GetInstanceId());
}
else else
{ CharacterDatabase.PExecute("UPDATE world SET data = '%s' WHERE map = '%u'", data.c_str(), instance->GetId()); } { CharacterDatabase.PExecute("UPDATE world SET data = '%s' WHERE map = '%u'", data.c_str(), instance->GetId()); }
} }

View file

@ -59,7 +59,9 @@ Map::~Map()
UnloadAll(true); UnloadAll(true);
if (!m_scriptSchedule.empty()) if (!m_scriptSchedule.empty())
{ sScriptMgr.DecreaseScheduledScriptCount(m_scriptSchedule.size()); } {
sScriptMgr.DecreaseScheduledScriptCount(m_scriptSchedule.size());
}
if (m_persistentState) if (m_persistentState)
{ m_persistentState->SetUsedByMapState(NULL); } // field pointer can be deleted after this { m_persistentState->SetUsedByMapState(NULL); } // field pointer can be deleted after this
@ -77,7 +79,9 @@ Map::~Map()
// release reference count // release reference count
if (m_TerrainData->Release()) if (m_TerrainData->Release())
{ sTerrainMgr.UnloadTerrain(m_TerrainData->GetMapId()); } {
sTerrainMgr.UnloadTerrain(m_TerrainData->GetMapId());
}
delete m_weatherSystem; delete m_weatherSystem;
m_weatherSystem = NULL; m_weatherSystem = NULL;
@ -86,10 +90,14 @@ Map::~Map()
void Map::LoadMapAndVMap(int gx, int gy) void Map::LoadMapAndVMap(int gx, int gy)
{ {
if (m_bLoadedGrids[gx][gy]) if (m_bLoadedGrids[gx][gy])
{ return; } {
return;
}
if (m_TerrainData->Load(gx, gy)) if (m_TerrainData->Load(gx, gy))
{ m_bLoadedGrids[gx][gy] = true; } {
m_bLoadedGrids[gx][gy] = true;
}
} }
Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode) Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode)
@ -245,7 +253,9 @@ Map::EnsureGridCreated(const GridPair& p)
int gy = (MAX_NUMBER_OF_GRIDS - 1) - p.y_coord; int gy = (MAX_NUMBER_OF_GRIDS - 1) - p.y_coord;
if (!m_bLoadedGrids[gx][gy]) if (!m_bLoadedGrids[gx][gy])
{ LoadMapAndVMap(gx, gy); } {
LoadMapAndVMap(gx, gy);
}
} }
} }
@ -274,7 +284,9 @@ Map::EnsureGridLoadedAtEnter(const Cell& cell, Player* player)
{ grid = getNGrid(cell.GridX(), cell.GridY()); } { grid = getNGrid(cell.GridX(), cell.GridY()); }
if (player) if (player)
{ AddToGrid(player, grid, cell); } {
AddToGrid(player, grid, cell);
}
} }
bool Map::EnsureGridLoaded(const Cell& cell) bool Map::EnsureGridLoaded(const Cell& cell)
@ -337,7 +349,9 @@ bool Map::Add(Player* player)
#endif /* ENABLE_ELUNA */ #endif /* ENABLE_ELUNA */
if (i_data) if (i_data)
{ i_data->OnPlayerEnter(player); } {
i_data->OnPlayerEnter(player);
}
return true; return true;
} }
@ -359,7 +373,9 @@ Map::Add(T* obj)
Cell cell(p); Cell cell(p);
if (obj->IsActiveObject()) if (obj->IsActiveObject())
{ EnsureGridLoadedAtEnter(cell); } {
EnsureGridLoadedAtEnter(cell);
}
else else
{ EnsureGridCreated(GridPair(cell.GridX(), cell.GridY())); } { EnsureGridCreated(GridPair(cell.GridX(), cell.GridY())); }
@ -370,7 +386,9 @@ Map::Add(T* obj)
obj->AddToWorld(); obj->AddToWorld();
if (obj->IsActiveObject()) if (obj->IsActiveObject())
{ AddToActive(obj); } {
AddToActive(obj);
}
DEBUG_LOG("%s enters grid[%u,%u]", obj->GetGuidStr().c_str(), cell.GridX(), cell.GridY()); DEBUG_LOG("%s enters grid[%u,%u]", obj->GetGuidStr().c_str(), cell.GridX(), cell.GridY());
@ -394,7 +412,9 @@ void Map::MessageBroadcast(Player const* player, WorldPacket* msg, bool to_self)
cell.SetNoCreate(); cell.SetNoCreate();
if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y))) if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)))
{ return; } {
return;
}
MaNGOS::MessageDeliverer post_man(*player, msg, to_self); MaNGOS::MessageDeliverer post_man(*player, msg, to_self);
TypeContainerVisitor<MaNGOS::MessageDeliverer, WorldTypeMapContainer > message(post_man); TypeContainerVisitor<MaNGOS::MessageDeliverer, WorldTypeMapContainer > message(post_man);
@ -415,7 +435,9 @@ void Map::MessageBroadcast(WorldObject const* obj, WorldPacket* msg)
cell.SetNoCreate(); cell.SetNoCreate();
if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y))) if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)))
{ return; } {
return;
}
// TODO: currently on continents when Visibility.Distance.InFlight > Visibility.Distance.Continents // TODO: currently on continents when Visibility.Distance.InFlight > Visibility.Distance.Continents
// we have alot of blinking mobs because monster move packet send is broken... // we have alot of blinking mobs because monster move packet send is broken...
@ -438,7 +460,9 @@ void Map::MessageDistBroadcast(Player const* player, WorldPacket* msg, float dis
cell.SetNoCreate(); cell.SetNoCreate();
if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y))) if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)))
{ return; } {
return;
}
MaNGOS::MessageDistDeliverer post_man(*player, msg, dist, to_self, own_team_only); MaNGOS::MessageDistDeliverer post_man(*player, msg, dist, to_self, own_team_only);
TypeContainerVisitor<MaNGOS::MessageDistDeliverer , WorldTypeMapContainer > message(post_man); TypeContainerVisitor<MaNGOS::MessageDistDeliverer , WorldTypeMapContainer > message(post_man);
@ -459,7 +483,9 @@ void Map::MessageDistBroadcast(WorldObject const* obj, WorldPacket* msg, float d
cell.SetNoCreate(); cell.SetNoCreate();
if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y))) if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)))
{ return; } {
return;
}
MaNGOS::ObjectMessageDistDeliverer post_man(*obj, msg, dist); MaNGOS::ObjectMessageDistDeliverer post_man(*obj, msg, dist);
TypeContainerVisitor<MaNGOS::ObjectMessageDistDeliverer, WorldTypeMapContainer > message(post_man); TypeContainerVisitor<MaNGOS::ObjectMessageDistDeliverer, WorldTypeMapContainer > message(post_man);
@ -515,7 +541,9 @@ void Map::Update(const uint32& t_diff)
Player* plr = m_mapRefIter->getSource(); Player* plr = m_mapRefIter->getSource();
if (!plr->IsInWorld() || !plr->IsPositionValid()) if (!plr->IsInWorld() || !plr->IsPositionValid())
{ continue; } {
continue;
}
// lets update mobs/objects in ALL visible cells around player! // lets update mobs/objects in ALL visible cells around player!
CellArea area = Cell::CalculateCellArea(plr->GetPositionX(), plr->GetPositionY(), GetVisibilityDistance()); CellArea area = Cell::CalculateCellArea(plr->GetPositionX(), plr->GetPositionY(), GetVisibilityDistance());
@ -553,7 +581,9 @@ void Map::Update(const uint32& t_diff)
++m_activeNonPlayersIter; ++m_activeNonPlayersIter;
if (!obj->IsInWorld() || !obj->IsPositionValid()) if (!obj->IsInWorld() || !obj->IsPositionValid())
{ continue; } {
continue;
}
// lets update mobs/objects in ALL visible cells around player! // lets update mobs/objects in ALL visible cells around player!
CellArea area = Cell::CalculateCellArea(obj->GetPositionX(), obj->GetPositionY(), GetVisibilityDistance()); CellArea area = Cell::CalculateCellArea(obj->GetPositionX(), obj->GetPositionY(), GetVisibilityDistance());
@ -598,14 +628,18 @@ void Map::Update(const uint32& t_diff)
///- Process necessary scripts ///- Process necessary scripts
if (!m_scriptSchedule.empty()) if (!m_scriptSchedule.empty())
{ ScriptsProcess(); } {
ScriptsProcess();
}
#ifdef ENABLE_ELUNA #ifdef ENABLE_ELUNA
sEluna->OnUpdate(this, t_diff); sEluna->OnUpdate(this, t_diff);
#endif /* ENABLE_ELUNA */ #endif /* ENABLE_ELUNA */
if (i_data) if (i_data)
{ i_data->Update(t_diff); } {
i_data->Update(t_diff);
}
m_weatherSystem->UpdateWeathers(t_diff); m_weatherSystem->UpdateWeathers(t_diff);
} }
@ -617,10 +651,14 @@ void Map::Remove(Player* player, bool remove)
#endif /* ENABLE_ELUNA */ #endif /* ENABLE_ELUNA */
if (i_data) if (i_data)
{ i_data->OnPlayerLeave(player); } {
i_data->OnPlayerLeave(player);
}
if (remove) if (remove)
{ player->CleanupsBeforeDelete(); } {
player->CleanupsBeforeDelete();
}
else else
{ player->RemoveFromWorld(); } { player->RemoveFromWorld(); }
@ -630,7 +668,9 @@ void Map::Remove(Player* player, bool remove)
// nocheck_prev will return the padding element of the RefManager // nocheck_prev will return the padding element of the RefManager
// instead of NULL in the case of prev // instead of NULL in the case of prev
if (m_mapRefIter == player->GetMapRef()) if (m_mapRefIter == player->GetMapRef())
{ m_mapRefIter = m_mapRefIter->nocheck_prev(); } {
m_mapRefIter = m_mapRefIter->nocheck_prev();
}
player->GetMapRef().unlink(); player->GetMapRef().unlink();
CellPair p = MaNGOS::ComputeCellPair(player->GetPositionX(), player->GetPositionY()); CellPair p = MaNGOS::ComputeCellPair(player->GetPositionX(), player->GetPositionY());
if (p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP) if (p.x_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP || p.y_coord >= TOTAL_NUMBER_OF_CELLS_PER_MAP)
@ -639,7 +679,9 @@ void Map::Remove(Player* player, bool remove)
player->ResetMap(); player->ResetMap();
if (remove) if (remove)
{ DeleteFromWorld(player); } {
DeleteFromWorld(player);
}
return; return;
} }
@ -663,7 +705,9 @@ void Map::Remove(Player* player, bool remove)
player->ResetMap(); player->ResetMap();
if (remove) if (remove)
{ DeleteFromWorld(player); } {
DeleteFromWorld(player);
}
} }
template<class T> template<class T>
@ -679,17 +723,23 @@ Map::Remove(T* obj, bool remove)
Cell cell(p); Cell cell(p);
if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y))) if (!loaded(GridPair(cell.data.Part.grid_x, cell.data.Part.grid_y)))
{ return; } {
return;
}
DEBUG_LOG("Remove object (GUID: %u TypeId:%u) from grid[%u,%u]", obj->GetGUIDLow(), obj->GetTypeId(), cell.data.Part.grid_x, cell.data.Part.grid_y); DEBUG_LOG("Remove object (GUID: %u TypeId:%u) from grid[%u,%u]", obj->GetGUIDLow(), obj->GetTypeId(), cell.data.Part.grid_x, cell.data.Part.grid_y);
NGridType* grid = getNGrid(cell.GridX(), cell.GridY()); NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
MANGOS_ASSERT(grid != NULL); MANGOS_ASSERT(grid != NULL);
if (obj->IsActiveObject()) if (obj->IsActiveObject())
{ RemoveFromActive(obj); } {
RemoveFromActive(obj);
}
if (remove) if (remove)
{ obj->CleanupsBeforeDelete(); } {
obj->CleanupsBeforeDelete();
}
else else
{ obj->RemoveFromWorld(); } { obj->RemoveFromWorld(); }
@ -701,7 +751,9 @@ Map::Remove(T* obj, bool remove)
{ {
// if option set then object already saved at this moment // if option set then object already saved at this moment
if (!sWorld.getConfig(CONFIG_BOOL_SAVE_RESPAWN_TIME_IMMEDIATELY)) if (!sWorld.getConfig(CONFIG_BOOL_SAVE_RESPAWN_TIME_IMMEDIATELY))
{ obj->SaveRespawnTime(); } {
obj->SaveRespawnTime();
}
// Note: In case resurrectable corpse and pet its removed from global lists in own destructor // Note: In case resurrectable corpse and pet its removed from global lists in own destructor
delete obj; delete obj;
@ -728,7 +780,9 @@ void Map::PlayerRelocation(Player* player, float x, float y, float z, float orie
NGridType* oldGrid = getNGrid(old_cell.GridX(), old_cell.GridY()); NGridType* oldGrid = getNGrid(old_cell.GridX(), old_cell.GridY());
RemoveFromGrid(player, oldGrid, old_cell); RemoveFromGrid(player, oldGrid, old_cell);
if (!old_cell.DiffGrid(new_cell)) if (!old_cell.DiffGrid(new_cell))
{ AddToGrid(player, oldGrid, new_cell); } {
AddToGrid(player, oldGrid, new_cell);
}
else else
{ EnsureGridLoadedAtEnter(new_cell, player); } { EnsureGridLoadedAtEnter(new_cell, player); }
@ -828,7 +882,9 @@ bool Map::UnloadGrid(const uint32& x, const uint32& y, bool pForce)
{ {
if (!pForce && ActiveObjectsNearGrid(x, y)) if (!pForce && ActiveObjectsNearGrid(x, y))
{ return false; } {
return false;
}
DEBUG_FILTER_LOG(LOG_FILTER_MAP_LOADING, "Unloading grid[%u,%u] for map %u", x, y, i_id); DEBUG_FILTER_LOG(LOG_FILTER_MAP_LOADING, "Unloading grid[%u,%u] for map %u", x, y, i_id);
ObjectGridUnloader unloader(*grid); ObjectGridUnloader unloader(*grid);
@ -969,7 +1025,9 @@ void Map::SendInitTransports(Player* player)
// no transports at map // no transports at map
if (tmap.find(player->GetMapId()) == tmap.end()) if (tmap.find(player->GetMapId()) == tmap.end())
{ return; } {
return;
}
UpdateData transData(player->GetMapId()); UpdateData transData(player->GetMapId());
@ -1001,7 +1059,9 @@ void Map::SendRemoveTransports(Player* player)
// no transports at map // no transports at map
if (tmap.find(player->GetMapId()) == tmap.end()) if (tmap.find(player->GetMapId()) == tmap.end())
{ return; } {
return;
}
UpdateData transData(player->GetMapId()); UpdateData transData(player->GetMapId());
@ -1010,7 +1070,9 @@ void Map::SendRemoveTransports(Player* player)
// except used transport // except used transport
for (MapManager::TransportSet::const_iterator i = tset.begin(); i != tset.end(); ++i) for (MapManager::TransportSet::const_iterator i = tset.begin(); i != tset.end(); ++i)
if ((*i) != player->GetTransport() && (*i)->GetMapId() != i_id) if ((*i) != player->GetTransport() && (*i)->GetMapId() != i_id)
{ (*i)->BuildOutOfRangeUpdateBlock(&transData); } {
(*i)->BuildOutOfRangeUpdateBlock(&transData);
}
WorldPacket packet; WorldPacket packet;
transData.BuildPacket(&packet); transData.BuildPacket(&packet);
@ -1052,7 +1114,9 @@ void Map::AddObjectToRemoveList(WorldObject* obj)
void Map::RemoveAllObjectsInRemoveList() void Map::RemoveAllObjectsInRemoveList()
{ {
if (i_objectsToRemove.empty()) if (i_objectsToRemove.empty())
{ return; } {
return;
}
// DEBUG_LOG("Object remover 1 check."); // DEBUG_LOG("Object remover 1 check.");
while (!i_objectsToRemove.empty()) while (!i_objectsToRemove.empty())
@ -1067,7 +1131,9 @@ void Map::RemoveAllObjectsInRemoveList()
// ??? WTF // ??? WTF
Corpse* corpse = GetCorpse(obj->GetObjectGuid()); Corpse* corpse = GetCorpse(obj->GetObjectGuid());
if (!corpse) if (!corpse)
{ sLog.outError("Try delete corpse/bones %u that not in map", obj->GetGUIDLow()); } {
sLog.outError("Try delete corpse/bones %u that not in map", obj->GetGUIDLow());
}
else else
{ Remove(corpse, true); } { Remove(corpse, true); }
break; break;
@ -1094,7 +1160,9 @@ uint32 Map::GetPlayersCountExceptGMs() const
uint32 count = 0; uint32 count = 0;
for (MapRefManager::const_iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr) for (MapRefManager::const_iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr)
if (!itr->getSource()->isGameMaster()) if (!itr->getSource()->isGameMaster())
{ ++count; } {
++count;
}
return count; return count;
} }
@ -1175,7 +1243,9 @@ void Map::AddToActive(WorldObject* obj)
c->GetRespawnCoord(x, y, z); c->GetRespawnCoord(x, y, z);
GridPair p = MaNGOS::ComputeGridPair(x, y); GridPair p = MaNGOS::ComputeGridPair(x, y);
if (getNGrid(p.x_coord, p.y_coord)) if (getNGrid(p.x_coord, p.y_coord))
{ getNGrid(p.x_coord, p.y_coord)->incUnloadActiveLock(); } {
getNGrid(p.x_coord, p.y_coord)->incUnloadActiveLock();
}
else else
{ {
GridPair p2 = MaNGOS::ComputeGridPair(c->GetPositionX(), c->GetPositionY()); GridPair p2 = MaNGOS::ComputeGridPair(c->GetPositionX(), c->GetPositionY());
@ -1193,10 +1263,14 @@ void Map::RemoveFromActive(WorldObject* obj)
{ {
ActiveNonPlayers::iterator itr = m_activeNonPlayers.find(obj); ActiveNonPlayers::iterator itr = m_activeNonPlayers.find(obj);
if (itr == m_activeNonPlayersIter) if (itr == m_activeNonPlayersIter)
{ ++m_activeNonPlayersIter; } {
++m_activeNonPlayersIter;
}
if (itr != m_activeNonPlayers.end()) if (itr != m_activeNonPlayers.end())
{ m_activeNonPlayers.erase(itr); } {
m_activeNonPlayers.erase(itr);
}
} }
else else
{ m_activeNonPlayers.erase(obj); } { m_activeNonPlayers.erase(obj); }
@ -1212,7 +1286,9 @@ void Map::RemoveFromActive(WorldObject* obj)
c->GetRespawnCoord(x, y, z); c->GetRespawnCoord(x, y, z);
GridPair p = MaNGOS::ComputeGridPair(x, y); GridPair p = MaNGOS::ComputeGridPair(x, y);
if (getNGrid(p.x_coord, p.y_coord)) if (getNGrid(p.x_coord, p.y_coord))
{ getNGrid(p.x_coord, p.y_coord)->decUnloadActiveLock(); } {
getNGrid(p.x_coord, p.y_coord)->decUnloadActiveLock();
}
else else
{ {
GridPair p2 = MaNGOS::ComputeGridPair(c->GetPositionX(), c->GetPositionY()); GridPair p2 = MaNGOS::ComputeGridPair(c->GetPositionX(), c->GetPositionY());
@ -1431,7 +1507,9 @@ bool DungeonMap::Add(Player* player)
// Is it needed? // Is it needed?
if (!CanEnter(player)) if (!CanEnter(player))
{ return false; } {
return false;
}
// check for existing instance binds // check for existing instance binds
InstancePlayerBind* playerBind = player->GetBoundInstance(GetId(), GetDifficulty()); InstancePlayerBind* playerBind = player->GetBoundInstance(GetId(), GetDifficulty());
@ -1479,7 +1557,9 @@ bool DungeonMap::Add(Player* player)
// bind to the group or keep using the group save // bind to the group or keep using the group save
if (!groupBind) if (!groupBind)
{ pGroup->BindToInstance(GetPersistanceState(), false); } {
pGroup->BindToInstance(GetPersistanceState(), false);
}
else else
{ {
// can not jump to a different instance without resetting it // can not jump to a different instance without resetting it
@ -1495,7 +1575,9 @@ bool DungeonMap::Add(Player* player)
GetPersistanceState()->GetPlayerCount(), GetPersistanceState()->GetGroupCount()); GetPersistanceState()->GetPlayerCount(), GetPersistanceState()->GetGroupCount());
if (groupBind->state) if (groupBind->state)
{ sLog.outError("GroupBind save players: %d, group count: %d", groupBind->state->GetPlayerCount(), groupBind->state->GetGroupCount()); } {
sLog.outError("GroupBind save players: %d, group count: %d", groupBind->state->GetPlayerCount(), groupBind->state->GetGroupCount());
}
else else
{ sLog.outError("GroupBind save NULL"); } { sLog.outError("GroupBind save NULL"); }
MANGOS_ASSERT(false); MANGOS_ASSERT(false);
@ -1516,7 +1598,9 @@ bool DungeonMap::Add(Player* player)
{ {
// set up a solo bind or continue using it // set up a solo bind or continue using it
if (!playerBind) if (!playerBind)
{ player->BindToInstance(GetPersistanceState(), false); } {
player->BindToInstance(GetPersistanceState(), false);
}
else else
// can not jump to a different instance without resetting it // can not jump to a different instance without resetting it
{ MANGOS_ASSERT(playerBind->state == GetPersistentState()); } { MANGOS_ASSERT(playerBind->state == GetPersistentState()); }
@ -1550,7 +1634,9 @@ void DungeonMap::Remove(Player* player, bool remove)
// if last player set unload timer // if last player set unload timer
if (!m_unloadTimer && m_mapRefManager.getSize() == 1) if (!m_unloadTimer && m_mapRefManager.getSize() == 1)
{ m_unloadTimer = m_unloadWhenEmpty ? MIN_UNLOAD_DELAY : std::max(sWorld.getConfig(CONFIG_UINT32_INSTANCE_UNLOAD_DELAY), (uint32)MIN_UNLOAD_DELAY); } {
m_unloadTimer = m_unloadWhenEmpty ? MIN_UNLOAD_DELAY : std::max(sWorld.getConfig(CONFIG_UINT32_INSTANCE_UNLOAD_DELAY), (uint32)MIN_UNLOAD_DELAY);
}
Map::Remove(player, remove); Map::Remove(player, remove);
@ -1620,7 +1706,9 @@ void DungeonMap::PermBindAllPlayers(Player* player)
// if the leader is not in the instance the group will not get a perm bind // if the leader is not in the instance the group will not get a perm bind
if (group && group->GetLeaderGuid() == plr->GetObjectGuid()) if (group && group->GetLeaderGuid() == plr->GetObjectGuid())
{ group->BindToInstance(GetPersistanceState(), true); } {
group->BindToInstance(GetPersistanceState(), true);
}
} }
} }
@ -1629,7 +1717,9 @@ void DungeonMap::UnloadAll(bool pForce)
TeleportAllPlayersTo(TELEPORT_LOCATION_HOMEBIND); TeleportAllPlayersTo(TELEPORT_LOCATION_HOMEBIND);
if (m_resetAfterUnload == true) if (m_resetAfterUnload == true)
{ GetPersistanceState()->DeleteRespawnTimes(); } {
GetPersistanceState()->DeleteRespawnTimes();
}
Map::UnloadAll(pForce); Map::UnloadAll(pForce);
} }
@ -1689,10 +1779,14 @@ void BattleGroundMap::InitVisibilityDistance()
bool BattleGroundMap::CanEnter(Player* player) bool BattleGroundMap::CanEnter(Player* player)
{ {
if (!Map::CanEnter(player)) if (!Map::CanEnter(player))
{ return false; } {
return false;
}
if (player->GetBattleGroundId() != GetInstanceId()) if (player->GetBattleGroundId() != GetInstanceId())
{ return false; } {
return false;
}
// player number limit is checked in bgmgr, no need to do it here // player number limit is checked in bgmgr, no need to do it here
return true; return true;
@ -1701,7 +1795,9 @@ bool BattleGroundMap::CanEnter(Player* player)
bool BattleGroundMap::Add(Player* player) bool BattleGroundMap::Add(Player* player)
{ {
if (!CanEnter(player)) if (!CanEnter(player))
{ return false; } {
return false;
}
// reset instance validity, battleground maps do not homebind // reset instance validity, battleground maps do not homebind
player->m_InstanceValid = true; player->m_InstanceValid = true;
@ -1750,11 +1846,15 @@ bool Map::ScriptsStart(DBScriptType type, uint32 id, Object* source, Object* tar
///- Find the script chain map ///- Find the script chain map
ScriptChainMap const *scm = sScriptMgr.GetScriptChainMap(type); ScriptChainMap const *scm = sScriptMgr.GetScriptChainMap(type);
if (!scm) if (!scm)
{ return false; } {
return false;
}
ScriptChainMap::const_iterator s = scm->find(id); ScriptChainMap::const_iterator s = scm->find(id);
if (s == scm->end()) if (s == scm->end())
{ return false; } {
return false;
}
// prepare static data // prepare static data
ObjectGuid sourceGuid = source->GetObjectGuid(); ObjectGuid sourceGuid = source->GetObjectGuid();
@ -1809,7 +1909,9 @@ void Map::ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* sou
void Map::ScriptsProcess() void Map::ScriptsProcess()
{ {
if (m_scriptSchedule.empty()) if (m_scriptSchedule.empty())
{ return; } {
return;
}
///- Process overdue queued scripts ///- Process overdue queued scripts
ScriptScheduleMap::iterator iter = m_scriptSchedule.begin(); ScriptScheduleMap::iterator iter = m_scriptSchedule.begin();
@ -1942,7 +2044,9 @@ DynamicObject* Map::GetDynamicObject(ObjectGuid guid)
Unit* Map::GetUnit(ObjectGuid guid) Unit* Map::GetUnit(ObjectGuid guid)
{ {
if (guid.IsPlayer()) if (guid.IsPlayer())
{ return GetPlayer(guid); } {
return GetPlayer(guid);
}
return GetAnyTypeCreature(guid); return GetAnyTypeCreature(guid);
} }
@ -2113,7 +2217,9 @@ void Map::PlayDirectSoundToMap(uint32 soundId, uint32 zoneId /*=0*/) const
Map::PlayerList const& pList = GetPlayers(); Map::PlayerList const& pList = GetPlayers();
for (PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) for (PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
if (!zoneId || itr->getSource()->GetZoneId() == zoneId) if (!zoneId || itr->getSource()->GetZoneId() == zoneId)
{ itr->getSource()->SendDirectMessage(&data); } {
itr->getSource()->SendDirectMessage(&data);
}
} }
/** /**

View file

@ -42,7 +42,9 @@ namespace MMAP
MMapManager* MMapFactory::createOrGetMMapManager() MMapManager* MMapFactory::createOrGetMMapManager()
{ {
if (g_MMapManager == NULL) if (g_MMapManager == NULL)
{ g_MMapManager = new MMapManager(); } {
g_MMapManager = new MMapManager();
}
return g_MMapManager; return g_MMapManager;
} }
@ -50,7 +52,9 @@ namespace MMAP
void MMapFactory::preventPathfindingOnMaps(const char* ignoreMapIds) void MMapFactory::preventPathfindingOnMaps(const char* ignoreMapIds)
{ {
if (!g_mmapDisabledIds) if (!g_mmapDisabledIds)
{ g_mmapDisabledIds = new std::set<uint32>(); } {
g_mmapDisabledIds = new std::set<uint32>();
}
uint32 strLenght = strlen(ignoreMapIds) + 1; uint32 strLenght = strlen(ignoreMapIds) + 1;
char* mapList = new char[strLenght]; char* mapList = new char[strLenght];
@ -143,7 +147,9 @@ namespace MMAP
{ {
// we already have this map loaded? // we already have this map loaded?
if (loadedMMaps.find(mapId) != loadedMMaps.end()) if (loadedMMaps.find(mapId) != loadedMMaps.end())
{ return true; } {
return true;
}
// load and init dtNavMesh - read parameters from file // load and init dtNavMesh - read parameters from file
uint32 pathLen = sWorld.GetDataPath().length() + strlen("mmaps/%03i.mmap") + 1; uint32 pathLen = sWorld.GetDataPath().length() + strlen("mmaps/%03i.mmap") + 1;
@ -154,7 +160,9 @@ namespace MMAP
if (!file) if (!file)
{ {
if (MMapFactory::IsPathfindingEnabled(mapId)) if (MMapFactory::IsPathfindingEnabled(mapId))
{ sLog.outError("MMAP:loadMapData: Error: Could not open mmap file '%s'", fileName); } {
sLog.outError("MMAP:loadMapData: Error: Could not open mmap file '%s'", fileName);
}
delete[] fileName; delete[] fileName;
return false; return false;
} }
@ -194,7 +202,9 @@ namespace MMAP
{ {
// make sure the mmap is loaded and ready to load tiles // make sure the mmap is loaded and ready to load tiles
if (!loadMapData(mapId)) if (!loadMapData(mapId))
{ return false; } {
return false;
}
// get this mmap data // get this mmap data
MMapData* mmap = loadedMMaps[mapId]; MMapData* mmap = loadedMMaps[mapId];

View file

@ -117,17 +117,25 @@ bool ScriptMgr::CanSpellEffectStartDBScript(SpellEntry const* spellinfo, SpellEf
{ {
uint8 priority = GetSpellStartDBScriptPriority(spellinfo, effIdx); uint8 priority = GetSpellStartDBScriptPriority(spellinfo, effIdx);
if (!priority) if (!priority)
{ return false; } {
return false;
}
for (int i = 0; i < MAX_EFFECT_INDEX; ++i) for (int i = 0; i < MAX_EFFECT_INDEX; ++i)
{ {
uint8 currentPriority = GetSpellStartDBScriptPriority(spellinfo, SpellEffectIndex(i)); uint8 currentPriority = GetSpellStartDBScriptPriority(spellinfo, SpellEffectIndex(i));
if (currentPriority < priority) // lower priority, continue checking if (currentPriority < priority) // lower priority, continue checking
{ continue; } {
continue;
}
if (currentPriority > priority) // take other index with higher priority if (currentPriority > priority) // take other index with higher priority
{ return false; } {
return false;
}
if (i < effIdx) // same priority at lower index if (i < effIdx) // same priority at lower index
{ return false; } {
return false;
}
} }
return true; return true;
@ -136,7 +144,9 @@ bool ScriptMgr::CanSpellEffectStartDBScript(SpellEntry const* spellinfo, SpellEf
void ScriptMgr::LoadScripts(DBScriptType type) void ScriptMgr::LoadScripts(DBScriptType type)
{ {
if (IsScriptScheduled()) // function don't must be called in time scripts use. if (IsScriptScheduled()) // function don't must be called in time scripts use.
{ return; } {
return;
}
m_dbScripts[type].clear(); // need for reload support m_dbScripts[type].clear(); // need for reload support
@ -486,7 +496,9 @@ void ScriptMgr::LoadScripts(DBScriptType type)
} }
} }
if (hasErrored) if (hasErrored)
{ continue; } {
continue;
}
break; break;
} }
case SCRIPT_COMMAND_PLAY_SOUND: // 16 case SCRIPT_COMMAND_PLAY_SOUND: // 16
@ -499,9 +511,13 @@ void ScriptMgr::LoadScripts(DBScriptType type)
} }
// bitmask: 0/1=target-player, 0/2=with distance dependent, 0/4=map wide, 0/8=zone wide // bitmask: 0/1=target-player, 0/2=with distance dependent, 0/4=map wide, 0/8=zone wide
if (tmp.playSound.flags & ~(1 | 2 | 4 | 8)) if (tmp.playSound.flags & ~(1 | 2 | 4 | 8))
{ sLog.outErrorDb("Table `db_scripts [type = %d]` using unsupported sound flags (datalong2: %u) in SCRIPT_COMMAND_PLAY_SOUND for script id %u, unsupported flags will be ignored", type, tmp.playSound.flags, tmp.id); } {
sLog.outErrorDb("Table `db_scripts [type = %d]` using unsupported sound flags (datalong2: %u) in SCRIPT_COMMAND_PLAY_SOUND for script id %u, unsupported flags will be ignored", type, tmp.playSound.flags, tmp.id);
}
if ((tmp.playSound.flags & (1 | 2)) > 0 && (tmp.playSound.flags & (4 | 8)) > 0) if ((tmp.playSound.flags & (1 | 2)) > 0 && (tmp.playSound.flags & (4 | 8)) > 0)
{ sLog.outErrorDb("Table `db_scripts [type = %d]` uses sound flags (datalong2: %u) in SCRIPT_COMMAND_PLAY_SOUND for script id %u, combining (1|2) with (4|8) makes no sense", type, tmp.playSound.flags, tmp.id); } {
sLog.outErrorDb("Table `db_scripts [type = %d]` uses sound flags (datalong2: %u) in SCRIPT_COMMAND_PLAY_SOUND for script id %u, combining (1|2) with (4|8) makes no sense", type, tmp.playSound.flags, tmp.id);
}
break; break;
} }
case SCRIPT_COMMAND_CREATE_ITEM: // 17 case SCRIPT_COMMAND_CREATE_ITEM: // 17
@ -874,7 +890,9 @@ void ScriptMgr::LoadDbScriptStrings()
for (int32 i = MIN_DB_SCRIPT_STRING_ID; i < MAX_DB_SCRIPT_STRING_ID; ++i) for (int32 i = MIN_DB_SCRIPT_STRING_ID; i < MAX_DB_SCRIPT_STRING_ID; ++i)
if (sObjectMgr.GetMangosStringLocale(i)) if (sObjectMgr.GetMangosStringLocale(i))
{ ids.insert(i); } {
ids.insert(i);
}
CheckScriptTexts(ids); CheckScriptTexts(ids);
sWaypointMgr.CheckTextsExistance(ids); sWaypointMgr.CheckTextsExistance(ids);
@ -918,7 +936,9 @@ bool ScriptAction::GetScriptCommandObject(const ObjectGuid guid, bool includeIte
resultObject = NULL; resultObject = NULL;
if (!guid) if (!guid)
{ return true; } {
return true;
}
switch (guid.GetHigh()) switch (guid.GetHigh())
{ {
@ -944,7 +964,9 @@ bool ScriptAction::GetScriptCommandObject(const ObjectGuid guid, bool includeIte
if (includeItem) if (includeItem)
{ {
if (Player* player = m_map->GetPlayer(m_ownerGuid)) if (Player* player = m_map->GetPlayer(m_ownerGuid))
{ resultObject = player->GetItemByGuid(guid); } {
resultObject = player->GetItemByGuid(guid);
}
break; break;
} }
// else no break, but display error message // else no break, but display error message
@ -955,7 +977,9 @@ bool ScriptAction::GetScriptCommandObject(const ObjectGuid guid, bool includeIte
} }
if (resultObject && !resultObject->IsInWorld()) if (resultObject && !resultObject->IsInWorld())
{ resultObject = NULL; } {
resultObject = NULL;
}
return true; return true;
} }
@ -1013,7 +1037,9 @@ bool ScriptAction::GetScriptProcessTargets(WorldObject* pOrigSource, WorldObject
// Prefer non-players as searcher // Prefer non-players as searcher
WorldObject* pSearcher = pOrigSource ? pOrigSource : pOrigTarget; WorldObject* pSearcher = pOrigSource ? pOrigSource : pOrigTarget;
if (pSearcher->GetTypeId() == TYPEID_PLAYER && pOrigTarget && pOrigTarget->GetTypeId() != TYPEID_PLAYER) if (pSearcher->GetTypeId() == TYPEID_PLAYER && pOrigTarget && pOrigTarget->GetTypeId() != TYPEID_PLAYER)
{ pSearcher = pOrigTarget; } {
pSearcher = pOrigTarget;
}
if (m_script->IsCreatureBuddy()) if (m_script->IsCreatureBuddy())
{ {
@ -1076,10 +1102,14 @@ bool ScriptAction::GetScriptProcessTargets(WorldObject* pOrigSource, WorldObject
} }
if (m_script->data_flags & SCRIPT_FLAG_REVERSE_DIRECTION) if (m_script->data_flags & SCRIPT_FLAG_REVERSE_DIRECTION)
{ std::swap(pFinalSource, pFinalTarget); } {
std::swap(pFinalSource, pFinalTarget);
}
if (m_script->data_flags & SCRIPT_FLAG_SOURCE_TARGETS_SELF) if (m_script->data_flags & SCRIPT_FLAG_SOURCE_TARGETS_SELF)
{ pFinalTarget = pFinalSource; } {
pFinalTarget = pFinalSource;
}
return true; return true;
} }
@ -1147,9 +1177,13 @@ bool ScriptAction::HandleScriptStep()
Object* source = NULL; Object* source = NULL;
Object* target = NULL; Object* target = NULL;
if (!GetScriptCommandObject(m_sourceGuid, true, source)) if (!GetScriptCommandObject(m_sourceGuid, true, source))
{ return false; } {
return false;
}
if (!GetScriptCommandObject(m_targetGuid, false, target)) if (!GetScriptCommandObject(m_targetGuid, false, target))
{ return false; } {
return false;
}
// Give some debug log output for easier use // Give some debug log output for easier use
DEBUG_LOG("DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, command %u for source %s (%sin world), target %s (%sin world)", m_type, m_script->id, m_script->command, m_sourceGuid.GetString().c_str(), source ? "" : "not ", m_targetGuid.GetString().c_str(), target ? "" : "not "); DEBUG_LOG("DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, command %u for source %s (%sin world), target %s (%sin world)", m_type, m_script->id, m_script->command, m_sourceGuid.GetString().c_str(), source ? "" : "not ", m_targetGuid.GetString().c_str(), target ? "" : "not ");
@ -1158,7 +1192,9 @@ bool ScriptAction::HandleScriptStep()
pSource = source && source->isType(TYPEMASK_WORLDOBJECT) ? (WorldObject*)source : NULL; pSource = source && source->isType(TYPEMASK_WORLDOBJECT) ? (WorldObject*)source : NULL;
pTarget = target && target->isType(TYPEMASK_WORLDOBJECT) ? (WorldObject*)target : NULL; pTarget = target && target->isType(TYPEMASK_WORLDOBJECT) ? (WorldObject*)target : NULL;
if (!GetScriptProcessTargets(pSource, pTarget, pSource, pTarget)) if (!GetScriptProcessTargets(pSource, pTarget, pSource, pTarget))
{ return false; } {
return false;
}
pSourceOrItem = pSource ? pSource : (source && source->isType(TYPEMASK_ITEM) ? source : NULL); pSourceOrItem = pSource ? pSource : (source && source->isType(TYPEMASK_ITEM) ? source : NULL);
} }
@ -1183,7 +1219,9 @@ bool ScriptAction::HandleScriptStep()
for (; i < MAX_TEXT_ID; ++i) for (; i < MAX_TEXT_ID; ++i)
{ {
if (!m_script->textId[i]) if (!m_script->textId[i])
{ break; } {
break;
}
} }
// Use one random // Use one random
@ -1191,20 +1229,26 @@ bool ScriptAction::HandleScriptStep()
} }
if (!DoDisplayText(pSource, textId, unitTarget)) if (!DoDisplayText(pSource, textId, unitTarget))
{ sLog.outErrorDb(" DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, could not display text %i properly", m_type, m_script->id, textId); } {
sLog.outErrorDb(" DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, could not display text %i properly", m_type, m_script->id, textId);
}
break; break;
} }
case SCRIPT_COMMAND_EMOTE: // 1 case SCRIPT_COMMAND_EMOTE: // 1
{ {
if (LogIfNotUnit(pSource)) if (LogIfNotUnit(pSource))
{ break; } {
break;
}
std::vector<uint32> emotes; std::vector<uint32> emotes;
emotes.push_back(m_script->emote.emoteId); emotes.push_back(m_script->emote.emoteId);
for (int i = 0; i < MAX_TEXT_ID; ++i) for (int i = 0; i < MAX_TEXT_ID; ++i)
{ {
if (!m_script->textId[i]) if (!m_script->textId[i])
{ break; } {
break;
}
emotes.push_back(uint32(m_script->textId[i])); emotes.push_back(uint32(m_script->textId[i]));
} }
@ -1228,7 +1272,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_MOVE_TO: // 3 case SCRIPT_COMMAND_MOVE_TO: // 3
{ {
if (LogIfNotUnit(pSource)) if (LogIfNotUnit(pSource))
{ break; } {
break;
}
// Just turn around // Just turn around
if ((m_script->x == 0.0f && m_script->y == 0.0f && m_script->z == 0.0f) || if ((m_script->x == 0.0f && m_script->y == 0.0f && m_script->z == 0.0f) ||
@ -1248,7 +1294,9 @@ bool ScriptAction::HandleScriptStep()
// Normal Movement // Normal Movement
if (m_script->moveTo.travelSpeed) if (m_script->moveTo.travelSpeed)
{ ((Unit*)pSource)->MonsterMoveWithSpeed(m_script->x, m_script->y, m_script->z, m_script->moveTo.travelSpeed * 0.01f); } {
((Unit*)pSource)->MonsterMoveWithSpeed(m_script->x, m_script->y, m_script->z, m_script->moveTo.travelSpeed * 0.01f);
}
else else
{ {
((Unit*)pSource)->GetMotionMaster()->Clear(); ((Unit*)pSource)->GetMotionMaster()->Clear();
@ -1288,7 +1336,9 @@ bool ScriptAction::HandleScriptStep()
{ {
Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget); Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget);
if (!pPlayer) if (!pPlayer)
{ break; } {
break;
}
pPlayer->TeleportTo(m_script->teleportTo.mapId, m_script->x, m_script->y, m_script->z, m_script->o); pPlayer->TeleportTo(m_script->teleportTo.mapId, m_script->x, m_script->y, m_script->z, m_script->o);
break; break;
@ -1297,11 +1347,15 @@ bool ScriptAction::HandleScriptStep()
{ {
Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget); Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget);
if (!pPlayer) if (!pPlayer)
{ break; } {
break;
}
WorldObject* pWorldObject = NULL; WorldObject* pWorldObject = NULL;
if (pSource && pSource->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT)) if (pSource && pSource->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT))
{ pWorldObject = pSource; } {
pWorldObject = pSource;
}
else if (pTarget && pTarget->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT)) else if (pTarget && pTarget->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT))
{ pWorldObject = pTarget; } { pWorldObject = pTarget; }
@ -1315,13 +1369,17 @@ bool ScriptAction::HandleScriptStep()
bool failQuest = false; bool failQuest = false;
// Creature must be alive for giving credit // Creature must be alive for giving credit
if (pWorldObject && pWorldObject->GetTypeId() == TYPEID_UNIT && !((Creature*)pWorldObject)->IsAlive()) if (pWorldObject && pWorldObject->GetTypeId() == TYPEID_UNIT && !((Creature*)pWorldObject)->IsAlive())
{ failQuest = true; } {
failQuest = true;
}
else if (m_script->questExplored.distance != 0 && !pWorldObject->IsWithinDistInMap(pPlayer, float(m_script->questExplored.distance))) else if (m_script->questExplored.distance != 0 && !pWorldObject->IsWithinDistInMap(pPlayer, float(m_script->questExplored.distance)))
{ failQuest = true; } { failQuest = true; }
// quest id and flags checked at script loading // quest id and flags checked at script loading
if (!failQuest) if (!failQuest)
{ pPlayer->AreaExploredOrEventHappens(m_script->questExplored.questId); } {
pPlayer->AreaExploredOrEventHappens(m_script->questExplored.questId);
}
else else
{ pPlayer->FailQuest(m_script->questExplored.questId); } { pPlayer->FailQuest(m_script->questExplored.questId); }
@ -1331,7 +1389,9 @@ bool ScriptAction::HandleScriptStep()
{ {
Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget); Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget);
if (!pPlayer) if (!pPlayer)
{ break; } {
break;
}
uint32 creatureEntry = m_script->killCredit.creatureEntry; uint32 creatureEntry = m_script->killCredit.creatureEntry;
WorldObject* pRewardSource = pSource && pSource->GetTypeId() == TYPEID_UNIT ? pSource : (pTarget && pTarget->GetTypeId() == TYPEID_UNIT ? pTarget : NULL); WorldObject* pRewardSource = pSource && pSource->GetTypeId() == TYPEID_UNIT ? pSource : (pTarget && pTarget->GetTypeId() == TYPEID_UNIT ? pTarget : NULL);
@ -1340,7 +1400,9 @@ bool ScriptAction::HandleScriptStep()
if (!creatureEntry) if (!creatureEntry)
{ {
if (pRewardSource) if (pRewardSource)
{ creatureEntry = pRewardSource->GetEntry(); } {
creatureEntry = pRewardSource->GetEntry();
}
else else
{ {
sLog.outErrorDb(" DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, command %u called for dynamic killcredit without creature partner, skipping.", m_type, m_script->id, m_script->command); sLog.outErrorDb(" DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, command %u called for dynamic killcredit without creature partner, skipping.", m_type, m_script->id, m_script->command);
@ -1352,7 +1414,9 @@ bool ScriptAction::HandleScriptStep()
{ {
WorldObject* pSearcher = pRewardSource ? pRewardSource : (pSource ? pSource : pTarget); WorldObject* pSearcher = pRewardSource ? pRewardSource : (pSource ? pSource : pTarget);
if (pSearcher != pRewardSource) if (pSearcher != pRewardSource)
{ sLog.outDebug(" DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, SCRIPT_COMMAND_KILL_CREDIT called for groupCredit without creature as searcher, script might need adjustment.", m_type, m_script->id); } {
sLog.outDebug(" DB-SCRIPTS: Process table `db_scripts [type = %d]` id %u, SCRIPT_COMMAND_KILL_CREDIT called for groupCredit without creature as searcher, script might need adjustment.", m_type, m_script->id);
}
pPlayer->RewardPlayerAndGroupAtEvent(creatureEntry, pSearcher); pPlayer->RewardPlayerAndGroupAtEvent(creatureEntry, pSearcher);
} }
else else
@ -1377,7 +1441,9 @@ bool ScriptAction::HandleScriptStep()
else else
{ {
if (LogIfNotGameObject(pSource)) if (LogIfNotGameObject(pSource))
{ break; } {
break;
}
pGo = (GameObject*)pSource; pGo = (GameObject*)pSource;
} }
@ -1435,7 +1501,9 @@ bool ScriptAction::HandleScriptStep()
{ {
GameObjectData const* goData = sObjectMgr.GetGOData(m_script->changeDoor.goGuid); GameObjectData const* goData = sObjectMgr.GetGOData(m_script->changeDoor.goGuid);
if (!goData) // checked at load if (!goData) // checked at load
{ break; } {
break;
}
// TODO - Was a change, before random map // TODO - Was a change, before random map
pDoor = m_map->GetGameObject(ObjectGuid(HIGHGUID_GAMEOBJECT, goData->id, m_script->changeDoor.goGuid)); pDoor = m_map->GetGameObject(ObjectGuid(HIGHGUID_GAMEOBJECT, goData->id, m_script->changeDoor.goGuid));
@ -1443,7 +1511,9 @@ bool ScriptAction::HandleScriptStep()
else else
{ {
if (LogIfNotGameObject(pSource)) if (LogIfNotGameObject(pSource))
{ break; } {
break;
}
pDoor = (GameObject*)pSource; pDoor = (GameObject*)pSource;
} }
@ -1467,16 +1537,22 @@ bool ScriptAction::HandleScriptStep()
pDoor->UseDoorOrButton(time_to_reset); pDoor->UseDoorOrButton(time_to_reset);
if (pTarget && pTarget->isType(TYPEMASK_GAMEOBJECT) && ((GameObject*)pTarget)->GetGoType() == GAMEOBJECT_TYPE_BUTTON) if (pTarget && pTarget->isType(TYPEMASK_GAMEOBJECT) && ((GameObject*)pTarget)->GetGoType() == GAMEOBJECT_TYPE_BUTTON)
{ ((GameObject*)pTarget)->UseDoorOrButton(time_to_reset); } {
((GameObject*)pTarget)->UseDoorOrButton(time_to_reset);
}
break; break;
} }
case SCRIPT_COMMAND_ACTIVATE_OBJECT: // 13 case SCRIPT_COMMAND_ACTIVATE_OBJECT: // 13
{ {
if (LogIfNotUnit(pSource)) if (LogIfNotUnit(pSource))
{ break; } {
break;
}
if (LogIfNotGameObject(pTarget)) if (LogIfNotGameObject(pTarget))
{ break; } {
break;
}
((GameObject*)pTarget)->Use((Unit*)pSource); ((GameObject*)pTarget)->Use((Unit*)pSource);
break; break;
@ -1484,7 +1560,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_REMOVE_AURA: // 14 case SCRIPT_COMMAND_REMOVE_AURA: // 14
{ {
if (LogIfNotUnit(pSource)) if (LogIfNotUnit(pSource))
{ break; } {
break;
}
((Unit*)pSource)->RemoveAurasDueToSpell(m_script->removeAura.spellId); ((Unit*)pSource)->RemoveAurasDueToSpell(m_script->removeAura.spellId);
break; break;
@ -1492,7 +1570,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_CAST_SPELL: // 15 case SCRIPT_COMMAND_CAST_SPELL: // 15
{ {
if (LogIfNotUnit(pTarget)) // TODO - Change when support for casting without victim will be supported if (LogIfNotUnit(pTarget)) // TODO - Change when support for casting without victim will be supported
{ break; } {
break;
}
// Select Spell // Select Spell
uint32 spell = m_script->castSpell.spellId; uint32 spell = m_script->castSpell.spellId;
@ -1511,7 +1591,9 @@ bool ScriptAction::HandleScriptStep()
} }
if (LogIfNotUnit(pSource)) if (LogIfNotUnit(pSource))
{ break; } {
break;
}
((Unit*)pSource)->CastSpell(((Unit*)pTarget), spell, (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL) != 0); ((Unit*)pSource)->CastSpell(((Unit*)pTarget), spell, (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL) != 0);
break; break;
@ -1530,7 +1612,9 @@ bool ScriptAction::HandleScriptStep()
{ {
pSoundTarget = GetPlayerTargetOrSourceAndLog(pSource, pTarget); pSoundTarget = GetPlayerTargetOrSourceAndLog(pSource, pTarget);
if (!pSoundTarget) if (!pSoundTarget)
{ break; } {
break;
}
} }
if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL) if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)
@ -1538,7 +1622,9 @@ bool ScriptAction::HandleScriptStep()
else else
{ {
if (m_script->playSound.flags & 2) if (m_script->playSound.flags & 2)
{ pSource->PlayDistanceSound(m_script->playSound.soundId, pSoundTarget); } {
pSource->PlayDistanceSound(m_script->playSound.soundId, pSoundTarget);
}
else if (m_script->playSound.flags & (4 | 8)) else if (m_script->playSound.flags & (4 | 8))
{ m_map->PlayDirectSoundToMap(m_script->playSound.soundId, (m_script->playSound.flags & 8) ? pSource->GetZoneId() : 0); } { m_map->PlayDirectSoundToMap(m_script->playSound.soundId, (m_script->playSound.flags & 8) ? pSource->GetZoneId() : 0); }
else else
@ -1550,10 +1636,14 @@ bool ScriptAction::HandleScriptStep()
{ {
Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget); Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget);
if (!pPlayer) if (!pPlayer)
{ break; } {
break;
}
if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(m_script->createItem.itemEntry, m_script->createItem.amount)) if (Item* pItem = pPlayer->StoreNewItemInInventorySlot(m_script->createItem.itemEntry, m_script->createItem.amount))
{ pPlayer->SendNewItem(pItem, m_script->createItem.amount, true, false); } {
pPlayer->SendNewItem(pItem, m_script->createItem.amount, true, false);
}
break; break;
} }
@ -1567,7 +1657,9 @@ bool ScriptAction::HandleScriptStep()
} }
if (LogIfNotCreature(pTarget)) if (LogIfNotCreature(pTarget))
{ break; } {
break;
}
((Creature*)pTarget)->ForcedDespawn(m_script->despawn.despawnDelay); ((Creature*)pTarget)->ForcedDespawn(m_script->despawn.despawnDelay);
@ -1586,7 +1678,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_MOVEMENT: // 20 case SCRIPT_COMMAND_MOVEMENT: // 20
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
// Consider add additional checks for cases where creature should not change movementType // Consider add additional checks for cases where creature should not change movementType
// (pet? in combat? already using same MMgen as script try to apply?) // (pet? in combat? already using same MMgen as script try to apply?)
@ -1598,7 +1692,9 @@ bool ScriptAction::HandleScriptStep()
break; break;
case RANDOM_MOTION_TYPE: case RANDOM_MOTION_TYPE:
if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL) if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)
{ ((Creature*)pSource)->GetMotionMaster()->MoveRandomAroundPoint(pSource->GetPositionX(), pSource->GetPositionY(), pSource->GetPositionZ(), float(m_script->movement.wanderDistance)); } {
((Creature*)pSource)->GetMotionMaster()->MoveRandomAroundPoint(pSource->GetPositionX(), pSource->GetPositionY(), pSource->GetPositionZ(), float(m_script->movement.wanderDistance));
}
else else
{ {
float respX, respY, respZ, respO, wander_distance; float respX, respY, respZ, respO, wander_distance;
@ -1617,7 +1713,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_SET_ACTIVEOBJECT: // 21 case SCRIPT_COMMAND_SET_ACTIVEOBJECT: // 21
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
((Creature*)pSource)->SetActiveObjectState(m_script->activeObject.activate); ((Creature*)pSource)->SetActiveObjectState(m_script->activeObject.activate);
break; break;
@ -1625,10 +1723,14 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_SET_FACTION: // 22 case SCRIPT_COMMAND_SET_FACTION: // 22
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
if (m_script->faction.factionId) if (m_script->faction.factionId)
{ ((Creature*)pSource)->SetFactionTemporary(m_script->faction.factionId, m_script->faction.flags); } {
((Creature*)pSource)->SetFactionTemporary(m_script->faction.factionId, m_script->faction.flags);
}
else else
{ ((Creature*)pSource)->ClearTemporaryFaction(); } { ((Creature*)pSource)->ClearTemporaryFaction(); }
@ -1637,10 +1739,14 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_MORPH_TO_ENTRY_OR_MODEL: // 23 case SCRIPT_COMMAND_MORPH_TO_ENTRY_OR_MODEL: // 23
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
if (!m_script->morph.creatureOrModelEntry) if (!m_script->morph.creatureOrModelEntry)
{ ((Creature*)pSource)->DeMorph(); } {
((Creature*)pSource)->DeMorph();
}
else if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL) else if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)
{ ((Creature*)pSource)->SetDisplayId(m_script->morph.creatureOrModelEntry); } { ((Creature*)pSource)->SetDisplayId(m_script->morph.creatureOrModelEntry); }
else else
@ -1656,10 +1762,14 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_MOUNT_TO_ENTRY_OR_MODEL: // 24 case SCRIPT_COMMAND_MOUNT_TO_ENTRY_OR_MODEL: // 24
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
if (!m_script->mount.creatureOrModelEntry) if (!m_script->mount.creatureOrModelEntry)
{ ((Creature*)pSource)->Unmount(); } {
((Creature*)pSource)->Unmount();
}
else if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL) else if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)
{ ((Creature*)pSource)->Mount(m_script->mount.creatureOrModelEntry); } { ((Creature*)pSource)->Mount(m_script->mount.creatureOrModelEntry); }
else else
@ -1675,7 +1785,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_SET_RUN: // 25 case SCRIPT_COMMAND_SET_RUN: // 25
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
((Creature*)pSource)->SetWalk(!m_script->run.run, true); ((Creature*)pSource)->SetWalk(!m_script->run.run, true);
@ -1684,9 +1796,13 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_ATTACK_START: // 26 case SCRIPT_COMMAND_ATTACK_START: // 26
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
if (LogIfNotUnit(pTarget)) if (LogIfNotUnit(pTarget))
{ break; } {
break;
}
Creature* pAttacker = static_cast<Creature*>(pSource); Creature* pAttacker = static_cast<Creature*>(pSource);
Unit* unitTarget = static_cast<Unit*>(pTarget); Unit* unitTarget = static_cast<Unit*>(pTarget);
@ -1704,7 +1820,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_GO_LOCK_STATE: // 27 case SCRIPT_COMMAND_GO_LOCK_STATE: // 27
{ {
if (LogIfNotGameObject(pSource)) if (LogIfNotGameObject(pSource))
{ break; } {
break;
}
GameObject* pGo = static_cast<GameObject*>(pSource); GameObject* pGo = static_cast<GameObject*>(pSource);
@ -1717,12 +1835,16 @@ bool ScriptAction::HandleScriptStep()
// Lock or Unlock // Lock or Unlock
if (m_script->goLockState.lockState & 0x01) if (m_script->goLockState.lockState & 0x01)
{ pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } {
pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
}
else if (m_script->goLockState.lockState & 0x02) else if (m_script->goLockState.lockState & 0x02)
{ pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); } { pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED); }
// Set Non Interactable or Set Interactable // Set Non Interactable or Set Interactable
if (m_script->goLockState.lockState & 0x04) if (m_script->goLockState.lockState & 0x04)
{ pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); } {
pGo->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT);
}
else if (m_script->goLockState.lockState & 0x08) else if (m_script->goLockState.lockState & 0x08)
{ pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); } { pGo->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NO_INTERACT); }
@ -1731,7 +1853,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_STAND_STATE: // 28 case SCRIPT_COMMAND_STAND_STATE: // 28
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
// Must be safe cast to Unit* here // Must be safe cast to Unit* here
((Unit*)pSource)->SetStandState(m_script->standState.stand_state); ((Unit*)pSource)->SetStandState(m_script->standState.stand_state);
@ -1740,11 +1864,15 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_MODIFY_NPC_FLAGS: // 29 case SCRIPT_COMMAND_MODIFY_NPC_FLAGS: // 29
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
// Add Flags // Add Flags
if (m_script->npcFlag.change_flag & 0x01) if (m_script->npcFlag.change_flag & 0x01)
{ pSource->SetFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag); } {
pSource->SetFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag);
}
// Remove Flags // Remove Flags
else if (m_script->npcFlag.change_flag & 0x02) else if (m_script->npcFlag.change_flag & 0x02)
{ pSource->RemoveFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag); } { pSource->RemoveFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag); }
@ -1752,7 +1880,9 @@ bool ScriptAction::HandleScriptStep()
else else
{ {
if (pSource->HasFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag)) if (pSource->HasFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag))
{ pSource->RemoveFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag); } {
pSource->RemoveFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag);
}
else else
{ pSource->SetFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag); } { pSource->SetFlag(UNIT_NPC_FLAGS, m_script->npcFlag.flag); }
} }
@ -1764,7 +1894,9 @@ bool ScriptAction::HandleScriptStep()
// only Player // only Player
Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget); Player* pPlayer = GetPlayerTargetOrSourceAndLog(pSource, pTarget);
if (!pPlayer) if (!pPlayer)
{ break; } {
break;
}
pPlayer->ActivateTaxiPathTo(m_script->sendTaxiPath.taxiPathId); pPlayer->ActivateTaxiPathTo(m_script->sendTaxiPath.taxiPathId);
break; break;
@ -1776,7 +1908,9 @@ bool ScriptAction::HandleScriptStep()
{ {
WorldObject* pSearcher = pSource ? pSource : pTarget; WorldObject* pSearcher = pSource ? pSource : pTarget;
if (pSearcher->GetTypeId() == TYPEID_PLAYER && pTarget && pTarget->GetTypeId() != TYPEID_PLAYER) if (pSearcher->GetTypeId() == TYPEID_PLAYER && pTarget && pTarget->GetTypeId() != TYPEID_PLAYER)
{ pSearcher = pTarget; } {
pSearcher = pTarget;
}
Creature* pCreatureBuddy = NULL; Creature* pCreatureBuddy = NULL;
MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*pSearcher, m_script->terminateScript.npcEntry, true, false, m_script->terminateScript.searchDist, true); MaNGOS::NearestCreatureEntryWithLiveStateInObjectRangeCheck u_check(*pSearcher, m_script->terminateScript.npcEntry, true, false, m_script->terminateScript.searchDist, true);
@ -1803,7 +1937,9 @@ bool ScriptAction::HandleScriptStep()
{ {
Creature* cSource = static_cast<Creature*>(pSource); Creature* cSource = static_cast<Creature*>(pSource);
if (cSource->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) if (cSource->GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE)
{ (static_cast<WaypointMovementGenerator<Creature>* >(cSource->GetMotionMaster()->top()))->AddToWaypointPauseTime(m_script->textId[0]); } {
(static_cast<WaypointMovementGenerator<Creature>* >(cSource->GetMotionMaster()->top()))->AddToWaypointPauseTime(m_script->textId[0]);
}
} }
return true; return true;
@ -1814,9 +1950,13 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_PAUSE_WAYPOINTS: // 32 case SCRIPT_COMMAND_PAUSE_WAYPOINTS: // 32
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ return false; } {
return false;
}
if (m_script->pauseWaypoint.doPause) if (m_script->pauseWaypoint.doPause)
{ ((Creature*)pSource)->addUnitState(UNIT_STAT_WAYPOINT_PAUSED); } {
((Creature*)pSource)->addUnitState(UNIT_STAT_WAYPOINT_PAUSED);
}
else else
{ ((Creature*)pSource)->clearUnitState(UNIT_STAT_WAYPOINT_PAUSED); } { ((Creature*)pSource)->clearUnitState(UNIT_STAT_WAYPOINT_PAUSED); }
break; break;
@ -1839,7 +1979,9 @@ bool ScriptAction::HandleScriptStep()
WorldObject* second = pSource; WorldObject* second = pSource;
// First case: target is player // First case: target is player
if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER) if (pTarget && pTarget->GetTypeId() == TYPEID_PLAYER)
{ player = static_cast<Player*>(pTarget); } {
player = static_cast<Player*>(pTarget);
}
// Second case: source is player // Second case: source is player
else if (pSource && pSource->GetTypeId() == TYPEID_PLAYER) else if (pSource && pSource->GetTypeId() == TYPEID_PLAYER)
{ {
@ -1849,7 +1991,9 @@ bool ScriptAction::HandleScriptStep()
bool terminateResult; bool terminateResult;
if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL) if (m_script->data_flags & SCRIPT_FLAG_COMMAND_ADDITIONAL)
{ terminateResult = !sObjectMgr.IsPlayerMeetToCondition(m_script->terminateCond.conditionId, player, m_map, second, CONDITION_FROM_DBSCRIPTS); } {
terminateResult = !sObjectMgr.IsPlayerMeetToCondition(m_script->terminateCond.conditionId, player, m_map, second, CONDITION_FROM_DBSCRIPTS);
}
else else
{ terminateResult = sObjectMgr.IsPlayerMeetToCondition(m_script->terminateCond.conditionId, player, m_map, second, CONDITION_FROM_DBSCRIPTS); } { terminateResult = sObjectMgr.IsPlayerMeetToCondition(m_script->terminateCond.conditionId, player, m_map, second, CONDITION_FROM_DBSCRIPTS); }
@ -1861,13 +2005,17 @@ bool ScriptAction::HandleScriptStep()
{ {
Player* member = groupRef->getSource(); Player* member = groupRef->getSource();
if (member->GetQuestStatus(m_script->terminateCond.failQuest) == QUEST_STATUS_INCOMPLETE) if (member->GetQuestStatus(m_script->terminateCond.failQuest) == QUEST_STATUS_INCOMPLETE)
{ member->FailQuest(m_script->terminateCond.failQuest); } {
member->FailQuest(m_script->terminateCond.failQuest);
}
} }
} }
else else
{ {
if (player->GetQuestStatus(m_script->terminateCond.failQuest) == QUEST_STATUS_INCOMPLETE) if (player->GetQuestStatus(m_script->terminateCond.failQuest) == QUEST_STATUS_INCOMPLETE)
{ player->FailQuest(m_script->terminateCond.failQuest); } {
player->FailQuest(m_script->terminateCond.failQuest);
}
} }
} }
return terminateResult; return terminateResult;
@ -1890,7 +2038,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_TURN_TO: // 36 case SCRIPT_COMMAND_TURN_TO: // 36
{ {
if (LogIfNotUnit(pSource)) if (LogIfNotUnit(pSource))
{ break; } {
break;
}
((Unit*)pSource)->SetFacingTo(pSource->GetAngle(pTarget)); ((Unit*)pSource)->SetFacingTo(pSource->GetAngle(pTarget));
break; break;
@ -2039,7 +2189,9 @@ bool ScriptAction::HandleScriptStep()
case SCRIPT_COMMAND_CHANGE_ENTRY: // 45 case SCRIPT_COMMAND_CHANGE_ENTRY: // 45
{ {
if (LogIfNotCreature(pSource)) if (LogIfNotCreature(pSource))
{ break; } {
break;
}
((Creature*)pSource)->UpdateEntry(m_script->changeEntry.creatureEntry); ((Creature*)pSource)->UpdateEntry(m_script->changeEntry.creatureEntry);
break; break;
@ -2224,13 +2376,17 @@ uint32 ScriptMgr::GetScriptId(const char* name) const
// use binary search to find the script name in the sorted vector // use binary search to find the script name in the sorted vector
// assume "" is the first element // assume "" is the first element
if (!name) if (!name)
{ return 0; } {
return 0;
}
ScriptNameMap::const_iterator itr = ScriptNameMap::const_iterator itr =
std::lower_bound(m_scriptNames.begin(), m_scriptNames.end(), name); std::lower_bound(m_scriptNames.begin(), m_scriptNames.end(), name);
if (itr == m_scriptNames.end() || *itr != name) if (itr == m_scriptNames.end() || *itr != name)
{ return 0; } {
return 0;
}
return uint32(itr - m_scriptNames.begin()); return uint32(itr - m_scriptNames.begin());
} }
@ -2337,7 +2493,9 @@ bool ScriptMgr::OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 send
#ifdef ENABLE_SD3 #ifdef ENABLE_SD3
if (code) if (code)
{ return SD3::GossipSelectWithCode(pPlayer, pCreature, sender, action, code); } {
return SD3::GossipSelectWithCode(pPlayer, pCreature, sender, action, code);
}
else else
{ return SD3::GossipSelect(pPlayer, pCreature, sender, action); } { return SD3::GossipSelect(pPlayer, pCreature, sender, action); }
#else #else
@ -2363,7 +2521,9 @@ bool ScriptMgr::OnGossipSelect(Player* pPlayer, GameObject* pGameObject, uint32
#ifdef ENABLE_SD3 #ifdef ENABLE_SD3
if (code) if (code)
{ return SD3::GOGossipSelectWithCode(pPlayer, pGameObject, sender, action, code); } {
return SD3::GOGossipSelectWithCode(pPlayer, pGameObject, sender, action, code);
}
else else
{ return SD3::GOGossipSelect(pPlayer, pGameObject, sender, action); } { return SD3::GOGossipSelect(pPlayer, pGameObject, sender, action); }
#else #else
@ -2684,7 +2844,9 @@ void ScriptMgr::CollectPossibleEventIds(std::set<uint32>& eventIds)
if (spell->Effect[j] == SPELL_EFFECT_SEND_EVENT) if (spell->Effect[j] == SPELL_EFFECT_SEND_EVENT)
{ {
if (spell->EffectMiscValue[j]) if (spell->EffectMiscValue[j])
{ eventIds.insert(spell->EffectMiscValue[j]); } {
eventIds.insert(spell->EffectMiscValue[j]);
}
} }
#endif #endif
} }
@ -2715,7 +2877,9 @@ bool StartEvents_Event(Map* map, uint32 id, Object* source, Object* target, bool
// Handle SD3 script // Handle SD3 script
if (sScriptMgr.OnProcessEvent(id, source, target, isStart)) if (sScriptMgr.OnProcessEvent(id, source, target, isStart))
{ return true; } {
return true;
}
// Handle PvP Calls // Handle PvP Calls
if (forwardToPvp && source->GetTypeId() == TYPEID_GAMEOBJECT) if (forwardToPvp && source->GetTypeId() == TYPEID_GAMEOBJECT)
@ -2726,7 +2890,9 @@ bool StartEvents_Event(Map* map, uint32 id, Object* source, Object* target, bool
{ {
bg = ((Player*)forwardToPvp)->GetBattleGround(); bg = ((Player*)forwardToPvp)->GetBattleGround();
if (!bg) if (!bg)
{ opvp = sOutdoorPvPMgr.GetScript(((Player*)forwardToPvp)->GetCachedZoneId()); } {
opvp = sOutdoorPvPMgr.GetScript(((Player*)forwardToPvp)->GetCachedZoneId());
}
} }
else else
{ {
@ -2741,15 +2907,21 @@ bool StartEvents_Event(Map* map, uint32 id, Object* source, Object* target, bool
} }
if (bg && bg->HandleEvent(id, static_cast<GameObject*>(source))) if (bg && bg->HandleEvent(id, static_cast<GameObject*>(source)))
{ return true; } {
return true;
}
if (opvp && opvp->HandleEvent(id, static_cast<GameObject*>(source))) if (opvp && opvp->HandleEvent(id, static_cast<GameObject*>(source)))
{ return true; } {
return true;
}
} }
Map::ScriptExecutionParam execParam = Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE_TARGET; Map::ScriptExecutionParam execParam = Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE_TARGET;
if (source->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT)) if (source->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT))
{ execParam = Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE; } {
execParam = Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_SOURCE;
}
else if (target && target->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT)) else if (target && target->isType(TYPEMASK_CREATURE_OR_GAMEOBJECT))
{ execParam = Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_TARGET; } { execParam = Map::SCRIPT_EXEC_PARAM_UNIQUE_BY_TARGET; }

View file

@ -5331,7 +5331,9 @@ SpellCastResult Spell::CheckCast(bool strict)
} }
if (!m_IsTriggeredSpell && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_ATTR_EX2_IGNORE_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target)) if (!m_IsTriggeredSpell && !DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, NULL, SPELL_ATTR_EX2_IGNORE_LOS) && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target))
{ return SPELL_FAILED_LINE_OF_SIGHT; } {
return SPELL_FAILED_LINE_OF_SIGHT;
}
// auto selection spell rank implemented in WorldSession::HandleCastSpellOpcode // auto selection spell rank implemented in WorldSession::HandleCastSpellOpcode
// this case can be triggered if rank not found (too low-level target for first rank) // this case can be triggered if rank not found (too low-level target for first rank)
@ -7658,7 +7660,9 @@ bool Spell::CheckTarget(Unit* target, SpellEffectIndex eff)
return false; return false;
if (!m_spellInfo->HasAttribute(SPELL_ATTR_EX2_IGNORE_LOS) && !corpse->IsWithinLOSInMap(m_caster)) if (!m_spellInfo->HasAttribute(SPELL_ATTR_EX2_IGNORE_LOS) && !corpse->IsWithinLOSInMap(m_caster))
{ return false; } {
return false;
}
} }
// all ok by some way or another, skip normal check // all ok by some way or another, skip normal check
@ -7668,7 +7672,9 @@ bool Spell::CheckTarget(Unit* target, SpellEffectIndex eff)
if (target != m_caster) if (target != m_caster)
if (WorldObject* caster = GetCastingObject()) if (WorldObject* caster = GetCastingObject())
if (!m_spellInfo->HasAttribute(SPELL_ATTR_EX2_IGNORE_LOS) && !target->IsWithinLOSInMap(caster)) if (!m_spellInfo->HasAttribute(SPELL_ATTR_EX2_IGNORE_LOS) && !target->IsWithinLOSInMap(caster))
{ return false; } {
return false;
}
break; break;
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -40,7 +40,9 @@ namespace Movement
float u = 1.f; float u = 1.f;
int32 seg_time = spline.length(point_Idx, point_Idx + 1); int32 seg_time = spline.length(point_Idx, point_Idx + 1);
if (seg_time > 0) if (seg_time > 0)
{ u = (time_passed - spline.length(point_Idx)) / (float)seg_time; } {
u = (time_passed - spline.length(point_Idx)) / (float)seg_time;
}
Location c; Location c;
c.orientation = initialOrientation; c.orientation = initialOrientation;
spline.evaluate_percent(point_Idx, u, c); spline.evaluate_percent(point_Idx, u, c);
@ -55,7 +57,9 @@ namespace Movement
if (splineflags.done && splineflags.isFacing()) if (splineflags.done && splineflags.isFacing())
{ {
if (splineflags.final_angle) if (splineflags.final_angle)
{ c.orientation = facing.angle; } {
c.orientation = facing.angle;
}
else if (splineflags.final_point) else if (splineflags.final_point)
{ c.orientation = atan2(facing.f.y - c.y, facing.f.x - c.x); } { c.orientation = atan2(facing.f.y - c.y, facing.f.x - c.x); }
// nothing to do for MoveSplineFlag::Final_Target flag // nothing to do for MoveSplineFlag::Final_Target flag
@ -93,7 +97,9 @@ namespace Movement
float z_now = spline.getPoint(spline.first()).z - Movement::computeFallElevation(MSToSec(time_passed)); float z_now = spline.getPoint(spline.first()).z - Movement::computeFallElevation(MSToSec(time_passed));
float final_z = FinalDestination().z; float final_z = FinalDestination().z;
if (z_now < final_z) if (z_now < final_z)
{ el = final_z; } {
el = final_z;
}
else else
{ el = z_now; } { el = z_now; }
} }
@ -301,7 +307,9 @@ namespace Movement
str << "spline Id: " << GetId() << std::endl; str << "spline Id: " << GetId() << std::endl;
str << "flags: " << splineflags.ToString() << std::endl; str << "flags: " << splineflags.ToString() << std::endl;
if (splineflags.final_angle) if (splineflags.final_angle)
{ str << "facing angle: " << facing.angle; } {
str << "facing angle: " << facing.angle;
}
else if (splineflags.final_target) else if (splineflags.final_target)
{ str << "facing target: " << facing.target; } { str << "facing target: " << facing.target; }
else if (splineflags.final_point) else if (splineflags.final_point)
@ -326,7 +334,9 @@ namespace Movement
{ {
int32 point = point_Idx_offset + point_Idx - spline.first() + (int)Finalized(); int32 point = point_Idx_offset + point_Idx - spline.first() + (int)Finalized();
if (isCyclic()) if (isCyclic())
{ point = point % (spline.last() - spline.first()); } {
point = point % (spline.last() - spline.first());
}
return point; return point;
} }
} }

View file

@ -42,7 +42,9 @@ namespace Movement
else if (moveFlags & MOVEFLAG_SWIMMING) else if (moveFlags & MOVEFLAG_SWIMMING)
{ {
if (moveFlags & MOVEFLAG_BACKWARD /*&& speed_obj.swim >= speed_obj.swim_back*/) if (moveFlags & MOVEFLAG_BACKWARD /*&& speed_obj.swim >= speed_obj.swim_back*/)
{ return MOVE_SWIM_BACK; } {
return MOVE_SWIM_BACK;
}
else else
{ return MOVE_SWIM; } { return MOVE_SWIM; }
} }
@ -71,7 +73,9 @@ namespace Movement
// there is a big chance that current position is unknown if current state is not finalized, need compute it // there is a big chance that current position is unknown if current state is not finalized, need compute it
// this also allows calculate spline position and update map position in much greater intervals // this also allows calculate spline position and update map position in much greater intervals
if (!move_spline.Finalized() && !transportInfo) if (!move_spline.Finalized() && !transportInfo)
{ real_position = move_spline.ComputePosition(); } {
real_position = move_spline.ComputePosition();
}
if (args.path.empty()) if (args.path.empty())
{ {
@ -92,10 +96,14 @@ namespace Movement
moveFlags |= MOVEFLAG_FORWARD; moveFlags |= MOVEFLAG_FORWARD;
if (args.velocity == 0.f) if (args.velocity == 0.f)
{ args.velocity = unit.GetSpeed(SelectSpeedType(moveFlags)); } {
args.velocity = unit.GetSpeed(SelectSpeedType(moveFlags));
}
if (!args.Validate(&unit)) if (!args.Validate(&unit))
{ return 0; } {
return 0;
}
unit.m_movementInfo.SetMovementFlags((MovementFlags)moveFlags); unit.m_movementInfo.SetMovementFlags((MovementFlags)moveFlags);
move_spline.Initialize(args); move_spline.Initialize(args);

View file

@ -131,7 +131,9 @@ namespace Movement
if (splineflags & MoveSplineFlag::UncompressedPath) if (splineflags & MoveSplineFlag::UncompressedPath)
{ {
if (splineflags.cyclic) if (splineflags.cyclic)
{ WriteCatmullRomCyclicPath(spline, data); } {
WriteCatmullRomCyclicPath(spline, data);
}
else else
{ WriteCatmullRomPath(spline, data); } { WriteCatmullRomPath(spline, data); }
} }

View file

@ -233,7 +233,9 @@ namespace Movement
// first and last two indexes are space for special 'virtual points' // first and last two indexes are space for special 'virtual points'
// these points are required for proper C_Evaluate and C_Evaluate_Derivative methtod work // these points are required for proper C_Evaluate and C_Evaluate_Derivative methtod work
if (cyclic) if (cyclic)
{ points[count] = controls[cyclic_point]; } {
points[count] = controls[cyclic_point];
}
else else
{ points[count] = controls[count - 1]; } { points[count] = controls[count - 1]; }
@ -257,7 +259,9 @@ namespace Movement
if (cyclic) if (cyclic)
{ {
if (cyclic_point == 0) if (cyclic_point == 0)
{ points[0] = controls[count - 1]; } {
points[0] = controls[count - 1];
}
else else
{ points[0] = controls[0].lerp(controls[1], -1); } { points[0] = controls[0].lerp(controls[1], -1); }

View file

@ -84,7 +84,9 @@ namespace Movement
void Increase() void Increase()
{ {
if (m_counter == limit) if (m_counter == limit)
{ init(); } {
init();
}
else else
{ ++m_counter; } { ++m_counter; }
} }

View file

@ -41,20 +41,26 @@ namespace Movement
float computeFallTime(float path_length, bool isSafeFall) float computeFallTime(float path_length, bool isSafeFall)
{ {
if (path_length < 0.f) if (path_length < 0.f)
{ return 0.f; } {
return 0.f;
}
float time; float time;
if (isSafeFall) if (isSafeFall)
{ {
if (path_length >= terminal_savefall_length) if (path_length >= terminal_savefall_length)
{ time = (path_length - terminal_savefall_length) / terminalSavefallVelocity + terminalSavefallVelocity / gravity; } {
time = (path_length - terminal_savefall_length) / terminalSavefallVelocity + terminalSavefallVelocity / gravity;
}
else else
{ time = sqrtf(2.f * path_length / gravity); } { time = sqrtf(2.f * path_length / gravity); }
} }
else else
{ {
if (path_length >= terminal_length) if (path_length >= terminal_length)
{ time = (path_length - terminal_length) / terminalVelocity + terminalFallTime; } {
time = (path_length - terminal_length) / terminalVelocity + terminalFallTime;
}
else else
{ time = sqrtf(2.f * path_length / gravity); } { time = sqrtf(2.f * path_length / gravity); }
} }
@ -68,12 +74,16 @@ namespace Movement
float result; float result;
if (isSafeFall) if (isSafeFall)
{ termVel = terminalSavefallVelocity; } {
termVel = terminalSavefallVelocity;
}
else else
{ termVel = terminalVelocity; } { termVel = terminalVelocity; }
if (start_velocity > termVel) if (start_velocity > termVel)
{ start_velocity = termVel; } {
start_velocity = termVel;
}
float terminal_time = terminalFallTime - start_velocity / gravity; // the time that needed to reach terminalVelocity float terminal_time = terminalFallTime - start_velocity / gravity; // the time that needed to reach terminalVelocity
@ -201,7 +211,9 @@ namespace Movement
for (int i = 0; i < N; ++i) for (int i = 0; i < N; ++i)
{ {
if ((t & (Flags)(1 << i)) && names[i] != NULL) if ((t & (Flags)(1 << i)) && names[i] != NULL)
{ str.append(" ").append(names[i]); } {
str.append(" ").append(names[i]);
}
} }
} }

View file

@ -59,7 +59,9 @@ void BIH::subdivide(int left, int right, std::vector<uint32>& tempTree, buildDat
// perform quick consistency checks // perform quick consistency checks
Vector3 d(gridBox.hi - gridBox.lo); Vector3 d(gridBox.hi - gridBox.lo);
if (d.x < 0 || d.y < 0 || d.z < 0) if (d.x < 0 || d.y < 0 || d.z < 0)
{ throw std::logic_error("negative node extents"); } {
throw std::logic_error("negative node extents");
}
for (int i = 0; i < 3; ++i) for (int i = 0; i < 3; ++i)
{ {
if (nodeBox.hi[i] < gridBox.lo[i] || nodeBox.lo[i] > gridBox.hi[i]) if (nodeBox.hi[i] < gridBox.lo[i] || nodeBox.lo[i] > gridBox.hi[i])
@ -88,7 +90,9 @@ void BIH::subdivide(int left, int right, std::vector<uint32>& tempTree, buildDat
// stay left // stay left
++i; ++i;
if (clipL < maxb) if (clipL < maxb)
{ clipL = maxb; } {
clipL = maxb;
}
} }
else else
{ {
@ -98,7 +102,9 @@ void BIH::subdivide(int left, int right, std::vector<uint32>& tempTree, buildDat
dat.indices[right] = t; dat.indices[right] = t;
--right; --right;
if (clipR > minb) if (clipR > minb)
{ clipR = minb; } {
clipR = minb;
}
} }
nodeL = std::min(nodeL, minb); nodeL = std::min(nodeL, minb);
nodeR = std::max(nodeR, maxb); nodeR = std::max(nodeR, maxb);
@ -245,11 +251,15 @@ void BIH::subdivide(int left, int right, std::vector<uint32>& tempTree, buildDat
nodeBoxR.lo[axis] = clipR; nodeBoxR.lo[axis] = clipR;
// recurse // recurse
if (nl > 0) if (nl > 0)
{ subdivide(left, right, tempTree, dat, gridBoxL, nodeBoxL, nextIndex, depth + 1, stats); } {
subdivide(left, right, tempTree, dat, gridBoxL, nodeBoxL, nextIndex, depth + 1, stats);
}
else else
{ stats.updateLeaf(depth + 1, 0); } { stats.updateLeaf(depth + 1, 0); }
if (nr > 0) if (nr > 0)
{ subdivide(right + 1, rightOrig, tempTree, dat, gridBoxR, nodeBoxR, nextIndex + 3, depth + 1, stats); } {
subdivide(right + 1, rightOrig, tempTree, dat, gridBoxR, nodeBoxR, nextIndex + 3, depth + 1, stats);
}
else else
{ stats.updateLeaf(depth + 1, 0); } { stats.updateLeaf(depth + 1, 0); }
} }

Some files were not shown because too many files have changed in this diff Show more