*Temp fix for crash caused by AV creature. Need to find a way to allow summoned creatures to use RandomMovement.
--HG-- branch : trunk
This commit is contained in:
+80
-23
@@ -731,12 +731,12 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
|
||||
}
|
||||
}
|
||||
|
||||
StoreNewItemInBestSlot(item_id, count);
|
||||
StoreNewItemInBestSlots(item_id, count);
|
||||
}
|
||||
}
|
||||
|
||||
for (PlayerCreateInfoItems::const_iterator item_id_itr = info->item.begin(); item_id_itr!=info->item.end(); ++item_id_itr++)
|
||||
StoreNewItemInBestSlot(item_id_itr->item_id, item_id_itr->item_amount);
|
||||
StoreNewItemInBestSlots(item_id_itr->item_id, item_id_itr->item_amount);
|
||||
|
||||
// bags and main-hand weapon must equipped at this moment
|
||||
// now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
|
||||
@@ -776,24 +776,30 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Player::StoreNewItemInBestSlot(uint32 titem_id, uint32 titem_amount)
|
||||
bool Player::StoreNewItemInBestSlots(uint32 titem_id, uint32 titem_amount)
|
||||
{
|
||||
sLog.outDebug("STORAGE: Creating initial item, itemId = %u, count = %u",titem_id, titem_amount);
|
||||
|
||||
// attempt equip
|
||||
uint16 eDest;
|
||||
uint8 msg = CanEquipNewItem( NULL_SLOT, eDest, titem_id, titem_amount, false );
|
||||
if( msg == EQUIP_ERR_OK )
|
||||
// attempt equip by one
|
||||
while(titem_amount > 0)
|
||||
{
|
||||
EquipNewItem( eDest, titem_id, titem_amount, true);
|
||||
uint16 eDest;
|
||||
uint8 msg = CanEquipNewItem( NULL_SLOT, eDest, titem_id, false );
|
||||
if( msg != EQUIP_ERR_OK )
|
||||
break;
|
||||
|
||||
EquipNewItem( eDest, titem_id, true);
|
||||
AutoUnequipOffhandIfNeed();
|
||||
return true; // equipped
|
||||
--titem_amount;
|
||||
}
|
||||
|
||||
if(titem_amount == 0)
|
||||
return true; // equipped
|
||||
|
||||
// attempt store
|
||||
ItemPosCountVec sDest;
|
||||
// store in main bag to simplify second pass (special bags can be not equipped yet at this moment)
|
||||
msg = CanStoreNewItem( INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount );
|
||||
uint8 msg = CanStoreNewItem( INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount );
|
||||
if( msg == EQUIP_ERR_OK )
|
||||
{
|
||||
StoreNewItem( sDest, titem_id, true, Item::GenerateItemRandomPropertyId(titem_id) );
|
||||
@@ -8098,7 +8104,7 @@ void Player::SendInitWorldStates(bool forceZone, uint32 forceZoneId)
|
||||
bg->FillInitialWorldStates(data);
|
||||
else
|
||||
{
|
||||
data << uint32(0xbb8) << uint32(0x0); // 7 gold
|
||||
data << uint32(0xbb8) << uint32(0x0); // 7 gold
|
||||
data << uint32(0xbb9) << uint32(0x0); // 8 green
|
||||
data << uint32(0xbba) << uint32(0x0); // 9 show
|
||||
}
|
||||
@@ -9666,10 +9672,10 @@ uint8 Player::CanStoreItems( Item **pItems,int count) const
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
uint8 Player::CanEquipNewItem( uint8 slot, uint16 &dest, uint32 item, uint32 count, bool swap ) const
|
||||
uint8 Player::CanEquipNewItem( uint8 slot, uint16 &dest, uint32 item, bool swap ) const
|
||||
{
|
||||
dest = 0;
|
||||
Item *pItem = Item::CreateItem( item, count, this );
|
||||
Item *pItem = Item::CreateItem( item, 1, this );
|
||||
if( pItem )
|
||||
{
|
||||
uint8 result = CanEquipItem(slot, dest, pItem, swap );
|
||||
@@ -10333,12 +10339,12 @@ Item* Player::_StoreItem( uint16 pos, Item *pItem, uint32 count, bool clone, boo
|
||||
}
|
||||
}
|
||||
|
||||
Item* Player::EquipNewItem( uint16 pos, uint32 item, uint32 count, bool update )
|
||||
Item* Player::EquipNewItem( uint16 pos, uint32 item, bool update )
|
||||
{
|
||||
Item *pItem = Item::CreateItem( item, count, this );
|
||||
Item *pItem = Item::CreateItem( item, 1, this );
|
||||
if( pItem )
|
||||
{
|
||||
ItemAddedQuestCheck( item, count );
|
||||
ItemAddedQuestCheck( item, 1 );
|
||||
Item * retItem = EquipItem( pos, pItem, update );
|
||||
|
||||
return retItem;
|
||||
@@ -13689,6 +13695,36 @@ void Player::_LoadDeclinedNames(QueryResult* result)
|
||||
delete result;
|
||||
}
|
||||
|
||||
void Player::_LoadArenaTeamInfo(QueryResult *result)
|
||||
{
|
||||
// arenateamid, played_week, played_season, personal_rating
|
||||
memset((void*)&m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1], 0, sizeof(uint32)*18);
|
||||
if (!result)
|
||||
return;
|
||||
|
||||
do
|
||||
{
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
uint32 arenateamid = fields[0].GetUInt32();
|
||||
uint32 played_week = fields[1].GetUInt32();
|
||||
uint32 played_season = fields[2].GetUInt32();
|
||||
uint32 personal_rating = fields[3].GetUInt32();
|
||||
|
||||
ArenaTeam* aTeam = objmgr.GetArenaTeamById(arenateamid);
|
||||
uint8 arenaSlot = aTeam->GetSlot();
|
||||
|
||||
m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + arenaSlot * 3] = arenateamid; // TeamID
|
||||
m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + arenaSlot * 3 + 1] = ((aTeam->GetCaptain() == GetGUID()) ? (uint32)0 : (uint32)1); // Captain 0, member 1
|
||||
m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + arenaSlot * 3 + 2] = played_week; // Played Week
|
||||
m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + arenaSlot * 3 + 3] = played_season; // Played Season
|
||||
m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + arenaSlot * 3 + 4] = 0; // Unk
|
||||
m_uint32Values[PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + arenaSlot * 3 + 5] = personal_rating; // Personal Rating
|
||||
|
||||
}while (result->NextRow());
|
||||
delete result;
|
||||
}
|
||||
|
||||
bool Player::LoadPositionFromDB(uint32& mapid, float& x,float& y,float& z,float& o, bool& in_flight, uint64 guid)
|
||||
{
|
||||
QueryResult *result = CharacterDatabase.PQuery("SELECT position_x,position_y,position_z,orientation,map,taxi_path FROM characters WHERE guid = '%u'",GUID_LOPART(guid));
|
||||
@@ -13791,8 +13827,8 @@ float Player::GetFloatValueFromDB(uint16 index, uint64 guid)
|
||||
|
||||
bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
|
||||
{
|
||||
//// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] [29] 30 31 32
|
||||
//QueryResult *result = CharacterDatabase.PQuery("SELECT guid, account, data, name, race, class, position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeon_difficulty FROM characters WHERE guid = '%u'", guid);
|
||||
//// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [28] [29] 30 31 32 33
|
||||
//QueryResult *result = CharacterDatabase.PQuery("SELECT guid, account, data, name, race, class, position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeon_difficulty, arena_pending_points FROM characters WHERE guid = '%u'", guid);
|
||||
QueryResult *result = holder->GetResult(PLAYER_LOGIN_QUERY_LOADFROM);
|
||||
|
||||
if(!result)
|
||||
@@ -13882,6 +13918,14 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
|
||||
|
||||
_LoadGroup(holder->GetResult(PLAYER_LOGIN_QUERY_LOADGROUP));
|
||||
|
||||
_LoadArenaTeamInfo(holder->GetResult(PLAYER_LOGIN_QUERY_LOADARENAINFO));
|
||||
|
||||
uint32 arena_currency = GetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY) + fields[33].GetUInt32();
|
||||
if (arena_currency > sWorld.getConfig(CONFIG_MAX_ARENA_POINTS))
|
||||
arena_currency = sWorld.getConfig(CONFIG_MAX_ARENA_POINTS);
|
||||
|
||||
SetUInt32Value(PLAYER_FIELD_ARENA_CURRENCY, arena_currency);
|
||||
|
||||
// check arena teams integrity
|
||||
for(uint32 arena_slot = 0; arena_slot < MAX_ARENA_SLOT; ++arena_slot)
|
||||
{
|
||||
@@ -15281,7 +15325,7 @@ void Player::SaveToDB()
|
||||
"taximask, online, cinematic, "
|
||||
"totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, resettalents_time, "
|
||||
"trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, "
|
||||
"death_expire_time, taxi_path, latency) VALUES ("
|
||||
"death_expire_time, taxi_path, arena_pending_points, latency) VALUES ("
|
||||
<< GetGUIDLow() << ", "
|
||||
<< GetSession()->GetAccountId() << ", '"
|
||||
<< sql_name << "', "
|
||||
@@ -15380,7 +15424,8 @@ void Player::SaveToDB()
|
||||
|
||||
ss << ", '";
|
||||
ss << m_taxi.SaveTaxiDestinationsToString();
|
||||
ss << "', '";
|
||||
|
||||
ss << "', '0', '";
|
||||
ss << GetSession()->GetLatency();
|
||||
ss << "' )";
|
||||
|
||||
@@ -17094,8 +17139,14 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint
|
||||
}
|
||||
else if( IsEquipmentPos( bag, slot ) )
|
||||
{
|
||||
if(pProto->BuyCount * count != 1)
|
||||
{
|
||||
SendEquipError( EQUIP_ERR_ITEM_CANT_BE_EQUIPPED, NULL, NULL );
|
||||
return false;
|
||||
}
|
||||
|
||||
uint16 dest;
|
||||
uint8 msg = CanEquipNewItem( slot, dest, item, pProto->BuyCount * count, false );
|
||||
uint8 msg = CanEquipNewItem( slot, dest, item, false );
|
||||
if( msg != EQUIP_ERR_OK )
|
||||
{
|
||||
SendEquipError( msg, NULL, NULL );
|
||||
@@ -17117,7 +17168,7 @@ bool Player::BuyItemFromVendor(uint64 vendorguid, uint32 item, uint8 count, uint
|
||||
}
|
||||
}
|
||||
|
||||
if(Item *it = EquipNewItem( dest, item, pProto->BuyCount * count, true ))
|
||||
if(Item *it = EquipNewItem( dest, item, true ))
|
||||
{
|
||||
uint32 new_count = pCreature->UpdateVendorItemCurrentCount(crItem,pProto->BuyCount * count);
|
||||
|
||||
@@ -18253,6 +18304,11 @@ uint32 Player::GetBattleGroundQueueIdFromLevel() const
|
||||
return 6;
|
||||
else
|
||||
return level/10 - 1; // 20..29 -> 1, 30-39 -> 2, ...
|
||||
/*
|
||||
assert(bgTypeId < MAX_BATTLEGROUND_TYPES);
|
||||
BattleGround *bg = sBattleGroundMgr.GetBattleGroundTemplate(bgTypeId);
|
||||
assert(bg);
|
||||
return (getLevel() - bg->GetMinLevel()) / 10;*/
|
||||
}
|
||||
|
||||
float Player::GetReputationPriceDiscount( Creature const* pCreature ) const
|
||||
@@ -18962,7 +19018,8 @@ void Player::HandleFallDamage(MovementInfo& movementInfo)
|
||||
|
||||
void Player::HandleFallUnderMap()
|
||||
{
|
||||
if(InBattleGround() && GetBattleGround()
|
||||
if(InBattleGround()
|
||||
&& GetBattleGround()
|
||||
&& GetBattleGround()->HandlePlayerUnderMap(this))
|
||||
{
|
||||
// do nothing, the handle already did if returned true
|
||||
|
||||
Reference in New Issue
Block a user