mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 22:37:02 +00:00
[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:
parent
ad9243ebd0
commit
c8fd454a79
26 changed files with 351 additions and 340 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue