[9551] Add and use PackedGuid wrapper.

Also
* use more wide bytebuff << >> operators for objects
* use at read packet faisl alsways exception way instead some time used bool results.
This commit is contained in:
VladimirMangos 2010-03-08 20:19:25 +03:00
parent ad9243ebd0
commit c8fd454a79
26 changed files with 351 additions and 340 deletions

View file

@ -183,33 +183,30 @@ void SpellCastTargets::setCorpseTarget(Corpse* corpse)
void SpellCastTargets::Update(Unit* caster)
{
m_GOTarget = m_GOTargetGUID ? caster->GetMap()->GetGameObject(m_GOTargetGUID) : NULL;
m_unitTarget = m_unitTargetGUID ?
( m_unitTargetGUID == caster->GetGUID() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID) ) :
m_GOTarget = !m_GOTargetGUID.IsEmpty() ? caster->GetMap()->GetGameObject(m_GOTargetGUID.GetRawValue()) : NULL;
m_unitTarget = !m_unitTargetGUID.IsEmpty() ?
( m_unitTargetGUID.GetRawValue() == caster->GetGUID() ? caster : ObjectAccessor::GetUnit(*caster, m_unitTargetGUID.GetRawValue()) ) :
NULL;
m_itemTarget = NULL;
if(caster->GetTypeId() == TYPEID_PLAYER)
{
if(m_targetMask & TARGET_FLAG_ITEM)
m_itemTarget = ((Player*)caster)->GetItemByGuid(m_itemTargetGUID);
m_itemTarget = ((Player*)caster)->GetItemByGuid(m_itemTargetGUID.GetRawValue());
else if(m_targetMask & TARGET_FLAG_TRADE_ITEM)
{
Player* pTrader = ((Player*)caster)->GetTrader();
if(pTrader && m_itemTargetGUID < TRADE_SLOT_COUNT)
m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(uint32(m_itemTargetGUID)));
if(pTrader && m_itemTargetGUID.GetRawValue() < TRADE_SLOT_COUNT)
m_itemTarget = pTrader->GetItemByPos(pTrader->GetItemPosByTradeSlot(uint32(m_itemTargetGUID.GetRawValue())));
}
if(m_itemTarget)
m_itemTargetEntry = m_itemTarget->GetEntry();
}
}
bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
void SpellCastTargets::read( ByteBuffer& data, Unit *caster )
{
if(data->rpos() + 4 > data->size())
return false;
*data >> m_targetMask;
data >> m_targetMask;
if(m_targetMask == TARGET_FLAG_SELF)
{
@ -218,121 +215,101 @@ bool SpellCastTargets::read ( WorldPacket * data, Unit *caster )
m_destZ = caster->GetPositionZ();
m_unitTarget = caster;
m_unitTargetGUID = caster->GetGUID();
return true;
return;
}
// TARGET_FLAG_UNK2 is used for non-combat pets, maybe other?
if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_UNK2 ))
if(!data->readPackGUID(m_unitTargetGUID))
return false;
data >> m_unitTargetGUID.ReadAsPacked();
if( m_targetMask & ( TARGET_FLAG_OBJECT ))
if(!data->readPackGUID(m_GOTargetGUID))
return false;
data >> m_GOTargetGUID.ReadAsPacked();
if(( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM )) && caster->GetTypeId() == TYPEID_PLAYER)
if(!data->readPackGUID(m_itemTargetGUID))
return false;
data >> m_itemTargetGUID.ReadAsPacked();
if( m_targetMask & (TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
if(!data->readPackGUID(m_CorpseTargetGUID))
return false;
data >> m_CorpseTargetGUID.ReadAsPacked();
if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
{
if(data->rpos() + 1 + 4 + 4 + 4 > data->size())
return false;
if(!data->readPackGUID(m_unitTargetGUID))
return false;
*data >> m_srcX >> m_srcY >> m_srcZ;
data >> m_unitTargetGUID.ReadAsPacked();
data >> m_srcX >> m_srcY >> m_srcZ;
if(!MaNGOS::IsValidMapCoord(m_srcX, m_srcY, m_srcZ))
return false;
throw ByteBufferException(false, data.rpos(), 0, data.size());
}
if( m_targetMask & TARGET_FLAG_DEST_LOCATION )
{
if(data->rpos() + 1 + 4 + 4 + 4 > data->size())
return false;
if(!data->readPackGUID(m_unitTargetGUID))
return false;
*data >> m_destX >> m_destY >> m_destZ;
data >> m_unitTargetGUID.ReadAsPacked();
data >> m_destX >> m_destY >> m_destZ;
if(!MaNGOS::IsValidMapCoord(m_destX, m_destY, m_destZ))
return false;
throw ByteBufferException(false, data.rpos(), 0, data.size());
}
if( m_targetMask & TARGET_FLAG_STRING )
{
if(data->rpos() + 1 > data->size())
return false;
*data >> m_strTarget;
}
data >> m_strTarget;
// find real units/GOs
Update(caster);
return true;
}
void SpellCastTargets::write ( WorldPacket * data )
void SpellCastTargets::write( ByteBuffer& data ) const
{
*data << uint32(m_targetMask);
data << uint32(m_targetMask);
if( m_targetMask & ( TARGET_FLAG_UNIT | TARGET_FLAG_PVP_CORPSE | TARGET_FLAG_OBJECT | TARGET_FLAG_CORPSE | TARGET_FLAG_UNK2 ) )
{
if(m_targetMask & TARGET_FLAG_UNIT)
{
if(m_unitTarget)
data->append(m_unitTarget->GetPackGUID());
data << m_unitTarget->GetPackGUID();
else
*data << uint8(0);
data << uint8(0);
}
else if( m_targetMask & TARGET_FLAG_OBJECT )
{
if(m_GOTarget)
data->append(m_GOTarget->GetPackGUID());
data << m_GOTarget->GetPackGUID();
else
*data << uint8(0);
data << uint8(0);
}
else if( m_targetMask & ( TARGET_FLAG_CORPSE | TARGET_FLAG_PVP_CORPSE ) )
data->appendPackGUID(m_CorpseTargetGUID);
data << m_CorpseTargetGUID.WriteAsPacked();
else
*data << uint8(0);
data << uint8(0);
}
if( m_targetMask & ( TARGET_FLAG_ITEM | TARGET_FLAG_TRADE_ITEM ) )
{
if(m_itemTarget)
data->append(m_itemTarget->GetPackGUID());
data << m_itemTarget->GetPackGUID();
else
*data << uint8(0);
data << uint8(0);
}
if( m_targetMask & TARGET_FLAG_SOURCE_LOCATION )
{
if(m_unitTarget)
data->append(m_unitTarget->GetPackGUID());
data << m_unitTarget->GetPackGUID();
else
*data << uint8(0);
data << uint8(0);
*data << m_srcX << m_srcY << m_srcZ;
data << m_srcX << m_srcY << m_srcZ;
}
if( m_targetMask & TARGET_FLAG_DEST_LOCATION )
{
if(m_unitTarget)
data->append(m_unitTarget->GetPackGUID());
data << m_unitTarget->GetPackGUID();
else
*data << uint8(0);
data << uint8(0);
*data << m_destX << m_destY << m_destZ;
data << m_destX << m_destY << m_destZ;
}
if( m_targetMask & TARGET_FLAG_STRING )
*data << m_strTarget;
data << m_strTarget;
}
Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 originalCasterGUID, Spell** triggeringContainer )
@ -3188,17 +3165,16 @@ void Spell::SendSpellStart()
WorldPacket data(SMSG_SPELL_START, (8+8+4+4+2));
if (m_CastItem)
data.append(m_CastItem->GetPackGUID());
data << m_CastItem->GetPackGUID();
else
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data << uint8(m_cast_count); // pending spell cast?
data << uint32(m_spellInfo->Id); // spellId
data << uint32(castFlags); // cast flags
data << uint32(m_timer); // delay?
m_targets.write(&data);
data << m_targets;
if ( castFlags & CAST_FLAG_UNKNOWN6 ) // predicted power?
data << uint32(0);
@ -3252,11 +3228,11 @@ void Spell::SendSpellGo()
WorldPacket data(SMSG_SPELL_GO, 50); // guess size
if(m_CastItem)
data.append(m_CastItem->GetPackGUID());
data << m_CastItem->GetPackGUID();
else
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data << uint8(m_cast_count); // pending spell cast?
data << uint32(m_spellInfo->Id); // spellId
data << uint32(castFlags); // cast flags
@ -3264,7 +3240,7 @@ void Spell::SendSpellGo()
WriteSpellGoTargets(&data);
m_targets.write(&data);
data << m_targets;
if ( castFlags & CAST_FLAG_UNKNOWN6 ) // unknown wotlk, predicted power?
data << uint32(0);
@ -3435,9 +3411,9 @@ void Spell::SendLogExecute()
WorldPacket data(SMSG_SPELLLOGEXECUTE, (8+4+4+4+4+8));
if(m_caster->GetTypeId() == TYPEID_PLAYER)
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
else
data.append(target->GetPackGUID());
data << target->GetPackGUID();
data << uint32(m_spellInfo->Id);
uint32 count1 = 1;
@ -3453,7 +3429,7 @@ void Spell::SendLogExecute()
{
case SPELL_EFFECT_POWER_DRAIN:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
data << unit->GetPackGUID();
else
data << uint8(0);
data << uint32(0);
@ -3462,21 +3438,21 @@ void Spell::SendLogExecute()
break;
case SPELL_EFFECT_ADD_EXTRA_ATTACKS:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
data << unit->GetPackGUID();
else
data << uint8(0);
data << uint32(0); // count?
break;
case SPELL_EFFECT_INTERRUPT_CAST:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
data << unit->GetPackGUID();
else
data << uint8(0);
data << uint32(0); // spellid
break;
case SPELL_EFFECT_DURABILITY_DAMAGE:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
data << unit->GetPackGUID();
else
data << uint8(0);
data << uint32(0);
@ -3484,7 +3460,7 @@ void Spell::SendLogExecute()
break;
case SPELL_EFFECT_OPEN_LOCK:
if(Item *item = m_targets.getItemTarget())
data.append(item->GetPackGUID());
data << item->GetPackGUID();
else
data << uint8(0);
break;
@ -3503,11 +3479,11 @@ void Spell::SendLogExecute()
case SPELL_EFFECT_SUMMON_OBJECT_SLOT3:
case SPELL_EFFECT_SUMMON_OBJECT_SLOT4:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
data << unit->GetPackGUID();
else if(m_targets.getItemTargetGUID())
data.appendPackGUID(m_targets.getItemTargetGUID());
else if(GameObject *go = m_targets.getGOTarget())
data.append(go->GetPackGUID());
data << go->GetPackGUID();
else
data << uint8(0); // guid
break;
@ -3516,14 +3492,14 @@ void Spell::SendLogExecute()
break;
case SPELL_EFFECT_DISMISS_PET:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
data << unit->GetPackGUID();
else
data << uint8(0);
break;
case SPELL_EFFECT_RESURRECT:
case SPELL_EFFECT_RESURRECT_NEW:
if(Unit *unit = m_targets.getUnitTarget())
data.append(unit->GetPackGUID());
data << unit->GetPackGUID();
else
data << uint8(0);
break;
@ -3539,14 +3515,14 @@ void Spell::SendLogExecute()
void Spell::SendInterrupted(uint8 result)
{
WorldPacket data(SMSG_SPELL_FAILURE, (8+4+1));
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data << uint8(m_cast_count);
data << uint32(m_spellInfo->Id);
data << uint8(result);
m_caster->SendMessageToSet(&data, true);
data.Initialize(SMSG_SPELL_FAILED_OTHER, (8+4));
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data << uint8(m_cast_count);
data << uint32(m_spellInfo->Id);
data << uint8(result);
@ -3569,7 +3545,7 @@ void Spell::SendChannelUpdate(uint32 time)
}
WorldPacket data( MSG_CHANNEL_UPDATE, 8+4 );
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data << uint32(time);
m_caster->SendMessageToSet(&data, true);
}
@ -3603,7 +3579,7 @@ void Spell::SendChannelStart(uint32 duration)
}
WorldPacket data( MSG_CHANNEL_START, (8+4+4) );
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data << uint32(m_spellInfo->Id);
data << uint32(duration);
m_caster->SendMessageToSet(&data, true);
@ -5902,7 +5878,7 @@ void Spell::Delayed()
sLog.outDetail("Spell %u partially interrupted for (%d) ms at damage", m_spellInfo->Id, delaytime);
WorldPacket data(SMSG_SPELL_DELAYED, 8+4);
data.append(m_caster->GetPackGUID());
data << m_caster->GetPackGUID();
data << uint32(delaytime);
m_caster->SendMessageToSet(&data, true);